{ "info": { "author": "Tim Paine", "author_email": "t.paine154@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Framework :: Jupyter", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8" ], "description": "# jupyterlab_celltests\nCell-by-cell testing for production Jupyter notebooks in JupyterLab\n\n[![Build Status](https://dev.azure.com/tpaine154/jupyter/_apis/build/status/timkpaine.jupyterlab_celltests?branchName=master)](https://dev.azure.com/tpaine154/jupyter/_build/latest?definitionId=15&branchName=master)\n[![Coverage](https://img.shields.io/azure-devops/coverage/tpaine154/jupyter/15)](https://dev.azure.com/tpaine154/jupyter/_build?definitionId=15&_a=summary)\n[![Docs](https://img.shields.io/readthedocs/jupyterlab_celltests.svg)](https://jupyterlab_celltests.readthedocs.io)\n[![PyPI](https://img.shields.io/pypi/l/jupyterlab_celltests.svg)](https://pypi.python.org/pypi/jupyterlab_celltests)\n[![PyPI](https://img.shields.io/pypi/v/jupyterlab_celltests.svg)](https://pypi.python.org/pypi/jupyterlab_celltests)\n[![npm](https://img.shields.io/npm/v/jupyterlab_celltests.svg)](https://www.npmjs.com/package/jupyterlab_celltests)\n\n\n# Overview\n`Celltests` is designed for writing tests for linearly executed notebooks. Its primary use is for unit testing reports. \n\n### \"Linearly executed notebooks?\"\nWhen converting notebooks into html/pdf/email reports, they are executed top-to-bottom one time, and are expected to contain as little code as reasonably possible, focusing primarily on the plotting and markdown bits. Libraries for this type of thing include [Papermill](https://github.com/nteract/papermill), [JupyterLab Emails](https://github.com/timkpaine/jupyterlab_email), etc. \n\n### Doesn't this already exist?\n[Nbval](https://github.com/computationalmodelling/nbval) is a great product and I recommend using it for notebook regression tests. But it only allows for testing for unexpected failures or simple output equality tests.\n\n### So why do I want this again?\nThis doesn't necessarily help you if your data sources go down, but its likely you'll notice this anyway. Where this comes in handy is:\n\n- when the environment (e.g. package versions) are changing in your system\n- when you play around in the notebook (e.g. nonlinear execution) but aren't sure if your reports will still generate\n- when your software lifecycle systems have a hard time dealing with notebooks (can't lint/audit them as code unless integrated nbdime/nbconvert to script, tough to test, tough to ensure what works today works tomorrow)\n\n### So what does this do?\nGiven a notebook, you can write mocks and assertions for individual cells. You can then generate a testing script for this notebook, allowing you to hook it into your testing system and thereby provide unittests of your report. \n\n## Writing tests\nWhen you write tests for a cell, we create a new method on a `unittest` class corresponding to the index of your cell, and including the cumulative tests for all previous cells (to mimic what has happened so far in the notebook's linear execution). You can write whatever mocking and asserts you like, and can call `%cell` to inject the contents of the cell into your test. \n![](https://raw.githubusercontent.com/timkpaine/jupyterlab_celltests/master/docs/demo.gif)\nThe tests themselves are stored in the cell metadata, similar to celltags, slide information, etc. \n\n## Running tests\nYou can run the tests offline from an `.ipynb` file, or you can execute them from the browser and view the results of `pytest-html`'s html plugin.\n![](https://raw.githubusercontent.com/timkpaine/jupyterlab_celltests/master/docs/demo2.gif)\n\n## Extra Tests\n- Max number of lines per cell\n- Max number of cells per notebook\n- Max number of function definitions per notebook\n- Max number of class definitions per notebook\n- Percentage of cells tested\n\n## Example\nIn the committed `Untitled.ipynb` notebook, but modified so that cell 0 has its import statement copied 10 times (to trigger test and lint failures):\n\n\n### Tests\n```bash\nUntitled_test.py::TestExtension::test_cell0 PASSED [ 8%]\nUntitled_test.py::TestExtension::test_cell1 PASSED [ 16%]\nUntitled_test.py::TestExtension::test_cell2 PASSED [ 25%]\nUntitled_test.py::TestExtension::test_cell3 PASSED [ 33%]\nUntitled_test.py::TestExtension::test_cell_coverage PASSED [ 41%]\nUntitled_test.py::TestExtension::test_cells_per_notebook PASSED [ 50%]\nUntitled_test.py::TestExtension::test_class_definition_count PASSED [ 58%]\nUntitled_test.py::TestExtension::test_function_definition_count PASSED [ 66%]\nUntitled_test.py::TestExtension::test_lines_per_cell_0 FAILED [ 75%]\nUntitled_test.py::TestExtension::test_lines_per_cell_1 PASSED [ 83%]\nUntitled_test.py::TestExtension::test_lines_per_cell_2 PASSED [ 91%]\nUntitled_test.py::TestExtension::test_lines_per_cell_3 PASSED [100%]\n```\n### Lint\n```bash\nChecking lines in cell 0: FAILED\nChecking lines in cell 1: PASSED\nChecking lines in cell 2: PASSED\nChecking lines in cell 3: PASSED\nChecking cells per notebook <= 10: PASSED\nChecking functions per notebook <= 10: PASSED\nChecking classes per notebook <= 10: PASSED\nChecking cell test coverage >= 50: PASSED\n```\n\nNB: In jupyterlab, notebooks will be lint checked using the version of\npython that is running jupyter lab itself. A notebook intended to be\nrun with a Python 2 kernel could therefore generate syntax errors\nduring lint checking.\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/timkpaine/jupyterlab_celltests", "keywords": "jupyter jupyterlab", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "jupyterlab-celltests", "package_url": "https://pypi.org/project/jupyterlab-celltests/", "platform": "", "project_url": "https://pypi.org/project/jupyterlab-celltests/", "project_urls": { "Homepage": "https://github.com/timkpaine/jupyterlab_celltests" }, "release_url": "https://pypi.org/project/jupyterlab-celltests/0.1.3/", "requires_dist": [ "jupyterlab (>=1.0.0)", "nbval (>=0.9.1)", "nbconvert", "pytest (>=4.4.0)", "pytest-html (>=1.20.0)", "flake8", "bump2version ; extra == 'dev'", "autopep8 ; extra == 'dev'", "pytest-cov (>=2.6.1) ; extra == 'dev'", "mock ; extra == 'dev'" ], "requires_python": "", "summary": "Cell-by-cell tests for JupyterLab", "version": "0.1.3", "yanked": false, "yanked_reason": null }, "last_serial": 6777946, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "c9c4ca9cec9009477998d86858713585", "sha256": "d7648c823389fbcf22bc8d1a4a49292ef29a7a6808a98d58fe7ee2a38a127764" }, "downloads": -1, "filename": "jupyterlab_celltests-0.0.1.tar.gz", "has_sig": false, "md5_digest": "c9c4ca9cec9009477998d86858713585", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5641, "upload_time": "2018-08-24T00:34:11", "upload_time_iso_8601": "2018-08-24T00:34:11.513283Z", "url": "https://files.pythonhosted.org/packages/12/13/ffedb9750b32a53a8d368132ef708a50f414422e297d118bed343f703e22/jupyterlab_celltests-0.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "04f676af9d8bdd76b32b3f65ff04daf1", "sha256": "730f5afefad525a15430223b3fbec33295738c504222913157df58b87cc8e6e0" }, "downloads": -1, "filename": "jupyterlab_celltests-0.0.2.tar.gz", "has_sig": false, "md5_digest": "04f676af9d8bdd76b32b3f65ff04daf1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6576, "upload_time": "2018-09-04T14:40:41", "upload_time_iso_8601": "2018-09-04T14:40:41.446028Z", "url": "https://files.pythonhosted.org/packages/c7/09/6bb7dd631c62b6418aaa4382b4d31c8b047db568be9b94ecbc4aced9898c/jupyterlab_celltests-0.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "145eaa3019f24a29e2e9e1812fa9c432", "sha256": "f153e12cccac16689a409b085229d1b5954e4e063bf3fc40d5464ebb453aac5c" }, "downloads": -1, "filename": "jupyterlab_celltests-0.0.3.tar.gz", "has_sig": false, "md5_digest": "145eaa3019f24a29e2e9e1812fa9c432", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8173, "upload_time": "2019-02-14T19:44:02", "upload_time_iso_8601": "2019-02-14T19:44:02.000937Z", "url": "https://files.pythonhosted.org/packages/6e/f7/0a55936a94ee6cebdb827d11ababed68bf017c720b4f56a2d43950b59d77/jupyterlab_celltests-0.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "e9b64853fdba3ccfd5a0f5b0f334447a", "sha256": "16cb93eb94c793a1c6b483d890b70e1778a88d14a546534a7d6ad3532b9c3ff7" }, "downloads": -1, "filename": "jupyterlab_celltests-0.0.4.tar.gz", "has_sig": false, "md5_digest": "e9b64853fdba3ccfd5a0f5b0f334447a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11307, "upload_time": "2019-02-26T03:48:18", "upload_time_iso_8601": "2019-02-26T03:48:18.293885Z", "url": "https://files.pythonhosted.org/packages/62/7c/6f87aec0d9bf63a208ea12462409195bed7e9ae0a7f2cdb44e4eeda4163f/jupyterlab_celltests-0.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "c8d7ad0ae4c91a168c867864518da0ff", "sha256": "b4093f5a0e4c26b18248590412434abf773ace4dac3dad8ead6550a57878be0b" }, "downloads": -1, "filename": "jupyterlab_celltests-0.0.5.tar.gz", "has_sig": false, "md5_digest": "c8d7ad0ae4c91a168c867864518da0ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11316, "upload_time": "2019-02-26T21:29:20", "upload_time_iso_8601": "2019-02-26T21:29:20.729713Z", "url": "https://files.pythonhosted.org/packages/4c/39/162f7a6a6d5143f29cca3841ee70e57e6c4b49b2b0a7f754b7ec0bcf8ecb/jupyterlab_celltests-0.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "d1ad5b1e04b2e9c4fa69303b19a6357a", "sha256": "1086c707430d1b232cfa6bc7996a4de3051bae03d91856f2abe9e1c77cffea6a" }, "downloads": -1, "filename": "jupyterlab_celltests-0.0.6.tar.gz", "has_sig": false, "md5_digest": "d1ad5b1e04b2e9c4fa69303b19a6357a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11320, "upload_time": "2019-02-26T21:30:49", "upload_time_iso_8601": "2019-02-26T21:30:49.741584Z", "url": "https://files.pythonhosted.org/packages/b7/9d/c5d7c553f3db56058321c387f666cb7ef75a1c3a90e5a6dd43e9d50d2093/jupyterlab_celltests-0.0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "fe57658adda78ea24d5f778d4cb7d52e", "sha256": "b84df12467383314e19aa60825d712ee503a754b809d391cdb71486fe4c04b30" }, "downloads": -1, "filename": "jupyterlab_celltests-0.0.7.tar.gz", "has_sig": false, "md5_digest": "fe57658adda78ea24d5f778d4cb7d52e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8685, "upload_time": "2019-06-10T21:09:50", "upload_time_iso_8601": "2019-06-10T21:09:50.578894Z", "url": "https://files.pythonhosted.org/packages/02/66/e410bca57d5da80609fbe54c1d3c0c6111019a59f9101574544bb8fac3c6/jupyterlab_celltests-0.0.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "e1c99ebd71ceb8bce237cfee0e12a8a7", "sha256": "b1e4e709c061cb5d010523b3b04f38bfa1a9c411aa63e8dd155156240a2017b9" }, "downloads": -1, "filename": "jupyterlab_celltests-0.0.8.tar.gz", "has_sig": false, "md5_digest": "e1c99ebd71ceb8bce237cfee0e12a8a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8685, "upload_time": "2019-06-10T21:15:31", "upload_time_iso_8601": "2019-06-10T21:15:31.660043Z", "url": "https://files.pythonhosted.org/packages/14/ce/1127b128af54de2a36fbc01e8e30c7194a7338e0d2c6222052e6e932e6a9/jupyterlab_celltests-0.0.8.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "a318be29bf9311de2f535e558cfb1ce2", "sha256": "c804ca45a2a9bfc46ae449d6965e907e2a9e3bb8de6176dac0e2f6624e63cf8e" }, "downloads": -1, "filename": "jupyterlab_celltests-0.0.9.tar.gz", "has_sig": false, "md5_digest": "a318be29bf9311de2f535e558cfb1ce2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8690, "upload_time": "2019-06-10T21:59:01", "upload_time_iso_8601": "2019-06-10T21:59:01.605140Z", "url": "https://files.pythonhosted.org/packages/d0/09/a7f759893c241199d37893de9d9ac010fd01a65657dc3bf93db85e007698/jupyterlab_celltests-0.0.9.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "07bc34578dc5dd673d48960adb069215", "sha256": "218225429d217535ea90d82ffc89aeef7a1e0443409ef13a66a7e61d906c2e37" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.0.tar.gz", "has_sig": false, "md5_digest": "07bc34578dc5dd673d48960adb069215", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10210, "upload_time": "2019-06-29T16:05:35", "upload_time_iso_8601": "2019-06-29T16:05:35.843606Z", "url": "https://files.pythonhosted.org/packages/79/ae/68b70f158129814084cf302eb719e21cf6ed9fe83c1c20d95e8b758c7aef/jupyterlab_celltests-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "14e34151b41d4f65aa8f2d80f8543a7f", "sha256": "c02544a49fa2135d600ff68d8bc46deeda59791ca8ea9f79486f2adfc2894d2b" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "14e34151b41d4f65aa8f2d80f8543a7f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 29914, "upload_time": "2019-08-19T21:01:35", "upload_time_iso_8601": "2019-08-19T21:01:35.574289Z", "url": "https://files.pythonhosted.org/packages/c6/43/82235e29361413e98180fc42458365d58a0a9173629d6fadd039c08054c3/jupyterlab_celltests-0.1.1-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "41978fb2662d8e0dd9f02d752494b904", "sha256": "72e200b37fe596466fd95c24f416ea4747382ad6c670fa736fe0918d473637b5" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.1.tar.gz", "has_sig": false, "md5_digest": "41978fb2662d8e0dd9f02d752494b904", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9501518, "upload_time": "2019-08-19T21:01:44", "upload_time_iso_8601": "2019-08-19T21:01:44.081716Z", "url": "https://files.pythonhosted.org/packages/09/b9/6fdb03fc751ac5dc2ef1fe876eb65c50a13423fcae95a3ba1d97f7e624d9/jupyterlab_celltests-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "323c320107d608cc4f1f81711702bb70", "sha256": "6b9e069d77b15d4f7e279a7ee164cda3e485cb4ed093dbf3d6a868840426e9a1" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "323c320107d608cc4f1f81711702bb70", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 32438, "upload_time": "2019-12-10T18:32:00", "upload_time_iso_8601": "2019-12-10T18:32:00.832973Z", "url": "https://files.pythonhosted.org/packages/08/9a/3acd8789e7972b79d655a6efea84875e90cc426189234ebcffe7e3e41f7c/jupyterlab_celltests-0.1.2-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9a083b3f81e61c8fee84a21714815f99", "sha256": "40e8a8fba1fd129890b0385f5e1d01a08e0d6b26357c111a8a6dade905f740aa" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.2.tar.gz", "has_sig": false, "md5_digest": "9a083b3f81e61c8fee84a21714815f99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9503998, "upload_time": "2019-12-10T18:32:09", "upload_time_iso_8601": "2019-12-10T18:32:09.987976Z", "url": "https://files.pythonhosted.org/packages/fc/22/cbf4ce77f2f940a1b25c2487817b3514ef4658f1f80cc3abf3ca3c81ddd5/jupyterlab_celltests-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "22d3d945422db021768ff65da0d9b047", "sha256": "c3c409f7b66d4d2fb5e74f0633e05eecb76dca2773b3f2a8efe820bf0802e3da" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "22d3d945422db021768ff65da0d9b047", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 39153, "upload_time": "2020-03-09T15:43:52", "upload_time_iso_8601": "2020-03-09T15:43:52.924269Z", "url": "https://files.pythonhosted.org/packages/ae/25/c9f728a816320339313c439486d0470470087b2be9960fdaf94f3f0dd3c1/jupyterlab_celltests-0.1.3-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c27318fc0d0e046ef034778b48f4232c", "sha256": "295db4fec59c8c88a84525ffd47fb7b463397751af33cba8d408c4a0eb61b788" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.3.tar.gz", "has_sig": false, "md5_digest": "c27318fc0d0e046ef034778b48f4232c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2931088, "upload_time": "2020-03-09T15:43:55", "upload_time_iso_8601": "2020-03-09T15:43:55.966871Z", "url": "https://files.pythonhosted.org/packages/da/55/460ded1a2296e171ac84801878c310f0c013fd2f805718fd0002ae74a8a8/jupyterlab_celltests-0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.3rc0": [ { "comment_text": "", "digests": { "md5": "85339372e9068d70bf2289df576cfe04", "sha256": "2d7204ebff305753c7716f94f59eb13637e3ceda101141206c9de1f7ba5ce919" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.3rc0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "85339372e9068d70bf2289df576cfe04", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 36007, "upload_time": "2020-03-09T10:21:48", "upload_time_iso_8601": "2020-03-09T10:21:48.279972Z", "url": "https://files.pythonhosted.org/packages/b5/7b/c712b5437e0fa48590f21c24e6f483241e9b29e9aac8eee4c1edd5b49caa/jupyterlab_celltests-0.1.3rc0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "768545a0dfba7ecf55f7c2178acc917e", "sha256": "b892a04b48b9888b496e8c78e6ca871c0c0331050103f76a309545f02d75b149" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.3rc0.tar.gz", "has_sig": false, "md5_digest": "768545a0dfba7ecf55f7c2178acc917e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2929558, "upload_time": "2020-03-09T10:22:02", "upload_time_iso_8601": "2020-03-09T10:22:02.302836Z", "url": "https://files.pythonhosted.org/packages/5c/cf/6066e54a3ecbbed31674d8fb0d60de6307a66e02046e671de78a3d18611a/jupyterlab_celltests-0.1.3rc0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "22d3d945422db021768ff65da0d9b047", "sha256": "c3c409f7b66d4d2fb5e74f0633e05eecb76dca2773b3f2a8efe820bf0802e3da" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "22d3d945422db021768ff65da0d9b047", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 39153, "upload_time": "2020-03-09T15:43:52", "upload_time_iso_8601": "2020-03-09T15:43:52.924269Z", "url": "https://files.pythonhosted.org/packages/ae/25/c9f728a816320339313c439486d0470470087b2be9960fdaf94f3f0dd3c1/jupyterlab_celltests-0.1.3-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c27318fc0d0e046ef034778b48f4232c", "sha256": "295db4fec59c8c88a84525ffd47fb7b463397751af33cba8d408c4a0eb61b788" }, "downloads": -1, "filename": "jupyterlab_celltests-0.1.3.tar.gz", "has_sig": false, "md5_digest": "c27318fc0d0e046ef034778b48f4232c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2931088, "upload_time": "2020-03-09T15:43:55", "upload_time_iso_8601": "2020-03-09T15:43:55.966871Z", "url": "https://files.pythonhosted.org/packages/da/55/460ded1a2296e171ac84801878c310f0c013fd2f805718fd0002ae74a8a8/jupyterlab_celltests-0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }