A toolbar overlay for debugging Flask applications

Overview

Flask Debug-toolbar

This is a port of the excellent django-debug-toolbar for Flask applications.

https://travis-ci.org/flask-debugtoolbar/flask-debugtoolbar.png?branch=master

Installation

Installing is simple with pip:

$ pip install flask-debugtoolbar

Usage

Setting up the debug toolbar is simple:

from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension

app = Flask(__name__)

# the toolbar is only enabled in debug mode:
app.debug = True

# set a 'SECRET_KEY' to enable the Flask session cookies
app.config['SECRET_KEY'] = '<replace with a secret key>'

toolbar = DebugToolbarExtension(app)

The toolbar will automatically be injected into Jinja templates when debug mode is on. In production, setting app.debug = False will disable the toolbar.

See the documentation for more information.

Comments
  • Fixed scrollbar issues

    Fixed scrollbar issues

    Fixes #181 where the scrollbar would not show on any page other than the sqlalchemy_select.html template. The scroll classname is now properly named and applied throughout all panel templates as flDebugScroll. I've also added a 10px bottom padding to show the end of the inner panel (for aesthetics sake).

    opened by caffeinatedMike 14
  • Python 3 compatibility

    Python 3 compatibility

    Recent updates to Flask and related components have included support for Python 3, and it would be great to be able to use Flask-DebugToolbar in projects running on Python 3. As it stands now, Flask-DebugToolbar must be disabled in such projects in order to run them without errors.

    Are there plans to support Python 3 in the near future?

    opened by justinmayer 13
  • Can't move ProfilerDebugPanel above RequestVarsDebugPanel

    Can't move ProfilerDebugPanel above RequestVarsDebugPanel

    If you reorder DEBUG_TB_PANELS so ProfilerDebugPanel comes before RequestVarsDebugPanel, you'll get an obscure error: AttributeError: 'functools.partial' object has no attribute '__module__'

    This is OK:

    DEBUG_TB_PANELS = [
        'flask_debugtoolbar.panels.request_vars.RequestVarsDebugPanel',
        'flask_debugtoolbar.panels.profiler.ProfilerDebugPanel',
    ]
    

    This is not:

    DEBUG_TB_PANELS = [
        'flask_debugtoolbar.panels.profiler.ProfilerDebugPanel',
        'flask_debugtoolbar.panels.request_vars.RequestVarsDebugPanel',
    ]
    

    Screen Shot 2013-03-08 at 7 41 37 PM

    opened by appsforartists 6
  • memory leak over time

    memory leak over time

    I'm still gathering data, but it appears as though recent flask-debugtoolbar versions cause a memory leak. After I upgraded to Flask and Werkzeug 0.8 I also had to update flask-debugtoolbar from baecf852dda0f5b6c4700fb6deaeda4068b3a19c to current master (45ce65c058a580d80e2ac207689601edef5db24b), I've been noticing memory usage growing on every request made against the server.

    I've disabled my custom panels and the ones from MongoEngine but left TimerDebugPanel, HeaderDebugPanel, RequestVarsDebugPanel, TemplateDebugPanel, LoggingPanel and ProfilerDebugPanel enabled.

    Here is the output from heapy for a run with the debug panel disabled with DEBUG_TB_ENABLED=False. The first set is the total number of objects by type. The second set is the types of the objects that refer to the ones in the front. If you are familiar with heapy, the former is heap() and the latter is heap().byrcsL

    Partition of a set of 202 objects. Total size = 40656 bytes.
     Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
         0     11   5     9224  23      9224  23 dict (no owner)
         1     16   8     8456  21     17680  43 types.FrameType
         2     59  29     5128  13     22808  56 str
         3     30  15     3728   9     26536  65 unicode
         4     16   8     1600   4     28136  69 list
         5      1   0     1048   3     29184  72 dict of flask.ctx.RequestContext
         6      1   0     1048   3     30232  74 dict of flask.wrappers.Request
         7      1   0     1048   3     31280  77 dict of flask.wrappers.Response
         8      1   0     1048   3     32328  80 dict of mimetools.Message
         9      1   0     1048   3     33376  82 dict of werkzeug.routing.MapAdapter
    <35 more rows. Type e.g. '_.more' to view.>
    
    Partition of a set of 202 objects. Total size = 40656 bytes.
     Index  Count   %     Size   % Cumulative  % Referrers by Kind (class / dict of class)
         0     22  11     7912  19      7912  19 types.FrameType
         1     67  33     7736  19     15648  38 dict (no owner)
         2      1   0     3352   8     19000  47 __builtin__.cell, dict of flask.wrappers.Request, dict
                                                 of werkzeug.datastructures.EnvironHeaders,
                                                 types.FrameType
         3     17   8     3136   8     22136  54 list
         4      6   3     1472   4     23608  58 dict of mimetools.Message
         5      2   1     1120   3     24728  61 dict of 0x7fca19073b90
         6      1   0     1048   3     25776  63 flask.ctx.RequestContext
         7      1   0     1048   3     26824  66 flask.wrappers.Request
         8      1   0     1048   3     27872  69 flask.wrappers.Response
         9      1   0     1048   3     28920  71 mimetools.Message
    <41 more rows. Type e.g. '_.more' to view.>
    

    A run with the debug toolbar enabled:

    Partition of a set of 538 objects. Total size = 81920 bytes.
     Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
         0     35   7    20552  25     20552  25 dict (no owner)
         1    135  25    11128  14     31680  39 str
         2    122  23    10472  13     42152  51 tuple
         3     16   3     8208  10     50360  61 types.FrameType
         4     34   6     4064   5     54424  66 unicode
         5     31   6     4024   5     58448  71 list
         6     46   9     1104   1     59552  73 int
         7      1   0     1048   1     60600  74 dict of blinker._saferef.BoundMethodWeakref
         8      1   0     1048   1     61648  75 dict of flask.ctx.RequestContext
         9      1   0     1048   1     62696  77 dict of flask.wrappers.Request
    <79 more rows. Type e.g. '_.more' to view.>
    
    Partition of a set of 538 objects. Total size = 81920 bytes.
     Index  Count   %     Size   % Cumulative  % Referrers by Kind (class / dict of class)
         0    143  27    16712  20     16712  20 list
         1     30   6    12544  15     29256  36 types.FrameType
         2     83  15    10000  12     39256  48 dict (no owner)
         3    116  22     6592   8     45848  56 tuple
         4      1   0     3352   4     49200  60 __builtin__.cell, dict (no owner), dict of
                                                 flask.wrappers.Request, dict of
                                                 werkzeug.datastructures.EnvironHeaders, types.FrameType
         5      6   1     1472   2     50672  62 dict of mimetools.Message
         6      2   0     1120   1     51792  63 dict of 0x7f9d02073f00
         7      1   0     1048   1     52840  65 blinker._saferef.BoundMethodWeakref
         8      1   0     1048   1     53888  66 dict of
                                                 flask_debugtoolbar.panels.headers.HeaderDebugPanel
         9      1   0     1048   1     54936  67 flask.ctx.RequestContext
    <84 more rows. Type e.g. '_.more' to view.>
    

    Hopefully you can see that the dict, str, and tuple usage is much larger with the debug toolbar, and that list objects seem to be holding a large number of references, with dict also in there. Is it possible that the toolbar is holding onto references that isn't being released?

    I'm going to investigate a bit more and see if there is anything that stands out in the diffs between the two commits I referenced earlier, and to see if it seems to be an issue with a particular panel.

    opened by joeshaw 6
  • Case insensitive rfind is error prone.

    Case insensitive rfind is error prone.

    https://github.com/mgood/flask-debugtoolbar/blob/master/flask_debugtoolbar/init.py#L205

    if you have a utf-8 character where the capital letter is represented in 1 byte, but the lower case character is represented in 2 bytes, then the location of the closing body tag fails.

    İstanbulİstanbulİstanbul

    The first character is problematic. A solution would be take in the closing tag string as a config argument and not do any lowering during string comparison.

    opened by bmorgan21 5
  • Deprecated import from flask.ext.sqlalchemy

    Deprecated import from flask.ext.sqlalchemy

    This import is throwing a deprecation warning with Flask 0.11

    flask_debugtoolbar/panels/sqlalchemy.py:2:    from flask.ext.sqlalchemy import get_debug_queries, SQLAlchemy
    
    opened by mlenzen 5
  • Flask Debug Toolbar Does Not Check For A Compressed Response

    Flask Debug Toolbar Does Not Check For A Compressed Response

    If you have an extension like Flask Compress compressing the contents of your responses with gzip before it's sent back to the user, flask debug toolbar will throw an error because it assumes the response is UTF-8 HTML.

    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
        return self.wsgi_app(environ, start_response)
      File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
        response = self.make_response(self.handle_exception(e))
      File "/usr/local/lib/python2.7/site-packages/flask_restful/__init__.py", line 270, in error_router
        return original_handler(e)
      File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
        reraise(exc_type, exc_value, tb)
      File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
        response = self.full_dispatch_request()
      File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1479, in full_dispatch_request
        response = self.process_response(response)
      File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1691, in process_response
        response = handler(response)
      File "/usr/local/lib/python2.7/site-packages/flask_debugtoolbar/__init__.py", line 202, in process_response
        response_html = response.data.decode(response.charset)
      File "/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
        return codecs.utf_8_decode(input, errors, True)
    UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1: invalid start byte
    
    opened by JackStouffer 5
  • Invalid unicode handling

    Invalid unicode handling

    When logging sql statements with sqlalchemy panel the following exception is thrown:

    Traceback (most recent call last): File "C:\Python27\lib\site-packages\flask\app.py", line 1518, in call return self.wsgi_app(environ, start_response) File "C:\Python27\lib\site-packages\flask\app.py", line 1506, in wsgi_app response = self.make_response(self.handle_exception(e)) File "C:\Python27\lib\site-packages\flask\app.py", line 1504, in wsgi_app response = self.full_dispatch_request() File "C:\Python27\lib\site-packages\flask\app.py", line 1266, in full_dispatch_request response = self.process_response(response) File "C:\Python27\lib\site-packages\flask\app.py", line 1414, in process_response response = handler(response) File "C:\Python27\lib\site-packages\flask_debugtoolbar__init__.py", line 171, in process_response toolbar_html = self.debug_toolbars[real_request].render_toolbar() File "C:\Python27\lib\site-packages\flask_debugtoolbar\toolbar.py", line 74, in render_toolbar return template.render(**context) File "C:\Python27\lib\site-packages\jinja2\environment.py", line 894, in render return self.environment.handle_exception(exc_info, True) File "C:\Python27\lib\site-packages\flask_debugtoolbar\templates\base.html", line 48, in top-level template code {{ panel.content()|safe }} File "C:\Python27\lib\site-packages\flask_debugtoolbar\panels\sqlalchemy.py", line 79, in content query.statement + _params).hexdigest() UnicodeDecodeError: 'ascii' codec can't decode byte 0xb2 in position 0: ordinal not in range(128)

    As far as I understand, the panel concatenates application SECRET_KEY and query statement and params. My secret key is a byte string which contains some non-ascii characters like "'\xb2q\xf6\x8c\xcd\xd0\x023...". I had generated it with the following method which has been described in Flask quickstart docs:

    import os os.urandom(24) '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'

    http://flask.pocoo.org/docs/quickstart/

    opened by cenkalti 5
  • JavaScript error when using HTML5 boilerplate

    JavaScript error when using HTML5 boilerplate

    The toolbar's CSS file isn't injected into the template when using the HTML5 boilerplate <html> element:

    <!doctype html>
    <!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
    <!--[if IE 7]>    <html class="no-js ie7 oldie" lang="en"> <![endif]-->
    <!--[if IE 8]>    <html class="no-js ie8 oldie" lang="en"> <![endif]-->
    <!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
    

    I would submit a pull request but I can't seem to find where this is being done.

    opened by mattupstate 5
  • No toolbar on either Chrome or firefox

    No toolbar on either Chrome or firefox

    I added the flask debug toolbar to my app. It looks working because it gave me the redirect warning like below:

    _Redirect (302) Location: /app/bokeh

    The Flask Debug Toolbar has intercepted a redirect to the above URL for debug viewing purposes. You can click the above link to continue with the redirect as normal. If you'd like to disable this feature, you can set the config variable DEBUG_TB_INTERCEPT_REDIRECTS to False._

    But there is no FDT tool bar shown up after I got the response. I tried both Chrome and Firefox, same result. Do I need to do any configuration on the browser side to display the toolbar?

    opened by johnxpan 4
  • flask.ext was deprecated

    flask.ext was deprecated

    "flask.ext" (https://github.com/pallets/flask/issues/1135) has been deprecated a while ago. FdT keeps importing flask_sqlalchemy with flask.ext resulting in warning messages:

    exthook.py:71: ExtDeprecationWarning: Importing flask.ext.sqlalchemy is deprecated, use flask_sqlalchemy instead

    opened by nad2000 4
  • Subdomains support

    Subdomains support

    I have an issue with subdomain support. It seems that debug toolbar is always loading on the main domain but not the subdomains.

    For example, if I have test.com, admin.test.com, and user.test.com. When I go to admin.test.com or user.test.com debug toolbar is loading all js, styles etc from test.com and if test.com is blocked it is not loading anything at all.

    What will be good is that if I go to user.test.com it will load everything from it. If I go to admin.test.com it will load from it and when I go to test.com it will load from it.

    I can work on pr for this just not sure what should be changed to support it and where?

    opened by rimvislt 0
  • Drop support for python 2

    Drop support for python 2

    It's probably time we dropped support for python 2: https://github.com/pallets-eco/flask-debugtoolbar/blob/e3c8ab0ca28d7ddfaaa731ef1e15649182255c6a/setup.cfg#L33

    Given that Flask requires 3.7, I'd be fine with jumping straight to that... anyone who is on an older version of python can continue using an older version of Flask.

    There's no immediate pressing need to jump to the latest python, but it makes future contributors lives easier because they don't have to worry about such a wide swathe of backwards compatibility.

    First though we should push a final 2.x compatible release, that's tracked in https://github.com/pallets-eco/flask-debugtoolbar/issues/192... only once that's done should we do this.

    opened by jeffwidman 0
  • New release incorporating the Flask-SQLAlchemy 3.x changes

    New release incorporating the Flask-SQLAlchemy 3.x changes

    Now that https://github.com/pallets-eco/flask-debugtoolbar/pull/186 has landed, we should push a release so folks can use it.

    This will likely happen as part of #188 because we'll need to update the project metadata links anyway for PyPI.

    opened by jeffwidman 0
  • Update CI workflows

    Update CI workflows

    @nickjj suggested we migrate from Travis to GitHub actions... We should definitely do that:

    • [ ] Add new GitHub workflows
    • [ ] Update the CI links in the readme to point at them instead of Travis: https://github.com/pallets-eco/flask-debugtoolbar/blob/master/README.rst
    • [ ] Delete old travis workflows
    • [x] I looked into deleting the travis org for https://travis-ci.org/github/flask-debugtoolbar (xref #188) but it looks like this isn't even possible... the page has a banner at the top about migrating to travis.ci and says builds stopped two years ago.
    opened by jeffwidman 0
  • Migrate the repo to `pallets-eco/flask-debugtoolbar`

    Migrate the repo to `pallets-eco/flask-debugtoolbar`

    We're migrating the location of this repo from flask-debugtoolbar/flask-debugtoolbar to pallets-eco/flask-debugtoolbar to co-locate it alongside a number of other popular Flask-related extensions.

    In order to complete this migration, we need to do a few things:

    • [x] transfer the repository to the pallets-eco org
    • [x] Make myself & @nickjj repo admins - this needs @davidism
    • [x] Make @mattaw a repo collaborator - I think I can do this once @davidism adds him to the pallets-eco org
    • [ ] Make @davidism and @ThiefMaster owners on https://pypi.org/project/Flask-DebugToolbar/ in case we ever need to publish an immediate security update or something more trusted users have access- I just sent them invites
    • [ ] Update outdated links to mgood/flask-debugtoolbar or flask-debugtoolbar/flask-debugtoolbar to point to pallets-eco/flask-debugtoolbar instead... I currently see some in https://github.com/pallets-eco/flask-debugtoolbar/blob/master/docs/index.rst and https://github.com/pallets-eco/flask-debugtoolbar/blob/master/setup.cfg
    • [ ] Cut a new release of flask-debugtoolbar and push to PyPI so that the project metadata on https://pypi.org/project/Flask-DebugToolbar/ points to the correct URLs.
    opened by jeffwidman 0
Releases(0.13.1)
  • 0.13.1(Mar 29, 2022)

    What's Changed

    • Fix setup.cfg to include package files by @nickjj in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/172
    • Use a consistent version naming convention, 0.13 should have been 0.13.0 but it was yanked and you can't re-push yanked packages with the same version

    Full Changelog: https://github.com/flask-debugtoolbar/flask-debugtoolbar/compare/0.12.1...0.13.1

    Source code(tar.gz)
    Source code(zip)
  • 0.12.1(Mar 28, 2022)

  • 0.12.0(Mar 28, 2022)

    What's Changed

    • Fix SQLAlchemy SELECT/EXPLAIN to use url_for to respect app prefixes.… by @mattaw in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/143
    • Add flask.g section to show g object content. by @Yaser-Amiri in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/118
    • Change docs to pull version from setup.py by @jeffwidman in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/108
    • Update README.rst by @jeffwidman in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/147
    • Setup DB properly by @jeffwidman in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/148
    • Cleanup version handling slightly by @jeffwidman in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/149
    • Support gzip response by @zaw007 in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/154
    • prefixed css classes, fixes #152 by @jnnkB in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/153
    • Remove deprecated Jinja with_ extension for Jinja 3.0 (related to Flask 2.0) by @nickjj in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/157
    • Update PyPI metadata files: add setup.cfg etc by @jeffwidman in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/164

    New Contributors

    • @mattaw made their first contribution in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/143
    • @Yaser-Amiri made their first contribution in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/118
    • @zaw007 made their first contribution in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/154
    • @jnnkB made their first contribution in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/153
    • @nickjj made their first contribution in https://github.com/flask-debugtoolbar/flask-debugtoolbar/pull/157

    Full Changelog: https://github.com/flask-debugtoolbar/flask-debugtoolbar/compare/0.11.0...v0.12.0

    Source code(tar.gz)
    Source code(zip)
  • 0.11.0(Feb 18, 2020)

    Enhancements:

    • Switch to Flask's native CLI, dropping flask_script in the process (b92391d, thanks @jeffwidman)
    • Do not show DebugToolbar routes in the route map (#86, thanks @floqqi)
    • Document Pygments for SQL highlighting (#127, thanks @pgiraud)

    Fixes:

    • Remove deprecated flask.json_available (#119, thanks @davidism)
    • Remove deprecated request.is_xhr (7ce099c, thanks @jeffwidman)
    • Explicitly disable SQLALCHEMY_TRACK_MODIFICATIONS (9c7db48, thanks @jeffwidman)
    • Fix typo (#142, thanks @timgates42)
    Source code(tar.gz)
    Source code(zip)
A Python program that will log into your scheduled Google Meets hands free

Chrome GMautomation General Information This Python program will open up Chrome and log into your scheduled Google Meet with camera and mic turned off

Jonathan Leow 5 Dec 31, 2021
Python Testing Crawler 🐍 🩺 🕷️ A crawler for automated functional testing of a web application

Python Testing Crawler 🐍 🩺 🕷️ A crawler for automated functional testing of a web application Crawling a server-side-rendered web application is a

70 Aug 07, 2022
pywinauto is a set of python modules to automate the Microsoft Windows GUI

pywinauto is a set of python modules to automate the Microsoft Windows GUI. At its simplest it allows you to send mouse and keyboard actions to windows dialogs and controls, but it has support for mo

3.8k Jan 06, 2023
pytest plugin for distributed testing and loop-on-failures testing modes.

xdist: pytest distributed testing plugin The pytest-xdist plugin extends pytest with some unique test execution modes: test run parallelization: if yo

pytest-dev 1.1k Dec 30, 2022
A simple python script that uses selenium(chrome web driver),pyautogui,time and schedule modules to enter google meets automatically

A simple python script that uses selenium(chrome web driver),pyautogui,time and schedule modules to enter google meets automatically

3 Feb 07, 2022
Front End Test Automation with Pytest Framework

Front End Test Automation Framework with Pytest Installation and running instructions: 1. To install the framework on your local machine: clone the re

Sergey Kolokolov 2 Jun 17, 2022
Testinfra test your infrastructures

Testinfra test your infrastructure Latest documentation: https://testinfra.readthedocs.io/en/latest About With Testinfra you can write unit tests in P

pytest-dev 2.1k Jan 07, 2023
Checks for a 200 response from your subdomain list.

Check for available subdomains Written in Python, this terminal based application looks for a 200 response from the subdomain list you've provided. En

Sean 1 Nov 03, 2021
Fi - A simple Python 3.9+ command-line application for managing Fidelity portfolios

fi fi is a simple Python 3.9+ command-line application for managing Fidelity por

Darik Harter 2 Feb 26, 2022
This repository contains a set of benchmarks of different implementations of Parquet (storage format) <-> Arrow (in-memory format).

Parquet benchmarks This repository contains a set of benchmarks of different implementations of Parquet (storage format) - Arrow (in-memory format).

11 Dec 21, 2022
pytest splinter and selenium integration for anyone interested in browser interaction in tests

Splinter plugin for the pytest runner Install pytest-splinter pip install pytest-splinter Features The plugin provides a set of fixtures to use splin

pytest-dev 238 Nov 14, 2022
Find index entries in $INDEX_ALLOCATION attributes

INDXRipper Find index entries in $INDEX_ALLOCATION attributes Timeline created using mactime.pl on the combined output of INDXRipper and fls. See: sle

32 Nov 05, 2022
Doggo Browser

Doggo Browser Quick Start $ python3 -m venv ./venv/ $ source ./venv/bin/activate $ pip3 install -r requirements.txt $ ./sobaki.py References Heavily I

Alexey Kutepov 9 Dec 12, 2022
A pure Python script to easily get a reverse shell

easy-shell A pure Python script to easily get a reverse shell. How it works? After sending a request, it generates a payload with different commands a

Cristian Souza 48 Dec 12, 2022
Mockoon is the easiest and quickest way to run mock APIs locally. No remote deployment, no account required, open source.

Mockoon Mockoon is the easiest and quickest way to run mock APIs locally. No remote deployment, no account required, open source. It has been built wi

mockoon 4.4k Dec 30, 2022
Thin-wrapper around the mock package for easier use with pytest

pytest-mock This plugin provides a mocker fixture which is a thin-wrapper around the patching API provided by the mock package: import os class UnixF

pytest-dev 1.5k Jan 05, 2023
Travel through time in your tests.

time-machine Travel through time in your tests. A quick example: import datetime as dt

Adam Johnson 373 Dec 27, 2022
A Proof of concept of a modern python CLI with click, pydantic, rich and anyio

httpcli This project is a proof of concept of a modern python networking cli which can be simple and easy to maintain using some of the best packages

Kevin Tewouda 17 Nov 15, 2022
A command-line tool and Python library and Pytest plugin for automated testing of RESTful APIs, with a simple, concise and flexible YAML-based syntax

1.0 Release See here for details about breaking changes with the upcoming 1.0 release: https://github.com/taverntesting/tavern/issues/495 Easier API t

909 Dec 15, 2022