diff --git a/IPython/html/services/notebooks/nbmanager.py b/IPython/html/services/notebooks/nbmanager.py index 630e63490..a66183802 100644 --- a/IPython/html/services/notebooks/nbmanager.py +++ b/IPython/html/services/notebooks/nbmanager.py @@ -47,26 +47,9 @@ class NotebookManager(LoggingConfigurable): def _notary_default(self): return sign.NotebookNotary(parent=self) - 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) - + # NotebookManager API part 1: methods that must be + # implemented in subclasses. + def path_exists(self, path): """Does the API-style path (directory) actually exist? @@ -101,47 +84,6 @@ class NotebookManager(LoggingConfigurable): """ raise NotImplementedError - def _notebook_dir_changed(self, name, old, new): - """Do a bit of validation of the notebook dir.""" - if not os.path.isabs(new): - # If we receive a non-absolute path, make it absolute. - self.notebook_dir = os.path.abspath(new) - return - 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) - - # Main notebook API - - def increment_filename(self, basename, path=''): - """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 - - Returns - ------- - name : unicode - A notebook name (with the .ipynb extension) that starts - with basename and does not refer to any existing notebook. - """ - path = path.strip('/') - for i in itertools.count(): - name = u'{basename}{i}{ext}'.format(basename=basename, i=i, - ext=self.filename_ext) - if not self.notebook_exists(name, path): - break - return name - def notebook_exists(self, name, path=''): """Returns a True if the notebook exists. Else, returns False. @@ -207,6 +149,55 @@ class NotebookManager(LoggingConfigurable): """Delete notebook by name and path.""" raise NotImplementedError('must be implemented in a subclass') + def create_checkpoint(self, name, path=''): + """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") + + def list_checkpoints(self, name, path=''): + """Return a list of checkpoints for a given notebook""" + return [] + + def restore_checkpoint(self, checkpoint_id, name, path=''): + """Restore a notebook from one of its checkpoints""" + raise NotImplementedError("must be implemented in a subclass") + + def delete_checkpoint(self, checkpoint_id, name, path=''): + """delete a checkpoint for a notebook""" + raise NotImplementedError("must be implemented in a subclass") + + def info_string(self): + return "Serving notebooks" + + # NotebookManager API part 2: methods that have useable default + # implementations, but can be overridden in subclasses. + + def increment_filename(self, basename, path=''): + """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 + + Returns + ------- + name : unicode + A notebook name (with the .ipynb extension) that starts + with basename and does not refer to any existing notebook. + """ + path = path.strip('/') + for i in itertools.count(): + name = u'{basename}{i}{ext}'.format(basename=basename, i=i, + ext=self.filename_ext) + if not self.notebook_exists(name, path): + break + return name + def create_notebook(self, model=None, path=''): """Create a new notebook and return its model with no content.""" path = path.strip('/') @@ -236,29 +227,43 @@ class NotebookManager(LoggingConfigurable): model = self.save_notebook(model, to_name, path) return model - # Checkpoint-related - - def create_checkpoint(self, name, path=''): - """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") - - def list_checkpoints(self, name, path=''): - """Return a list of checkpoints for a given notebook""" - return [] - - def restore_checkpoint(self, checkpoint_id, name, path=''): - """Restore a notebook from one of its checkpoints""" - raise NotImplementedError("must be implemented in a subclass") - - def delete_checkpoint(self, checkpoint_id, name, path=''): - """delete a checkpoint for a notebook""" - raise NotImplementedError("must be implemented in a subclass") - def log_info(self): self.log.info(self.info_string()) + + # NotebookManager methods provided for use in subclasses. + + 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 info_string(self): - return "Serving notebooks" + 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) + + def _notebook_dir_changed(self, name, old, new): + """Do a bit of validation of the notebook dir.""" + if not os.path.isabs(new): + # If we receive a non-absolute path, make it absolute. + self.notebook_dir = os.path.abspath(new) + return + 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) +