48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
# Copyright (c) Jupyter Development Team.
|
|
# Distributed under the terms of the Modified BSD License.
|
|
import os
|
|
import io
|
|
import tarfile
|
|
import nbformat
|
|
|
|
def _jupyter_bundlerextension_paths():
|
|
"""Metadata for notebook bundlerextension"""
|
|
return [{
|
|
# unique bundler name
|
|
"name": "tarball_bundler",
|
|
# module containing bundle function
|
|
"module_name": "notebook.bundler.tarball_bundler",
|
|
# human-readable menu item label
|
|
"label" : "Notebook Tarball (tar.gz)",
|
|
# group under 'deploy' or 'download' menu
|
|
"group" : "download",
|
|
}]
|
|
|
|
def bundle(handler, model):
|
|
"""Create a compressed tarball containing the notebook document.
|
|
|
|
Parameters
|
|
----------
|
|
handler : tornado.web.RequestHandler
|
|
Handler that serviced the bundle request
|
|
model : dict
|
|
Notebook model from the configured ContentManager
|
|
"""
|
|
notebook_filename = model['name']
|
|
notebook_content = nbformat.writes(model['content']).encode('utf-8')
|
|
notebook_name = os.path.splitext(notebook_filename)[0]
|
|
tar_filename = '{}.tar.gz'.format(notebook_name)
|
|
|
|
info = tarfile.TarInfo(notebook_filename)
|
|
info.size = len(notebook_content)
|
|
|
|
with io.BytesIO() as tar_buffer:
|
|
with tarfile.open(tar_filename, "w:gz", fileobj=tar_buffer) as tar:
|
|
tar.addfile(info, io.BytesIO(notebook_content))
|
|
|
|
handler.set_attachment_header(tar_filename)
|
|
handler.set_header('Content-Type', 'application/gzip')
|
|
|
|
# Return the buffer value as the response
|
|
handler.finish(tar_buffer.getvalue())
|