slipcover


Nameslipcover JSON
Version 1.0.10 PyPI version JSON
download
home_pagehttps://github.com/plasma-umass/slipcover
SummaryNear Zero-Overhead Python Code Coverage
upload_time2024-04-24 20:44:39
maintainerNone
docs_urlNone
authorJuan Altmayer Pizzorno, Emery Berger
requires_python<3.14,>=3.8
licenseApache License 2.0
keywords coverage testing
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ![slipcover](https://github.com/plasma-umass/slipcover/raw/main/docs/slipcover-logo.png)

# SlipCover: Near Zero-Overhead Python Code Coverage
by [Juan Altmayer Pizzorno](https://jaltmayerpizzorno.github.io) and [Emery Berger](https://emeryberger.com)
at UMass Amherst's [PLASMA lab](https://plasma-umass.org/).

[![license](https://img.shields.io/github/license/plasma-umass/slipcover?color=blue)](https://github.com/plasma-umass/slipcover/blob/v1.0.10/LICENSE)
[![pypi](https://img.shields.io/pypi/v/slipcover?color=blue)](https://pypi.org/project/slipcover/)
[![Downloads](https://static.pepy.tech/badge/slipcover)](https://pepy.tech/project/slipcover)
![pyversions](https://img.shields.io/pypi/pyversions/slipcover)
![tests](https://github.com/jaltmayerpizzorno/slipcover/workflows/tests/badge.svg)

## About Slipcover
SlipCover is a fast [code coverage](https://en.wikipedia.org/wiki/Code_coverage) tool.
It tracks a Python program as it runs and reports on the parts that executed and
those that didn't.
That can help guide your testing (showing code that isn't being tested), debugging,
[fuzzing](https://en.wikipedia.org/wiki/Fuzzing) or to find "dead" code.

Past code coverage tools can make programs significantly slower;
it is not uncommon for them to take twice as long to execute.
SlipCover aims to provide the same information with **near-zero overhead**, often 
almost as fast as running the original Python program.

### How it works
Previous coverage tools like [Coverage.py](https://github.com/nedbat/coveragepy) rely on 
[Python's tracing facilities](https://docs.python.org/3/library/sys.html?highlight=settrace#sys.settrace),
which add significant overhead.
Instead, SlipCover uses just-in-time instrumentation and de-instrumentation.
When SlipCover gathers coverage information, it modifies the program's Python byte codes,
inserting instructions that let it keep track the lines executed by the program.
As the program executes, SlipCover gradually removes instrumentation that
is no longer needed, allowing those parts to run at full speed.
Care is taken throughout SlipCover to keep things as efficient as possible.
On Python 3.12, rather than rewrite bytecode, SlipCover uses the new
[`sys.monitoring`](https://docs.python.org/3.12/library/sys.monitoring.html) API
to collect coverage information.


### Performance
<img src="https://github.com/plasma-umass/slipcover/blob/v1.0.10/benchmarks/cpython.png?raw=True" align="right" width="65%"/>
<img src="https://github.com/plasma-umass/slipcover/blob/v1.0.10/benchmarks/pypy.png?raw=True" align="right" width="65%"/>

[//]: # (CPython-range)
The first image on the right shows SlipCover's [speedup](https://en.wikipedia.org/wiki/Speedup),
ranging from 1.1x to 3.4x, in relation to [Coverage.py](https://github.com/nedbat/coveragepy), running on
[CPython 3.10.5](https://github.com/python/cpython).

The first two benchmarks are the test suites for [scikit-learn](https://scikit-learn.org/stable/)
and [Flask](https://flask.palletsprojects.com/);
"sudoku" runs [Peter Norvig's Sudoku solver](http://norvig.com/sudoku.html)
while the others were derived from the 
[Python Benchmark Suite](https://github.com/python/pyperformance).

More "Python-intensive" programs such as sudoku and those from the benchmark
suite (with a larger proportion of execution time spent in Python, rather than in native code)
generate more tracing events, causing more overhead in Coverage.py.
While each program's structure can affect SlipCover's ability to de-instrument,
its running time stays relatively close to the original.

[//]: # (PyPy-range)
On [PyPy 3.9](https://pypy.org), the speedup ranges from 2.1x to 104.9x.
Since it is so high for some of the benchmarks, we plot it on a logarithmic scale (see the second image on the right).

In a proof-of-concept integration with a property-based testing package,
SlipCover sped up coverage-based testing 22x.

### Accuracy
We verified SlipCover's accuracy against [Coverage.py](https://github.com/nedbat/coveragepy)
and against a [simple script](https://github.com/plasma-umass/slipcover/blob/v1.0.10/tools/oracle.py) of our own that collects coverage using Python tracing.
We found SlipCover's results to be accurate, in fact, in certain cases [more accurate](https://github.com/nedbat/coveragepy/issues/1358).

## Getting started
SlipCover is available from [PyPI](https://pypi.org/project/slipcover).
You can install it like any other Python module with
```console
pip3 install slipcover
```

You could then run your Python script with:
```console
python3 -m slipcover myscript.py
```

### Using it with a test harness
SlipCover can also execute a Python module, as in:
```console
python3 -m slipcover -m pytest -x -v
```
which starts `pytest`, passing it any options (`-x -v` in this example)
after the module name.
No plug-in is required for pytest.

## Usage example
```console
$ python3 -m slipcover -m pytest
================================================================ test session starts ================================================================
platform darwin -- Python 3.9.12, pytest-7.1.2, pluggy-1.0.0
rootdir: /Users/juan/project/wally/d2k-5, configfile: pytest.ini
plugins: hypothesis-6.39.3, mock-3.7.0, repeat-0.9.1, doctestplus-0.12.0, arraydiff-0.5.0
collected 439 items                                                                                                                                 

tests/box_test.py .........................                                                                                                   [  5%]
tests/image_test.py ...............                                                                                                           [  9%]
tests/network_equivalence_test.py .........................................s................................................................. [ 33%]
..............................................................................                                                                [ 51%]
tests/network_test.py ....................................................................................................................... [ 78%]
...............................................................................................                                               [100%]

=================================================== 438 passed, 1 skipped, 62 warnings in 48.43s ====================================================

File                                 #lines    #miss    Cover%  Lines missing
---------------------------------  --------  -------  --------  ------------------------
d2k/__init__.py                           3        0       100
d2k/box.py                              105       27        74  73, 142-181
d2k/image.py                             38        4        89  70-73
d2k/network.py                          359        1        99  236
tests/box_test.py                       178        0       100
tests/darknet.py                        132       11        91  146, 179-191
tests/image_test.py                      45        0       100
tests/network_equivalence_test.py       304       30        90  63, 68, 191-215, 455-465
tests/network_test.py                   453        0       100
$ 
```
As can be seen in the coverage report, d2k lacks some coverage, especially in
its `box.py` and `image.py` components.

## Platforms
Our GitHub workflows run the automated test suite on Linux, MacOS and Windows, but
really it should work anywhere where CPython/PyPy does.

## Contributing
SlipCover is under active development; contributions are welcome!
Please also feel free to [create a new issue](https://github.com/jaltmayerpizzorno/slipcover/issues/new)
with any suggestions or issues you may encounter.

## Technical Information
For more details about how SlipCover works please see the following paper, published at [ISSTA'23](https://conf.researchr.org/home/issta-2023): [SlipCover: Near Zero-Overhead Code Coverage for Python](https://arxiv.org/pdf/2305.02886).

# Acknowledgements

Logo design by [Sophia Berger](https://www.linkedin.com/in/sophia-berger/).

This material is based upon work supported by the National Science
Foundation under Grant No. 1955610. Any opinions, findings, and
conclusions or recommendations expressed in this material are those of
the author(s) and do not necessarily reflect the views of the National
Science Foundation.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/plasma-umass/slipcover",
    "name": "slipcover",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<3.14,>=3.8",
    "maintainer_email": null,
    "keywords": "coverage testing",
    "author": "Juan Altmayer Pizzorno, Emery Berger",
    "author_email": "juan@altmayer.com, emery@cs.umass.edu",
    "download_url": "https://files.pythonhosted.org/packages/35/b3/88e3b753010670b18f0a0cc8049b0f977630e8007e6c913a8775ced304ae/slipcover-1.0.10.tar.gz",
    "platform": null,
    "description": "![slipcover](https://github.com/plasma-umass/slipcover/raw/main/docs/slipcover-logo.png)\n\n# SlipCover: Near Zero-Overhead Python Code Coverage\nby [Juan Altmayer Pizzorno](https://jaltmayerpizzorno.github.io) and [Emery Berger](https://emeryberger.com)\nat UMass Amherst's [PLASMA lab](https://plasma-umass.org/).\n\n[![license](https://img.shields.io/github/license/plasma-umass/slipcover?color=blue)](https://github.com/plasma-umass/slipcover/blob/v1.0.10/LICENSE)\n[![pypi](https://img.shields.io/pypi/v/slipcover?color=blue)](https://pypi.org/project/slipcover/)\n[![Downloads](https://static.pepy.tech/badge/slipcover)](https://pepy.tech/project/slipcover)\n![pyversions](https://img.shields.io/pypi/pyversions/slipcover)\n![tests](https://github.com/jaltmayerpizzorno/slipcover/workflows/tests/badge.svg)\n\n## About Slipcover\nSlipCover is a fast [code coverage](https://en.wikipedia.org/wiki/Code_coverage) tool.\nIt tracks a Python program as it runs and reports on the parts that executed and\nthose that didn't.\nThat can help guide your testing (showing code that isn't being tested), debugging,\n[fuzzing](https://en.wikipedia.org/wiki/Fuzzing) or to find \"dead\" code.\n\nPast code coverage tools can make programs significantly slower;\nit is not uncommon for them to take twice as long to execute.\nSlipCover aims to provide the same information with **near-zero overhead**, often \nalmost as fast as running the original Python program.\n\n### How it works\nPrevious coverage tools like [Coverage.py](https://github.com/nedbat/coveragepy) rely on \n[Python's tracing facilities](https://docs.python.org/3/library/sys.html?highlight=settrace#sys.settrace),\nwhich add significant overhead.\nInstead, SlipCover uses just-in-time instrumentation and de-instrumentation.\nWhen SlipCover gathers coverage information, it modifies the program's Python byte codes,\ninserting instructions that let it keep track the lines executed by the program.\nAs the program executes, SlipCover gradually removes instrumentation that\nis no longer needed, allowing those parts to run at full speed.\nCare is taken throughout SlipCover to keep things as efficient as possible.\nOn Python 3.12, rather than rewrite bytecode, SlipCover uses the new\n[`sys.monitoring`](https://docs.python.org/3.12/library/sys.monitoring.html) API\nto collect coverage information.\n\n\n### Performance\n<img src=\"https://github.com/plasma-umass/slipcover/blob/v1.0.10/benchmarks/cpython.png?raw=True\" align=\"right\" width=\"65%\"/>\n<img src=\"https://github.com/plasma-umass/slipcover/blob/v1.0.10/benchmarks/pypy.png?raw=True\" align=\"right\" width=\"65%\"/>\n\n[//]: # (CPython-range)\nThe first image on the right shows SlipCover's [speedup](https://en.wikipedia.org/wiki/Speedup),\nranging from 1.1x to 3.4x, in relation to [Coverage.py](https://github.com/nedbat/coveragepy), running on\n[CPython 3.10.5](https://github.com/python/cpython).\n\nThe first two benchmarks are the test suites for [scikit-learn](https://scikit-learn.org/stable/)\nand [Flask](https://flask.palletsprojects.com/);\n\"sudoku\" runs [Peter Norvig's Sudoku solver](http://norvig.com/sudoku.html)\nwhile the others were derived from the \n[Python Benchmark Suite](https://github.com/python/pyperformance).\n\nMore \"Python-intensive\" programs such as sudoku and those from the benchmark\nsuite (with a larger proportion of execution time spent in Python, rather than in native code)\ngenerate more tracing events, causing more overhead in Coverage.py.\nWhile each program's structure can affect SlipCover's ability to de-instrument,\nits running time stays relatively close to the original.\n\n[//]: # (PyPy-range)\nOn [PyPy 3.9](https://pypy.org), the speedup ranges from 2.1x to 104.9x.\nSince it is so high for some of the benchmarks, we plot it on a logarithmic scale (see the second image on the right).\n\nIn a proof-of-concept integration with a property-based testing package,\nSlipCover sped up coverage-based testing 22x.\n\n### Accuracy\nWe verified SlipCover's accuracy against [Coverage.py](https://github.com/nedbat/coveragepy)\nand against a [simple script](https://github.com/plasma-umass/slipcover/blob/v1.0.10/tools/oracle.py) of our own that collects coverage using Python tracing.\nWe found SlipCover's results to be accurate, in fact, in certain cases [more accurate](https://github.com/nedbat/coveragepy/issues/1358).\n\n## Getting started\nSlipCover is available from [PyPI](https://pypi.org/project/slipcover).\nYou can install it like any other Python module with\n```console\npip3 install slipcover\n```\n\nYou could then run your Python script with:\n```console\npython3 -m slipcover myscript.py\n```\n\n### Using it with a test harness\nSlipCover can also execute a Python module, as in:\n```console\npython3 -m slipcover -m pytest -x -v\n```\nwhich starts `pytest`, passing it any options (`-x -v` in this example)\nafter the module name.\nNo plug-in is required for pytest.\n\n## Usage example\n```console\n$ python3 -m slipcover -m pytest\n================================================================ test session starts ================================================================\nplatform darwin -- Python 3.9.12, pytest-7.1.2, pluggy-1.0.0\nrootdir: /Users/juan/project/wally/d2k-5, configfile: pytest.ini\nplugins: hypothesis-6.39.3, mock-3.7.0, repeat-0.9.1, doctestplus-0.12.0, arraydiff-0.5.0\ncollected 439 items                                                                                                                                 \n\ntests/box_test.py .........................                                                                                                   [  5%]\ntests/image_test.py ...............                                                                                                           [  9%]\ntests/network_equivalence_test.py .........................................s................................................................. [ 33%]\n..............................................................................                                                                [ 51%]\ntests/network_test.py ....................................................................................................................... [ 78%]\n...............................................................................................                                               [100%]\n\n=================================================== 438 passed, 1 skipped, 62 warnings in 48.43s ====================================================\n\nFile                                 #lines    #miss    Cover%  Lines missing\n---------------------------------  --------  -------  --------  ------------------------\nd2k/__init__.py                           3        0       100\nd2k/box.py                              105       27        74  73, 142-181\nd2k/image.py                             38        4        89  70-73\nd2k/network.py                          359        1        99  236\ntests/box_test.py                       178        0       100\ntests/darknet.py                        132       11        91  146, 179-191\ntests/image_test.py                      45        0       100\ntests/network_equivalence_test.py       304       30        90  63, 68, 191-215, 455-465\ntests/network_test.py                   453        0       100\n$ \n```\nAs can be seen in the coverage report, d2k lacks some coverage, especially in\nits `box.py` and `image.py` components.\n\n## Platforms\nOur GitHub workflows run the automated test suite on Linux, MacOS and Windows, but\nreally it should work anywhere where CPython/PyPy does.\n\n## Contributing\nSlipCover is under active development; contributions are welcome!\nPlease also feel free to [create a new issue](https://github.com/jaltmayerpizzorno/slipcover/issues/new)\nwith any suggestions or issues you may encounter.\n\n## Technical Information\nFor more details about how SlipCover works please see the following paper, published at [ISSTA'23](https://conf.researchr.org/home/issta-2023): [SlipCover: Near Zero-Overhead Code Coverage for Python](https://arxiv.org/pdf/2305.02886).\n\n# Acknowledgements\n\nLogo design by [Sophia Berger](https://www.linkedin.com/in/sophia-berger/).\n\nThis material is based upon work supported by the National Science\nFoundation under Grant No. 1955610. Any opinions, findings, and\nconclusions or recommendations expressed in this material are those of\nthe author(s) and do not necessarily reflect the views of the National\nScience Foundation.\n",
    "bugtrack_url": null,
    "license": "Apache License 2.0",
    "summary": "Near Zero-Overhead Python Code Coverage",
    "version": "1.0.10",
    "project_urls": {
        "Homepage": "https://github.com/plasma-umass/slipcover"
    },
    "split_keywords": [
        "coverage",
        "testing"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fe04c66302d425aa7794a393627f8e17511eddd60604a81f6b0413fb1a8c03ff",
                "md5": "12753a07eb4c21ed8430ac11a7bb8f9c",
                "sha256": "b50090b88bd4359e332295a70ea0e0b0c24a182d71a37b9c293d5f349b60c95a"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp310-cp310-macosx_13_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "12753a07eb4c21ed8430ac11a7bb8f9c",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": "<3.14,>=3.8",
            "size": 41781,
            "upload_time": "2024-04-24T20:45:20",
            "upload_time_iso_8601": "2024-04-24T20:45:20.091050Z",
            "url": "https://files.pythonhosted.org/packages/fe/04/c66302d425aa7794a393627f8e17511eddd60604a81f6b0413fb1a8c03ff/slipcover-1.0.10-cp310-cp310-macosx_13_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6186071773a8f2188ee3d32709dbb3608bef8969b69970015cd24613ce390613",
                "md5": "ec77390207c8075a9e66f11c1570d2dd",
                "sha256": "2e43f688a5968487f84dd76b3005c654b02f6243534238676855f3bb4e0ef517"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ec77390207c8075a9e66f11c1570d2dd",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": "<3.14,>=3.8",
            "size": 52777,
            "upload_time": "2024-04-24T20:45:01",
            "upload_time_iso_8601": "2024-04-24T20:45:01.300807Z",
            "url": "https://files.pythonhosted.org/packages/61/86/071773a8f2188ee3d32709dbb3608bef8969b69970015cd24613ce390613/slipcover-1.0.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "64c252124ee8a5d8383517e09e11114da76022dd4d9fc81589a0b91bcc0efb77",
                "md5": "9d5f66c2c038ba30afac205cb39fcf7f",
                "sha256": "52c2fc7044b4638c488bf03bb7961f8e8021159068bdc378a1f63d529f447d1b"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "9d5f66c2c038ba30afac205cb39fcf7f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": "<3.14,>=3.8",
            "size": 88158,
            "upload_time": "2024-04-24T20:46:13",
            "upload_time_iso_8601": "2024-04-24T20:46:13.349638Z",
            "url": "https://files.pythonhosted.org/packages/64/c2/52124ee8a5d8383517e09e11114da76022dd4d9fc81589a0b91bcc0efb77/slipcover-1.0.10-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "265065692ede26fff0a6177e2ae95a4e729ab985d4d7514bfe374aa622adac76",
                "md5": "c506db20aea227770a8b05d5e02abfe0",
                "sha256": "93d36fe9641472c6b81e33b80a667032c58be42ca4f1120c96a7fdd1dd57d8b2"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp311-cp311-macosx_13_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "c506db20aea227770a8b05d5e02abfe0",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": "<3.14,>=3.8",
            "size": 41696,
            "upload_time": "2024-04-24T20:45:21",
            "upload_time_iso_8601": "2024-04-24T20:45:21.945793Z",
            "url": "https://files.pythonhosted.org/packages/26/50/65692ede26fff0a6177e2ae95a4e729ab985d4d7514bfe374aa622adac76/slipcover-1.0.10-cp311-cp311-macosx_13_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9e97f8d3a11749f18391f7b199b21e0a17a201154d4ad62682e7ecd4edbda286",
                "md5": "870ec2e2d1ecade7815632cd02cc5fc8",
                "sha256": "59b5f181c8749b8f370502ab3d3ab902a6f957107e24fbe9905cea927351d037"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "870ec2e2d1ecade7815632cd02cc5fc8",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": "<3.14,>=3.8",
            "size": 52788,
            "upload_time": "2024-04-24T20:45:01",
            "upload_time_iso_8601": "2024-04-24T20:45:01.296592Z",
            "url": "https://files.pythonhosted.org/packages/9e/97/f8d3a11749f18391f7b199b21e0a17a201154d4ad62682e7ecd4edbda286/slipcover-1.0.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5541ae81cd2cb49cf94c93629b2d55fb52f036e882241aca69bfd2fbc9834938",
                "md5": "9de5d05c2b4debf5f711982e82e9bf0e",
                "sha256": "535fe94f6ff4baa6a609843524d918fdfb92b0ae6eb16452745dfacf99c4adea"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "9de5d05c2b4debf5f711982e82e9bf0e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": "<3.14,>=3.8",
            "size": 88155,
            "upload_time": "2024-04-24T20:46:13",
            "upload_time_iso_8601": "2024-04-24T20:46:13.519841Z",
            "url": "https://files.pythonhosted.org/packages/55/41/ae81cd2cb49cf94c93629b2d55fb52f036e882241aca69bfd2fbc9834938/slipcover-1.0.10-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "36be5edcea197e2bc5c1a704b9de859835bac118f457d814403837c52ad64d0d",
                "md5": "c24def446777faad12f93cbd437e3019",
                "sha256": "7cc7e043b643ba49062876472e346bfba380ce9dbb211498fca89685efb1c933"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp38-cp38-macosx_13_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "c24def446777faad12f93cbd437e3019",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": "<3.14,>=3.8",
            "size": 41775,
            "upload_time": "2024-04-24T20:45:46",
            "upload_time_iso_8601": "2024-04-24T20:45:46.609905Z",
            "url": "https://files.pythonhosted.org/packages/36/be/5edcea197e2bc5c1a704b9de859835bac118f457d814403837c52ad64d0d/slipcover-1.0.10-cp38-cp38-macosx_13_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ec87aac9b31207a173635e1d2f69fbb8805ec9df0e54f26b69282d4aa9b422fa",
                "md5": "df456a9d63ec4f3a1a745fe5deb3f77e",
                "sha256": "32cd3a2a01e502fa7d49eb3d723a398834897d8a6c68dae4f278b9b4731ce690"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "df456a9d63ec4f3a1a745fe5deb3f77e",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": "<3.14,>=3.8",
            "size": 53079,
            "upload_time": "2024-04-24T20:46:12",
            "upload_time_iso_8601": "2024-04-24T20:46:12.357435Z",
            "url": "https://files.pythonhosted.org/packages/ec/87/aac9b31207a173635e1d2f69fbb8805ec9df0e54f26b69282d4aa9b422fa/slipcover-1.0.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "435e3c73e430c1c0d2d5c1ec38f57c925599e8f47c686aebdec134c48016a4a3",
                "md5": "5b837afaea788a15586e4f98879fc705",
                "sha256": "afdf33dd56e0d5b5cd65ad26cb8642b440e129ac6ce9e474e88910faf26760ad"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "5b837afaea788a15586e4f98879fc705",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": "<3.14,>=3.8",
            "size": 88194,
            "upload_time": "2024-04-24T20:45:54",
            "upload_time_iso_8601": "2024-04-24T20:45:54.070752Z",
            "url": "https://files.pythonhosted.org/packages/43/5e/3c73e430c1c0d2d5c1ec38f57c925599e8f47c686aebdec134c48016a4a3/slipcover-1.0.10-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ed3011d3b107d707ab96d4046dbb276c345601b2cedcdd2bfb1734b7d8dc88d2",
                "md5": "8cfb337103b279b96a97028ae2e929c6",
                "sha256": "db96b37e24ae7e51f0826bbfdec17eb2233eb3e002f23415c8c3cbfff3642374"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp39-cp39-macosx_13_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "8cfb337103b279b96a97028ae2e929c6",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": "<3.14,>=3.8",
            "size": 41774,
            "upload_time": "2024-04-24T20:45:58",
            "upload_time_iso_8601": "2024-04-24T20:45:58.968515Z",
            "url": "https://files.pythonhosted.org/packages/ed/30/11d3b107d707ab96d4046dbb276c345601b2cedcdd2bfb1734b7d8dc88d2/slipcover-1.0.10-cp39-cp39-macosx_13_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "65b3345b0e585f14e2e85318c039626109bdcb4d7987f8b012e1ce5b411dec7f",
                "md5": "3c041e775f5c9a129fc56d931fae4465",
                "sha256": "04f847e24d214a2abce5b7b2fdca5064e0787251d8f16fd4b53bbc2b51f8d06e"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3c041e775f5c9a129fc56d931fae4465",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": "<3.14,>=3.8",
            "size": 52457,
            "upload_time": "2024-04-24T20:45:03",
            "upload_time_iso_8601": "2024-04-24T20:45:03.640324Z",
            "url": "https://files.pythonhosted.org/packages/65/b3/345b0e585f14e2e85318c039626109bdcb4d7987f8b012e1ce5b411dec7f/slipcover-1.0.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "17280a86487b9e33b3d14e6dc3f1e8db73cbbeeb55f7d444e0ff07a1854dc283",
                "md5": "d9c5e626fe352452f916d4d73b8ef317",
                "sha256": "2b24ecec2d5f74a1fa6c41bdafbc7c345a0b58cac9431dd62dccba6ca8b9a27a"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d9c5e626fe352452f916d4d73b8ef317",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": "<3.14,>=3.8",
            "size": 88195,
            "upload_time": "2024-04-24T20:45:54",
            "upload_time_iso_8601": "2024-04-24T20:45:54.287851Z",
            "url": "https://files.pythonhosted.org/packages/17/28/0a86487b9e33b3d14e6dc3f1e8db73cbbeeb55f7d444e0ff07a1854dc283/slipcover-1.0.10-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b78e1891df05d1b03c0c13e2947082a0c958abf92300046bbfc1c004a783dad0",
                "md5": "c1f15dc4cc9c996b7f9296e667c11c4d",
                "sha256": "614b17040522452347dbd2002f1f0a19423a613e223e996bf6cb75d8d8820314"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "c1f15dc4cc9c996b7f9296e667c11c4d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<3.14,>=3.8",
            "size": 30947,
            "upload_time": "2024-04-24T20:44:37",
            "upload_time_iso_8601": "2024-04-24T20:44:37.656348Z",
            "url": "https://files.pythonhosted.org/packages/b7/8e/1891df05d1b03c0c13e2947082a0c958abf92300046bbfc1c004a783dad0/slipcover-1.0.10-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "35b388e3b753010670b18f0a0cc8049b0f977630e8007e6c913a8775ced304ae",
                "md5": "6a943d56007a3d644e68ad446ee44833",
                "sha256": "cb3ed532c3a4fb666ea6f7a04d595d159004462b253958445734fb1390fda97d"
            },
            "downloads": -1,
            "filename": "slipcover-1.0.10.tar.gz",
            "has_sig": false,
            "md5_digest": "6a943d56007a3d644e68ad446ee44833",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.14,>=3.8",
            "size": 52781,
            "upload_time": "2024-04-24T20:44:39",
            "upload_time_iso_8601": "2024-04-24T20:44:39.729787Z",
            "url": "https://files.pythonhosted.org/packages/35/b3/88e3b753010670b18f0a0cc8049b0f977630e8007e6c913a8775ced304ae/slipcover-1.0.10.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-24 20:44:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "plasma-umass",
    "github_project": "slipcover",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "slipcover"
}
        
Elapsed time: 0.24522s