Metadata-Version: 2.1
Name: bookstore
Version: 2.0.0
Summary: Storage Workflows for Notebooks
Home-page: https://github.com/nteract/bookstore
Author: nteract contributors
Author-email: nteract@googlegroups.com
License: BSD
Project-URL: Documentation, https://github.com/nteract/bookstore/#todo
Project-URL: Funding, https://nteract.io
Project-URL: Source, https://github.com/nteract/bookstore/
Project-URL: Tracker, https://github.com/nteract/bookstore/issues
Keywords: jupyter storage nteract notebook
Platform: UNKNOWN
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: BSD License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 2.7
Description-Content-Type: text/markdown
Requires-Dist: future
Requires-Dist: ipython (>=5.0)
Requires-Dist: notebook
Requires-Dist: s3fs
Requires-Dist: futures; python_version < "3.0"
Provides-Extra: dev
Requires-Dist: codecov; extra == 'dev'
Requires-Dist: coverage; extra == 'dev'
Requires-Dist: notebook; extra == 'dev'
Requires-Dist: mock; extra == 'dev'
Requires-Dist: pytest (>=3.3); extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: pytest-mock; extra == 'dev'
Requires-Dist: black; (python_version >= "3.6") and extra == 'dev'
Provides-Extra: test
Requires-Dist: codecov; extra == 'test'
Requires-Dist: coverage; extra == 'test'
Requires-Dist: notebook; extra == 'test'
Requires-Dist: mock; extra == 'test'
Requires-Dist: pytest (>=3.3); extra == 'test'
Requires-Dist: pytest-cov; extra == 'test'
Requires-Dist: pytest-mock; extra == 'test'
Requires-Dist: black; (python_version >= "3.6") and extra == 'test'

# bookstore

[![Documentation Status](https://readthedocs.org/projects/bookstore/badge/?version=latest)](https://bookstore.readthedocs.io/en/latest/?badge=latest)

This repository provides tooling and workflow recommendations for storing, scheduling, and publishing notebooks.

## Automatic Notebook Versioning

Every save of a notebook creates an immutable copy of the notebook on object storage.

To ease implementation, we'll rely on S3 as the object store, using [versioned buckets](https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html).

<!--

Include diagram for versioning

-->

## Storage Paths

All notebooks are archived to a single versioned S3 bucket with specific prefixes denoting the lifecycle of the notebook:

- `/workspace` - where users edit
- `/published` - public notebooks (to an organization)

Each notebook path is a namespace that an external service ties into the schedule. We archive off versions, keeping the path intact (until a user changes them).

| Prefix                                  | Intent                 |
| --------------------------------------- | ---------------------- |
| `/workspace/kylek/notebooks/mine.ipynb` | Notebook in “draft”    |
| `/published/kylek/notebooks/mine.ipynb` | Current published copy |

Scheduled notebooks will also be referred to by the notebook key, though we'll need to be able to surface version Ids as well.

## Transitioning to this Storage Plan

Since most people are on a regular filesystem, we'll start with writing to the `/workspace` prefix as Archival Storage (writing on save using a `post_save_hook` for a Jupyter contents manager).

## Configuration

```python
# jupyter config
# At ~/.jupyter/jupyter_notebook_config.py for user installs on macOS
# See https://jupyter.readthedocs.io/en/latest/projects/jupyter-directories.html for other places to plop this

from bookstore import BookstoreContentsArchiver

c.NotebookApp.contents_manager_class = BookstoreContentsArchiver

c.BookstoreSettings.workspace_prefix = "/workspace/kylek/notebooks"
c.BookstoreSettings.published_prefix = "/published/kylek/notebooks"

# Optional, in case you're using a different contents manager
# This defaults to notebook.services.contents.manager.ContentsManager

c.BookstoreSettings.s3_bucket = "<bucket-name>"

# Note: if bookstore is used from an EC2 instance with the right IAM role, you don't
# have to specify these
c.BookstoreSettings.s3_access_key_id = <AWS Access Key ID / IAM Access Key ID>
c.BookstoreSettings.s3_secret_access_key = <AWS Secret Access Key / IAM Secret Access Key>
```


