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
  • build(deps): bump actions/checkout from 3.1.0 to 3.3.0

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

    Bumps actions/checkout from 3.1.0 to 3.3.0.

    Release notes

    Sourced from actions/checkout's releases.

    v3.3.0

    What's Changed

    New Contributors

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

    v3.2.0

    What's Changed

    New Contributors

    Full Changelog: https://github.com/actions/checkout/compare/v3.1.0...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] 0
  • Add an option to remove unused requests from cassette

    Add an option to remove unused requests from cassette

    This PR adds an option to remove previously recorded interactions if they are not used. I believe this feature can address the issue discussed in #208. We don't need to focus on ignoring all requests in the cassette file, but instead, we can write to file only replayed interactions and new ones. If no previous request is used, VCR will save only new interactions.

    There is a similar feature (merged, but not released) in Ruby VCR.

    opened by danielnsilva 0
  • 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
  • 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
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
Kent - Fake Sentry server for local development, debugging, and integration testing

Kent is a service for debugging and integration testing Sentry.

Will Kahn-Greene 100 Dec 15, 2022
A Demo of Feishu automation testing framework

FeishuAutoTestDemo This is a automation testing framework which use Feishu as an example. Execute runner.py to run. Technology Web UI Test pytest + se

2 Aug 19, 2022
MongoDB panel for the Flask Debug Toolbar

Flask Debug Toolbar MongoDB Panel Info: An extension panel for Rob Hudson's Django Debug Toolbar that adds MongoDB debugging information Author: Harry

Cenk Altı 4 Dec 11, 2019
automate the procedure of 403 response code bypass

403bypasser automate the procedure of 403 response code bypass Description i notice a lot of #bugbountytips describe how to bypass 403 response code s

smackerdodi2 40 Dec 16, 2022
Docker-based integration tests

Docker-based integration tests Description Simple pytest fixtures that help you write integration tests with Docker and docker-compose. Specify all ne

Avast 326 Dec 27, 2022
Declarative HTTP Testing for Python and anything else

Gabbi Release Notes Gabbi is a tool for running HTTP tests where requests and responses are represented in a declarative YAML-based form. The simplest

Chris Dent 139 Sep 21, 2022
The Social-Engineer Toolkit (SET) repository from TrustedSec - All new versions of SET will be deployed here.

💼 The Social-Engineer Toolkit (SET) 💼 Copyright 2020 The Social-Engineer Toolkit (SET) Written by: David Kennedy (ReL1K) @HackingDave Company: Trust

trustedsec 8.4k Dec 31, 2022
Auto-hms-action - Automation of NU Health Management System

🦾 Automation of NU Health Management System 🤖 長崎大学 健康管理システムの自動化 🏯 Usage / 使い方

k5-mot 3 Mar 04, 2022
It's a simple script to generate a mush on code forces, the script will accept the public problem urls only or polygon problems.

Codeforces-Sheet-Generator It's a simple script to generate a mushup on code forces, the script will accept the public problem urls only or polygon pr

Ahmed Hossam 10 Aug 02, 2022
Code for "SUGAR: Subgraph Neural Network with Reinforcement Pooling and Self-Supervised Mutual Information Mechanism"

SUGAR Code for "SUGAR: Subgraph Neural Network with Reinforcement Pooling and Self-Supervised Mutual Information Mechanism" Overview train.py: the cor

41 Nov 08, 2022
RAT-el is an open source penetration test tool that allows you to take control of a windows machine.

To prevent RATel from being detected by antivirus, please do not upload the payload to TOTAL VIRUS. Each month I will test myself if the payload gets detected by antivirus. So you’ll have a photo eve

218 Dec 16, 2022
MultiPy lets you conveniently keep track of your python scripts for personal use or showcase by loading and grouping them into categories. It allows you to either run each script individually or together with just one click.

MultiPy About MultiPy is a graphical user interface built using Dear PyGui Python GUI Framework that lets you conveniently keep track of your python s

56 Oct 29, 2022
PyBuster A directory busting tool for web application penetration tester, written in python

PyBuster A directory busting tool for web application penetration tester, written in python. Supports custom wordlist,recursive search. Screenshots Pr

Anukul Pandey 4 Jan 30, 2022
Webscreener is a tool for mass web domains pentesting.

Webscreener is a tool for mass web domains pentesting. It is used to take snapshots for domains that is generated by a tool like knockpy or Sublist3r. It cuts out most of the pentesting time by scree

Seekurity 3 Jun 07, 2021
Django test runner using nose

django-nose django-nose provides all the goodness of nose in your Django tests, like: Testing just your apps by default, not all the standard ones tha

Jazzband 880 Dec 15, 2022
A library for generating fake data and populating database tables.

Knockoff Factory A library for generating mock data and creating database fixtures that can be used for unit testing. Table of content Installation Ch

Nike Inc. 30 Sep 23, 2022
PyAutoEasy is a extension / wrapper around the famous PyAutoGUI, a cross-platform GUI automation tool to replace your boooring repetitive tasks.

PyAutoEasy PyAutoEasy is a extension / wrapper around the famous PyAutoGUI, a cross-platform GUI automation tool to replace your boooring repetitive t

Dingu Sagar 7 Oct 27, 2022
A toolbar overlay for debugging Flask applications

Flask Debug-toolbar This is a port of the excellent django-debug-toolbar for Flask applications. Installation Installing is simple with pip: $ pip ins

863 Dec 29, 2022
Pytest modified env

Pytest plugin to fail a test if it leaves modified os.environ afterwards.

wemake.services 7 Sep 11, 2022
Auto Click by pyautogui and excel operations.

Auto Click by pyautogui and excel operations.

Janney 2 Dec 21, 2021