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
Explain yourself! Interrogate a codebase for docstring coverage.

interrogate: explain yourself Interrogate a codebase for docstring coverage. Why Do I Need This? interrogate checks your code base for missing docstri

Lynn Root 435 Dec 29, 2022
Zero configuration Airflow plugin that let you manage your DAG files.

simple-dag-editor SimpleDagEditor is a zero configuration plugin for Apache Airflow. It provides a file managing interface that points to your dag_fol

null 30 Jul 20, 2022
Run `black` on python code blocks in documentation files

blacken-docs Run black on python code blocks in documentation files. install pip install blacken-docs usage blacken-docs provides a single executable

Anthony Sottile 460 Dec 23, 2022
This is a repository for "100 days of code challenge" projects. You can reach all projects from beginner to professional which are written in Python.

100 Days of Code It's a challenge that aims to gain code practice and enhance programming knowledge. Day #1 Create a Band Name Generator It's actually

SelenNB 2 May 12, 2022
Source Code for 'Practical Python Projects' (video) by Sunil Gupta

Apress Source Code This repository accompanies %Practical Python Projects by Sunil Gupta (Apress, 2021). Download the files as a zip using the green b

Apress 2 Jun 1, 2022
Tutorial for STARKs with supporting code in python

stark-anatomy STARK tutorial with supporting code in python Outline: introduction overview of STARKs basic tools -- algebra and polynomials FRI low de

null 121 Jan 3, 2023
Python code for working with NFL play by play data.

nfl_data_py nfl_data_py is a Python library for interacting with NFL data sourced from nflfastR, nfldata, dynastyprocess, and Draft Scout. Includes im

null 82 Jan 5, 2023
A collection and example code of every topic you need to know about in the basics of Python.

The Python Beginners Guide: Master The Python Basics Tonight This guide is a collection of every topic you need to know about in the basics of Python.

Ahmed Baari 1 Dec 19, 2021
Quick tutorial on orchest.io that shows how to build multiple deep learning models on your data with a single line of code using python

Deep AutoViML Pipeline for orchest.io Quickstart Build Deep Learning models with a single line of code: deep_autoviml Deep AutoViML helps you build te

Ram Seshadri 6 Oct 2, 2022
Some of the best ways and practices of doing code in Python!

Pythonicness ❤ This repository contains some of the best ways and practices of doing code in Python! Features Properly formatted codes (PEP 8) for bet

Samyak Jain 2 Jan 15, 2022
Example Python code for running the mango-explorer marketmaker

?? Mango Explorer ?? Introduction This guide will show you how to load and run a customisable marketmaker that runs on Mango Markets using the mango-e

Blockworks Foundation 2 Apr 11, 2022
The source code that powers readthedocs.org

Welcome to Read the Docs Purpose Read the Docs hosts documentation for the open source community. It supports Sphinx docs written with reStructuredTex

Read the Docs 7.4k Dec 25, 2022
Documentation of the QR code found on new Austrian ID cards.

Austrian ID Card QR Code This document aims to be a complete documentation of the format used in the QR area on the back of new Austrian ID cards (Per

Gabriel Huber 9 Dec 12, 2022
Automated generation of real Swagger/OpenAPI 2.0 schemas from Django REST Framework code.

drf-yasg - Yet another Swagger generator Generate real Swagger/OpenAPI 2.0 specifications from a Django Rest Framework API. Compatible with Django Res

Cristi Vîjdea 3k Dec 31, 2022
Żmija is a simple universal code generation tool.

Żmija Żmija is a simple universal code generation tool. It is intended to be used as a means to generate code that is both efficient and easily mainta

Adrian Samoticha 2 Nov 23, 2021
Automatic links from code examples to reference documentation

sphinx-codeautolink Automatic links from Python code examples to reference documentation at the flick of a switch! sphinx-codeautolink analyses the co

Felix Hildén 41 Dec 17, 2022
Portfolio project for Code Institute Full Stack software development course.

Comic Sales tracker This project is the third milestone project for the Code Institute Diploma in Full Stack Software Development. You can see the fin

null 1 Jan 10, 2022
Show Rubygems description and annotate your code right from Sublime Text.

Gem Description for Sublime Text Show Rubygems description and annotate your code. Just mouse over your Gemfile's gem definitions to show the popup. s

Nando Vieira 2 Dec 19, 2022
Some code that takes a pipe-separated input and converts that into a table!

tablemaker A program that takes an input: a | b | c # With comments as well. e | f | g h | i |jk And converts it to a table: ┌───┬───┬────┐ │ a │ b │

CodingSoda 2 Aug 30, 2022