##// END OF EJS Templates
NotebookManager API: rename *notebook_model methods to *notebook
NotebookManager API: rename *notebook_model methods to *notebook

File last commit:

r15290:8826286d
r15290:8826286d
Show More
nbmanager.py
235 lines | 8.2 KiB | text/x-python | PythonLexer
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180 """A base class notebook manager.
Authors:
* Brian Granger
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 * Zach Sailer
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180 """
#-----------------------------------------------------------------------------
# Copyright (C) 2011 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
Brian Granger
Fixing minor things for the Azure backed nb storage.
r8181 import os
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180
from IPython.config.configurable import LoggingConfigurable
MinRK
add nbformat.sign.NotebookNotary
r14857 from IPython.nbformat import current, sign
Thomas Kluyver
Python 3 compatibility for os.getcwdu()
r13447 from IPython.utils import py3compat
MinRK
add nbformat.sign.NotebookNotary
r14857 from IPython.utils.traitlets import Instance, Unicode, TraitError
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180
#-----------------------------------------------------------------------------
# Classes
#-----------------------------------------------------------------------------
Brian Granger
Renaming BaseNotebookManager->NotebookManager to preserve config.
r8194 class NotebookManager(LoggingConfigurable):
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180
Brian Granger
Fixing minor things for the Azure backed nb storage.
r8181 # Todo:
# The notebook_dir attribute is used to mean a couple of different things:
# 1. Where the notebooks are stored if FileNotebookManager is used.
# 2. The cwd of the kernel for a project.
# Right now we use this attribute in a number of different places and
MinRK
add checkpoint API to FileNBManager
r10497 # we are going to have to disentangle all of this.
Thomas Kluyver
Python 3 compatibility for os.getcwdu()
r13447 notebook_dir = Unicode(py3compat.getcwd(), config=True, help="""
Zachary Sailer
manual rebase notebooks web services
r12984 The directory to use for notebooks.
""")
Paul Ivanov
cleaning up named_notebook_path
r13026
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 filename_ext = Unicode(u'.ipynb')
MinRK
adjust definition of 'path' in notebooks...
r13067
MinRK
add nbformat.sign.NotebookNotary
r14857 notary = Instance(sign.NotebookNotary)
def _notary_default(self):
return sign.NotebookNotary(parent=self)
MinRK
sign notebooks
r14856
MinRK
move signature checking to base NotebookManager...
r14907 def check_and_sign(self, nb, path, name):
"""Check for trusted cells, and sign the notebook.
Called as a part of saving notebooks.
"""
if self.notary.check_cells(nb):
self.notary.sign(nb)
else:
self.log.warn("Saving untrusted notebook %s/%s", path, name)
def mark_trusted_cells(self, nb, path, name):
"""Mark cells as trusted if the notebook signature matches.
Called as a part of loading notebooks.
"""
trusted = self.notary.check_signature(nb)
if not trusted:
self.log.warn("Notebook %s/%s is not trusted", path, name)
self.notary.mark_cells(nb, trusted)
MinRK
adjust definition of 'path' in notebooks...
r13067 def path_exists(self, path):
"""Does the API-style path (directory) actually exist?
MinRK
move os_path to FileNBMan...
r13070 Override this method in subclasses.
MinRK
adjust definition of 'path' in notebooks...
r13067
Paul Ivanov
cleaning up named_notebook_path
r13026 Parameters
----------
MinRK
adjust definition of 'path' in notebooks...
r13067 path : string
The
Paul Ivanov
cleaning up named_notebook_path
r13026 Returns
-------
MinRK
adjust definition of 'path' in notebooks...
r13067 exists : bool
Whether the path does indeed exist.
Paul Ivanov
cleaning up named_notebook_path
r13026 """
MinRK
move os_path to FileNBMan...
r13070 raise NotImplementedError
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097
def is_hidden(self, path):
"""Does the API style path correspond to a hidden directory or file?
Parameters
----------
path : string
The path to check. This is an API path (`/` separated,
relative to base notebook-dir).
Returns
-------
exists : bool
Whether the path is hidden.
"""
raise NotImplementedError
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 def _notebook_dir_changed(self, name, old, new):
"""Do a bit of validation of the notebook dir."""
Ohad Ravid
Answer Issue #2366...
r8453 if not os.path.isabs(new):
# If we receive a non-absolute path, make it absolute.
MinRK
fix `--notebook-dir` configurable when there is no trailing slash
r13066 self.notebook_dir = os.path.abspath(new)
Ohad Ravid
Answer Issue #2366...
r8453 return
Brian Granger
Fixing minor things for the Azure backed nb storage.
r8181 if os.path.exists(new) and not os.path.isdir(new):
raise TraitError("notebook dir %r is not a directory" % new)
if not os.path.exists(new):
self.log.info("Creating notebook dir %s", new)
try:
os.mkdir(new)
except:
raise TraitError("Couldn't create notebook dir %r" % new)
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 # Main notebook API
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180
MinRK
adjust definition of 'path' in notebooks...
r13067 def increment_filename(self, basename, path=''):
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 """Increment a notebook filename without the .ipynb to make it unique.
Parameters
----------
basename : unicode
The name of a notebook without the ``.ipynb`` file extension.
path : unicode
The URL path of the notebooks directory
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180 """
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 return basename
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180
Brian E. Granger
Addressing review comments....
r15093 # TODO: Remove this after we create the contents web service and directories are
# no longer listed by the notebook web service.
def list_dirs(self, path):
"""List the directory models for a given API style path."""
raise NotImplementedError('must be implemented in a subclass')
# TODO: Remove this after we create the contents web service and directories are
# no longer listed by the notebook web service.
def get_dir_model(self, name, path=''):
"""Get the directory model given a directory name and its API style path.
The keys in the model should be:
* name
* path
* last_modified
* created
* type='directory'
"""
raise NotImplementedError('must be implemented in a subclass')
MinRK
update upload and copy...
r13074 def list_notebooks(self, path=''):
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 """Return a list of notebook dicts without content.
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180
This returns a list of dicts, each of the form::
dict(notebook_id=notebook,name=name)
This list of dicts should be sorted by name::
data = sorted(data, key=lambda item: item['name'])
"""
raise NotImplementedError('must be implemented in a subclass')
Konrad Hinsen
NotebookManager API: rename *notebook_model methods to *notebook
r15290 def get_notebook(self, name, path='', content=True):
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 """Get the notebook model with or without content."""
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180 raise NotImplementedError('must be implemented in a subclass')
Konrad Hinsen
NotebookManager API: rename *notebook_model methods to *notebook
r15290 def save_notebook(self, model, name, path=''):
"""Save the notebook and return the model with no content."""
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 raise NotImplementedError('must be implemented in a subclass')
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180
Konrad Hinsen
NotebookManager API: rename *notebook_model methods to *notebook
r15290 def update_notebook(self, model, name, path=''):
"""Update the notebook and return the model with no content."""
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180 raise NotImplementedError('must be implemented in a subclass')
Konrad Hinsen
NotebookManager API: rename *notebook_model methods to *notebook
r15290 def delete_notebook(self, name, path=''):
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 """Delete notebook by name and path."""
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180 raise NotImplementedError('must be implemented in a subclass')
Konrad Hinsen
NotebookManager API: rename *notebook_model methods to *notebook
r15290 def create_notebook(self, model=None, path=''):
MinRK
notebooks should always have one checkpoint...
r13245 """Create a new notebook and return its model with no content."""
MinRK
ensure 'path' never has leading or trailing slash in nbmanager...
r13078 path = path.strip('/')
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 if model is None:
model = {}
MinRK
update upload and copy...
r13074 if 'content' not in model:
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 metadata = current.new_metadata(name=u'')
MinRK
update upload and copy...
r13074 model['content'] = current.new_notebook(metadata=metadata)
if 'name' not in model:
model['name'] = self.increment_filename('Untitled', path)
model['path'] = path
Konrad Hinsen
NotebookManager API: rename *notebook_model methods to *notebook
r15290 model = self.save_notebook(model, model['name'], model['path'])
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 return model
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180
MinRK
allow specifying destination in copy_notebook
r13123 def copy_notebook(self, from_name, to_name=None, path=''):
"""Copy an existing notebook and return its new model.
If to_name not specified, increment `from_name-Copy#.ipynb`.
"""
MinRK
ensure 'path' never has leading or trailing slash in nbmanager...
r13078 path = path.strip('/')
Konrad Hinsen
NotebookManager API: rename *notebook_model methods to *notebook
r15290 model = self.get_notebook(from_name, path)
MinRK
allow specifying destination in copy_notebook
r13123 if not to_name:
base = os.path.splitext(from_name)[0] + '-Copy'
to_name = self.increment_filename(base, path)
model['name'] = to_name
Konrad Hinsen
NotebookManager API: rename *notebook_model methods to *notebook
r15290 model = self.save_notebook(model, to_name, path)
Zachary Sailer
refactoring of nbmanager and filenbmanager...
r13046 return model
MinRK
add checkpoint API to FileNBManager
r10497
# Checkpoint-related
MinRK
update upload and copy...
r13074 def create_checkpoint(self, name, path=''):
MinRK
add checkpoint API to FileNBManager
r10497 """Create a checkpoint of the current state of a notebook
Returns a checkpoint_id for the new checkpoint.
"""
raise NotImplementedError("must be implemented in a subclass")
MinRK
update upload and copy...
r13074 def list_checkpoints(self, name, path=''):
MinRK
add checkpoint API to FileNBManager
r10497 """Return a list of checkpoints for a given notebook"""
return []
MinRK
update upload and copy...
r13074 def restore_checkpoint(self, checkpoint_id, name, path=''):
MinRK
add checkpoint API to FileNBManager
r10497 """Restore a notebook from one of its checkpoints"""
raise NotImplementedError("must be implemented in a subclass")
Brian Granger
Fixing minor things for the Azure backed nb storage.
r8181
MinRK
update upload and copy...
r13074 def delete_checkpoint(self, checkpoint_id, name, path=''):
MinRK
add checkpoint API to FileNBManager
r10497 """delete a checkpoint for a notebook"""
raise NotImplementedError("must be implemented in a subclass")
Brian Granger
Fixing minor things for the Azure backed nb storage.
r8181 def log_info(self):
Paul Ivanov
print info string on interrupt, log it on startup
r10019 self.log.info(self.info_string())
def info_string(self):
Brian E. Granger
Review and refactoring of notebooks web service.
r13051 return "Serving notebooks"