Automatically mock your HTTP interactions to simplify and speed up testing

Overview

VCR.py 📼

PyPI Python versions Build Status Code Coverage Status Join the chat at https://gitter.im/kevin1024/vcrpy Code Style: black


vcr.py logo

This is a Python version of Ruby's VCR library.

Source code
https://github.com/kevin1024/vcrpy
Documentation
https://vcrpy.readthedocs.io/

Rationale

VCR.py simplifies and speeds up tests that make HTTP requests. The first time you run code that is inside a VCR.py context manager or decorated function, VCR.py records all HTTP interactions that take place through the libraries it supports and serializes and writes them to a flat file (in yaml format by default). This flat file is called a cassette. When the relevant piece of code is executed again, VCR.py will read the serialized requests and responses from the aforementioned cassette file, and intercept any HTTP requests that it recognizes from the original test run and return the responses that corresponded to those requests. This means that the requests will not actually result in HTTP traffic, which confers several benefits including:

  • The ability to work offline
  • Completely deterministic tests
  • Increased test execution speed

If the server you are testing against ever changes its API, all you need to do is delete your existing cassette files, and run your tests again. VCR.py will detect the absence of a cassette file and once again record all HTTP interactions, which will update them to correspond to the new API.

Usage with Pytest

There is a library to provide some pytest fixtures called pytest-recording https://github.com/kiwicom/pytest-recording

License

This library uses the MIT license. See LICENSE.txt for more details

Comments
  • Feature/new matchers

    Feature/new matchers

    Hi,

    I did the update for the #71 as promised. This merge request introduces backward incompatibility with old cassettes, but I think it's worth it.

    Improvements which I think should be done:

    1. url matcher could be removed on on favor of uri . (I left just for backward compatibility)
    2. ~~More integration and unit test should be added (I will do this after discussion of this pull request)~~ done.

    Looking forward for review. Max

    enhancement in progress 
    opened by mshytikov 47
  • Drop support for EOL Python 2.6 and 3.3

    Drop support for EOL Python 2.6 and 3.3

    Fixes #338.

    Also removes redundant code that was required to maintain support for Python 2.6.

    Here's the pip installs for vcrpy-unittest from PyPI for the last month (via pypinfo --percent --pip vcrpy-unittest pyversion) showing nothing for Python 2.6 or 3.3.

    | python_version | percent | download_count | | -------------- | ------: | -------------: | | 2.7 | 47.5% | 699 | | 3.6 | 43.7% | 643 | | 3.5 | 4.8% | 70 | | 3.4 | 4.0% | 59 |

    Also includes @samuelfekete's CI fixes from 36b5162 to (mostly) get the CI green! Thanks! (I would have cherry-picked that commit but git couldn't find it.)

    opened by hugovk 38
  • vcrpy doesn't work under django?

    vcrpy doesn't work under django?

    I'm trying to use vcrpy to accelerate the execution of my django application test suite. I'm using django 1.7 on Mac, with Python 2.7.

    I added the following couple of lines to one of my tests:

         import vcr
         with vcr.use_cassette('recording.yaml'):
    

    The result is an import error:

        import vcr
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/__init__.py", line 2, in <module>
        from .config import VCR
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/config.py", line 6, in <module>
        from .cassette import Cassette
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/cassette.py", line 12, in <module>
        from .patch import CassettePatcherBuilder
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/patch.py", line 8, in <module>
        from .stubs import VCRHTTPConnection, VCRHTTPSConnection
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/stubs/__init__.py", line 9, in <module>
        from six.moves.http_client import (
    ImportError: No module named http_client
    

    The problematic code in stubs/init.py is :

    import six
    from six.moves.http_client import (
        HTTPConnection,
        HTTPSConnection,
        HTTPMessage,
        HTTPResponse,
    )
    

    This code seems to run fine when I'm just running it from a plain python console, but it results in the above ImportError under django.

    ready 
    opened by roy2006 34
  • Adding support for boto3

    Adding support for boto3

    boto3 bundles the requests library, so this basically is a copy and paste of the requests stubbing.

    I'm a little lost in the testing of this, with some guidance and/or help I could complete this.

    opened by dedsm 27
  • add httpx support

    add httpx support

    This PR adds support for httpx.

    The stub and tests are heavily based in the aiohttp implementation. You won't see any synchronous implementation because it was not necessary.

    Not sure if I edited the tox file correctly. (:

    opened by herdigiorgi 22
  • Upgrading to 1.6.0 seems conditional extra_require are not working on setup

    Upgrading to 1.6.0 seems conditional extra_require are not working on setup

    I receive this error when i upgraded to 1.6.0:

    Traceback (most recent call last):
      File "run_tests.py", line 14, in <module>
        from tests.app_login_tests import MainSiteTest  # noqa
      File "/my_app/tests/app_login_tests.py", line 7, in <module>
        from vcr_setup import vcrlib
      File "/my_app/tests/vcr_setup.py", line 1, in <module>
        import vcr
      File "/usr/local/lib/python2.7/dist-packages/vcr/__init__.py", line 2, in <module>
        from .config import VCR
      File "/usr/local/lib/python2.7/dist-packages/vcr/config.py", line 8, in <module>
        from .compat import collections
      File "/usr/local/lib/python2.7/dist-packages/vcr/compat.py", line 4, in <module>
        import mock
    ImportError: No module named mock
    

    Looking at the commits i think this new conditionals imports are not working https://github.com/kevin1024/vcrpy/commit/41949f7dc64a2ddb8a9c2cb845eac7bb8b94380b#diff-2eeaed663bd0d25b7e608891384b7298R36 i'm installing the package using pip im on python 2.7.

    opened by ialex 21
  • Handle PEP 479 with backward compat for python2.7

    Handle PEP 479 with backward compat for python2.7

    PEP479 renders the _handle_generator function of CassetteContextDecorator object erroneous in python3.7. Yet, we can't rely properly on yield from as python2.7 compat is still mandatory. Try to find a good balance between these two facts

    @graingert is it better for you?

    This would close #396

    bug need dev 
    opened by P-EB 20
  • use_cassette as decorator fails to pass unknown kwargs, pytest important

    use_cassette as decorator fails to pass unknown kwargs, pytest important

    usage requires edited conftest and execute with py.test --template FOO

    conftest.py

    import pytest
    @pytest.fixture
    def template(request):
        return request.config.getoption("--template")
    
    def pytest_addoption(parser):
        parser.addoption("--template", action="store",type='string',
                         help="set the name of the template to use in tests")
    

    test.py

    import vcr
    import pytest
    @vcr.use_cassette('test_vapp_find.yaml')
    def test_vapp_find(self, template):
            assert template == FOO
    

    usage:

    py.test -s test.py --template FOO

    suggested fix

    config.py

    # pass kwargs we dont know about merged_config = dict(kwargs.items() + merged_config.items())
    return Cassette.load(path, **merged_config)
    
    #cassette.py::Cassette.init
    **kwargs
    ):
    super(Cassette,self).init(**kwargs)
    
    opened by suederat 18
  • Error with body matcher for json, xmlrpc and form urlencoded

    Error with body matcher for json, xmlrpc and form urlencoded

    This is a tricky issue I encountered when using the body matcher on xmlrpc requests.

    Symptoms: Sometimes the request won't match, sometimes it will, and this only affects certain requests. This occurs on Python 3.4 and I believe other python 3 versions but not on 2.7

    Cause: An XMLRPC request has a body with XML inside which is generated from the parameters passed to the function call. Some parameters can be of dict type. xmlrpclib (or xmlrpc.client) will loop over items of the dict and generate the appropriate XML which will be the body of our POST request. Now items order is not guaranteed in dict and the behavior changed in python 3 such that the order of the same dict can change anytime and is not more or less constant on the same computer as in python 2. So the generated XML won't be necessarily the same as the one you recorded.

    Fix suggestion: A custom xmlrpc body matcher that takes that into account and will compare the struct XML elements in the correct order.

    The gzip compression didn't help me debuging this as I couldn't even read directly the cassettes...

    opened by Diaoul 17
  • Make request.headers always a CaseInsensitiveDict.

    Make request.headers always a CaseInsensitiveDict.

    Previously request.headers was a normal dict (albeit with the request.add_header interface) which meant that some code paths would do case-sensitive matching, for example remove_post_data_parameters which tests for 'Content-Type'. This change allows all code paths to get the same case-insensitive treatment.

    Additionally request.headers becomes a property to enforce upgrading it to a CaseInsensitiveDict even if assigned.

    opened by agriffis 16
  • Drop support for legacy Python 2.7

    Drop support for legacy Python 2.7

    Fixes #434.

    Python 2.7 reaches EOL on 2020-01-01. Many projects are pledging to drop support before or during 2020: https://python3statement.org/

    It's also relatively little used. Here's the pip installs for vcrpy from PyPI for May 2019:

    | category | percent | downloads | |----------|--------:|----------:| | 3.6 | 37.19% | 65,506 | | 3.7 | 26.36% | 46,432 | | 2.7 | 21.83% | 38,445 | | 3.5 | 11.53% | 20,303 | | 3.4 | 2.48% | 4,361 | | null | 0.31% | 553 | | 3.8 | 0.29% | 503 | | 3.3 | 0.01% | 14 | | Total | | 176,117 |

    Source: pypistats python_minor vcrpy --last-month # pip install pypistats

    There's one bit of six remaining in this PR, what's the best way to replace this?

        def test_case(self, predicate=None):
            predicate = predicate or self.is_test_method
            return six.with_metaclass(auto_decorate(self.use_cassette, predicate))
    
    opened by hugovk 15
  • Route requests to different cassette files depending on host

    Route requests to different cassette files depending on host

    I have various hosts that I need to hit for a unit test. I'd like to be able to route the responses from each host to its own specific cassette file. The documentation does not appear to show an example of how to do this. Is there a recommended way of doing this?

    opened by Jasonca2 0
  • build(deps): bump actions/checkout from 3.1.0 to 3.2.0

    build(deps): bump actions/checkout from 3.1.0 to 3.2.0

    Bumps actions/checkout from 3.1.0 to 3.2.0.

    Release notes

    Sourced from actions/checkout's releases.

    v3.2.0

    What's Changed

    New Contributors

    Full Changelog: https://github.com/actions/checkout/compare/v3...v3.2.0

    Changelog

    Sourced from actions/checkout's changelog.

    Changelog

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies github_actions 
    opened by dependabot[bot] 1
  • Improved message on CannotOverwriteExistingCassetteException with no failed matchers

    Improved message on CannotOverwriteExistingCassetteException with no failed matchers

    Context

    Per discussion here: Originally posted by @salomvary in https://github.com/kevin1024/vcrpy/issues/533#issuecomment-1269519939

    CannotOverwriteExistingCassetteException can be raised along with 'no matchers failed' as the message details.

    In many cases, setting vcr.allow_playback_repeats for the affected test will clear the issue.

    Proposal

    Update the error handler to recognize this corner case and emit a message encouraging developers to consider whether they need to set vcr.allow_playback_repeats

    opened by edthedev 0
  • Question! Using VCR mechanics to record queries to sql database.

    Question! Using VCR mechanics to record queries to sql database.

    Does anyone know if there are any libraries that would allow to record and play queries to sql database? I don't per-see any obstacles in implementation. The question is does it even makes sense in terms of test speed improvement?

    opened by igor-polynets 2
  • POSTing binary data as bytes or bytearray instead of BytesIO breaks assumptions baked into replace_post_data_parameters

    POSTing binary data as bytes or bytearray instead of BytesIO breaks assumptions baked into replace_post_data_parameters

    This sequence https://github.com/kevin1024/vcrpy/blob/f3f66086a149722812345aaf1bb304ff39d105ef/vcr/filters.py#L110-L116 assumes that anything that isn't a BytesIO or dict or with content-type json that is splittable by b"=" can be UTF-8 decoded. But any random unlucky binary data is likely to have a b"=" somewhere in it, and, if passed in as a raw byte array instead of a BytesIO, it then chokes that decode with 'utf-8' codec can't decode...blah blah blah if the user has defined filter_post_data_parameters for their recorder.

    The BytesIO check in https://github.com/kevin1024/vcrpy/blob/f3f66086a149722812345aaf1bb304ff39d105ef/vcr/filters.py#L86 is insufficient for preventing exceptions from trying to decode binary data.

    opened by fiendish 0
Releases(v4.2.1)
  • v4.2.1(Aug 31, 2022)

    • Fix a bug where the first request in a redirect chain was not being recorded with aiohttp
    • Various typos and small fixes, thanks @jairhenrique, @timgates42
    Source code(tar.gz)
    Source code(zip)
  • v4.2.0(Jun 29, 2022)

    • Drop support for python < 3.7, thanks @jairhenrique, @IvanMalison, @AthulMuralidhar
    • Various aiohttp bigfixes (thanks @pauloromeira and boechat107)
    • Bugfix: filter_post_data_parameters not working with aiohttp. Thank you @vprakashplanview, @scop, @jairhenrique, and @cinemascop89
    • Bugfix: Some random misspellings (thanks @scop)
    • Migrate the CI suite to Github Actions from Travis (thanks @jairhenrique and @cclauss)
    • Various documentation and code misspelling fixes (thanks @scop and @Justintime50)
    • Bugfix: httpx support (select between allow_redirects/follow_redirects) (thanks @immerrr)
    Source code(tar.gz)
    Source code(zip)
  • v4.1.1(Oct 9, 2020)

    • Fix HTTPX support for versions greater than 0.15 (thanks @jairhenrique)
    • Include a trailing newline on json cassettes (thanks @AaronRobson)
    Source code(tar.gz)
    Source code(zip)
  • v4.1.0(Jul 31, 2020)

    • 4.1.0
      • Add support for httpx!! (thanks @herdigiorgi)
      • Add the new allow_playback_repeats option (thanks @tysonholub)
      • Several aiohttp improvements (cookie support, multiple headers with same key) (Thanks @pauloromeira)
      • Use enums for record modes (thanks @aaronbannin)
      • Bugfix: Do not redirect on 304 in aiohttp (Thanks @royjs)
      • Bugfix: Fix test suite by switching to mockbin (thanks @jairhenrique)
    Source code(tar.gz)
    Source code(zip)
  • v4.0.2(Dec 20, 2019)

  • v4.0.1(Dec 20, 2019)

  • v4.0.0(Dec 20, 2019)

  • v3.0.0(Dec 14, 2019)

    v3.0.0

    • This release is a breaking change as it changes how aiohttp follows redirects and your cassettes may need to be re-recorded with this update.
    • Fix multiple requests being replayed per single request in aiohttp stub #495 (@nickdirienzo)
    • Add support for request_info on mocked responses in aiohttp stub #495 (@nickdirienzo)
    • doc: fixed variable name (a -> cass) in an example for rewind #492 (@yarikoptic)
    Source code(tar.gz)
    Source code(zip)
  • v2.1.1(Nov 3, 2019)

    • 2.1.1
    • Format code with black (@neozenith)
    • Use latest pypy3 in Travis (@hugovk)
    • Improve documentation about custom matchers (@gward)
    • Fix exception when body is empty (@keithprickett)
    • Add pytest-recording to the documentation as an alternative Pytest plugin (@Stranger6667)
    • Fix yarl and python3.5 version issue (@neozenith)
    • Fix header matcher for boto3 - fixes #474 (@simahawk)
    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Aug 8, 2019)

    v2.1.0

    Updates

    • Add a rewind method to reset a cassette (thanks @khamidou)
    • New error message with more details on why the cassette failed to play a request (thanks @arthurHamon2, @neozenith)
    • Handle connect tunnel URI (thanks @jeking3)
    • Add code coverage to the project (thanks @neozenith)
    • Drop support to python 3.4
    • Add deprecation warning on python 2.7, next major release will drop python 2.7 support

    Fixes

    • Fix build problems on requests tests (thanks to @dunossauro)
    • Fix matching on 'body' failing when Unicode symbols are present in them (thanks @valgur)
    • Fix bugs on aiohttp integration (thanks @graingert, @steinnes, @stj, @lamenezes, @lmazuel)
    • Fix Biopython incompatibility (thanks @rishab121)
    • Fix Boto3 integration (thanks @1oglop1, @arthurHamon2)
    Source code(tar.gz)
    Source code(zip)
  • v2.0.0(Sep 19, 2018)

    • Support python 3.7 (fix httplib2 and urllib2, thanks @felixonmars)
    • [#356] Fixes before_record_response so the original response isn't changed (thanks @kgraves)
    • Fix requests stub when using proxy (thanks @samuelfekete @daneoshiga)
    • (only for aiohttp stub) Drop support to python 3.4 asyncio.coroutine (aiohttp doesn't support python it anymore)
    • Fix aiohttp stub to work with aiohttp client (thanks @stj)
    • Fix aiohttp stub to accept content type passed
    • Improve docs (thanks @adamchainz)
    Source code(tar.gz)
    Source code(zip)
  • v1.13.0(Jul 13, 2018)

    • Fix support to latest aiohttp version (3.3.2).
    • Fix content-type bug in aiohttp stub.
    • Properly save URL with query params properly when using aiohttp.
    Source code(tar.gz)
    Source code(zip)
  • v1.12.0(May 21, 2018)

    • Fix support to latest aiohttp version (3.2.1)
    • Adapted setup to PEP508
    • Support binary responses on aiohttp
    • Dropped support for EOL python versions (2.6 and 3.3)
    Source code(tar.gz)
    Source code(zip)
  • v1.11.1(May 28, 2017)

  • v1.11.0(May 2, 2017)

    Allow injection of persistence methods + bugfixes (thanks @j-funk and @IvanMalison) Support python 3.6 + CI tests (thanks @derekbekoe and @graingert) Support pytest-asyncio coroutines (thanks @graingert)

    Source code(tar.gz)
    Source code(zip)
  • v1.10.5(Jan 12, 2017)

    • Added a fix to httplib2 (thanks @carlosds730)
    • Fix an issue with aiohttp (thanks @madninja)
    • Add missing requirement yarl (thanks @lamenezes),
    • Remove duplicate mock triple (thanks @FooBarQuaxx)
    Source code(tar.gz)
    Source code(zip)
  • v1.10.1(Sep 12, 2016)

  • v1.10.0(Aug 14, 2016)

  • v1.9.0(Jul 16, 2016)

    • Add support for boto3 (thanks @desdm, @foorbarna).
    • Fix deepcopy issue for response headers when decode_compressed_response is enabled (thanks @nickdirienzo)
    Source code(tar.gz)
    Source code(zip)
  • v1.7.3(Aug 24, 2015)

    [#188] additional_matchers kwarg on use_casstte. [#191] Actually support passing multiple before_record_request functions (thanks @agriffis).

    Source code(tar.gz)
    Source code(zip)
  • v1.7.2(Aug 19, 2015)

  • v1.7.1(Aug 12, 2015)

  • v1.6.1(Jul 15, 2015)

    [#169] Support conditional requirements in old versions of pip, Fix RST parse errors generated by pandoc, [Tornado] Fix unsupported features exception not being raised, [#166] content-aware body matcher.

    Source code(tar.gz)
    Source code(zip)
  • v1.6.0(Jul 3, 2015)

    [#120] Tornado support (thanks @abhinav), [#147] packaging fixes (thanks @graingert), [#158] allow filtering post params in requests (thanks @MrJohz), [#140] add xmlrpclib support (thanks @Diaoul).

    Source code(tar.gz)
    Source code(zip)
  • v1.5.2(May 15, 2015)

Owner
Kevin McCarthy
Kevin McCarthy
Python HTTP Server

Python HTTP Server Preview Languange and Code Editor: How to run? Download the zip first. Open the http.py and wait 1-2 seconds. You will see __pycach

SonLyte 16 Oct 21, 2021
The successor to nose, based on unittest2

Welcome to nose2 nose2 is the successor to nose. It's unittest with plugins. nose2 is a new project and does not support all of the features of nose.

738 Jan 09, 2023
An HTTP server to easily download and upload files.

httpsweet An HTTP server to easily download and upload files. It was created with flexibility in mind, allowing be used in many different situations,

Eloy 17 Dec 23, 2022
Meinheld is a high performance asynchronous WSGI Web Server (based on picoev)

What's this This is a high performance python wsgi web server. And Meinheld is a WSGI compliant web server. (PEP333 and PEP3333 supported) You can als

Yutaka Matsubara 1.4k Jan 01, 2023
Radically simplified static file serving for Python web apps

WhiteNoise Radically simplified static file serving for Python web apps With a couple of lines of config WhiteNoise allows your web app to serve its o

Dave Evans 2.1k Jan 08, 2023
No longer maintained, please migrate to model_bakery

Model Mommy: Smart fixtures for better tests IMPORTANT: Model Mommy is no longer maintained and was replaced by Model Bakery. Please, consider migrati

Bernardo Fontes 917 Oct 04, 2022
A screamingly fast Python 2/3 WSGI server written in C.

bjoern: Fast And Ultra-Lightweight HTTP/1.1 WSGI Server A screamingly fast, ultra-lightweight WSGI server for CPython 2 and CPython 3, written in C us

Jonas Haag 2.9k Dec 21, 2022
a socket mock framework - for all kinds of socket animals, web-clients included

mocket /mɔˈkɛt/ A socket mock framework for all kinds of socket animals, web-clients included - with gevent/asyncio/SSL support ...and then MicroPytho

Giorgio Salluzzo 249 Dec 14, 2022
create custom test databases that are populated with fake data

About Generate fake but valid data filled databases for test purposes using most popular patterns(AFAIK). Current support is sqlite, mysql, postgresql

Emir Ozer 2.2k Jan 06, 2023
Waitress - A WSGI server for Python 2 and 3

Waitress Waitress is a production-quality pure-Python WSGI server with very acceptable performance. It has no dependencies except ones which live in t

Pylons Project 1.2k Dec 30, 2022
Let your Python tests travel through time

FreezeGun: Let your Python tests travel through time FreezeGun is a library that allows your Python tests to travel through time by mocking the dateti

Steve Pulec 3.5k Jan 09, 2023
Robyn is an async Python backend server with a runtime written in Rust, btw.

Robyn is an async Python backend server with a runtime written in Rust, btw. Python server running on top of of Rust Async RunTime. Installation

Sanskar Jethi 1.8k Dec 30, 2022
A utility for mocking out the Python Requests library.

Responses A utility library for mocking out the requests Python library. Note Responses requires Python 2.7 or newer, and requests = 2.0 Installing p

Sentry 3.8k Jan 02, 2023
Automatically mock your HTTP interactions to simplify and speed up testing

VCR.py 📼 This is a Python version of Ruby's VCR library. Source code https://github.com/kevin1024/vcrpy Documentation https://vcrpy.readthedocs.io/ R

Kevin McCarthy 2.3k Jan 01, 2023
HTTP client mocking tool for Python - inspired by Fakeweb for Ruby

HTTPretty 1.0.5 HTTP Client mocking tool for Python created by Gabriel Falcão . It provides a full fake TCP socket module. Inspired by FakeWeb Github

Gabriel Falcão 2k Jan 06, 2023
livereload server in python (MAINTAINERS NEEDED)

LiveReload Reload webpages on changes, without hitting refresh in your browser. Installation python-livereload is for web developers who know Python,

Hsiaoming Yang 977 Dec 14, 2022
Green is a clean, colorful, fast python test runner.

Green -- A clean, colorful, fast python test runner. Features Clean - Low redundancy in output. Result statistics for each test is vertically aligned.

Nathan Stocks 756 Dec 22, 2022
Mimesis is a high-performance fake data generator for Python, which provides data for a variety of purposes in a variety of languages.

Mimesis - Fake Data Generator Description Mimesis is a high-performance fake data generator for Python, which provides data for a variety of purposes

Isaak Uchakaev 3.8k Jan 01, 2023
Sixpack is a language-agnostic a/b-testing framework

Sixpack Sixpack is a framework to enable A/B testing across multiple programming languages. It does this by exposing a simple API for client libraries

1.7k Dec 24, 2022
FastWSGI - An ultra fast WSGI server for Python 3

FastWSGI - An ultra fast WSGI server for Python 3

James Roberts 343 Dec 22, 2022