Near Zero-Overhead Python Code Coverage

Overview

license pypi pyversions tests

Slipcover: Near Zero-Overhead Python Code Coverage

by Juan Altmayer Pizzorno and Emery Berger at UMass Amherst's PLASMA lab.

About Slipcover

Slipcover is a fast 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 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 rely on Python's tracing facilities, 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.

Performance

The image on the right shows the execution time of a few benchmarks. It compares how long they take to run while tracking coverage using Coverage.py and tracking coverage using Slipcover, relative to their normal running times.

The first two benchmarks are the test suites for scikit-learn and Flask; "sudoku" runs Peter Norvig's Sudoku solver while the others were derived from the Python Benchmark Suite.

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, mostly at 5% or less overhead.

Accuracy

We verified Slipcover's accuracy against Coverage.py and against a simple script of our own that collects coverage using Python tracing. We found Slipcover's results to be accurate, in fact, in certain cases more accurate.

Getting started

Slipcover is available from PyPI. You can install it like any other Python module with

pip3 install slipcover

You could then run your Python script with:

python3 -m slipcover myscript.py

Using it with a test harness

Slipcover can also execute a Python module, as in:

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

$ python3 -m slipcover -m pytest --disable-warnings
============================================================================= test session starts ==============================================================================
platform darwin -- Python 3.9.9, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: /Users/juan/project/wally/d2k-5
collected 439 items                                                                                                                                                            

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

================================================================= 438 passed, 1 skipped, 53 warnings in 55.31s =================================================================

File                #lines    #missed    Cover%  Lines missing
----------------  --------  ---------  --------  ---------------------------------------------------------------------------------------------------
d2k/__init__.py          3          0       100
d2k/network.py         359          1       100  236
d2k/box.py             105         27        74  73, 142, 144-146, 148-149, 151, 154, 156-159, 161, 163-166, 168, 170-171, 173-174, 176-177, 180-181
d2k/image.py            38          4        89  70-73
tests/darknet.py       132         11        92  146, 179-181, 183-187, 189, 191
$

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 does.

Contributing

Slipcover is alpha software, and under active development. Please feel free to create a new issue with any suggestions or issues you may encounter.

Acknowledgements

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.

Comments
  • running pytest with slipcover doesn't load plugins (was

    running pytest with slipcover doesn't load plugins (was "doesn't load pytest.ini")

    Running slipcover with pytest as described in the readme doesn't work for me; I think this is because it isn't picking up my pytest.ini file.

    Running python -m pytest works as expected; running python -m slipcover -m pytest errors — I think based on the error I'm getting it's because of the missing configuration from my pytest.ini. (I'm trying it out with a django project, which requires DJANGO_SETTINGS_MODULE to be defined when not running tests through django.)

    When I ran on a project without a pytest.ini file it worked fine.

    bug 
    opened by rlskoeser 12
  • Include pyptr.h in sdist, allow conda build config via CXX env vars.

    Include pyptr.h in sdist, allow conda build config via CXX env vars.

    Minor fixes required for builds under conda.

    • Add pyptr.h to manifest, currently missing from sdist.
    • Fix typo in setup.py extension definitions, extension wasn't being detected as c++.
    opened by asford 9
  • The slipcover.tracker module seems to be unimportable when using the Windows py38 binary wheel on Windows 10

    The slipcover.tracker module seems to be unimportable when using the Windows py38 binary wheel on Windows 10

    I created a new virtualenv using Python 3.8 on Windows 10 and installed slipcover into it, using the wheel from PyPI.

    On running python -m slipcover

    Traceback (most recent call last):
      File "C:\Users\vagrant\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 192, in _run_module_as_main
        return _run_code(code, main_globals, None,
      File "C:\Users\vagrant\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "C:\Users\vagrant\py38\lib\site-packages\slipcover\__main__.py", line 4, in <module>
        from slipcover import slipcover as sc
      File "C:\Users\vagrant\py38\lib\site-packages\slipcover\slipcover.py", line 8, in <module>
        from . import tracker
    ImportError: DLL load failed while importing tracker: The specified module could not be found.
    

    The tracker module exists in the filesystem:

    (py38) PS C:\Users\vagrant> dir .\py38\lib\site-packages\slipcover\
    
    
        Directory: C:\Users\vagrant\py38\lib\site-packages\slipcover
    
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    d-----         4/27/2022  11:17 PM                __pycache__
    -a----         4/27/2022  11:17 PM          27122 slipcover.py
    -a----         4/27/2022  11:17 PM          14848 tracker.pyd
    -a----         4/27/2022  11:17 PM              0 __init__.py
    -a----         4/27/2022  11:17 PM           7287 __main__.py
    
    bug 
    opened by exarkun 9
  • Error installing slipcover with Python 3.11

    Error installing slipcover with Python 3.11

    Hi,

    Trying to install slipcover with pip 22.3.1 and Python 3.11.0 gives an error with the following output:

    $ pip3.11 install slipcover
    Collecting slipcover
      Using cached slipcover-0.2.0.tar.gz (28 kB)
      Preparing metadata (setup.py) ... done
    Requirement already satisfied: tabulate in /usr/local/lib/python3.11/site-packages (from slipcover) (0.9.0)
    Building wheels for collected packages: slipcover
      Building wheel for slipcover (setup.py) ... error
      error: subprocess-exited-with-error
      
      × python setup.py bdist_wheel did not run successfully.
      │ exit code: 1
      ╰─> [20 lines of output]
          running bdist_wheel
          running build
          running build_py
          creating build
          creating build/lib.macosx-11-x86_64-cpython-311
          creating build/lib.macosx-11-x86_64-cpython-311/slipcover
          copying slipcover/slipcover.py -> build/lib.macosx-11-x86_64-cpython-311/slipcover
          copying slipcover/__init__.py -> build/lib.macosx-11-x86_64-cpython-311/slipcover
          copying slipcover/branch.py -> build/lib.macosx-11-x86_64-cpython-311/slipcover
          copying slipcover/bytecode.py -> build/lib.macosx-11-x86_64-cpython-311/slipcover
          copying slipcover/__main__.py -> build/lib.macosx-11-x86_64-cpython-311/slipcover
          running build_ext
          building 'slipcover.tracker' extension
          creating build/temp.macosx-11-x86_64-cpython-311
          clang -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk -I/usr/local/opt/[email protected]/Frameworks/Python.framework/Versions/3.11/include/python3.11 -c tracker.cxx -o build/temp.macosx-11-x86_64-cpython-311/tracker.o -std=c++17 -arch x86_64 -arch arm64 -arch arm64e
          **tracker.cxx:4:10: fatal error: 'pyptr.h' file not found
          #include "pyptr.h"
                   ^~~~~~~~~
          1 error generated.
          error: command '/usr/bin/clang' failed with exit code 1**
          [end of output]
      
      note: This error originates from a subprocess, and is likely not a problem with pip.
      ERROR: Failed building wheel for slipcover
      Running setup.py clean for slipcover
    Failed to build slipcover
    Installing collected packages: slipcover
      Running setup.py install for slipcover ... error
      error: subprocess-exited-with-error
      
      × Running setup.py install for slipcover did not run successfully.
      │ exit code: 1
      ╰─> [22 lines of output]
          running install
          /usr/local/lib/python3.11/site-packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
            warnings.warn(
          running build
          running build_py
          creating build
          creating build/lib.macosx-11-x86_64-cpython-311
          creating build/lib.macosx-11-x86_64-cpython-311/slipcover
          copying slipcover/slipcover.py -> build/lib.macosx-11-x86_64-cpython-311/slipcover
          copying slipcover/__init__.py -> build/lib.macosx-11-x86_64-cpython-311/slipcover
          copying slipcover/branch.py -> build/lib.macosx-11-x86_64-cpython-311/slipcover
          copying slipcover/bytecode.py -> build/lib.macosx-11-x86_64-cpython-311/slipcover
          copying slipcover/__main__.py -> build/lib.macosx-11-x86_64-cpython-311/slipcover
          running build_ext
          building 'slipcover.tracker' extension
          creating build/temp.macosx-11-x86_64-cpython-311
          clang -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk -I/usr/local/opt/[email protected]/Frameworks/Python.framework/Versions/3.11/include/python3.11 -c tracker.cxx -o build/temp.macosx-11-x86_64-cpython-311/tracker.o -std=c++17 -arch x86_64 -arch arm64 -arch arm64e
          **tracker.cxx:4:10: fatal error: 'pyptr.h' file not found
          #include "pyptr.h"
                   ^~~~~~~~~
          1 error generated.
          error: command '/usr/bin/clang' failed with exit code 1**
          [end of output]
      
      note: This error originates from a subprocess, and is likely not a problem with pip.
    error: legacy-install-failure
    
    × Encountered error while trying to install package.
    ╰─> slipcover
    
    note: This is an issue with the package mentioned above, not pip.
    hint: See above for output from the failure.
    

    Looks to be an issue with the slipcover.tracker extension? I'm on macOS Big Sur 11.7.1 if that makes any difference. Let me know if I can provide any further information.

    bug 
    opened by dscrofts 5
  • importing subprocess hits AttributeError

    importing subprocess hits AttributeError

    Using an example test file under Python3.8.10 that only imports subprocess, I see:

    Traceback (most recent call last):
    File "/Users/wandschn/builds/22-2/build/internal/lib/python3.8/runpy.py", line 194, in _run_module_as_main
        return _run_code(code, main_globals, None,
    File "/Users/wandschn/builds/22-2/build/internal/lib/python3.8/runpy.py", line 87, in _run_code
        exec(code, run_globals)
    File "/Users/wandschn/builds/22-2/build/22-2.VE/lib/python3.8/site-packages/slipcover/__main__.py", line 199, in <module>
        exec(code, script_globals)
    File "/Users/wandschn/builds/22-2/build/mmshare-v5.8/tmp.py", line 1, in <module>
        import subprocess
    File "/Users/wandschn/builds/22-2/build/internal/lib/python3.8/subprocess.py", line 64, in <module>
        import msvcrt
    File "<frozen importlib._bootstrap>", line 991, in _find_and_load
    File "<frozen importlib._bootstrap>", line 971, in _find_and_load_unlocked
    File "<frozen importlib._bootstrap>", line 914, in _find_spec
    File "/Users/wandschn/builds/22-2/build/22-2.VE/lib/python3.8/site-packages/slipcover/__main__.py", line 40, in find_spec
        found = f.find_spec(fullname, path, target)
    AttributeError: '_SixMetaPathImporter' object has no attribute 'find_spec'
    

    I'm running on mac, the Python version is 3.8.10. The slipcover version is slipcover==0.1.3.

    bug 
    opened by d-b-w 5
  • ModuleNotFoundError: No module named '_pytest'

    ModuleNotFoundError: No module named '_pytest'

    slipcover seems to have an undeclared dependency on pytest now.

    python -m slipcover run --json --out slipcover.json -m twisted.trial sometestsuite
    

    fails:

    Traceback (most recent call last):
      File "C:\hostedtoolcache\windows\Python\3.9.12\x64\lib\runpy.py", line 197, in _run_module_as_main
        return _run_code(code, main_globals, None,
      File "C:\hostedtoolcache\windows\Python\3.9.12\x64\lib\runpy.py", line 87, in _run_code
        exec(code, run_globals)
      File "C:\hostedtoolcache\windows\Python\3.9.12\x64\lib\site-packages\slipcover\__main__.py", line 153, in <module>
        wrap_pytest()
      File "C:\hostedtoolcache\windows\Python\3.9.12\x64\lib\site-packages\slipcover\__main__.py", line 112, in wrap_pytest
        import _pytest.assertion.rewrite
    ModuleNotFoundError: No module named '_pytest'
    Error: Process completed with exit code 1.
    
    bug 
    opened by exarkun 4
  • pypy support?

    pypy support?

    hi @jaltmayerpizzorno!

    Great project, this is a fun approach! I was wondering whether you would be interested in adding PyPy support? I briefly looked, and there seems not a lot missing: The C extension seems to just work, the only problem is some detail around the way PyPy does builtin functions. If there is interest, I would be happy to open up a pull request to deal with the latter! (if not, feel free to just close the issue)

    opened by cfbolz 3
  • macOS

    macOS "universal" wheel does not contain the Apple Silicon binary

    When I try to install and run slipcover on a M1 Pro Mac, this is what I get:

    $ python3 -m venv venv
    $ venv/bin/pip install slipcover
    Collecting slipcover
      Using cached slipcover-0.1.4-cp310-cp310-macosx_10_15_universal2.whl (22 kB)
    Collecting tabulate
      Using cached tabulate-0.8.9-py3-none-any.whl (25 kB)
    Installing collected packages: tabulate, slipcover
    Successfully installed slipcover-0.1.4 tabulate-0.8.9
    
    $ venv/bin/python -m slipcover
    Traceback (most recent call last):
      File "/Users/pd/.pyenv/versions/3.10.3/lib/python3.10/runpy.py", line 196, in _run_module_as_main
        return _run_code(code, main_globals, None,
      File "/Users/pd/.pyenv/versions/3.10.3/lib/python3.10/runpy.py", line 86, in _run_code
        exec(code, run_globals)
      File "/Users/pd/tmp/venv/lib/python3.10/site-packages/slipcover/__main__.py", line 4, in <module>
        from slipcover import slipcover as sc
      File "/Users/pd/tmp/venv/lib/python3.10/site-packages/slipcover/slipcover.py", line 8, in <module>
        from . import tracker
    ImportError: dlopen(/Users/pd/tmp/venv/lib/python3.10/site-packages/slipcover/tracker.cpython-310-darwin.so, 0x0002): tried: '/Users/pd/tmp/venv/lib/python3.10/site-packages/slipcover/tracker.cpython-310-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e'))
    

    Apparently the slipcover-0.1.4-cp310-cp310-macosx_10_15_universal2.whl wheel is mislabeled and contains only x86 code.

    opened by pietrodn 3
  • `--fail-under` flag as in `coverage`

    `--fail-under` flag as in `coverage`

    Good day, and thank you for this very interesting project!

    I'm going to file a few issues regarding feature parity with coverage, but feel free to do with them as you wish including nothing. :-)

    Or, if you are open to pull requests, I could probably knock at least a few of them out.


    The one big reason that I cannot yet adopt slipcover in my current project is that it is missing --fail-under or some facility like that which fails when the test coverage drops below a certain level.

    I might well have missed this feature in your program of course.

    Here's the documentation: https://coverage.readthedocs.io/en/6.4.4/cmd.html#reporting

    Doesn't seem horrifyingly hard...

    enhancement 
    opened by rec 2
  • Performance numbers for 3.11

    Performance numbers for 3.11

    Not a bug, just a friendly request for more data :slightly_smiling_face:

    On https://pypi.org/project/slipcover/ you show a slowdown due to slipcover in the range 3% to 7%. Does 3.11 show a similar slowdown? And does this mean that tests run with slipcover on 3.11 outperform test without coverage on 3.10?

    opened by markshannon 2
  • Add tox test config.

    Add tox test config.

    Add a basic tox configuration to execute tests against multiple python versions in a local development environment.

    Tox is used to initialize an isolated python environment for tests, including any required external dependencies.

    This config uses tox-conda to support multiple python interpreter versions.


    Possible options:

    • [ ] Add tox notes to README.md contributor instructions.

    • [ ] Convert actions workflows to use tox for different python versions.

    • Add basic tox config for different python versions

    • Remove py311 from tox env list, currently broken

    opened by asford 1
  • Codecov compat?

    Codecov compat?

    I checked the docs, tracker, and https://docs.codecov.com/docs/supported-report-formats docs, and still couldn’t tell if any of the supported output formats (is it currently just json?) are compatible with codecov.io, so thought I’d try asking here. Thanks!

    enhancement 
    opened by jab 1
  • Document features

    Document features

    This tool looks great! I hope to see it continue to improve and reach feature parity with Coverage.py.

    It would be really useful to have each of the features you support explicitly documented, with instructions on how to use them. Currently I feel like I have to dig through the issues and source code to understand what's possible/supported.

    documentation 
    opened by LilyFoote 1
  • Support `coverage`'s `exclude_lines` setting

    Support `coverage`'s `exclude_lines` setting

    I wasn't accurate in a previous issue: this feature is also gating for my project.


    In real-world programs, there are significant quantities of code within otherwise tested files which are deliberately not unit tested due to diminishing returns and finite resources.

    coverage uses the exclude_lines configuration file setting to match lines and scopes not to be included in coverage, usually with a specific comment - docs.

    This is informative when reading code, and it also gives a more useful measure of actual coverage.

    This sounds harder than my previous issues, because of the fact it applies to scopes as well as single lines.


    coverage has a ton of other features, several of which we do use, but IMHO these two are the most important.

    Thanks again for a very promising library!

    enhancement 
    opened by rec 1
  • Read a .rc file!

    Read a .rc file!

    From reading your documentation, you could pretty well read a .coveragerc file as-is, as you've kept the same names (good idea!), though of course many .coveragerc features you don't support.

    enhancement 
    opened by rec 1
  • Functions that are expected to be empty are not empty

    Functions that are expected to be empty are not empty

    I use a library, automat that has some runtime assumptions about whether certain functions have function bodies or not.

    When I run my tests with pytest and coverage, it works as expected:

    $ python -m coverage run -m pytest
    ================================== test session starts ==================================
    platform linux -- Python 3.10.4, pytest-7.1.2, pluggy-1.0.0
    rootdir: /home/di/example
    collected 1 item
    
    test_something.py .                                                               [100%]
    
    =================================== 1 passed in 0.02s ===================================
    

    When I run it with slipcover, it causes these assumptions to fail:

     python -m slipcover -m pytest
    ================================== test session starts ==================================
    platform linux -- Python 3.10.4, pytest-7.1.2, pluggy-1.0.0
    rootdir: /home/di/example
    collected 0 items / 1 error
    
    ======================================== ERRORS =========================================
    __________________________ ERROR collecting test_something.py ___________________________
    test_something.py:1: in <module>
        from foo import Something
    <frozen importlib._bootstrap>:1027: in _find_and_load
        ???
    <frozen importlib._bootstrap>:1006: in _find_and_load_unlocked
        ???
    <frozen importlib._bootstrap>:688: in _load_unlocked
        ???
    ../.pyenv/versions/3.10.4/lib/python3.10/site-packages/slipcover/__main__.py:43: in exec_module
        exec(code, module.__dict__)
    foo.py:4: in <module>
        class Something:
    foo.py:12: in Something
        def some_input(self):
    ../.pyenv/versions/3.10.4/lib/python3.10/site-packages/automat/_methodical.py:376: in decorator
        return MethodicalInput(automaton=self._automaton,
    <attrs generated init automat._methodical.MethodicalInput>:11: in __init__
        __attr_validator_method(self, __attr_method, self.method)
    ../.pyenv/versions/3.10.4/lib/python3.10/site-packages/automat/_methodical.py:166: in assertNoCode
        raise ValueError("function body must be empty")
    E   ValueError: function body must be empty
    ================================ short test summary info ================================
    ERROR test_something.py - ValueError: function body must be empty
    !!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!
    =================================== 1 error in 0.17s ====================================
    
    File                 #lines    #l.miss    Cover%  Missing
    -----------------  --------  ---------  --------  ---------
    foo.py                    8          1        88  15
    test_something.py         3          2        33  3-4
    

    A minimally reproducing example is below

    requirements.txt:

    automat
    coverage
    pytest
    slipcover
    

    foo.py:

    import automat
    
    
    class Something:
        _machine = automat.MethodicalMachine()
    
        @_machine.state(initial=True)
        def some_state(self):
            """Nothing"""
    
        @_machine.input()
        def some_input(self):
            """Nothing"""
    
        some_state.upon(some_input, enter=some_state, outputs=[])
    

    test_something.py:

    from foo import Something
    
    def test_something():
        Something().some_input()
    
    opened by di 1
Releases(v0.2.2)
  • v0.2.2(Dec 14, 2022)

    This release:

    • adds --skip-covered to skip fully (100%) covered files when printing coverage, suggested by @LilyFoote;
    • adds --fail-under T to have Slicover fail with a return code of 2 if the overall coverage is less than T, suggested by @rec;
    • fixes a division by 0 when printing out coverage for empty files on Python 3.11; thank you, @diceroll123!
    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(Nov 21, 2022)

    This release:

    • fixes failing tests with Python 3.11;
    • adds wheels for Python 3.11;
    • adds an experimental option, --immediate, which essentially implements on-stack replacement by ignoring Python's rule that code objects should be immutable. Using it further reduces overhead, as Slipcover need not generate new code objects or update references to it. Use at your own risk... this is really only intended for research purposes;
    • fixes an include file, ironically, not being included into the source distribution;
    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Aug 24, 2022)

    This release:

    • fixes a bug causing Slipcover to move functions' docstrings when doing branch coverage, so that they could no longer be found;
    • advances version to 0.2.0 given the support for branch coverage;
    Source code(tar.gz)
    Source code(zip)
  • v0.1.9(Aug 15, 2022)

    This release:

    • adds branch coverage measuring support to slipcover; simply run it with --branch to get it.
    • adds a "meta" item identify the source of the coverage information, as well as per-file and global summaries to the JSON output (issue #2).
    Source code(tar.gz)
    Source code(zip)
  • v0.1.8(Jun 7, 2022)

    This release:

    • fixes a packaging issue omitting Python 3.11 from classifiers;
    • acknowledges pypy support, contributed by @cfbolz, and actually added in v0.1.7;
    Source code(tar.gz)
    Source code(zip)
  • v0.1.7(Jun 7, 2022)

    This release:

    • adds support for Python 3.11 (technically 3.11.0b3);
    • changes missing lines text formatting to include any non-code lines between missing ones, simplifying output and aligning it with Coverage.py;
    Source code(tar.gz)
    Source code(zip)
  • v0.1.6(May 13, 2022)

    Changes in this release:

    • fixed file filter not being used for modules loaded through pytest, including uninteresting coverage results;
    • simplified statistics gathering, also greatly improving its performance;
    Source code(tar.gz)
    Source code(zip)
  • v0.1.5(May 5, 2022)

  • v0.1.4(May 4, 2022)

    Changes in release:

    • fixed pytest plugins not being loaded, due to a conflict between how Slipcover was manipulating sys.meta_path and importlib.metadata's package detection. Note that some plugins may not yet work (notably, pytest-xdist) -- see #9.
    • added handler for MetaPathFinders that don't implement find_spec;
    Source code(tar.gz)
    Source code(zip)
  • v0.1.3(Apr 29, 2022)

    Changes in this release:

    • Fixed tracker module not always loading with Python 3.8 on Windows, due to Microsoft Studio dependencies;
    • Fixed description links on pypi;
    • Improved Python library path detection (still needs work, though);
    • Fixed missing wheels for Python 3.9 and 3.10;
    Source code(tar.gz)
    Source code(zip)
  • v0.1.2(Apr 27, 2022)

  • v0.1.1(Apr 27, 2022)

    Changes:

    • Slipcover now interposes on pytest, so that you can get coverage results on those files as well;
    • Fixed function finder not finding static and class methods (affected performance, not correctness);
    Source code(tar.gz)
    Source code(zip)
  • v0.1(Apr 21, 2022)

Owner
PLASMA @ UMass
PLASMA @ UMass
A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification)..

apispec A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification). Features Supports th

marshmallow-code 1k Jan 01, 2023
python wrapper for simple-icons

simpleicons Use a wide-range of icons derived from the simple-icons repo in python. Go to their website for a full list of icons. The slug version mus

Sachin Raja 14 Nov 07, 2022
advance python series: Data Classes, OOPs, python

Working With Pydantic - Built-in Data Process ========================== Normal way to process data (reading json file): the normal princiople, it's f

Phung Hưng Binh 1 Nov 08, 2021
epub2sphinx is a tool to convert epub files to ReST for Sphinx

epub2sphinx epub2sphinx is a tool to convert epub files to ReST for Sphinx. It uses Pandoc for converting HTML data inside epub files into ReST. It cr

Nihaal 8 Dec 15, 2022
A system for Python that generates static type annotations by collecting runtime types

MonkeyType MonkeyType collects runtime types of function arguments and return values, and can automatically generate stub files or even add draft type

Instagram 4.1k Jan 07, 2023
Seamlessly integrate pydantic models in your Sphinx documentation.

Seamlessly integrate pydantic models in your Sphinx documentation.

Franz Wöllert 71 Dec 26, 2022
the project for the most brutal and effective language learning technique

- "The project for the most brutal and effective language learning technique" (c) Alex Kay The langflow project was created especially for language le

Alexander Kaigorodov 7 Dec 26, 2021
Main repository for the Sphinx documentation builder

Sphinx Sphinx is a tool that makes it easy to create intelligent and beautiful documentation for Python projects (or other documents consisting of mul

5.1k Jan 04, 2023
A Material Design theme for MkDocs

A Material Design theme for MkDocs Create a branded static site from a set of Markdown files to host the documentation of your Open Source or commerci

Martin Donath 12.3k Jan 04, 2023
Python script to generate Vale linting rules from word usage guidance in the Red Hat Supplementary Style Guide

ssg-vale-rules-gen Python script to generate Vale linting rules from word usage guidance in the Red Hat Supplementary Style Guide. These rules are use

Vale at Red Hat 1 Jan 13, 2022
Near Zero-Overhead Python Code Coverage

Slipcover: Near Zero-Overhead Python Code Coverage by Juan Altmayer Pizzorno and Emery Berger at UMass Amherst's PLASMA lab. About Slipcover Slipcover

PLASMA @ UMass 325 Dec 28, 2022
Documentation and issues for Pylance - Fast, feature-rich language support for Python

Documentation and issues for Pylance - Fast, feature-rich language support for Python

Microsoft 1.5k Dec 29, 2022
The sarge package provides a wrapper for subprocess which provides command pipeline functionality.

Overview The sarge package provides a wrapper for subprocess which provides command pipeline functionality. This package leverages subprocess to provi

Vinay Sajip 14 Dec 18, 2022
Beautiful static documentation generator for OpenAPI/Swagger 2.0

Spectacle The gentleman at REST Spectacle generates beautiful static HTML5 documentation from OpenAPI/Swagger 2.0 API specifications. The goal of Spec

Sourcey 1.3k Dec 13, 2022
Collections of Beautiful Latex Snippets

HandyLatex Collections of Beautiful Latex Snippets Table 👉 Succinct table with bold separation line and gray text %################## Dependencies ##

Xintao 15 Apr 11, 2022
Fast syllable estimation library based on pattern matching.

Syllables: A fast syllable estimator for Python Syllables is a fast, simple syllable estimator for Python. It's intended for use in places where speed

ProseGrinder 26 Dec 14, 2022
Yu-Gi-Oh! Master Duel translation script

Yu-Gi-Oh! Master Duel translation script

715 Jan 08, 2023
A powerful Sphinx changelog-generating extension.

What is Releases? Releases is a Python (2.7, 3.4+) compatible Sphinx (1.8+) extension designed to help you keep a source control friendly, merge frien

Jeff Forcier 166 Dec 29, 2022
DataRisk Detection Learning Resources

DataRisk Detection Learning Resources Data security: Based on the "data-centric security system" position, it generally refers to the entire security

Liao Wenzhe 59 Dec 05, 2022
NetBox plugin for BGP related objects documentation

Netbox BGP Plugin Netbox plugin for BGP related objects documentation. Compatibility This plugin in compatible with NetBox 2.10 and later. Installatio

Nikolay Yuzefovich 133 Dec 27, 2022