{ "info": { "author": "nteract contributors", "author_email": "nteract@googlegroups.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Intended Audience :: System Administrators", "License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3" ], "description": "\"scrapbook\n\n# scrapbook\n\n\n\n[![Travis Build Status](https://travis-ci.org/nteract/scrapbook.svg?branch=master)](https://travis-ci.org/nteract/scrapbook)\n[![Azure Build Status](https://dev.azure.com/nteract/nteract/_apis/build/status/nteract.scrapbook?branchName=master)](https://dev.azure.com/nteract/nteract/_build/latest?definitionId=6&branchName=master)\n[![image](https://codecov.io/github/nteract/scrapbook/coverage.svg?branch=master)](https://codecov.io/github/nteract/scrapbook=master)\n[![Documentation Status](https://readthedocs.org/projects/nteract-scrapbook/badge/?version=latest)](https://nteract-scrapbook.readthedocs.io/en/latest/?badge=latest)\n[![badge](https://tinyurl.com/y3moqkmc)](https://mybinder.org/v2/gh/nteract/scrapbook/master?filepath=binder%2Freglue_highlight_dates.ipynb)\n[![badge](https://tinyurl.com/ybk8qa3j)](https://mybinder.org/v2/gh/nteract/scrapbook/master?filepath=binder%2FResultsDemo.ipynb)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)\n\nTHE **scrapbook** library records a notebook\u2019s data values and generated visual\ncontent as \"scraps\". Recorded scraps can be read at a future time.\n\n## Use Cases\n\nNotebook users may wish to record data produced during a notebook's execution.\nThis recorded data, **scraps**, can be used at a later time or passed in a\nworkflow to another notebook as input.\n\nNamely, scrapbook lets you:\n\n- **persist** data and visual content displays in a notebook as scraps\n- **recall** any persisted scrap of data\n- **summarize collections** of notebooks\n\n## Python Version Support\n\nThis library's long term support target is Python 3.5+. It currently also\nsupports Python 2.7 until Python 2 reaches end-of-life in 2020. After this\ndate, Python 2 support will halt, and only 3.x versions will be maintained.\n\n## Installation\n\nInstall using `pip`:\n\n```{.sourceCode .bash}\npip install nteract-scrapbook\n```\n\nFor installing optional IO dependencies, you can specify individual store bundles,\nlike `s3` or `azure`:\n\n```{.sourceCode .bash}\npip install nteract-scrapbook[s3]\n```\n\nor use `all`:\n\n```{.sourceCode .bash}\npip install nteract-scrapbook[all]\n```\n\n---\n\n## Models and Terminology\n\nScrapbook defines the following items:\n\n- **scraps**: serializable data values and visualizations such as strings, lists of\n objects, pandas dataframes, charts, images, or data references.\n- **notebook**: a wrapped nbformat notebook object with extra methods for interacting\n with scraps.\n- **scrapbook**: a collection of notebooks with an interface for asking questions of\n the collection.\n- **encoders**: a registered translator of data to/from notebook\n storage formats.\n\n### `scrap` model\n\nThe `scrap` model houses a few key attributes in a tuple, including:\n\n- **name**: The name of the scrap\n- **data**: Any data captured by the scrapbook api call\n- **encoder**: The name of the encoder used to encode/decode data to/from the notebook\n- **display**: Any display data used by IPython to display visual content\n\n---\n\n## API\n\nScrapbook adds a few basic api commands which enable saving and retrieving data\nincluding:\n\n- `glue` to persist scraps with or without _display output_\n- `read_notebook` reads one notebook\n- `scraps` provides a searchable dictionary of all scraps by name\n- `reglue` which copies a scrap from another notebook to the current notebook\n- `read_notebooks` reads many notebooks from a given path\n- `scraps_report` displays a report about collected scraps\n- `papermill_dataframe` and `papermill_metrics` for backward compatibility\n for two deprecated papermill features\n\nThe following sections provide more detail on these api commands.\n\n### `glue` to persist scraps\n\nRecords a `scrap` (data or display value) in the given notebook cell.\n\nThe `scrap` (recorded value) can be retrieved during later inspection of the\noutput notebook.\n\n```python\n\"\"\"glue example for recording data values\"\"\"\nimport scrapbook as sb\n\nsb.glue(\"hello\", \"world\")\nsb.glue(\"number\", 123)\nsb.glue(\"some_list\", [1, 3, 5])\nsb.glue(\"some_dict\", {\"a\": 1, \"b\": 2})\nsb.glue(\"non_json\", df, 'arrow')\n```\n\nThe scrapbook library can be used later to recover `scraps` from the output\nnotebook:\n\n```python\n# read a notebook and get previously recorded scraps\nnb = sb.read_notebook('notebook.ipynb')\nnb.scraps\n```\n\n**scrapbook** will imply the storage format by the value type of any registered\ndata encoders. Alternatively, the implied encoding format can be overwritten by\nsetting the `encoder` argument to the registered name (e.g. `\"json\"`) of a\nparticular encoder.\n\nThis data is persisted by generating a display output with a special media type\nidentifying the content encoding format and data. These outputs are not always\nvisible in notebook rendering but still exist in the document. Scrapbook can\nthen rehydrate the data associated with the notebook in the future by reading\nthese cell outputs.\n\n#### With _display output_\n\nTo display a named scrap with visible display outputs, you need to indicate that\nthe scrap is directly renderable.\n\nThis can be done by toggling the `display` argument.\n\n```python\n# record a UI message along with the input string\nsb.glue(\"hello\", \"Hello World\", display=True)\n```\n\nThe call will save the data and the display attributes of the Scrap object,\nmaking it visible as well as encoding the original data. This leans on the\n`IPython.core.formatters.format_display_data` function to translate the data\nobject into a display and metadata dict for the notebook kernel to parse.\n\nAnother pattern that can be used is to specify that **only the display data**\nshould be saved, and not the original object. This is achieved by setting\nthe encoder to be `display`.\n\n```python\n# record an image without the original input object\nsb.glue(\"sharable_png\",\n IPython.display.Image(filename=\"sharable.png\"),\n encoder='display'\n)\n```\n\nFinally the media types that are generated can be controlled by passing\na list, tuple, or dict object as the display argument.\n\n```python\nsb.glue(\"media_as_text_only\",\n media_obj,\n encoder='display',\n display=('text/plain',) # This passes [text/plain] to format_display_data's include argument\n)\n\nsb.glue(\"media_without_text\",\n media_obj,\n encoder='display',\n display={'exclude': 'text/plain'} # forward to format_display_data's kwargs\n)\n```\n\nLike data scraps, these can be retrieved at a later time be accessing the scrap's\n`display` attribute. Though usually one will just use Notebook's `reglue` method\n(described below).\n\n### `read_notebook` reads one notebook\n\nReads a Notebook object loaded from the location specified at `path`.\nYou've already seen how this function is used in the above api call examples,\nbut essentially this provides a thin wrapper over an `nbformat`'s NotebookNode\nwith the ability to extract scrapbook scraps.\n\n```python\nnb = sb.read_notebook('notebook.ipynb')\n```\n\nThis Notebook object adheres to the [nbformat's json schema](https://github.com/jupyter/nbformat/blob/master/nbformat/v4/nbformat.v4.schema.json),\nallowing for access to its required fields.\n\n```python\nnb.cells # The cells from the notebook\nnb.metadata\nnb.nbformat\nnb.nbformat_minor\n```\n\nThere's a few additional methods provided, most of which are outlined in more detail\nbelow:\n\n```python\nnb.scraps\nnb.reglue\n```\n\nThe abstraction also makes saved content available as a dataframe referencing each\nkey and source. More of these methods will be made available in later versions.\n\n```python\n# Produces a data frame with [\"name\", \"data\", \"encoder\", \"display\", \"filename\"] as columns\nnb.scrap_dataframe # Warning: This might be a large object if data or display is large\n```\n\nThe Notebook object also has a few legacy functions for backwards compatibility\nwith papermill's Notebook object model. As a result, it can be used to read\npapermill execution statistics as well as scrapbook abstractions:\n\n```python\nnb.cell_timing # List of cell execution timings in cell order\nnb.execution_counts # List of cell execution counts in cell order\nnb.papermill_metrics # Dataframe of cell execution counts and times\nnb.papermill_record_dataframe # Dataframe of notebook records (scraps with only data)\nnb.parameter_dataframe # Dataframe of notebook parameters\nnb.papermill_dataframe # Dataframe of notebook parameters and cell scraps\n```\n\nThe notebook reader relies on [papermill's registered iorw](https://papermill.readthedocs.io/en/latest/reference/papermill-io.html)\nto enable access to a variety of sources such as -- but not limited to -- S3,\nAzure, and Google Cloud.\n\n### `scraps` provides a name -> scrap lookup\n\nThe `scraps` method allows for access to all of the scraps in a particular notebook.\n\n```python\nnb = sb.read_notebook('notebook.ipynb')\nnb.scraps # Prints a dict of all scraps by name\n```\n\nThis object has a few additional methods as well for convenient conversion and\nexecution.\n\n```python\nnb.scraps.data_scraps # Filters to only scraps with `data` associated\nnb.scraps.data_dict # Maps `data_scraps` to a `name` -> `data` dict\nnb.scraps.display_scraps # Filters to only scraps with `display` associated\nnb.scraps.display_dict # Maps `display_scraps` to a `name` -> `display` dict\nnb.scraps.dataframe # Generates a dataframe with [\"name\", \"data\", \"encoder\", \"display\"] as columns\n```\n\nThese methods allow for simple use-cases to not require digging through model\nabstractions.\n\n### `reglue` copys a scrap into the current notebook\n\nUsing `reglue` one can take any scrap glue'd into one notebook and glue into the\ncurrent one.\n\n```python\nnb = sb.read_notebook('notebook.ipynb')\nnb.reglue(\"table_scrap\") # This copies both data and displays\n```\n\nAny data or display information will be copied verbatim into the currently\nexecuting notebook as though the user called `glue` again on the original source.\n\nIt's also possible to rename the scrap in the process.\n\n```python\nnb.reglue(\"table_scrap\", \"old_table_scrap\")\n```\n\nAnd finally if one wishes to try to reglue without checking for existence the\n`raise_on_missing` can be set to just display a message on failure.\n\n```python\nnb.reglue(\"maybe_missing\", raise_on_missing=False)\n# => \"No scrap found with name 'maybe_missing' in this notebook\"\n```\n\n### `read_notebooks` reads many notebooks\n\nReads all notebooks located in a given `path` into a Scrapbook object.\n\n```python\n# create a scrapbook named `book`\nbook = sb.read_notebooks('path/to/notebook/collection/')\n# get the underlying notebooks as a list\nbook.notebooks # Or `book.values`\n```\n\nThe path reuses [papermill's registered `iorw`](https://papermill.readthedocs.io/en/latest/reference/papermill-io.html)\nto list and read files form various sources, such that non-local urls can load data.\n\n```python\n# create a scrapbook named `book`\nbook = sb.read_notebooks('s3://bucket/key/prefix/to/notebook/collection/')\n```\n\nThe Scrapbook (`book` in this example) can be used to recall all scraps across\nthe collection of notebooks:\n\n```python\nbook.notebook_scraps # Dict of shape `notebook` -> (`name` -> `scrap`)\nbook.scraps # merged dict of shape `name` -> `scrap`\n```\n\n### `scraps_report` displays a report about collected scraps\n\nThe Scrapbook collection can be used to generate a `scraps_report` on all the\nscraps from the collection as a markdown structured output.\n\n```python\nbook.scraps_report()\n```\n\nThis display can filter on scrap and notebook names, as well as enable or disable\nan overall header for the display.\n\n```python\nbook.scraps_report(\n scrap_names=[\"scrap1\", \"scrap2\"],\n notebook_names=[\"result1\"], # matches `/notebook/collections/result1.ipynb` pathed notebooks\n header=False\n)\n```\n\nBy default the report will only populate with visual elements. To also\nreport on data elements set include_data.\n\n```python\nbook.scraps_report(include_data=True)\n```\n\n### papermill support\n\nFinally the scrapbook provides two backwards compatible features for deprecated\n`papermill` capabilities:\n\n```python\nbook.papermill_dataframe\nbook.papermill_metrics\n```\n\n## Encoders\n\nEncoders are accessible by key names to Encoder objects registered\nagainst the `encoders.registry` object. To register new data encoders\nsimply call:\n\n```python\nfrom encoder import registry as encoder_registry\n# add encoder to the registry\nencoder_registry.register(\"custom_encoder_name\", MyCustomEncoder())\n```\n\nThe encode class must implement two methods, `encode` and `decode`:\n\n```python\nclass MyCustomEncoder(object):\n def encode(self, scrap):\n # scrap.data is any type, usually specific to the encoder name\n pass # Return a `Scrap` with `data` type one of [None, list, dict, *six.integer_types, *six.string_types]\n\n def decode(self, scrap):\n # scrap.data is one of [None, list, dict, *six.integer_types, *six.string_types]\n pass # Return a `Scrap` with `data` type as any type, usually specific to the encoder name\n```\n\nThis can read transform scraps into a json object representing their contents or\nlocation and load those strings back into the original data objects.\n\n### `text`\n\nA basic string storage format that saves data as python strings.\n\n```python\nsb.glue(\"hello\", \"world\", \"text\")\n```\n\n### `json`\n\n```python\nsb.glue(\"foo_json\", {\"foo\": \"bar\", \"baz\": 1}, \"json\")\n```\n\n### `arrow`\n\nImplementation Pending!\n\n## papermill's deprecated `record` feature\n\n**scrapbook** provides a robust and flexible recording schema. This library replaces [papermill](https://papermill.readthedocs.io)'s existing\n`record` functionality.\n\n[Documentation for papermill `record`](https://papermill.readthedocs.io/en/latest/usage-recording.html?#recording-values-to-the-notebook) exists on ReadTheDocs.\nIn brief, the deprecated `record` function:\n\n`pm.record(name, value)`: enables values to be saved\nwith the notebook [[API documentation]](https://papermill.readthedocs.io/en/latest/reference/papermill.html#papermill.api.record)\n\n```python\npm.record(\"hello\", \"world\")\npm.record(\"number\", 123)\npm.record(\"some_list\", [1, 3, 5])\npm.record(\"some_dict\", {\"a\": 1, \"b\": 2})\n```\n\n`pm.read_notebook(notebook)`: pandas could be used later to recover recorded\nvalues by reading the output notebook into a dataframe. For example:\n\n```python\nnb = pm.read_notebook('notebook.ipynb')\nnb.dataframe\n```\n\n### Rationale for Papermill `record` deprecation\n\nPapermill's `record` function was deprecated due to these limitations and challenges:\n\n- The `record` function didn't follow papermill's pattern of linear execution\n of a notebook. It was awkward to describe `record` as an additional\n feature of papermill, and really felt like describing a second less\n developed library.\n- Recording / Reading required data translation to JSON for everything. This is\n a tedious, painful process for dataframes.\n- Reading recorded values into a dataframe would result in unintuitive dataframe\n shapes.\n- Less modularity and flexiblity than other papermill components where custom\n operators can be registered.\n\nTo overcome these limitations in Papermill, a decision was made to create\n**Scrapbook**.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/nteract/scrapbook", "keywords": "jupyter mapreduce nteract pipeline notebook", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "nteract-scrapbook", "package_url": "https://pypi.org/project/nteract-scrapbook/", "platform": "", "project_url": "https://pypi.org/project/nteract-scrapbook/", "project_urls": { "Documentation": "https://nteract-scrapbook.readthedocs.io", "Funding": "https://nteract.io", "Homepage": "https://github.com/nteract/scrapbook", "Source": "https://github.com/nteract/scrapbook/", "Tracker": "https://github.com/nteract/scrapbook/issues" }, "release_url": "https://pypi.org/project/nteract-scrapbook/0.3.1/", "requires_dist": [ "six", "papermill", "jsonschema", "future", "ipython (>=5.0)", "numpy (<1.17) ; python_version < \"3.0\"", "pandas (<0.25) ; python_version < \"3.0\"", "futures ; python_version < \"3.0\"", "pandas ; python_version >= \"3.0\"", "papermill[all] ; extra == 'all'", "papermill[azure] ; extra == 'azure'", "bumpversion ; extra == 'dev'", "wheel (>=0.31.0) ; extra == 'dev'", "setuptools (>=38.6.0) ; extra == 'dev'", "twine (>=1.11.0) ; extra == 'dev'", "flake8 ; extra == 'dev'", "tox ; extra == 'dev'", "mock ; extra == 'dev'", "ipython ; extra == 'dev'", "papermill[dev] ; extra == 'dev'", "pytest (>=4.1) ; extra == 'dev'", "pytest-cov (>=2.6.1) ; extra == 'dev'", "pytest-mock (>=1.10) ; extra == 'dev'", "pytest-env (>=0.6.2) ; extra == 'dev'", "codecov ; extra == 'dev'", "coverage ; extra == 'dev'", "papermill[gcs] ; extra == 'gcs'", "papermill[s3] ; extra == 's3'", "bumpversion ; extra == 'test'", "wheel (>=0.31.0) ; extra == 'test'", "setuptools (>=38.6.0) ; extra == 'test'", "twine (>=1.11.0) ; extra == 'test'", "flake8 ; extra == 'test'", "tox ; extra == 'test'", "mock ; extra == 'test'", "ipython ; extra == 'test'", "papermill[dev] ; extra == 'test'", "pytest (>=4.1) ; extra == 'test'", "pytest-cov (>=2.6.1) ; extra == 'test'", "pytest-mock (>=1.10) ; extra == 'test'", "pytest-env (>=0.6.2) ; extra == 'test'", "codecov ; extra == 'test'", "coverage ; extra == 'test'" ], "requires_python": "", "summary": "A library for recording and reading data in Jupyter and nteract Notebooks", "version": "0.3.1" }, "last_serial": 5717368, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "cdb41a147a540e3f4e60c916ef5d2518", "sha256": "94f3f61fe7b295112234619c4c6c0f909dc8e5add67ea38c8876741866c83bae" }, "downloads": -1, "filename": "nteract_scrapbook-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cdb41a147a540e3f4e60c916ef5d2518", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 31214, "upload_time": "2019-02-26T19:29:23", "url": "https://files.pythonhosted.org/packages/66/9f/0ce03da20d8c687d59299c15e9a32ce85684e4d7ca4719b8329e9a622bc6/nteract_scrapbook-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b0eea68792a39d888a8dd75a92c64940", "sha256": "e85f300163d5fa7eb87e6bb00b6896494a33ccc44b37f3b92179aae56cd1ed19" }, "downloads": -1, "filename": "nteract-scrapbook-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b0eea68792a39d888a8dd75a92c64940", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 124707, "upload_time": "2019-02-26T19:29:25", "url": "https://files.pythonhosted.org/packages/66/85/3f26d39362f0a0b24f1a2983785f4563a6a499ea18f840dda93069311f84/nteract-scrapbook-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "e30d5d14def0f72dd9d29743666b052a", "sha256": "32b6b13817ae442eec50922d1b94c7637d0f58777dbf2447d61b8292d840c858" }, "downloads": -1, "filename": "nteract_scrapbook-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e30d5d14def0f72dd9d29743666b052a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 35205, "upload_time": "2019-05-01T02:20:14", "url": "https://files.pythonhosted.org/packages/d0/f2/ed95d0909cdd6b8318eb3b0f77ab446b0e99b47b638228001b78820a9271/nteract_scrapbook-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "58e41c5bad3223228c2fef64da2d871e", "sha256": "4f14ac2460bbb0f6787faa88726ad65031879be595a0e757d68e8b77e93dc93f" }, "downloads": -1, "filename": "nteract-scrapbook-0.2.1.tar.gz", "has_sig": false, "md5_digest": "58e41c5bad3223228c2fef64da2d871e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 127660, "upload_time": "2019-05-01T02:20:17", "url": "https://files.pythonhosted.org/packages/01/36/0d69368d9a41d72e6af2a25462ac00529fedfee083eeaac8ece6bfe87307/nteract-scrapbook-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "ac651a041c708fbdd53a8bd744563757", "sha256": "9b9573b6c456dde64d5713d1776012181cf4942c96d77b0f8fc175dd5517e98f" }, "downloads": -1, "filename": "nteract_scrapbook-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ac651a041c708fbdd53a8bd744563757", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37484, "upload_time": "2019-08-19T21:33:38", "url": "https://files.pythonhosted.org/packages/53/b8/9beda12875f4bcc44be2a602a9add699428d543bd04bdab3f13578e27935/nteract_scrapbook-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e3332ef079e9e96f9e1afc65a6df70c4", "sha256": "e8b053dfee8db3871a79408a68a04c696b39cd606bd5382c9f464b4ed840ee5e" }, "downloads": -1, "filename": "nteract-scrapbook-0.3.0.tar.gz", "has_sig": false, "md5_digest": "e3332ef079e9e96f9e1afc65a6df70c4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 132871, "upload_time": "2019-08-19T21:33:40", "url": "https://files.pythonhosted.org/packages/67/dd/d7cc6468ff4b1875a397f66f280bdfb2ae942f699f7466069658d240ccaa/nteract-scrapbook-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "8a8f292b4424117f280be066aad17af5", "sha256": "0eb83afe0c45d7444681ae3ea5366493d61a95a61fea584b7814114f44891b69" }, "downloads": -1, "filename": "nteract_scrapbook-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8a8f292b4424117f280be066aad17af5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37482, "upload_time": "2019-08-22T21:03:43", "url": "https://files.pythonhosted.org/packages/1a/85/05460941cf6f07bce751b566f93c7f90d169681826109915c513c07289f5/nteract_scrapbook-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b489c42a55c3da3c35578b600da4a25e", "sha256": "6607dd3ec4a078d640167752b0bf5b49bbfe6d4f4e60fe17e8339bc8a7878ec8" }, "downloads": -1, "filename": "nteract-scrapbook-0.3.1.tar.gz", "has_sig": false, "md5_digest": "b489c42a55c3da3c35578b600da4a25e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 132901, "upload_time": "2019-08-22T21:03:45", "url": "https://files.pythonhosted.org/packages/c8/16/8e203190cb24a2d81256f66a6fbaeba33decd9f2174453b5d29772bd05fa/nteract-scrapbook-0.3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8a8f292b4424117f280be066aad17af5", "sha256": "0eb83afe0c45d7444681ae3ea5366493d61a95a61fea584b7814114f44891b69" }, "downloads": -1, "filename": "nteract_scrapbook-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8a8f292b4424117f280be066aad17af5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37482, "upload_time": "2019-08-22T21:03:43", "url": "https://files.pythonhosted.org/packages/1a/85/05460941cf6f07bce751b566f93c7f90d169681826109915c513c07289f5/nteract_scrapbook-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b489c42a55c3da3c35578b600da4a25e", "sha256": "6607dd3ec4a078d640167752b0bf5b49bbfe6d4f4e60fe17e8339bc8a7878ec8" }, "downloads": -1, "filename": "nteract-scrapbook-0.3.1.tar.gz", "has_sig": false, "md5_digest": "b489c42a55c3da3c35578b600da4a25e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 132901, "upload_time": "2019-08-22T21:03:45", "url": "https://files.pythonhosted.org/packages/c8/16/8e203190cb24a2d81256f66a6fbaeba33decd9f2174453b5d29772bd05fa/nteract-scrapbook-0.3.1.tar.gz" } ] }