nbwipers


Namenbwipers JSON
Version 0.3.7 PyPI version JSON
download
home_pagehttps://github.com/felixgwilliams/nbwipers
SummaryWipe clean your Jupyter Notebooks!
upload_time2024-06-11 19:40:02
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords python notebook jupyter ci pre-commit
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # nbwipers

![Test](https://github.com/felixgwilliams/nbwipers/actions/workflows/testing.yml/badge.svg)
[![License:MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![PyPI - Version](https://img.shields.io/pypi/v/nbwipers)](https://pypi.org/project/nbwipers/)
[![Crates.io](https://img.shields.io/crates/v/nbwipers)](https://crates.io/crates/nbwipers)
[![Conda](https://img.shields.io/conda/v/conda-forge/nbwipers)](https://anaconda.org/conda-forge/nbwipers)
[![codecov](https://codecov.io/gh/felixgwilliams/nbwipers/graph/badge.svg?token=PLGJFNRHSQ)](https://codecov.io/gh/felixgwilliams/nbwipers)

nbwipers is a command line tool to wipe clean jupyter notebooks, written in Rust.

The interface and functionality are based on [nbstripout](https://github.com/kynan/nbstripout) and the idea to implement it in rust comes from [nbstripout-fast](https://github.com/deshaw/nbstripout-fast).

## Usage

nbwipers has a few subcommands that provide functionality related to cleaning Jupyter notebooks.

- `clean`: clean a single notebook. This is more-or-less equivalent to `nbstripout`.
- `check`: check notebooks in a given path for elements that would be removed by `clean`. This could be used in a CI context to enforce clean notebooks.
- `clean-all` clean all notebooks in a given path. This one should be used carefully!
- `install` register nbwipers as a git filter for `ipynb` files. Equivalent to `nbstripout --install`
- `uninstall` remove nbwipers as a git filter.
- `check-install` check that `nbwipers` or `nbstripout` is installed in the local repo. This is used in the pre-commit hook.

The full options can be found in [`CommandLineHelp.md`](CommandLineHelp.md).

### Examples

To set up nbwipers as a git filter in your repository, use

```shell
nbwipers install local
```

If this step is performed on a pre-existing repo, you can `touch` your notebooks so that git can detect the changes.
In bash:

```bash
for f in $(git ls-files '*.ipynb'); do touch $f; done
```

To check the notebooks in your folder, you can run the following

```shell
nbwipers check .
```

### pre-commit

You can add the following to your `pre-commit-config.yaml` file to ensure that `nbwipers` or `nbstripout` is installed in your repo, in order to prevent Jupyter notebook outputs from being committed to version control.

```yaml
  - repo: https://github.com/felixgwilliams/nbwipers-pre-commit
    rev: v0.3.4
    hooks:
      - id: nbwipers-check-install
```

Alternatively, you can use the URL for this repo in your config, but this will compile `nbwipers` from source, rather than retrieving the binary from PyPI, and is therefore not recommended.

If you are using your pre-commit configuration as part of CI, you should set the environment variable `NBWIPERS_CHECK_INSTALL_EXIT_ZERO` which forces this check to pass, since you do not need `nbwipers` configured in your CI environment.

## Motivation

A working copy of a Jupyter notebook contains:

1. Code written by the author.
2. Notebook outputs: tables, logs, tracebacks, images, widgets and so on...
3. Execution counts.
4. Metadata, such as whether cells are collapsed, scrollable etc.

Of these categories of data, only the first — code written by the author — should definitely be tracked by version control, since it is the product of the author's intention and hard work.
The other categories of data are subject to change outside of the explicit intentions of the author and are generally noisy from a version control perspective.

Moreover, including notebook outputs in version control

- makes diffs harder to interpret, as they will contain lots of unintended changes.
- increases the risk of a tricky merge conflict if different users run the same cell and get a slightly different result.
- increases the amount of data committed, which can degrade repository performance.
- risks leaking sensitive data.

An effective way to ensure you do not commit problematic parts of your notebooks is to use `nbwipers` or `nbstripout` as a git filter.

A git filter sits between your actual files and what git sees when you stage and commit your changes.
This way, git only sees the transformed version of the file without the problematic elements.
At the same time, you do not have to lose them from your local copy.

An exception is when you checkout a branch or do a git pull, which results in changes to the notebook.
In this case, your local copy will be replaced by the clean version and you will lose your cell outputs.

## Configuration

Configuration is currently done via the `tool.nbwipers` section of the `pyproject.toml` file.
Most of the command line options can be set per-project in the `pyproject.toml`, `nbwipers.toml` or `.nbwipers.toml` file.
If you use `pyroject.toml`, you need to put the configuration under `[tool.nbwipers]`.
If you use `nbwipers.toml` or `.nbwipers.toml`, the configuration needs to be at the top level.

For example you can use `extra-keys` to specify additional notebook elements you want to ignore.
If you don't need the python version or the details about the Jupyter Kernel, you can include the following in your `pyproject.toml` file:

```toml
[tool.nbwipers]
extra-keys = ["metadata.kernelspec", "metadata.language_info.version"]
```

The equivalent for `nbwipers.toml` or `.nbwipers.toml` is just

```toml
extra-keys = ["metadata.kernelspec", "metadata.language_info.version"]
```

This can be useful when collaborating, as the precise python version and the name assigned to the kernel are ephemeral and can change from person to person.

## Testing Coverage

To test coverage, use the command:

```shell
cargo tarpaulin -o stdout -o html -o lcov --engine llvm
```

Using the `llvm` engine means that integration tests contribute to coverage.

## Acknowledgements

nbwipers relies on inspiration and code from several projects.
For the projects, whose code was used please see [`LICENSE`](LICENSE) for the third-party notices.

### [nbstripout](https://github.com/kynan/nbstripout)

> strip output from Jupyter and IPython notebooks

nbstripout is an invaluable tool for working with Jupyter Notebooks in the context of version control.
This project forms the basis of the interface and logic of this project and is also the source of the testing examples.

### [nbstripout-fast](https://github.com/deshaw/nbstripout-fast)

> A much faster version of nbstripout by writing it in rust (of course).

nbstripout-fast, like this project, implements the functionality of nbstripout in Rust, while also allowing repo-level configuration in a YAML file.

With nbwipers I hoped to recreate the idea of nbstripout-fast, but with the ability to install as a git filter, and configuration via `pyproject.toml`.

### [ruff](https://github.com/astral-sh/ruff)

> An extremely fast Python linter and code formatter, written in Rust.

Ruff is quickly becoming *the* linter for python code, thanks to its performance, extensive set of rules and its ease of use.
It was a definite source of knowledge for the organisation of the configuration and the file discovery.
The schema for Jupyter Notebooks, and some of the file discovery code was adapted from Ruff.


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/felixgwilliams/nbwipers",
    "name": "nbwipers",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "python, notebook, jupyter, ci, pre-commit",
    "author": null,
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/5b/f6/476aeedef6771f0cc62ada37b7b7fd85cb83b1533f3ec1fcabfff3f9aa0d/nbwipers-0.3.7.tar.gz",
    "platform": null,
    "description": "# nbwipers\n\n![Test](https://github.com/felixgwilliams/nbwipers/actions/workflows/testing.yml/badge.svg)\n[![License:MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![PyPI - Version](https://img.shields.io/pypi/v/nbwipers)](https://pypi.org/project/nbwipers/)\n[![Crates.io](https://img.shields.io/crates/v/nbwipers)](https://crates.io/crates/nbwipers)\n[![Conda](https://img.shields.io/conda/v/conda-forge/nbwipers)](https://anaconda.org/conda-forge/nbwipers)\n[![codecov](https://codecov.io/gh/felixgwilliams/nbwipers/graph/badge.svg?token=PLGJFNRHSQ)](https://codecov.io/gh/felixgwilliams/nbwipers)\n\nnbwipers is a command line tool to wipe clean jupyter notebooks, written in Rust.\n\nThe interface and functionality are based on [nbstripout](https://github.com/kynan/nbstripout) and the idea to implement it in rust comes from [nbstripout-fast](https://github.com/deshaw/nbstripout-fast).\n\n## Usage\n\nnbwipers has a few subcommands that provide functionality related to cleaning Jupyter notebooks.\n\n- `clean`: clean a single notebook. This is more-or-less equivalent to `nbstripout`.\n- `check`: check notebooks in a given path for elements that would be removed by `clean`. This could be used in a CI context to enforce clean notebooks.\n- `clean-all` clean all notebooks in a given path. This one should be used carefully!\n- `install` register nbwipers as a git filter for `ipynb` files. Equivalent to `nbstripout --install`\n- `uninstall` remove nbwipers as a git filter.\n- `check-install` check that `nbwipers` or `nbstripout` is installed in the local repo. This is used in the pre-commit hook.\n\nThe full options can be found in [`CommandLineHelp.md`](CommandLineHelp.md).\n\n### Examples\n\nTo set up nbwipers as a git filter in your repository, use\n\n```shell\nnbwipers install local\n```\n\nIf this step is performed on a pre-existing repo, you can `touch` your notebooks so that git can detect the changes.\nIn bash:\n\n```bash\nfor f in $(git ls-files '*.ipynb'); do touch $f; done\n```\n\nTo check the notebooks in your folder, you can run the following\n\n```shell\nnbwipers check .\n```\n\n### pre-commit\n\nYou can add the following to your `pre-commit-config.yaml` file to ensure that `nbwipers` or `nbstripout` is installed in your repo, in order to prevent Jupyter notebook outputs from being committed to version control.\n\n```yaml\n  - repo: https://github.com/felixgwilliams/nbwipers-pre-commit\n    rev: v0.3.4\n    hooks:\n      - id: nbwipers-check-install\n```\n\nAlternatively, you can use the URL for this repo in your config, but this will compile `nbwipers` from source, rather than retrieving the binary from PyPI, and is therefore not recommended.\n\nIf you are using your pre-commit configuration as part of CI, you should set the environment variable `NBWIPERS_CHECK_INSTALL_EXIT_ZERO` which forces this check to pass, since you do not need `nbwipers` configured in your CI environment.\n\n## Motivation\n\nA working copy of a Jupyter notebook contains:\n\n1. Code written by the author.\n2. Notebook outputs: tables, logs, tracebacks, images, widgets and so on...\n3. Execution counts.\n4. Metadata, such as whether cells are collapsed, scrollable etc.\n\nOf these categories of data, only the first — code written by the author — should definitely be tracked by version control, since it is the product of the author's intention and hard work.\nThe other categories of data are subject to change outside of the explicit intentions of the author and are generally noisy from a version control perspective.\n\nMoreover, including notebook outputs in version control\n\n- makes diffs harder to interpret, as they will contain lots of unintended changes.\n- increases the risk of a tricky merge conflict if different users run the same cell and get a slightly different result.\n- increases the amount of data committed, which can degrade repository performance.\n- risks leaking sensitive data.\n\nAn effective way to ensure you do not commit problematic parts of your notebooks is to use `nbwipers` or `nbstripout` as a git filter.\n\nA git filter sits between your actual files and what git sees when you stage and commit your changes.\nThis way, git only sees the transformed version of the file without the problematic elements.\nAt the same time, you do not have to lose them from your local copy.\n\nAn exception is when you checkout a branch or do a git pull, which results in changes to the notebook.\nIn this case, your local copy will be replaced by the clean version and you will lose your cell outputs.\n\n## Configuration\n\nConfiguration is currently done via the `tool.nbwipers` section of the `pyproject.toml` file.\nMost of the command line options can be set per-project in the `pyproject.toml`, `nbwipers.toml` or `.nbwipers.toml` file.\nIf you use `pyroject.toml`, you need to put the configuration under `[tool.nbwipers]`.\nIf you use `nbwipers.toml` or `.nbwipers.toml`, the configuration needs to be at the top level.\n\nFor example you can use `extra-keys` to specify additional notebook elements you want to ignore.\nIf you don't need the python version or the details about the Jupyter Kernel, you can include the following in your `pyproject.toml` file:\n\n```toml\n[tool.nbwipers]\nextra-keys = [\"metadata.kernelspec\", \"metadata.language_info.version\"]\n```\n\nThe equivalent for `nbwipers.toml` or `.nbwipers.toml` is just\n\n```toml\nextra-keys = [\"metadata.kernelspec\", \"metadata.language_info.version\"]\n```\n\nThis can be useful when collaborating, as the precise python version and the name assigned to the kernel are ephemeral and can change from person to person.\n\n## Testing Coverage\n\nTo test coverage, use the command:\n\n```shell\ncargo tarpaulin -o stdout -o html -o lcov --engine llvm\n```\n\nUsing the `llvm` engine means that integration tests contribute to coverage.\n\n## Acknowledgements\n\nnbwipers relies on inspiration and code from several projects.\nFor the projects, whose code was used please see [`LICENSE`](LICENSE) for the third-party notices.\n\n### [nbstripout](https://github.com/kynan/nbstripout)\n\n> strip output from Jupyter and IPython notebooks\n\nnbstripout is an invaluable tool for working with Jupyter Notebooks in the context of version control.\nThis project forms the basis of the interface and logic of this project and is also the source of the testing examples.\n\n### [nbstripout-fast](https://github.com/deshaw/nbstripout-fast)\n\n> A much faster version of nbstripout by writing it in rust (of course).\n\nnbstripout-fast, like this project, implements the functionality of nbstripout in Rust, while also allowing repo-level configuration in a YAML file.\n\nWith nbwipers I hoped to recreate the idea of nbstripout-fast, but with the ability to install as a git filter, and configuration via `pyproject.toml`.\n\n### [ruff](https://github.com/astral-sh/ruff)\n\n> An extremely fast Python linter and code formatter, written in Rust.\n\nRuff is quickly becoming *the* linter for python code, thanks to its performance, extensive set of rules and its ease of use.\nIt was a definite source of knowledge for the organisation of the configuration and the file discovery.\nThe schema for Jupyter Notebooks, and some of the file discovery code was adapted from Ruff.\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Wipe clean your Jupyter Notebooks!",
    "version": "0.3.7",
    "project_urls": {
        "Homepage": "https://github.com/felixgwilliams/nbwipers",
        "Source Code": "https://github.com/felixgwilliams/nbwipers"
    },
    "split_keywords": [
        "python",
        " notebook",
        " jupyter",
        " ci",
        " pre-commit"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e2e4fb6f7766003ba72455efdd1994ab62fbfae48d3fec6ca02bc43cca7d5d9b",
                "md5": "74818f2c4df24d276daea004f7f7570a",
                "sha256": "5415fee9179e85483493bad16aaec74ac7cfafd14386692cdb0b486dd6e7816a"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7-py3-none-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "74818f2c4df24d276daea004f7f7570a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 1981768,
            "upload_time": "2024-06-11T19:39:38",
            "upload_time_iso_8601": "2024-06-11T19:39:38.903707Z",
            "url": "https://files.pythonhosted.org/packages/e2/e4/fb6f7766003ba72455efdd1994ab62fbfae48d3fec6ca02bc43cca7d5d9b/nbwipers-0.3.7-py3-none-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "640de36b6a0793ca4d940b26033eb83c8068305402950bd733816d2b63a3647b",
                "md5": "34b7846791388b37ec7109364a8e6aa9",
                "sha256": "50137c218a2ac4466e6979103cdfabd4849908733d0e030fd9010fed87984426"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7-py3-none-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "34b7846791388b37ec7109364a8e6aa9",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 1903886,
            "upload_time": "2024-06-11T19:39:41",
            "upload_time_iso_8601": "2024-06-11T19:39:41.385078Z",
            "url": "https://files.pythonhosted.org/packages/64/0d/e36b6a0793ca4d940b26033eb83c8068305402950bd733816d2b63a3647b/nbwipers-0.3.7-py3-none-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f9a431b6ab99eac3d0c784ad08f6d9d81e80194e2597a901ba9b17d3eb6b8384",
                "md5": "3ddfd5a49731ed0381d9eb3c65304d68",
                "sha256": "f706105891cf2729d608c602960aed46a75d9118dd288682db913bc34b40ace0"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "3ddfd5a49731ed0381d9eb3c65304d68",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 2835174,
            "upload_time": "2024-06-11T19:39:43",
            "upload_time_iso_8601": "2024-06-11T19:39:43.786889Z",
            "url": "https://files.pythonhosted.org/packages/f9/a4/31b6ab99eac3d0c784ad08f6d9d81e80194e2597a901ba9b17d3eb6b8384/nbwipers-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e47246bc3dd1c0a5ee75e0fab300b1aa5453d445c0b191efe01b7132ac263cbf",
                "md5": "fe010af8a803f07e5ebc5dd51fcc3e0b",
                "sha256": "974124711490709e4c303c12fd19d3db680c6c866c24adb1de79f99878607388"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "fe010af8a803f07e5ebc5dd51fcc3e0b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 2774490,
            "upload_time": "2024-06-11T19:39:46",
            "upload_time_iso_8601": "2024-06-11T19:39:46.505857Z",
            "url": "https://files.pythonhosted.org/packages/e4/72/46bc3dd1c0a5ee75e0fab300b1aa5453d445c0b191efe01b7132ac263cbf/nbwipers-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "616e0634f18fa23e30f3275c8dd187e4dc9c2c24687c4134dd82f2655e04d236",
                "md5": "f795cd88d4f933cef1d91abd9995a5fa",
                "sha256": "ddeab5fcd933722dd5a74a28e5d90e9ddde37c8820087350de17c936b0a8aa0b"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "f795cd88d4f933cef1d91abd9995a5fa",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 3022543,
            "upload_time": "2024-06-11T19:39:48",
            "upload_time_iso_8601": "2024-06-11T19:39:48.671630Z",
            "url": "https://files.pythonhosted.org/packages/61/6e/0634f18fa23e30f3275c8dd187e4dc9c2c24687c4134dd82f2655e04d236/nbwipers-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8fe2445d2f066636d8a8c1519e0d48d2e6971a14f4393e86acbbe497a001e98a",
                "md5": "4d1d3e009f7d814140914020d7cc83c2",
                "sha256": "3aca53ed16b0bca1ee20322a447bcbe3cda7115688b30c625e00b380e98f13af"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "4d1d3e009f7d814140914020d7cc83c2",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 2970469,
            "upload_time": "2024-06-11T19:39:51",
            "upload_time_iso_8601": "2024-06-11T19:39:51.249075Z",
            "url": "https://files.pythonhosted.org/packages/8f/e2/445d2f066636d8a8c1519e0d48d2e6971a14f4393e86acbbe497a001e98a/nbwipers-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fe204d47c63d6683422e1519570acdccb232e4f132373607a38db4be302eacf5",
                "md5": "b18dc4f637542e6be250a834c5a8cb1a",
                "sha256": "9e6c7c92f7893435285b08e68b35d6b1b5988dc80b4612fdc415f06fdafa5896"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "has_sig": false,
            "md5_digest": "b18dc4f637542e6be250a834c5a8cb1a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 3133902,
            "upload_time": "2024-06-11T19:39:53",
            "upload_time_iso_8601": "2024-06-11T19:39:53.696589Z",
            "url": "https://files.pythonhosted.org/packages/fe/20/4d47c63d6683422e1519570acdccb232e4f132373607a38db4be302eacf5/nbwipers-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "19565b53774830f270d72cd8a3b89a3e7c267728a8e4f7c0b4bd81414a29cd8b",
                "md5": "50b39af98062e87337086869a9a28285",
                "sha256": "01bb76057e415a7fc3685f3113eeaa5b6000dac4a3335599ac6dffb2951c3c7f"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "50b39af98062e87337086869a9a28285",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 2882111,
            "upload_time": "2024-06-11T19:39:56",
            "upload_time_iso_8601": "2024-06-11T19:39:56.089456Z",
            "url": "https://files.pythonhosted.org/packages/19/56/5b53774830f270d72cd8a3b89a3e7c267728a8e4f7c0b4bd81414a29cd8b/nbwipers-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "19b5652fcebb0bd20270f464ce8fc15fdbedc345047d7b58788c1ec976a2620d",
                "md5": "4d74cd9498cde12267cde924e5b703d1",
                "sha256": "25228ce07033e57af08b491f5c8389e20fad9166ce04396e241740742cb9ecb7"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7-py3-none-win32.whl",
            "has_sig": false,
            "md5_digest": "4d74cd9498cde12267cde924e5b703d1",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 1552159,
            "upload_time": "2024-06-11T19:39:58",
            "upload_time_iso_8601": "2024-06-11T19:39:58.048808Z",
            "url": "https://files.pythonhosted.org/packages/19/b5/652fcebb0bd20270f464ce8fc15fdbedc345047d7b58788c1ec976a2620d/nbwipers-0.3.7-py3-none-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d8a43747d89cb6e12115332aa28002d396e7393f1ab8361d3388c302cb509091",
                "md5": "79728b857fc2eb15058d2ceb802f1773",
                "sha256": "d94f2bdf060b9c0d9f280de74db6eab4fff962265d73d2c6f1ae7d29792b1614"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7-py3-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "79728b857fc2eb15058d2ceb802f1773",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 1676144,
            "upload_time": "2024-06-11T19:40:00",
            "upload_time_iso_8601": "2024-06-11T19:40:00.665165Z",
            "url": "https://files.pythonhosted.org/packages/d8/a4/3747d89cb6e12115332aa28002d396e7393f1ab8361d3388c302cb509091/nbwipers-0.3.7-py3-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5bf6476aeedef6771f0cc62ada37b7b7fd85cb83b1533f3ec1fcabfff3f9aa0d",
                "md5": "49d76e54e9140b8308581f0ce0f10a15",
                "sha256": "0a33f6731f20b1f983a4dce3ce8387f5f1aed7eabc2398758bd85a3f680ab030"
            },
            "downloads": -1,
            "filename": "nbwipers-0.3.7.tar.gz",
            "has_sig": false,
            "md5_digest": "49d76e54e9140b8308581f0ce0f10a15",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 50530,
            "upload_time": "2024-06-11T19:40:02",
            "upload_time_iso_8601": "2024-06-11T19:40:02.480075Z",
            "url": "https://files.pythonhosted.org/packages/5b/f6/476aeedef6771f0cc62ada37b7b7fd85cb83b1533f3ec1fcabfff3f9aa0d/nbwipers-0.3.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-06-11 19:40:02",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "felixgwilliams",
    "github_project": "nbwipers",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "nbwipers"
}
        
Elapsed time: 0.28069s