forked from Wavyzz/py-healthchecks.io
Compare commits
102 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e9a89cdd1 | ||
|
|
a5c6fe24dc | ||
|
|
7e60e76088 | ||
|
|
47b257ca9d | ||
|
|
88448bb2b4 | ||
|
|
22b28936e3 | ||
|
|
47ced622a3 | ||
|
|
3a41684c13 | ||
|
|
fe068c34ef | ||
|
|
e7ee9625d5 | ||
|
|
95a9e5b4d7 | ||
|
|
ddc15c065e | ||
|
|
2e529a1bdc | ||
|
|
0f4c9aa8ba | ||
|
|
1e7d13096d | ||
|
|
6c51038e12 | ||
|
|
84952be7a9 | ||
|
|
0446f63034 | ||
|
|
e44ba1ed0b | ||
|
|
28840eac26 | ||
|
|
365e0cde5d | ||
|
|
542ce00387 | ||
|
|
7b772f3a60 | ||
|
|
73404d2636 | ||
|
|
aa4618ccce | ||
|
|
d64a2cfbd1 | ||
|
|
d014f1586b | ||
|
|
a085cb2f4d | ||
|
|
432fbebb2a | ||
|
|
d293d84fb8 | ||
|
|
5f8cb52183 | ||
|
|
40958b2281 | ||
|
|
11819ccae6 | ||
|
|
9a829eb8f3 | ||
|
|
945fca9b03 | ||
|
|
d20a9d3d4e | ||
|
|
450596b6a8 | ||
|
|
4dd6eabdae | ||
|
|
389d8b9b64 | ||
|
|
9d89a749e5 | ||
|
|
22bb34fbd8 | ||
|
|
1c373133b2 | ||
|
|
c7a710a052 | ||
|
|
ee03e90d6a | ||
|
|
c6d4d5cc2a | ||
|
|
9aca74ae01 | ||
|
|
5bf9a032f3 | ||
|
|
0c82993e42 | ||
|
|
e8278430e6 | ||
|
|
2f0b4602a9 | ||
|
|
4c30b611e7 | ||
|
|
f3be1bff3f | ||
|
|
0c7562765d | ||
|
|
02a7665f22 | ||
|
|
5a3901cfd2 | ||
|
|
718dc3d7a0 | ||
|
|
103b5d0eda | ||
|
|
2b8f217698 | ||
|
|
bcc2242ec6 | ||
|
|
721e79e678 | ||
|
|
818dd54f2f | ||
|
|
376578ac36 | ||
|
|
67cbd2963f | ||
|
|
960d78bc10 | ||
|
|
17c612c29f | ||
|
|
79ae404e63 | ||
|
|
f13236d1a5 | ||
|
|
4233abdf4b | ||
|
|
bbebf174b9 | ||
|
|
d9a1553e88 | ||
|
|
ca62cdc282 | ||
|
|
b5bffa2dc0 | ||
|
|
78bfa7b0fc | ||
|
|
1c5f8f5f1f | ||
|
|
17d431bf42 | ||
|
|
5b1cc5aafd | ||
|
|
bc7a85e523 | ||
|
|
c0431ca182 | ||
|
|
112a80b24e | ||
|
|
ee2cb27a2e | ||
|
|
e04b50b565 | ||
|
|
3480060739 | ||
|
|
c103d5f281 | ||
|
|
8f2a17cb26 | ||
|
|
0ad674fc74 | ||
|
|
86c2348172 | ||
|
|
0606e83f19 | ||
|
|
6b46571dd4 | ||
|
|
9f139177dc | ||
|
|
885651c666 | ||
|
|
7bc06275d3 | ||
|
|
31efa7962a | ||
|
|
5b5c919995 | ||
|
|
0256482f70 | ||
|
|
47a09d7a5f | ||
|
|
f15615a09f | ||
|
|
819693cd1a | ||
|
|
a83fd4ac77 | ||
|
|
93bd42756a | ||
|
|
b96a02d711 | ||
|
|
3f5662670a | ||
|
|
063a5e9709 |
6
.github/workflows/constraints.txt
vendored
6
.github/workflows/constraints.txt
vendored
@@ -1,6 +1,6 @@
|
|||||||
pip==21.3.1
|
pip==22.0.3
|
||||||
nox==2021.10.1
|
nox==2022.1.7
|
||||||
nox-poetry==0.9.0
|
nox-poetry==0.9.0
|
||||||
poetry==1.1.12
|
poetry==1.1.12
|
||||||
virtualenv==20.10.0
|
virtualenv==20.13.0
|
||||||
poetry-dynamic-versioning==0.13.1
|
poetry-dynamic-versioning==0.13.1
|
||||||
|
|||||||
2
.github/workflows/pre-release.yml
vendored
2
.github/workflows/pre-release.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Publish package on TestPyPI
|
- name: Publish package on TestPyPI
|
||||||
if: "! steps.check-version.outputs.tag"
|
if: "! steps.check-version.outputs.tag"
|
||||||
uses: pypa/gh-action-pypi-publish@v1.4.2
|
uses: pypa/gh-action-pypi-publish@v1.5.0
|
||||||
with:
|
with:
|
||||||
user: __token__
|
user: __token__
|
||||||
password: ${{ secrets.TEST_PYPI_TOKEN }}
|
password: ${{ secrets.TEST_PYPI_TOKEN }}
|
||||||
|
|||||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
|||||||
poetry build --ansi
|
poetry build --ansi
|
||||||
|
|
||||||
- name: Publish package on PyPI
|
- name: Publish package on PyPI
|
||||||
uses: pypa/gh-action-pypi-publish@v1.4.2
|
uses: pypa/gh-action-pypi-publish@v1.5.0
|
||||||
with:
|
with:
|
||||||
user: __token__
|
user: __token__
|
||||||
password: ${{ secrets.PYPI_TOKEN }}
|
password: ${{ secrets.PYPI_TOKEN }}
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -8,3 +8,4 @@
|
|||||||
/docs/_build/
|
/docs/_build/
|
||||||
/src/*.egg-info/
|
/src/*.egg-info/
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
.vscode
|
||||||
|
|||||||
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"python.pythonPath": "/home/andrew/.pyenv/versions/3.10.0/envs/healthchecks/bin/python"
|
|
||||||
}
|
|
||||||
14
README.rst
14
README.rst
@@ -7,16 +7,16 @@ Py Healthchecks.Io
|
|||||||
|
|
||||||
|pre-commit| |Black|
|
|pre-commit| |Black|
|
||||||
|
|
||||||
.. |PyPI| image:: https://img.shields.io/pypi/v/py-healthchecksio.svg
|
.. |PyPI| image:: https://img.shields.io/pypi/v/healthchecks-io.svg
|
||||||
:target: https://pypi.org/project/py-healthchecksio/
|
:target: https://pypi.org/project/healthchecks-io/
|
||||||
:alt: PyPI
|
:alt: PyPI
|
||||||
.. |Status| image:: https://img.shields.io/pypi/status/py-healthchecksio.svg
|
.. |Status| image:: https://img.shields.io/pypi/status/healthchecks-io.svg
|
||||||
:target: https://pypi.org/project/py-healthchecksio/
|
:target: https://pypi.org/project/healthchecks-io/
|
||||||
:alt: Status
|
:alt: Status
|
||||||
.. |Python Version| image:: https://img.shields.io/pypi/pyversions/py-healthchecksio
|
.. |Python Version| image:: https://img.shields.io/pypi/pyversions/healthchecks-io
|
||||||
:target: https://pypi.org/project/py-healthchecksio
|
:target: https://pypi.org/project/healthchecks-io
|
||||||
:alt: Python Version
|
:alt: Python Version
|
||||||
.. |License| image:: https://img.shields.io/pypi/l/py-healthchecks.io
|
.. |License| image:: https://img.shields.io/pypi/l/healthchecks-io
|
||||||
:target: https://opensource.org/licenses/MIT
|
:target: https://opensource.org/licenses/MIT
|
||||||
:alt: License
|
:alt: License
|
||||||
.. |Read the Docs| image:: https://img.shields.io/readthedocs/py-healthchecksio/latest.svg?label=Read%20the%20Docs
|
.. |Read the Docs| image:: https://img.shields.io/readthedocs/py-healthchecksio/latest.svg?label=Read%20the%20Docs
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
furo==2021.11.23
|
furo==2022.1.2
|
||||||
sphinx==4.3.1
|
sphinx==4.4.0
|
||||||
sphinx-click==3.0.2
|
sphinx-click==3.1.0
|
||||||
|
|||||||
@@ -3,6 +3,31 @@ Usage
|
|||||||
|
|
||||||
This package implements the Healthchecks.io Management and Ping APIs as documented here https://healthchecks.io/docs/api/.
|
This package implements the Healthchecks.io Management and Ping APIs as documented here https://healthchecks.io/docs/api/.
|
||||||
|
|
||||||
|
Context Manager
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Either the Client or AsyncClient can be used as a ContextManager (or Async Context Manager)
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
from healthchecks_io import Client, CheckCreate
|
||||||
|
|
||||||
|
with Client(api_key="myapikey") as client:
|
||||||
|
check = client.create_check(CheckCreate(name="New Check", tags="tag1 tag2"))
|
||||||
|
print(check)
|
||||||
|
|
||||||
|
This is probably the easiest way to use the Clients for one-off scripts. If you do not need to keep a client open for multiple requests, just use
|
||||||
|
the context manager.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
When using either of the client types as a context manager, the httpx client underlying the client will be closed when the context manager exits.
|
||||||
|
|
||||||
|
Since we allow you to pass in a client on creation, its possible to use a shared client with this library. If you then use the client as a contextmanager,
|
||||||
|
it will close that shared client.
|
||||||
|
|
||||||
|
Just a thing to be aware of!
|
||||||
|
|
||||||
|
|
||||||
Sync
|
Sync
|
||||||
----
|
----
|
||||||
|
|
||||||
@@ -38,7 +63,7 @@ Creating a new Check
|
|||||||
|
|
||||||
client = Client(api_key="myapikey")
|
client = Client(api_key="myapikey")
|
||||||
|
|
||||||
check = client.create_check(CreateCheck(name="New Check", tags="tag1 tag2")
|
check = client.create_check(CheckCreate(name="New Check", tags="tag1 tag2"))
|
||||||
print(check)
|
print(check)
|
||||||
|
|
||||||
Getting a Check
|
Getting a Check
|
||||||
@@ -57,6 +82,7 @@ Pinging a Check
|
|||||||
^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
from healthchecks_io import Client
|
from healthchecks_io import Client
|
||||||
|
|
||||||
client = Client(api_key="myapikey")
|
client = Client(api_key="myapikey")
|
||||||
@@ -68,13 +94,54 @@ Async
|
|||||||
|
|
||||||
If you want to use the client in an async program, use AsyncClient instead of Client
|
If you want to use the client in an async program, use AsyncClient instead of Client
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
from healthchecks_io import AsyncClient, CheckCreate
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
client = AsyncClient(api_key="myapikey")
|
||||||
|
|
||||||
|
check = await client.create_check(CheckCreate(name="New Check", tags="tag1 tag2"))
|
||||||
|
print(check)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
asyncio.run(main())
|
||||||
|
|
||||||
|
|
||||||
|
CheckTrap
|
||||||
|
---------
|
||||||
|
|
||||||
|
Ever wanted to run some code and wrape it in a healthcheck check without thinking about it?
|
||||||
|
|
||||||
|
That's what CheckTrap is for.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
from healthchecks_io import AsyncClient, CheckCreate
|
import asyncio
|
||||||
|
from healthchecks_io import Client, AsyncClient, CheckCreate, CheckTrap
|
||||||
|
|
||||||
client = AsyncClient(api_key="myapikey")
|
def run_my_thing_to_monitor():
|
||||||
|
pass
|
||||||
|
|
||||||
check = await client.create_check(CreateCheck(name="New Check", tags="tag1 tag2")
|
async def main(check):
|
||||||
print(check)
|
client = AsyncClient(ping_key="ping_key")
|
||||||
|
|
||||||
|
# works with async too, and the ping api and slugs
|
||||||
|
async with CheckTrap(client, slug=check.slug) as ct:
|
||||||
|
# when entering the context manager, sends a start ping to your check
|
||||||
|
# Add custom logs to what gets sent to healthchecks. Reminder, only the first 10k bytes get saved
|
||||||
|
ct.add_log("My custom log message")
|
||||||
|
run_my_thing_to_monitor()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
client = Client(api_key="myapikey")
|
||||||
|
|
||||||
|
# create a new check, or use an existing one already with just its uuid.
|
||||||
|
check = await client.create_check(CreateCheck(name="New Check", tags="tag1 tag2")
|
||||||
|
|
||||||
|
with CheckTrap(client, check.uuid):
|
||||||
|
# when entering the context manager, sends a start ping to your check
|
||||||
|
run_my_thing_to_monitor()
|
||||||
|
|
||||||
|
asyncio.run(main())
|
||||||
|
|||||||
464
poetry.lock
generated
464
poetry.lock
generated
@@ -26,11 +26,11 @@ trio = ["trio (>=0.16)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aspy.refactor-imports"
|
name = "aspy.refactor-imports"
|
||||||
version = "2.2.0"
|
version = "2.2.1"
|
||||||
description = "Utilities for refactoring imports in python-like syntax."
|
description = "Utilities for refactoring imports in python-like syntax."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6.1"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
cached-property = "*"
|
cached-property = "*"
|
||||||
@@ -45,17 +45,17 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "attrs"
|
name = "attrs"
|
||||||
version = "21.2.0"
|
version = "21.4.0"
|
||||||
description = "Classes Without Boilerplate"
|
description = "Classes Without Boilerplate"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
|
dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"]
|
||||||
docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
|
docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
|
||||||
tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
|
tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
|
||||||
tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
|
tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "babel"
|
name = "babel"
|
||||||
@@ -68,21 +68,6 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
|||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pytz = ">=2015.7"
|
pytz = ">=2015.7"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "backports.entry-points-selectable"
|
|
||||||
version = "1.1.1"
|
|
||||||
description = "Compatibility shim providing selectable entry points for older implementations"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=2.7"
|
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
|
|
||||||
|
|
||||||
[package.extras]
|
|
||||||
docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
|
|
||||||
testing = ["pytest", "pytest-flake8", "pytest-cov", "pytest-black (>=0.3.7)", "pytest-mypy", "pytest-checkdocs (>=2.4)", "pytest-enabler (>=1.0.1)"]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bandit"
|
name = "bandit"
|
||||||
version = "1.7.1"
|
version = "1.7.1"
|
||||||
@@ -114,29 +99,25 @@ lxml = ["lxml"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "black"
|
name = "black"
|
||||||
version = "21.12b0"
|
version = "22.1.0"
|
||||||
description = "The uncompromising code formatter."
|
description = "The uncompromising code formatter."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6.2"
|
python-versions = ">=3.6.2"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
click = ">=7.1.2"
|
click = ">=8.0.0"
|
||||||
mypy-extensions = ">=0.4.3"
|
mypy-extensions = ">=0.4.3"
|
||||||
pathspec = ">=0.9.0,<1"
|
pathspec = ">=0.9.0"
|
||||||
platformdirs = ">=2"
|
platformdirs = ">=2"
|
||||||
tomli = ">=0.2.6,<2.0.0"
|
tomli = ">=1.1.0"
|
||||||
typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""}
|
typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""}
|
||||||
typing-extensions = [
|
typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
|
||||||
{version = ">=3.10.0.0", markers = "python_version < \"3.10\""},
|
|
||||||
{version = "!=3.10.0.1", markers = "python_version >= \"3.10\""},
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
colorama = ["colorama (>=0.4.3)"]
|
colorama = ["colorama (>=0.4.3)"]
|
||||||
d = ["aiohttp (>=3.7.4)"]
|
d = ["aiohttp (>=3.7.4)"]
|
||||||
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
|
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
|
||||||
python2 = ["typed-ast (>=1.4.3)"]
|
|
||||||
uvloop = ["uvloop (>=0.15.2)"]
|
uvloop = ["uvloop (>=0.15.2)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -196,11 +177,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "coverage"
|
name = "coverage"
|
||||||
version = "6.2"
|
version = "6.3.1"
|
||||||
description = "Code coverage measurement for Python"
|
description = "Code coverage measurement for Python"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
tomli = {version = "*", optional = true, markers = "extra == \"toml\""}
|
tomli = {version = "*", optional = true, markers = "extra == \"toml\""}
|
||||||
@@ -210,7 +191,7 @@ toml = ["tomli"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "croniter"
|
name = "croniter"
|
||||||
version = "1.1.0"
|
version = "1.2.0"
|
||||||
description = "croniter provides iteration for datetime object with cron like format"
|
description = "croniter provides iteration for datetime object with cron like format"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -261,11 +242,11 @@ pipenv = ["pipenv"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "filelock"
|
name = "filelock"
|
||||||
version = "3.4.0"
|
version = "3.4.2"
|
||||||
description = "A platform independent file lock."
|
description = "A platform independent file lock."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"]
|
docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"]
|
||||||
@@ -301,7 +282,7 @@ pycodestyle = "*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flake8-bugbear"
|
name = "flake8-bugbear"
|
||||||
version = "21.11.29"
|
version = "22.1.11"
|
||||||
description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle."
|
description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -352,7 +333,7 @@ restructuredtext-lint = "*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "furo"
|
name = "furo"
|
||||||
version = "2021.11.23"
|
version = "2022.1.2"
|
||||||
description = "A clean customisable Sphinx documentation theme."
|
description = "A clean customisable Sphinx documentation theme."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -400,7 +381,7 @@ python-versions = ">=3.6"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "httpcore"
|
name = "httpcore"
|
||||||
version = "0.14.3"
|
version = "0.14.5"
|
||||||
description = "A minimal low-level HTTP client."
|
description = "A minimal low-level HTTP client."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -414,10 +395,11 @@ sniffio = ">=1.0.0,<2.0.0"
|
|||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
http2 = ["h2 (>=3,<5)"]
|
http2 = ["h2 (>=3,<5)"]
|
||||||
|
socks = ["socksio (>=1.0.0,<2.0.0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "httpx"
|
name = "httpx"
|
||||||
version = "0.21.1"
|
version = "0.22.0"
|
||||||
description = "The next generation HTTP client."
|
description = "The next generation HTTP client."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -426,7 +408,7 @@ python-versions = ">=3.6"
|
|||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
certifi = "*"
|
certifi = "*"
|
||||||
charset-normalizer = "*"
|
charset-normalizer = "*"
|
||||||
httpcore = ">=0.14.0,<0.15.0"
|
httpcore = ">=0.14.5,<0.15.0"
|
||||||
rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]}
|
rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]}
|
||||||
sniffio = "*"
|
sniffio = "*"
|
||||||
|
|
||||||
@@ -434,10 +416,11 @@ sniffio = "*"
|
|||||||
brotli = ["brotlicffi", "brotli"]
|
brotli = ["brotlicffi", "brotli"]
|
||||||
cli = ["click (>=8.0.0,<9.0.0)", "rich (>=10.0.0,<11.0.0)", "pygments (>=2.0.0,<3.0.0)"]
|
cli = ["click (>=8.0.0,<9.0.0)", "rich (>=10.0.0,<11.0.0)", "pygments (>=2.0.0,<3.0.0)"]
|
||||||
http2 = ["h2 (>=3,<5)"]
|
http2 = ["h2 (>=3,<5)"]
|
||||||
|
socks = ["socksio (>=1.0.0,<2.0.0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "identify"
|
name = "identify"
|
||||||
version = "2.4.0"
|
version = "2.4.1"
|
||||||
description = "File identification library for Python"
|
description = "File identification library for Python"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -530,21 +513,21 @@ python-versions = "*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mypy"
|
name = "mypy"
|
||||||
version = "0.910"
|
version = "0.931"
|
||||||
description = "Optional static typing for Python"
|
description = "Optional static typing for Python"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5"
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
mypy-extensions = ">=0.4.3,<0.5.0"
|
mypy-extensions = ">=0.4.3"
|
||||||
toml = "*"
|
tomli = ">=1.1.0"
|
||||||
typed-ast = {version = ">=1.4.0,<1.5.0", markers = "python_version < \"3.8\""}
|
typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""}
|
||||||
typing-extensions = ">=3.7.4"
|
typing-extensions = ">=3.10"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
dmypy = ["psutil (>=4.0)"]
|
dmypy = ["psutil (>=4.0)"]
|
||||||
python2 = ["typed-ast (>=1.4.0,<1.5.0)"]
|
python2 = ["typed-ast (>=1.4.0,<2)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mypy-extensions"
|
name = "mypy-extensions"
|
||||||
@@ -603,11 +586,11 @@ flake8-polyfill = ">=1.0.2,<2"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "platformdirs"
|
name = "platformdirs"
|
||||||
version = "2.4.0"
|
version = "2.4.1"
|
||||||
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"]
|
docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"]
|
||||||
@@ -630,7 +613,7 @@ testing = ["pytest", "pytest-benchmark"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pre-commit"
|
name = "pre-commit"
|
||||||
version = "2.16.0"
|
version = "2.17.0"
|
||||||
description = "A framework for managing and maintaining multi-language pre-commit hooks."
|
description = "A framework for managing and maintaining multi-language pre-commit hooks."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -647,7 +630,7 @@ virtualenv = ">=20.0.8"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pre-commit-hooks"
|
name = "pre-commit-hooks"
|
||||||
version = "4.0.1"
|
version = "4.1.0"
|
||||||
description = "Some out-of-the-box hooks for pre-commit."
|
description = "Some out-of-the-box hooks for pre-commit."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -675,7 +658,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pydantic"
|
name = "pydantic"
|
||||||
version = "1.8.2"
|
version = "1.9.0"
|
||||||
description = "Data validation and settings management using python 3.6 type hinting"
|
description = "Data validation and settings management using python 3.6 type hinting"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -712,7 +695,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pygments"
|
name = "pygments"
|
||||||
version = "2.10.0"
|
version = "2.11.2"
|
||||||
description = "Pygments is a syntax highlighting package written in Python."
|
description = "Pygments is a syntax highlighting package written in Python."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -761,17 +744,18 @@ python-versions = ">=3.6"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytest-asyncio"
|
name = "pytest-asyncio"
|
||||||
version = "0.16.0"
|
version = "0.17.2"
|
||||||
description = "Pytest support for asyncio."
|
description = "Pytest support for asyncio"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">= 3.6"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pytest = ">=5.4.0"
|
pytest = ">=6.1.0"
|
||||||
|
typing-extensions = {version = ">=4.0", markers = "python_version < \"3.8\""}
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
testing = ["coverage", "hypothesis (>=5.7.1)"]
|
testing = ["coverage (==6.2)", "hypothesis (>=5.7.1)", "flaky (>=3.5.0)", "mypy (==0.931)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytest-cov"
|
name = "pytest-cov"
|
||||||
@@ -801,11 +785,11 @@ pytest = ">=3.2.5"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytest-mock"
|
name = "pytest-mock"
|
||||||
version = "3.6.1"
|
version = "3.7.0"
|
||||||
description = "Thin-wrapper around the mock package for easier use with pytest"
|
description = "Thin-wrapper around the mock package for easier use with pytest"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pytest = ">=5.0"
|
pytest = ">=5.0"
|
||||||
@@ -834,7 +818,7 @@ python-versions = "*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyupgrade"
|
name = "pyupgrade"
|
||||||
version = "2.29.1"
|
version = "2.31.0"
|
||||||
description = "A tool to automatically upgrade syntax for newer versions."
|
description = "A tool to automatically upgrade syntax for newer versions."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -853,14 +837,14 @@ python-versions = ">=3.6"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "reorder-python-imports"
|
name = "reorder-python-imports"
|
||||||
version = "2.6.0"
|
version = "2.7.1"
|
||||||
description = "Tool for reordering python imports"
|
description = "Tool for reordering python imports"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6.1"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
"aspy.refactor-imports" = ">=2.1.0"
|
"aspy.refactor-imports" = ">=2.2.1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "requests"
|
name = "requests"
|
||||||
@@ -882,7 +866,7 @@ use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "respx"
|
name = "respx"
|
||||||
version = "0.19.0"
|
version = "0.19.2"
|
||||||
description = "A utility for mocking out the Python HTTPX and HTTP Core libraries."
|
description = "A utility for mocking out the Python HTTPX and HTTP Core libraries."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -918,14 +902,14 @@ idna2008 = ["idna"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruamel.yaml"
|
name = "ruamel.yaml"
|
||||||
version = "0.17.17"
|
version = "0.17.19"
|
||||||
description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
|
description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3"
|
python-versions = ">=3"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""}
|
"ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""}
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["ryd"]
|
docs = ["ryd"]
|
||||||
@@ -995,7 +979,7 @@ python-versions = ">=3.6"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sphinx"
|
name = "sphinx"
|
||||||
version = "4.3.1"
|
version = "4.3.2"
|
||||||
description = "Python documentation generator"
|
description = "Python documentation generator"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -1021,7 +1005,7 @@ sphinxcontrib-serializinghtml = ">=1.1.5"
|
|||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["sphinxcontrib-websupport"]
|
docs = ["sphinxcontrib-websupport"]
|
||||||
lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.900)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"]
|
lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.920)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"]
|
||||||
test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"]
|
test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1042,7 +1026,7 @@ test = ["pytest", "pytest-cov"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sphinx-click"
|
name = "sphinx-click"
|
||||||
version = "3.0.2"
|
version = "3.1.0"
|
||||||
description = "Sphinx extension that automatically documents click applications"
|
description = "Sphinx extension that automatically documents click applications"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -1154,7 +1138,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tomli"
|
name = "tomli"
|
||||||
version = "1.2.2"
|
version = "1.2.3"
|
||||||
description = "A lil' TOML parser"
|
description = "A lil' TOML parser"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -1190,7 +1174,7 @@ test = ["pytest", "typing-extensions", "mypy"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "types-croniter"
|
name = "types-croniter"
|
||||||
version = "1.0.3"
|
version = "1.0.7"
|
||||||
description = "Typing stubs for croniter"
|
description = "Typing stubs for croniter"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -1198,7 +1182,7 @@ python-versions = "*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "types-pytz"
|
name = "types-pytz"
|
||||||
version = "2021.3.3"
|
version = "2021.3.4"
|
||||||
description = "Typing stubs for pytz"
|
description = "Typing stubs for pytz"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -1227,14 +1211,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "virtualenv"
|
name = "virtualenv"
|
||||||
version = "20.10.0"
|
version = "20.11.2"
|
||||||
description = "Virtual Python Environment builder"
|
description = "Virtual Python Environment builder"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
"backports.entry-points-selectable" = ">=1.0.4"
|
|
||||||
distlib = ">=0.3.1,<1"
|
distlib = ">=0.3.1,<1"
|
||||||
filelock = ">=3.2,<4"
|
filelock = ">=3.2,<4"
|
||||||
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
||||||
@@ -1267,20 +1250,20 @@ tests = ["codecov", "scikit-build", "cmake", "ninja", "pybind11", "pytest", "pyt
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zipp"
|
name = "zipp"
|
||||||
version = "3.6.0"
|
version = "3.7.0"
|
||||||
description = "Backport of pathlib-compatible object wrapper for zip files"
|
description = "Backport of pathlib-compatible object wrapper for zip files"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
|
docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
|
||||||
testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
|
testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.7"
|
python-versions = "^3.7"
|
||||||
content-hash = "7aa92cbd452389c4c3bf0af735ac63ed73601cf81cde06a32e0485c2a0be7a6e"
|
content-hash = "6baff36f0391069d727a7e2608cd8f5bb3338d93e575cdf9d8f0068f57b346b3"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
alabaster = [
|
alabaster = [
|
||||||
@@ -1292,25 +1275,21 @@ anyio = [
|
|||||||
{file = "anyio-3.4.0.tar.gz", hash = "sha256:24adc69309fb5779bc1e06158e143e0b6d2c56b302a3ac3de3083c705a6ed39d"},
|
{file = "anyio-3.4.0.tar.gz", hash = "sha256:24adc69309fb5779bc1e06158e143e0b6d2c56b302a3ac3de3083c705a6ed39d"},
|
||||||
]
|
]
|
||||||
"aspy.refactor-imports" = [
|
"aspy.refactor-imports" = [
|
||||||
{file = "aspy.refactor_imports-2.2.0-py2.py3-none-any.whl", hash = "sha256:7a18039d2e8be6b02b4791ce98891deb46b459b575c52ed35ab818c4eaa0c098"},
|
{file = "aspy.refactor_imports-2.2.1-py2.py3-none-any.whl", hash = "sha256:ace9ca78abf6cfdd20ea1a321b75b20c8cc2c1af58aecb9dc4ba9d6f70f74645"},
|
||||||
{file = "aspy.refactor_imports-2.2.0.tar.gz", hash = "sha256:78ca24122963fd258ebfc4a8dc708d23a18040ee39dca8767675821e84e9ea0a"},
|
{file = "aspy.refactor_imports-2.2.1.tar.gz", hash = "sha256:f5b2fcbf9fd68361168588f14eda64d502d029eefe632d15094cd0683ae12984"},
|
||||||
]
|
]
|
||||||
atomicwrites = [
|
atomicwrites = [
|
||||||
{file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
|
{file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
|
||||||
{file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
|
{file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
|
||||||
]
|
]
|
||||||
attrs = [
|
attrs = [
|
||||||
{file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
|
{file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"},
|
||||||
{file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
|
{file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"},
|
||||||
]
|
]
|
||||||
babel = [
|
babel = [
|
||||||
{file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"},
|
{file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"},
|
||||||
{file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"},
|
{file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"},
|
||||||
]
|
]
|
||||||
"backports.entry-points-selectable" = [
|
|
||||||
{file = "backports.entry_points_selectable-1.1.1-py2.py3-none-any.whl", hash = "sha256:7fceed9532a7aa2bd888654a7314f864a3c16a4e710b34a58cfc0f08114c663b"},
|
|
||||||
{file = "backports.entry_points_selectable-1.1.1.tar.gz", hash = "sha256:914b21a479fde881635f7af5adc7f6e38d6b274be32269070c53b698c60d5386"},
|
|
||||||
]
|
|
||||||
bandit = [
|
bandit = [
|
||||||
{file = "bandit-1.7.1-py3-none-any.whl", hash = "sha256:f5acd838e59c038a159b5c621cf0f8270b279e884eadd7b782d7491c02add0d4"},
|
{file = "bandit-1.7.1-py3-none-any.whl", hash = "sha256:f5acd838e59c038a159b5c621cf0f8270b279e884eadd7b782d7491c02add0d4"},
|
||||||
{file = "bandit-1.7.1.tar.gz", hash = "sha256:a81b00b5436e6880fa8ad6799bc830e02032047713cbb143a12939ac67eb756c"},
|
{file = "bandit-1.7.1.tar.gz", hash = "sha256:a81b00b5436e6880fa8ad6799bc830e02032047713cbb143a12939ac67eb756c"},
|
||||||
@@ -1320,8 +1299,29 @@ beautifulsoup4 = [
|
|||||||
{file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"},
|
{file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"},
|
||||||
]
|
]
|
||||||
black = [
|
black = [
|
||||||
{file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"},
|
{file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"},
|
||||||
{file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"},
|
{file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"},
|
||||||
|
{file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"},
|
||||||
|
{file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"},
|
||||||
|
{file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"},
|
||||||
|
{file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"},
|
||||||
|
{file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"},
|
||||||
|
{file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"},
|
||||||
|
{file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"},
|
||||||
|
{file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"},
|
||||||
|
{file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"},
|
||||||
|
{file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"},
|
||||||
|
{file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"},
|
||||||
|
{file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"},
|
||||||
|
{file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"},
|
||||||
|
{file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"},
|
||||||
|
{file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"},
|
||||||
|
{file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"},
|
||||||
|
{file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"},
|
||||||
|
{file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"},
|
||||||
|
{file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"},
|
||||||
|
{file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"},
|
||||||
|
{file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"},
|
||||||
]
|
]
|
||||||
cached-property = [
|
cached-property = [
|
||||||
{file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"},
|
{file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"},
|
||||||
@@ -1348,57 +1348,51 @@ colorama = [
|
|||||||
{file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
|
{file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
|
||||||
]
|
]
|
||||||
coverage = [
|
coverage = [
|
||||||
{file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"},
|
{file = "coverage-6.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeffd96882d8c06d31b65dddcf51db7c612547babc1c4c5db6a011abe9798525"},
|
||||||
{file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"},
|
{file = "coverage-6.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:621f6ea7260ea2ffdaec64fe5cb521669984f567b66f62f81445221d4754df4c"},
|
||||||
{file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"},
|
{file = "coverage-6.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f2436d6742c01136dd940ee158bfc7cf5ced3da7e4c949662b8703b5cd8145"},
|
||||||
{file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"},
|
{file = "coverage-6.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de73fca6fb403dd72d4da517cfc49fcf791f74eee697d3219f6be29adf5af6ce"},
|
||||||
{file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"},
|
{file = "coverage-6.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78fbb2be068a13a5d99dce9e1e7d168db880870f7bc73f876152130575bd6167"},
|
||||||
{file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"},
|
{file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5a4551dfd09c3bd12fca8144d47fe7745275adf3229b7223c2f9e29a975ebda"},
|
||||||
{file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"},
|
{file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7bff3a98f63b47464480de1b5bdd80c8fade0ba2832c9381253c9b74c4153c27"},
|
||||||
{file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"},
|
{file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a06c358f4aed05fa1099c39decc8022261bb07dfadc127c08cfbd1391b09689e"},
|
||||||
{file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"},
|
{file = "coverage-6.3.1-cp310-cp310-win32.whl", hash = "sha256:9fff3ff052922cb99f9e52f63f985d4f7a54f6b94287463bc66b7cdf3eb41217"},
|
||||||
{file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"},
|
{file = "coverage-6.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:276b13cc085474e482566c477c25ed66a097b44c6e77132f3304ac0b039f83eb"},
|
||||||
{file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"},
|
{file = "coverage-6.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:56c4a409381ddd7bbff134e9756077860d4e8a583d310a6f38a2315b9ce301d0"},
|
||||||
{file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"},
|
{file = "coverage-6.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eb494070aa060ceba6e4bbf44c1bc5fa97bfb883a0d9b0c9049415f9e944793"},
|
||||||
{file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"},
|
{file = "coverage-6.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e15d424b8153756b7c903bde6d4610be0c3daca3986173c18dd5c1a1625e4cd"},
|
||||||
{file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"},
|
{file = "coverage-6.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d47a897c1e91f33f177c21de897267b38fbb45f2cd8e22a710bcef1df09ac1"},
|
||||||
{file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"},
|
{file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:25e73d4c81efa8ea3785274a2f7f3bfbbeccb6fcba2a0bdd3be9223371c37554"},
|
||||||
{file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"},
|
{file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fac0bcc5b7e8169bffa87f0dcc24435446d329cbc2b5486d155c2e0f3b493ae1"},
|
||||||
{file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"},
|
{file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:72128176fea72012063200b7b395ed8a57849282b207321124d7ff14e26988e8"},
|
||||||
{file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"},
|
{file = "coverage-6.3.1-cp37-cp37m-win32.whl", hash = "sha256:1bc6d709939ff262fd1432f03f080c5042dc6508b6e0d3d20e61dd045456a1a0"},
|
||||||
{file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"},
|
{file = "coverage-6.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:618eeba986cea7f621d8607ee378ecc8c2504b98b3fdc4952b30fe3578304687"},
|
||||||
{file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"},
|
{file = "coverage-6.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ed164af5c9078596cfc40b078c3b337911190d3faeac830c3f1274f26b8320"},
|
||||||
{file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"},
|
{file = "coverage-6.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:352c68e233409c31048a3725c446a9e48bbff36e39db92774d4f2380d630d8f8"},
|
||||||
{file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"},
|
{file = "coverage-6.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:448d7bde7ceb6c69e08474c2ddbc5b4cd13c9e4aa4a717467f716b5fc938a734"},
|
||||||
{file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"},
|
{file = "coverage-6.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fde6b90889522c220dd56a670102ceef24955d994ff7af2cb786b4ba8fe11e4"},
|
||||||
{file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"},
|
{file = "coverage-6.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e647a0be741edbb529a72644e999acb09f2ad60465f80757da183528941ff975"},
|
||||||
{file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"},
|
{file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a5cdc3adb4f8bb8d8f5e64c2e9e282bc12980ef055ec6da59db562ee9bdfefa"},
|
||||||
{file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"},
|
{file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2dd70a167843b4b4b2630c0c56f1b586fe965b4f8ac5da05b6690344fd065c6b"},
|
||||||
{file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"},
|
{file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9ad0a117b8dc2061ce9461ea4c1b4799e55edceb236522c5b8f958ce9ed8fa9a"},
|
||||||
{file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"},
|
{file = "coverage-6.3.1-cp38-cp38-win32.whl", hash = "sha256:e92c7a5f7d62edff50f60a045dc9542bf939758c95b2fcd686175dd10ce0ed10"},
|
||||||
{file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"},
|
{file = "coverage-6.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:482fb42eea6164894ff82abbcf33d526362de5d1a7ed25af7ecbdddd28fc124f"},
|
||||||
{file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"},
|
{file = "coverage-6.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c5b81fb37db76ebea79aa963b76d96ff854e7662921ce742293463635a87a78d"},
|
||||||
{file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"},
|
{file = "coverage-6.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a4f923b9ab265136e57cc14794a15b9dcea07a9c578609cd5dbbfff28a0d15e6"},
|
||||||
{file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"},
|
{file = "coverage-6.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d296cbc8254a7dffdd7bcc2eb70be5a233aae7c01856d2d936f5ac4e8ac1f1"},
|
||||||
{file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"},
|
{file = "coverage-6.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245ab82e8554fa88c4b2ab1e098ae051faac5af829efdcf2ce6b34dccd5567c"},
|
||||||
{file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"},
|
{file = "coverage-6.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f2b05757c92ad96b33dbf8e8ec8d4ccb9af6ae3c9e9bd141c7cc44d20c6bcba"},
|
||||||
{file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"},
|
{file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9e3dd806f34de38d4c01416344e98eab2437ac450b3ae39c62a0ede2f8b5e4ed"},
|
||||||
{file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"},
|
{file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d651fde74a4d3122e5562705824507e2f5b2d3d57557f1916c4b27635f8fbe3f"},
|
||||||
{file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"},
|
{file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:704f89b87c4f4737da2860695a18c852b78ec7279b24eedacab10b29067d3a38"},
|
||||||
{file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"},
|
{file = "coverage-6.3.1-cp39-cp39-win32.whl", hash = "sha256:2aed4761809640f02e44e16b8b32c1a5dee5e80ea30a0ff0912158bde9c501f2"},
|
||||||
{file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"},
|
{file = "coverage-6.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:9976fb0a5709988778ac9bc44f3d50fccd989987876dfd7716dee28beed0a9fa"},
|
||||||
{file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"},
|
{file = "coverage-6.3.1-pp36.pp37.pp38-none-any.whl", hash = "sha256:463e52616ea687fd323888e86bf25e864a3cc6335a043fad6bbb037dbf49bbe2"},
|
||||||
{file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"},
|
{file = "coverage-6.3.1.tar.gz", hash = "sha256:6c3f6158b02ac403868eea390930ae64e9a9a2a5bbfafefbb920d29258d9f2f8"},
|
||||||
{file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"},
|
|
||||||
{file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"},
|
|
||||||
{file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"},
|
|
||||||
{file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"},
|
|
||||||
{file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"},
|
|
||||||
{file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"},
|
|
||||||
]
|
]
|
||||||
croniter = [
|
croniter = [
|
||||||
{file = "croniter-1.1.0-py2.py3-none-any.whl", hash = "sha256:d30dd147d1daec39d015a15b8cceb3069b9780291b9c141e869c32574a8eeacb"},
|
{file = "croniter-1.2.0-py2.py3-none-any.whl", hash = "sha256:c214aa35c0de6048f2e3eddb6cb7812c99fcb4039f37f559a4b2d62edcb0d157"},
|
||||||
{file = "croniter-1.1.0.tar.gz", hash = "sha256:4023e4d18ced979332369964351e8f4f608c1f7c763e146b1d740002c4245247"},
|
{file = "croniter-1.2.0.tar.gz", hash = "sha256:094422f6aeb9ed646714393503fa388afe4f846e110e1997fea5794e2085c2d7"},
|
||||||
]
|
]
|
||||||
darglint = [
|
darglint = [
|
||||||
{file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"},
|
{file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"},
|
||||||
@@ -1417,8 +1411,8 @@ dparse = [
|
|||||||
{file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"},
|
{file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"},
|
||||||
]
|
]
|
||||||
filelock = [
|
filelock = [
|
||||||
{file = "filelock-3.4.0-py3-none-any.whl", hash = "sha256:2e139a228bcf56dd8b2274a65174d005c4a6b68540ee0bdbb92c76f43f29f7e8"},
|
{file = "filelock-3.4.2-py3-none-any.whl", hash = "sha256:cf0fc6a2f8d26bd900f19bf33915ca70ba4dd8c56903eeb14e1e7a2fd7590146"},
|
||||||
{file = "filelock-3.4.0.tar.gz", hash = "sha256:93d512b32a23baf4cac44ffd72ccf70732aeff7b8050fcaf6d3ec406d954baf4"},
|
{file = "filelock-3.4.2.tar.gz", hash = "sha256:38b4f4c989f9d06d44524df1b24bd19e167d851f19b50bf3e3559952dddc5b80"},
|
||||||
]
|
]
|
||||||
flake8 = [
|
flake8 = [
|
||||||
{file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
|
{file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
|
||||||
@@ -1428,8 +1422,8 @@ flake8-bandit = [
|
|||||||
{file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"},
|
{file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"},
|
||||||
]
|
]
|
||||||
flake8-bugbear = [
|
flake8-bugbear = [
|
||||||
{file = "flake8-bugbear-21.11.29.tar.gz", hash = "sha256:8b04cb2fafc6a78e1a9d873bd3988e4282f7959bb6b0d7c1ae648ec09b937a7b"},
|
{file = "flake8-bugbear-22.1.11.tar.gz", hash = "sha256:4c2a4136bd4ecb8bf02d5159af302ffc067642784c9d0488b33ce4610da825ee"},
|
||||||
{file = "flake8_bugbear-21.11.29-py36.py37.py38-none-any.whl", hash = "sha256:179e41ddae5de5e3c20d1f61736feeb234e70958fbb56ab3c28a67739c8e9a82"},
|
{file = "flake8_bugbear-22.1.11-py3-none-any.whl", hash = "sha256:ce7ae44aaaf67ef192b8a6de94a5ac617144e1675ad0654fdea556f48dc18d9b"},
|
||||||
]
|
]
|
||||||
flake8-docstrings = [
|
flake8-docstrings = [
|
||||||
{file = "flake8-docstrings-1.6.0.tar.gz", hash = "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b"},
|
{file = "flake8-docstrings-1.6.0.tar.gz", hash = "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b"},
|
||||||
@@ -1444,8 +1438,8 @@ flake8-rst-docstrings = [
|
|||||||
{file = "flake8_rst_docstrings-0.2.5-py3-none-any.whl", hash = "sha256:b99d9041b769b857efe45a448dc8c71b1bb311f9cacbdac5de82f96498105082"},
|
{file = "flake8_rst_docstrings-0.2.5-py3-none-any.whl", hash = "sha256:b99d9041b769b857efe45a448dc8c71b1bb311f9cacbdac5de82f96498105082"},
|
||||||
]
|
]
|
||||||
furo = [
|
furo = [
|
||||||
{file = "furo-2021.11.23-py3-none-any.whl", hash = "sha256:6d396451ad1aadce380c662fca9362cb10f4fd85f296d74fe3ca32006eb641d7"},
|
{file = "furo-2022.1.2-py3-none-any.whl", hash = "sha256:958016bfe1387c1e8ddf5b9d71696b69c4eaa5cd8afc9492abfb008aba2d300c"},
|
||||||
{file = "furo-2021.11.23.tar.gz", hash = "sha256:54cecac5f3b688b5c7370d72ecdf1cd91a6c53f0f42751f4a719184b562cde70"},
|
{file = "furo-2022.1.2.tar.gz", hash = "sha256:b217f218cbcd423ffbfe69baa79389d4ecebf2d86f0d593c44ef31da7b5aed30"},
|
||||||
]
|
]
|
||||||
gitdb = [
|
gitdb = [
|
||||||
{file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
|
{file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
|
||||||
@@ -1460,16 +1454,16 @@ h11 = [
|
|||||||
{file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"},
|
{file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"},
|
||||||
]
|
]
|
||||||
httpcore = [
|
httpcore = [
|
||||||
{file = "httpcore-0.14.3-py3-none-any.whl", hash = "sha256:9a98d2416b78976fc5396ff1f6b26ae9885efbb3105d24eed490f20ab4c95ec1"},
|
{file = "httpcore-0.14.5-py3-none-any.whl", hash = "sha256:2621ee769d0236574df51b305c5f4c69ca8f0c7b215221ad247b1ee42a9a9de1"},
|
||||||
{file = "httpcore-0.14.3.tar.gz", hash = "sha256:d10162a63265a0228d5807964bd964478cbdb5178f9a2eedfebb2faba27eef5d"},
|
{file = "httpcore-0.14.5.tar.gz", hash = "sha256:435ab519628a6e2393f67812dea3ca5c6ad23b457412cd119295d9f906d96a2b"},
|
||||||
]
|
]
|
||||||
httpx = [
|
httpx = [
|
||||||
{file = "httpx-0.21.1-py3-none-any.whl", hash = "sha256:208e5ef2ad4d105213463cfd541898ed9d11851b346473539a8425e644bb7c66"},
|
{file = "httpx-0.22.0-py3-none-any.whl", hash = "sha256:e35e83d1d2b9b2a609ef367cc4c1e66fd80b750348b20cc9e19d1952fc2ca3f6"},
|
||||||
{file = "httpx-0.21.1.tar.gz", hash = "sha256:02af20df486b78892a614a7ccd4e4e86a5409ec4981ab0e422c579a887acad83"},
|
{file = "httpx-0.22.0.tar.gz", hash = "sha256:d8e778f76d9bbd46af49e7f062467e3157a5a3d2ae4876a4bbfd8a51ed9c9cb4"},
|
||||||
]
|
]
|
||||||
identify = [
|
identify = [
|
||||||
{file = "identify-2.4.0-py2.py3-none-any.whl", hash = "sha256:eba31ca80258de6bb51453084bff4a923187cd2193b9c13710f2516ab30732cc"},
|
{file = "identify-2.4.1-py2.py3-none-any.whl", hash = "sha256:0192893ff68b03d37fed553e261d4a22f94ea974093aefb33b29df2ff35fed3c"},
|
||||||
{file = "identify-2.4.0.tar.gz", hash = "sha256:a33ae873287e81651c7800ca309dc1f84679b763c9c8b30680e16fbfa82f0107"},
|
{file = "identify-2.4.1.tar.gz", hash = "sha256:64d4885e539f505dd8ffb5e93c142a1db45480452b1594cacd3e91dca9a984e9"},
|
||||||
]
|
]
|
||||||
idna = [
|
idna = [
|
||||||
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
|
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
|
||||||
@@ -1570,29 +1564,26 @@ mccabe = [
|
|||||||
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
|
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
|
||||||
]
|
]
|
||||||
mypy = [
|
mypy = [
|
||||||
{file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"},
|
{file = "mypy-0.931-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a"},
|
||||||
{file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"},
|
{file = "mypy-0.931-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00"},
|
||||||
{file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"},
|
{file = "mypy-0.931-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714"},
|
||||||
{file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"},
|
{file = "mypy-0.931-cp310-cp310-win_amd64.whl", hash = "sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc"},
|
||||||
{file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"},
|
{file = "mypy-0.931-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1bf752559797c897cdd2c65f7b60c2b6969ffe458417b8d947b8340cc9cec08d"},
|
||||||
{file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"},
|
{file = "mypy-0.931-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4365c60266b95a3f216a3047f1d8e3f895da6c7402e9e1ddfab96393122cc58d"},
|
||||||
{file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"},
|
{file = "mypy-0.931-cp36-cp36m-win_amd64.whl", hash = "sha256:1b65714dc296a7991000b6ee59a35b3f550e0073411ac9d3202f6516621ba66c"},
|
||||||
{file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"},
|
{file = "mypy-0.931-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e839191b8da5b4e5d805f940537efcaa13ea5dd98418f06dc585d2891d228cf0"},
|
||||||
{file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"},
|
{file = "mypy-0.931-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:50c7346a46dc76a4ed88f3277d4959de8a2bd0a0fa47fa87a4cde36fe247ac05"},
|
||||||
{file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"},
|
{file = "mypy-0.931-cp37-cp37m-win_amd64.whl", hash = "sha256:d8f1ff62f7a879c9fe5917b3f9eb93a79b78aad47b533911b853a757223f72e7"},
|
||||||
{file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"},
|
{file = "mypy-0.931-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9fe20d0872b26c4bba1c1be02c5340de1019530302cf2dcc85c7f9fc3252ae0"},
|
||||||
{file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"},
|
{file = "mypy-0.931-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1b06268df7eb53a8feea99cbfff77a6e2b205e70bf31743e786678ef87ee8069"},
|
||||||
{file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"},
|
{file = "mypy-0.931-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8c11003aaeaf7cc2d0f1bc101c1cc9454ec4cc9cb825aef3cafff8a5fdf4c799"},
|
||||||
{file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"},
|
{file = "mypy-0.931-cp38-cp38-win_amd64.whl", hash = "sha256:d9d2b84b2007cea426e327d2483238f040c49405a6bf4074f605f0156c91a47a"},
|
||||||
{file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"},
|
{file = "mypy-0.931-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166"},
|
||||||
{file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"},
|
{file = "mypy-0.931-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b56154f8c09427bae082b32275a21f500b24d93c88d69a5e82f3978018a0266"},
|
||||||
{file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"},
|
{file = "mypy-0.931-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ca7f8c4b1584d63c9a0f827c37ba7a47226c19a23a753d52e5b5eddb201afcd"},
|
||||||
{file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"},
|
{file = "mypy-0.931-cp39-cp39-win_amd64.whl", hash = "sha256:74f7eccbfd436abe9c352ad9fb65872cc0f1f0a868e9d9c44db0893440f0c697"},
|
||||||
{file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"},
|
{file = "mypy-0.931-py3-none-any.whl", hash = "sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d"},
|
||||||
{file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"},
|
{file = "mypy-0.931.tar.gz", hash = "sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce"},
|
||||||
{file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"},
|
|
||||||
{file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"},
|
|
||||||
{file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"},
|
|
||||||
]
|
]
|
||||||
mypy-extensions = [
|
mypy-extensions = [
|
||||||
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
|
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
|
||||||
@@ -1619,20 +1610,20 @@ pep8-naming = [
|
|||||||
{file = "pep8_naming-0.12.1-py2.py3-none-any.whl", hash = "sha256:4a8daeaeb33cfcde779309fc0c9c0a68a3bbe2ad8a8308b763c5068f86eb9f37"},
|
{file = "pep8_naming-0.12.1-py2.py3-none-any.whl", hash = "sha256:4a8daeaeb33cfcde779309fc0c9c0a68a3bbe2ad8a8308b763c5068f86eb9f37"},
|
||||||
]
|
]
|
||||||
platformdirs = [
|
platformdirs = [
|
||||||
{file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"},
|
{file = "platformdirs-2.4.1-py3-none-any.whl", hash = "sha256:1d7385c7db91728b83efd0ca99a5afb296cab9d0ed8313a45ed8ba17967ecfca"},
|
||||||
{file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"},
|
{file = "platformdirs-2.4.1.tar.gz", hash = "sha256:440633ddfebcc36264232365d7840a970e75e1018d15b4327d11f91909045fda"},
|
||||||
]
|
]
|
||||||
pluggy = [
|
pluggy = [
|
||||||
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
|
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
|
||||||
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
|
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
|
||||||
]
|
]
|
||||||
pre-commit = [
|
pre-commit = [
|
||||||
{file = "pre_commit-2.16.0-py2.py3-none-any.whl", hash = "sha256:758d1dc9b62c2ed8881585c254976d66eae0889919ab9b859064fc2fe3c7743e"},
|
{file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"},
|
||||||
{file = "pre_commit-2.16.0.tar.gz", hash = "sha256:fe9897cac830aa7164dbd02a4e7b90cae49630451ce88464bca73db486ba9f65"},
|
{file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"},
|
||||||
]
|
]
|
||||||
pre-commit-hooks = [
|
pre-commit-hooks = [
|
||||||
{file = "pre_commit_hooks-4.0.1-py2.py3-none-any.whl", hash = "sha256:6efe92c7613c311abc7dd06817fc016f222d9289fe24b261e64412b0af96c662"},
|
{file = "pre_commit_hooks-4.1.0-py2.py3-none-any.whl", hash = "sha256:ba95316b79038e56ce998cdacb1ce922831ac0e41744c77bcc2b9677bf183206"},
|
||||||
{file = "pre_commit_hooks-4.0.1.tar.gz", hash = "sha256:99f1b9fc00a82e6588990b6b92edcdf4bec9c3d65c6272b8867be389055ce05e"},
|
{file = "pre_commit_hooks-4.1.0.tar.gz", hash = "sha256:b6361865d1877c5da5ac3a944aab19ce6bd749a534d2ede28e683d07194a57e1"},
|
||||||
]
|
]
|
||||||
py = [
|
py = [
|
||||||
{file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
|
{file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
|
||||||
@@ -1643,28 +1634,41 @@ pycodestyle = [
|
|||||||
{file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
|
{file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
|
||||||
]
|
]
|
||||||
pydantic = [
|
pydantic = [
|
||||||
{file = "pydantic-1.8.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739"},
|
{file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"},
|
||||||
{file = "pydantic-1.8.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4"},
|
{file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"},
|
||||||
{file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e"},
|
{file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"},
|
||||||
{file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840"},
|
{file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"},
|
||||||
{file = "pydantic-1.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b"},
|
{file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"},
|
||||||
{file = "pydantic-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20"},
|
{file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"},
|
||||||
{file = "pydantic-1.8.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb"},
|
{file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"},
|
||||||
{file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1"},
|
{file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"},
|
||||||
{file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23"},
|
{file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"},
|
||||||
{file = "pydantic-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287"},
|
{file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"},
|
||||||
{file = "pydantic-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd"},
|
{file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"},
|
||||||
{file = "pydantic-1.8.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505"},
|
{file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"},
|
||||||
{file = "pydantic-1.8.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e"},
|
{file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"},
|
||||||
{file = "pydantic-1.8.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820"},
|
{file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"},
|
||||||
{file = "pydantic-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3"},
|
{file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"},
|
||||||
{file = "pydantic-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316"},
|
{file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"},
|
||||||
{file = "pydantic-1.8.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62"},
|
{file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"},
|
||||||
{file = "pydantic-1.8.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f"},
|
{file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"},
|
||||||
{file = "pydantic-1.8.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b"},
|
{file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"},
|
||||||
{file = "pydantic-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3"},
|
{file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"},
|
||||||
{file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"},
|
{file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"},
|
||||||
{file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"},
|
{file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"},
|
||||||
|
{file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"},
|
||||||
|
{file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"},
|
||||||
|
{file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"},
|
||||||
|
{file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"},
|
||||||
|
{file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"},
|
||||||
|
{file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"},
|
||||||
|
{file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"},
|
||||||
|
{file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"},
|
||||||
|
{file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"},
|
||||||
|
{file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"},
|
||||||
|
{file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"},
|
||||||
|
{file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"},
|
||||||
|
{file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"},
|
||||||
]
|
]
|
||||||
pydocstyle = [
|
pydocstyle = [
|
||||||
{file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"},
|
{file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"},
|
||||||
@@ -1675,8 +1679,8 @@ pyflakes = [
|
|||||||
{file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"},
|
{file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"},
|
||||||
]
|
]
|
||||||
pygments = [
|
pygments = [
|
||||||
{file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"},
|
{file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"},
|
||||||
{file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"},
|
{file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"},
|
||||||
]
|
]
|
||||||
pyparsing = [
|
pyparsing = [
|
||||||
{file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"},
|
{file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"},
|
||||||
@@ -1691,8 +1695,8 @@ pytest-async = [
|
|||||||
{file = "pytest_async-0.1.1.tar.gz", hash = "sha256:0d6ffd3ebac2f3aa47d606dbae1984750268a89dc8caf4a908ba61c60299cdfd"},
|
{file = "pytest_async-0.1.1.tar.gz", hash = "sha256:0d6ffd3ebac2f3aa47d606dbae1984750268a89dc8caf4a908ba61c60299cdfd"},
|
||||||
]
|
]
|
||||||
pytest-asyncio = [
|
pytest-asyncio = [
|
||||||
{file = "pytest-asyncio-0.16.0.tar.gz", hash = "sha256:7496c5977ce88c34379df64a66459fe395cd05543f0a2f837016e7144391fcfb"},
|
{file = "pytest-asyncio-0.17.2.tar.gz", hash = "sha256:6d895b02432c028e6957d25fc936494e78c6305736e785d9fee408b1efbc7ff4"},
|
||||||
{file = "pytest_asyncio-0.16.0-py3-none-any.whl", hash = "sha256:5f2a21273c47b331ae6aa5b36087047b4899e40f03f18397c0e65fa5cca54e9b"},
|
{file = "pytest_asyncio-0.17.2-py3-none-any.whl", hash = "sha256:e0fe5dbea40516b661ef1bcfe0bd9461c2847c4ef4bb40012324f2454fb7d56d"},
|
||||||
]
|
]
|
||||||
pytest-cov = [
|
pytest-cov = [
|
||||||
{file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
|
{file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
|
||||||
@@ -1703,8 +1707,8 @@ pytest-lazy-fixture = [
|
|||||||
{file = "pytest_lazy_fixture-0.6.3-py3-none-any.whl", hash = "sha256:e0b379f38299ff27a653f03eaa69b08a6fd4484e46fd1c9907d984b9f9daeda6"},
|
{file = "pytest_lazy_fixture-0.6.3-py3-none-any.whl", hash = "sha256:e0b379f38299ff27a653f03eaa69b08a6fd4484e46fd1c9907d984b9f9daeda6"},
|
||||||
]
|
]
|
||||||
pytest-mock = [
|
pytest-mock = [
|
||||||
{file = "pytest-mock-3.6.1.tar.gz", hash = "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62"},
|
{file = "pytest-mock-3.7.0.tar.gz", hash = "sha256:5112bd92cc9f186ee96e1a92efc84969ea494939c3aead39c50f421c4cc69534"},
|
||||||
{file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"},
|
{file = "pytest_mock-3.7.0-py3-none-any.whl", hash = "sha256:6cff27cec936bf81dc5ee87f07132b807bcda51106b5ec4b90a04331cba76231"},
|
||||||
]
|
]
|
||||||
python-dateutil = [
|
python-dateutil = [
|
||||||
{file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
|
{file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
|
||||||
@@ -1715,8 +1719,8 @@ pytz = [
|
|||||||
{file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
|
{file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
|
||||||
]
|
]
|
||||||
pyupgrade = [
|
pyupgrade = [
|
||||||
{file = "pyupgrade-2.29.1-py2.py3-none-any.whl", hash = "sha256:1d3f03d14652caacd6f3d464696e103ef33578531a5c1b995be3821b14b811b7"},
|
{file = "pyupgrade-2.31.0-py2.py3-none-any.whl", hash = "sha256:0a62c5055f854d7f36e155b7ee8920561bf0399c53edd975cf02436eef8937fc"},
|
||||||
{file = "pyupgrade-2.29.1.tar.gz", hash = "sha256:737e02bed0de70247df5d2a0c3edba6b4529adf44f5ef588ecda4a69f14bf694"},
|
{file = "pyupgrade-2.31.0.tar.gz", hash = "sha256:80e2308cae2b11c3fdd091137495d99abf7e0cd98b501aa5758974991497c24c"},
|
||||||
]
|
]
|
||||||
pyyaml = [
|
pyyaml = [
|
||||||
{file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
|
{file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
|
||||||
@@ -1754,16 +1758,16 @@ pyyaml = [
|
|||||||
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
|
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
|
||||||
]
|
]
|
||||||
reorder-python-imports = [
|
reorder-python-imports = [
|
||||||
{file = "reorder_python_imports-2.6.0-py2.py3-none-any.whl", hash = "sha256:54a3afd594a3959b10f7eb8b54ef453eb2b5176eb7b01c111cb1893ff9a2c685"},
|
{file = "reorder_python_imports-2.7.1-py2.py3-none-any.whl", hash = "sha256:5477c008cd7a5f2dbe32a35e90d74b5a3427468731441f033034310e427143a3"},
|
||||||
{file = "reorder_python_imports-2.6.0.tar.gz", hash = "sha256:f4dc03142bdb57625e64299aea80e9055ce0f8b719f8f19c217a487c9fa9379e"},
|
{file = "reorder_python_imports-2.7.1.tar.gz", hash = "sha256:1ae34422f13f5a4b4669f340774909d721bfc0a8311973c70b3a50540b595bc5"},
|
||||||
]
|
]
|
||||||
requests = [
|
requests = [
|
||||||
{file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
|
{file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
|
||||||
{file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
|
{file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
|
||||||
]
|
]
|
||||||
respx = [
|
respx = [
|
||||||
{file = "respx-0.19.0-py2.py3-none-any.whl", hash = "sha256:1ac1cc99bf892ffd3e33108ae43d71d8309a58ac226965f4bd81ec055600f265"},
|
{file = "respx-0.19.2-py2.py3-none-any.whl", hash = "sha256:417f986fec599b9cc6531e93e494b7a75d1cb7bccff9dde5b53edc51f7954494"},
|
||||||
{file = "respx-0.19.0.tar.gz", hash = "sha256:4a09e15803c7450d45303520ec528794c9fd77b05984263bc83b78aabbb39413"},
|
{file = "respx-0.19.2.tar.gz", hash = "sha256:f3d210bb4de0ccc4c5afabeb87c3c1b03b3765a9c1a73eb042a07bb18ac33705"},
|
||||||
]
|
]
|
||||||
restructuredtext-lint = [
|
restructuredtext-lint = [
|
||||||
{file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"},
|
{file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"},
|
||||||
@@ -1773,8 +1777,8 @@ rfc3986 = [
|
|||||||
{file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
|
{file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
|
||||||
]
|
]
|
||||||
"ruamel.yaml" = [
|
"ruamel.yaml" = [
|
||||||
{file = "ruamel.yaml-0.17.17-py3-none-any.whl", hash = "sha256:9af3ec5d7f8065582f3aa841305465025d0afd26c5fb54e15b964e11838fc74f"},
|
{file = "ruamel.yaml-0.17.19-py3-none-any.whl", hash = "sha256:92ac00b312c9a83ff3253a8f7b86dfe6f9996b4082b103af84b8df99175945bc"},
|
||||||
{file = "ruamel.yaml-0.17.17.tar.gz", hash = "sha256:9751de4cbb57d4bfbf8fc394e125ed4a2f170fbff3dc3d78abf50be85924f8be"},
|
{file = "ruamel.yaml-0.17.19.tar.gz", hash = "sha256:b9ce9a925d0f0c35a1dbba56b40f253c53cd526b0fa81cf7b1d24996f28fb1d7"},
|
||||||
]
|
]
|
||||||
"ruamel.yaml.clib" = [
|
"ruamel.yaml.clib" = [
|
||||||
{file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"},
|
{file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"},
|
||||||
@@ -1828,16 +1832,16 @@ soupsieve = [
|
|||||||
{file = "soupsieve-2.3.1.tar.gz", hash = "sha256:b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9"},
|
{file = "soupsieve-2.3.1.tar.gz", hash = "sha256:b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9"},
|
||||||
]
|
]
|
||||||
sphinx = [
|
sphinx = [
|
||||||
{file = "Sphinx-4.3.1-py3-none-any.whl", hash = "sha256:048dac56039a5713f47a554589dc98a442b39226a2b9ed7f82797fcb2fe9253f"},
|
{file = "Sphinx-4.3.2-py3-none-any.whl", hash = "sha256:6a11ea5dd0bdb197f9c2abc2e0ce73e01340464feaece525e64036546d24c851"},
|
||||||
{file = "Sphinx-4.3.1.tar.gz", hash = "sha256:32a5b3e9a1b176cc25ed048557d4d3d01af635e6b76c5bc7a43b0a34447fbd45"},
|
{file = "Sphinx-4.3.2.tar.gz", hash = "sha256:0a8836751a68306b3fe97ecbe44db786f8479c3bf4b80e3a7f5c838657b4698c"},
|
||||||
]
|
]
|
||||||
sphinx-autobuild = [
|
sphinx-autobuild = [
|
||||||
{file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"},
|
{file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"},
|
||||||
{file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"},
|
{file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"},
|
||||||
]
|
]
|
||||||
sphinx-click = [
|
sphinx-click = [
|
||||||
{file = "sphinx-click-3.0.2.tar.gz", hash = "sha256:29896dd12bfaacb566a8c7af2e2b675d010d69b0c5aad3b52495d4842358b15b"},
|
{file = "sphinx-click-3.1.0.tar.gz", hash = "sha256:36dbf271b1d2600fb05bd598ddeed0b6b6acf35beaf8bc9d507ba7716b232b0e"},
|
||||||
{file = "sphinx_click-3.0.2-py3-none-any.whl", hash = "sha256:8529a02bea8cd2cd47daba2f71d7935c727c89d70baabec7fca31af49a0c379f"},
|
{file = "sphinx_click-3.1.0-py3-none-any.whl", hash = "sha256:8fb0b048a577d346d741782e44d041d7e908922858273d99746f305870116121"},
|
||||||
]
|
]
|
||||||
sphinxcontrib-applehelp = [
|
sphinxcontrib-applehelp = [
|
||||||
{file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
|
{file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
|
||||||
@@ -1876,8 +1880,8 @@ toml = [
|
|||||||
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
||||||
]
|
]
|
||||||
tomli = [
|
tomli = [
|
||||||
{file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"},
|
{file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"},
|
||||||
{file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"},
|
{file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"},
|
||||||
]
|
]
|
||||||
tornado = [
|
tornado = [
|
||||||
{file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"},
|
{file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"},
|
||||||
@@ -1959,12 +1963,12 @@ typeguard = [
|
|||||||
{file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"},
|
{file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"},
|
||||||
]
|
]
|
||||||
types-croniter = [
|
types-croniter = [
|
||||||
{file = "types-croniter-1.0.3.tar.gz", hash = "sha256:955d9ca3efaf99f0f76d6607a1f5b8a9cc4051e26dc34b4a3d69dfa29571758e"},
|
{file = "types-croniter-1.0.7.tar.gz", hash = "sha256:4989e4b0199f7d5d16d1ec1c931cf981acf47f153bf67d329dc12377c32f34e0"},
|
||||||
{file = "types_croniter-1.0.3-py3-none-any.whl", hash = "sha256:45f5ca35db9c964c986ecbceea0a779219638b38a01f5346242da44a0013c3e1"},
|
{file = "types_croniter-1.0.7-py3-none-any.whl", hash = "sha256:7166f6b013126087354b4bb1eb775f81c7c7d096720591b02e2a1ca5f7ea1f9a"},
|
||||||
]
|
]
|
||||||
types-pytz = [
|
types-pytz = [
|
||||||
{file = "types-pytz-2021.3.3.tar.gz", hash = "sha256:f6d21d6687935a1615db464b1e1df800d19502c36bc0486f43be7dfd2c404947"},
|
{file = "types-pytz-2021.3.4.tar.gz", hash = "sha256:101da53091013bb07403468c20d36930d749d3918054ac46f9c1bfc607dadf7d"},
|
||||||
{file = "types_pytz-2021.3.3-py3-none-any.whl", hash = "sha256:75859c64c9a97d68259af6da208e8f5aaf4be4536e4d431a82a6e8b848fc183d"},
|
{file = "types_pytz-2021.3.4-py3-none-any.whl", hash = "sha256:ccfa2ed29f816e3de2f882541c06ad2791f808a79cfe38265411820190999f0f"},
|
||||||
]
|
]
|
||||||
typing-extensions = [
|
typing-extensions = [
|
||||||
{file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"},
|
{file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"},
|
||||||
@@ -1975,14 +1979,14 @@ urllib3 = [
|
|||||||
{file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
|
{file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
|
||||||
]
|
]
|
||||||
virtualenv = [
|
virtualenv = [
|
||||||
{file = "virtualenv-20.10.0-py2.py3-none-any.whl", hash = "sha256:4b02e52a624336eece99c96e3ab7111f469c24ba226a53ec474e8e787b365814"},
|
{file = "virtualenv-20.11.2-py2.py3-none-any.whl", hash = "sha256:efd556cec612fd826dc7ef8ce26a6e4ba2395f494244919acd135fb5ceffa809"},
|
||||||
{file = "virtualenv-20.10.0.tar.gz", hash = "sha256:576d05b46eace16a9c348085f7d0dc8ef28713a2cabaa1cf0aea41e8f12c9218"},
|
{file = "virtualenv-20.11.2.tar.gz", hash = "sha256:7f9e9c2e878d92a434e760058780b8d67a7c5ec016a66784fe4b0d5e50a4eb5c"},
|
||||||
]
|
]
|
||||||
xdoctest = [
|
xdoctest = [
|
||||||
{file = "xdoctest-0.15.10-py3-none-any.whl", hash = "sha256:7666bd0511df59275dfe94ef94b0fde9654afd14f00bf88902fdc9bcee77d527"},
|
{file = "xdoctest-0.15.10-py3-none-any.whl", hash = "sha256:7666bd0511df59275dfe94ef94b0fde9654afd14f00bf88902fdc9bcee77d527"},
|
||||||
{file = "xdoctest-0.15.10.tar.gz", hash = "sha256:5f16438f2b203860e75ec594dbc38020df7524db0b41bb88467ea0a6030e6685"},
|
{file = "xdoctest-0.15.10.tar.gz", hash = "sha256:5f16438f2b203860e75ec594dbc38020df7524db0b41bb88467ea0a6030e6685"},
|
||||||
]
|
]
|
||||||
zipp = [
|
zipp = [
|
||||||
{file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"},
|
{file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"},
|
||||||
{file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"},
|
{file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"},
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -19,20 +19,20 @@ Changelog = "https://github.com/andrewthetechie/py-healthchecks.io/releases"
|
|||||||
python = "^3.7"
|
python = "^3.7"
|
||||||
click = "^8.0.1"
|
click = "^8.0.1"
|
||||||
pydantic = "^1.8.2"
|
pydantic = "^1.8.2"
|
||||||
httpx = "^0.21.1"
|
httpx = ">=0.21.1,<0.23.0"
|
||||||
croniter = "^1.1.0"
|
croniter = "^1.1.0"
|
||||||
pytz = "^2021.3"
|
pytz = "^2021.3"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
pytest = "^6.2.5"
|
pytest = "^6.2.5"
|
||||||
coverage = {extras = ["toml"], version = "^6.2"}
|
coverage = {extras = ["toml"], version = "^6.3"}
|
||||||
safety = "^1.10.3"
|
safety = "^1.10.3"
|
||||||
mypy = "^0.910"
|
mypy = "^0.931"
|
||||||
typeguard = "^2.13.2"
|
typeguard = "^2.13.2"
|
||||||
xdoctest = {extras = ["colors"], version = "^0.15.10"}
|
xdoctest = {extras = ["colors"], version = "^0.15.10"}
|
||||||
sphinx = "^4.3.1"
|
sphinx = "^4.3.2"
|
||||||
sphinx-autobuild = ">=2021.3.14"
|
sphinx-autobuild = ">=2021.3.14"
|
||||||
pre-commit = "^2.16.0"
|
pre-commit = "^2.17.0"
|
||||||
flake8 = "^4.0.1"
|
flake8 = "^4.0.1"
|
||||||
black = ">=21.10b0"
|
black = ">=21.10b0"
|
||||||
flake8-bandit = "^2.1.2"
|
flake8-bandit = "^2.1.2"
|
||||||
@@ -41,19 +41,19 @@ flake8-docstrings = "^1.6.0"
|
|||||||
flake8-rst-docstrings = "^0.2.3"
|
flake8-rst-docstrings = "^0.2.3"
|
||||||
pep8-naming = "^0.12.1"
|
pep8-naming = "^0.12.1"
|
||||||
darglint = "^1.8.1"
|
darglint = "^1.8.1"
|
||||||
reorder-python-imports = "^2.6.0"
|
reorder-python-imports = "^2.7.1"
|
||||||
pre-commit-hooks = "^4.0.1"
|
pre-commit-hooks = "^4.0.1"
|
||||||
sphinx-click = "^3.0.2"
|
sphinx-click = "^3.1.0"
|
||||||
Pygments = "^2.10.0"
|
Pygments = "^2.11.2"
|
||||||
pyupgrade = "^2.29.1"
|
pyupgrade = "^2.31.0"
|
||||||
furo = ">=2021.11.12"
|
furo = ">=2021.11.12"
|
||||||
pytest-cov = "^3.0.0"
|
pytest-cov = "^3.0.0"
|
||||||
types-croniter = "^1.0.3"
|
types-croniter = "^1.0.7"
|
||||||
types-pytz = "^2021.3.3"
|
types-pytz = "^2021.3.4"
|
||||||
pytest_async = "^0.1.1"
|
pytest_async = "^0.1.1"
|
||||||
pytest-asyncio = "^0.16.0"
|
pytest-asyncio = "^0.17.2"
|
||||||
respx = "^0.19.0"
|
respx = "^0.19.2"
|
||||||
pytest-mock = "^3.6.1"
|
pytest-mock = "^3.7.0"
|
||||||
pytest-lazy-fixture = "^0.6.3"
|
pytest-lazy-fixture = "^0.6.3"
|
||||||
|
|
||||||
[tool.coverage.paths]
|
[tool.coverage.paths]
|
||||||
|
|||||||
@@ -4,18 +4,22 @@ __version__ = "0.0.0" # noqa: E402
|
|||||||
|
|
||||||
from .client import AsyncClient # noqa: F401, E402
|
from .client import AsyncClient # noqa: F401, E402
|
||||||
from .client import Client # noqa: F401, E402
|
from .client import Client # noqa: F401, E402
|
||||||
|
from .client import CheckTrap # noqa: F401, E402
|
||||||
from .client.exceptions import BadAPIRequestError # noqa: F401, E402
|
from .client.exceptions import BadAPIRequestError # noqa: F401, E402
|
||||||
from .client.exceptions import CheckNotFoundError # noqa: F401, E402
|
from .client.exceptions import CheckNotFoundError # noqa: F401, E402
|
||||||
from .client.exceptions import HCAPIAuthError # noqa: F401, E402
|
from .client.exceptions import HCAPIAuthError # noqa: F401, E402
|
||||||
from .client.exceptions import HCAPIError # noqa: F401, E402
|
from .client.exceptions import HCAPIError # noqa: F401, E402
|
||||||
from .client.exceptions import HCAPIRateLimitError # noqa: F401, E402
|
from .client.exceptions import HCAPIRateLimitError # noqa: F401, E402
|
||||||
from .client.exceptions import NonUniqueSlugError # noqa: F401, E402
|
from .client.exceptions import NonUniqueSlugError # noqa: F401, E402
|
||||||
|
from .client.exceptions import WrongClientError # noqa: F401, E402
|
||||||
|
from .client.exceptions import PingFailedError # noqa: F401, E402
|
||||||
from .schemas import Check, CheckCreate, CheckPings, CheckStatuses # noqa: F401, E402
|
from .schemas import Check, CheckCreate, CheckPings, CheckStatuses # noqa: F401, E402
|
||||||
from .schemas import Integration, Badges, CheckUpdate # noqa: F401, E402
|
from .schemas import Integration, Badges, CheckUpdate # noqa: F401, E402
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"AsyncClient",
|
"AsyncClient",
|
||||||
"Client",
|
"Client",
|
||||||
|
"CheckTrap",
|
||||||
"BadAPIRequestError",
|
"BadAPIRequestError",
|
||||||
"CheckNotFoundError",
|
"CheckNotFoundError",
|
||||||
"HCAPIAuthError",
|
"HCAPIAuthError",
|
||||||
@@ -23,6 +27,8 @@ __all__ = [
|
|||||||
"CheckNotFoundError",
|
"CheckNotFoundError",
|
||||||
"HCAPIRateLimitError",
|
"HCAPIRateLimitError",
|
||||||
"NonUniqueSlugError",
|
"NonUniqueSlugError",
|
||||||
|
"WrongClientError",
|
||||||
|
"PingFailedError",
|
||||||
"Check",
|
"Check",
|
||||||
"CheckCreate",
|
"CheckCreate",
|
||||||
"CheckUpdate",
|
"CheckUpdate",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
"""healthchecks_io clients."""
|
"""healthchecks_io clients."""
|
||||||
from .async_client import AsyncClient # noqa: F401
|
from .async_client import AsyncClient # noqa: F401
|
||||||
|
from .check_trap import CheckTrap # noqa: F401
|
||||||
from .sync_client import Client # noqa: F401
|
from .sync_client import Client # noqa: F401
|
||||||
|
|
||||||
__all__ = ["AsyncClient", "Client"]
|
__all__ = ["AsyncClient", "Client", "CheckTrap"]
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
"""An async healthchecks.io client."""
|
"""An async healthchecks.io client."""
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from types import TracebackType
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
from typing import Type
|
||||||
|
|
||||||
from httpx import AsyncClient as HTTPXAsyncClient
|
from httpx import AsyncClient as HTTPXAsyncClient
|
||||||
|
|
||||||
@@ -56,6 +58,23 @@ class AsyncClient(AbstractClient):
|
|||||||
] = f"py-healthchecks.io-async/{client_version}"
|
] = f"py-healthchecks.io-async/{client_version}"
|
||||||
self._client.headers["Content-type"] = "application/json"
|
self._client.headers["Content-type"] = "application/json"
|
||||||
|
|
||||||
|
async def __aenter__(self) -> "AsyncClient":
|
||||||
|
"""Context manager entrance.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
AsyncClient: returns this client as a context manager
|
||||||
|
"""
|
||||||
|
return self
|
||||||
|
|
||||||
|
async def __aexit__(
|
||||||
|
self,
|
||||||
|
exc_type: Optional[Type[BaseException]],
|
||||||
|
exc: Optional[BaseException],
|
||||||
|
traceback: Optional[TracebackType],
|
||||||
|
) -> None:
|
||||||
|
"""Context manager exit."""
|
||||||
|
await self._afinalizer_method()
|
||||||
|
|
||||||
def _finalizer_method(self) -> None:
|
def _finalizer_method(self) -> None:
|
||||||
"""Calls _afinalizer_method from a sync context to work with weakref.finalizer."""
|
"""Calls _afinalizer_method from a sync context to work with weakref.finalizer."""
|
||||||
asyncio.run(self._afinalizer_method())
|
asyncio.run(self._afinalizer_method())
|
||||||
@@ -79,7 +98,7 @@ class AsyncClient(AbstractClient):
|
|||||||
"""
|
"""
|
||||||
request_url = self._get_api_request_url("checks/")
|
request_url = self._get_api_request_url("checks/")
|
||||||
response = self.check_response(
|
response = self.check_response(
|
||||||
await self._client.post(request_url, json=new_check.dict())
|
await self._client.post(request_url, json=new_check.dict(exclude_none=True))
|
||||||
)
|
)
|
||||||
return Check.from_api_result(response.json())
|
return Check.from_api_result(response.json())
|
||||||
|
|
||||||
@@ -99,7 +118,8 @@ class AsyncClient(AbstractClient):
|
|||||||
request_url = self._get_api_request_url(f"checks/{uuid}")
|
request_url = self._get_api_request_url(f"checks/{uuid}")
|
||||||
response = self.check_response(
|
response = self.check_response(
|
||||||
await self._client.post(
|
await self._client.post(
|
||||||
request_url, json=update_check.dict(exclude_unset=True)
|
request_url,
|
||||||
|
json=update_check.dict(exclude_unset=True, exclude_none=True),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return Check.from_api_result(response.json())
|
return Check.from_api_result(response.json())
|
||||||
@@ -322,7 +342,9 @@ class AsyncClient(AbstractClient):
|
|||||||
for key, item in response.json()["badges"].items()
|
for key, item in response.json()["badges"].items()
|
||||||
}
|
}
|
||||||
|
|
||||||
async def success_ping(self, uuid: str = "", slug: str = "") -> Tuple[bool, str]:
|
async def success_ping(
|
||||||
|
self, uuid: str = "", slug: str = "", data: str = ""
|
||||||
|
) -> Tuple[bool, str]:
|
||||||
"""Signals to Healthchecks.io that a job has completed successfully.
|
"""Signals to Healthchecks.io that a job has completed successfully.
|
||||||
|
|
||||||
Can also be used to indicate a continuously running process is still running and healthy.
|
Can also be used to indicate a continuously running process is still running and healthy.
|
||||||
@@ -338,6 +360,7 @@ class AsyncClient(AbstractClient):
|
|||||||
Args:
|
Args:
|
||||||
uuid (str): Check's UUID. Defaults to "".
|
uuid (str): Check's UUID. Defaults to "".
|
||||||
slug (str): Check's Slug. Defaults to "".
|
slug (str): Check's Slug. Defaults to "".
|
||||||
|
data (str): Text data to append to this check. Defaults to "".
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
HCAPIAuthError: Raised when status_code == 401 or 403
|
HCAPIAuthError: Raised when status_code == 401 or 403
|
||||||
@@ -352,10 +375,14 @@ class AsyncClient(AbstractClient):
|
|||||||
Tuple[bool, str]: success (true or false) and the response text
|
Tuple[bool, str]: success (true or false) and the response text
|
||||||
"""
|
"""
|
||||||
ping_url = self._get_ping_url(uuid, slug, "")
|
ping_url = self._get_ping_url(uuid, slug, "")
|
||||||
response = self.check_ping_response(await self._client.get(ping_url))
|
response = self.check_ping_response(
|
||||||
|
await self._client.post(ping_url, content=data)
|
||||||
|
)
|
||||||
return (True if response.status_code == 200 else False, response.text)
|
return (True if response.status_code == 200 else False, response.text)
|
||||||
|
|
||||||
async def start_ping(self, uuid: str = "", slug: str = "") -> Tuple[bool, str]:
|
async def start_ping(
|
||||||
|
self, uuid: str = "", slug: str = "", data: str = ""
|
||||||
|
) -> Tuple[bool, str]:
|
||||||
"""Sends a "job has started!" message to Healthchecks.io.
|
"""Sends a "job has started!" message to Healthchecks.io.
|
||||||
|
|
||||||
Sending a "start" signal is optional, but it enables a few extra features:
|
Sending a "start" signal is optional, but it enables a few extra features:
|
||||||
@@ -373,6 +400,7 @@ class AsyncClient(AbstractClient):
|
|||||||
Args:
|
Args:
|
||||||
uuid (str): Check's UUID. Defaults to "".
|
uuid (str): Check's UUID. Defaults to "".
|
||||||
slug (str): Check's Slug. Defaults to "".
|
slug (str): Check's Slug. Defaults to "".
|
||||||
|
data (str): Text data to append to this check. Defaults to "".
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
HCAPIAuthError: Raised when status_code == 401 or 403
|
HCAPIAuthError: Raised when status_code == 401 or 403
|
||||||
@@ -387,10 +415,14 @@ class AsyncClient(AbstractClient):
|
|||||||
Tuple[bool, str]: success (true or false) and the response text
|
Tuple[bool, str]: success (true or false) and the response text
|
||||||
"""
|
"""
|
||||||
ping_url = self._get_ping_url(uuid, slug, "/start")
|
ping_url = self._get_ping_url(uuid, slug, "/start")
|
||||||
response = self.check_ping_response(await self._client.get(ping_url))
|
response = self.check_ping_response(
|
||||||
|
await self._client.post(ping_url, content=data)
|
||||||
|
)
|
||||||
return (True if response.status_code == 200 else False, response.text)
|
return (True if response.status_code == 200 else False, response.text)
|
||||||
|
|
||||||
async def fail_ping(self, uuid: str = "", slug: str = "") -> Tuple[bool, str]:
|
async def fail_ping(
|
||||||
|
self, uuid: str = "", slug: str = "", data: str = ""
|
||||||
|
) -> Tuple[bool, str]:
|
||||||
"""Signals to Healthchecks.io that the job has failed.
|
"""Signals to Healthchecks.io that the job has failed.
|
||||||
|
|
||||||
Actively signaling a failure minimizes the delay from your monitored service failing to you receiving an alert.
|
Actively signaling a failure minimizes the delay from your monitored service failing to you receiving an alert.
|
||||||
@@ -406,6 +438,7 @@ class AsyncClient(AbstractClient):
|
|||||||
Args:
|
Args:
|
||||||
uuid (str): Check's UUID. Defaults to "".
|
uuid (str): Check's UUID. Defaults to "".
|
||||||
slug (str): Check's Slug. Defaults to "".
|
slug (str): Check's Slug. Defaults to "".
|
||||||
|
data (str): Text data to append to this check. Defaults to "".
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
HCAPIAuthError: Raised when status_code == 401 or 403
|
HCAPIAuthError: Raised when status_code == 401 or 403
|
||||||
@@ -420,11 +453,13 @@ class AsyncClient(AbstractClient):
|
|||||||
Tuple[bool, str]: success (true or false) and the response text
|
Tuple[bool, str]: success (true or false) and the response text
|
||||||
"""
|
"""
|
||||||
ping_url = self._get_ping_url(uuid, slug, "/fail")
|
ping_url = self._get_ping_url(uuid, slug, "/fail")
|
||||||
response = self.check_ping_response(await self._client.get(ping_url))
|
response = self.check_ping_response(
|
||||||
|
await self._client.post(ping_url, content=data)
|
||||||
|
)
|
||||||
return (True if response.status_code == 200 else False, response.text)
|
return (True if response.status_code == 200 else False, response.text)
|
||||||
|
|
||||||
async def exit_code_ping(
|
async def exit_code_ping(
|
||||||
self, exit_code: int, uuid: str = "", slug: str = ""
|
self, exit_code: int, uuid: str = "", slug: str = "", data: str = ""
|
||||||
) -> Tuple[bool, str]:
|
) -> Tuple[bool, str]:
|
||||||
"""Signals to Healthchecks.io that the job has failed.
|
"""Signals to Healthchecks.io that the job has failed.
|
||||||
|
|
||||||
@@ -442,6 +477,7 @@ class AsyncClient(AbstractClient):
|
|||||||
exit_code (int): Exit code to sent, int from 0 to 255
|
exit_code (int): Exit code to sent, int from 0 to 255
|
||||||
uuid (str): Check's UUID. Defaults to "".
|
uuid (str): Check's UUID. Defaults to "".
|
||||||
slug (str): Check's Slug. Defaults to "".
|
slug (str): Check's Slug. Defaults to "".
|
||||||
|
data (str): Text data to append to this check. Defaults to "".
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
HCAPIAuthError: Raised when status_code == 401 or 403
|
HCAPIAuthError: Raised when status_code == 401 or 403
|
||||||
@@ -456,5 +492,7 @@ class AsyncClient(AbstractClient):
|
|||||||
Tuple[bool, str]: success (true or false) and the response text
|
Tuple[bool, str]: success (true or false) and the response text
|
||||||
"""
|
"""
|
||||||
ping_url = self._get_ping_url(uuid, slug, f"/{exit_code}")
|
ping_url = self._get_ping_url(uuid, slug, f"/{exit_code}")
|
||||||
response = self.check_ping_response(await self._client.get(ping_url))
|
response = self.check_ping_response(
|
||||||
|
await self._client.post(ping_url, content=data)
|
||||||
|
)
|
||||||
return (True if response.status_code == 200 else False, response.text)
|
return (True if response.status_code == 200 else False, response.text)
|
||||||
|
|||||||
166
src/healthchecks_io/client/check_trap.py
Normal file
166
src/healthchecks_io/client/check_trap.py
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
"""CheckTrap is a context manager to wrap around python code to communicate results to a Healthchecks check."""
|
||||||
|
from types import TracebackType
|
||||||
|
from typing import List
|
||||||
|
from typing import Optional
|
||||||
|
from typing import Type
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
|
from .async_client import AsyncClient
|
||||||
|
from .exceptions import PingFailedError
|
||||||
|
from .exceptions import WrongClientError
|
||||||
|
from .sync_client import Client
|
||||||
|
|
||||||
|
|
||||||
|
class CheckTrap:
|
||||||
|
"""CheckTrap is a context manager to wrap around python code to communicate results to a Healthchecks check."""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
client: Union[Client, AsyncClient],
|
||||||
|
uuid: str = "",
|
||||||
|
slug: str = "",
|
||||||
|
suppress_exceptions: bool = False,
|
||||||
|
) -> None:
|
||||||
|
"""A context manager to wrap around python code to communicate results to a Healthchecks check.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
client (Union[Client, AsyncClient]): healthchecks_io client, async or sync
|
||||||
|
uuid (str): uuid of the check. Defaults to "".
|
||||||
|
slug (str): slug of the check, exclusion wiht uuid. Defaults to "".
|
||||||
|
suppress_exceptions (bool): If true, do not raise any exceptions. Defaults to False.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
Exception: Raised if a slug and a uuid is passed
|
||||||
|
"""
|
||||||
|
if uuid == "" and slug == "":
|
||||||
|
raise Exception("Must pass a slug or an uuid")
|
||||||
|
self.client: Union[Client, AsyncClient] = client
|
||||||
|
self.uuid: str = uuid
|
||||||
|
self.slug: str = slug
|
||||||
|
self.log_lines: List[str] = list()
|
||||||
|
self.suppress_exceptions: bool = suppress_exceptions
|
||||||
|
|
||||||
|
def add_log(self, line: str) -> None:
|
||||||
|
"""Add a line to the context manager's log that is sent with the check.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
line (str): String to add to the logs
|
||||||
|
"""
|
||||||
|
self.log_lines.append(line)
|
||||||
|
|
||||||
|
def __enter__(self) -> "CheckTrap":
|
||||||
|
"""Enter the context manager.
|
||||||
|
|
||||||
|
Sends a start ping to the check represented by self.uuid or self.slug.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
WrongClientError: Raised when using an AsyncClient with this as a sync client manager
|
||||||
|
PingFailedError: When a ping fails for any reason not handled by a custom exception
|
||||||
|
HCAPIAuthError: Raised when status_code == 401 or 403
|
||||||
|
HCAPIError: Raised when status_code is 5xx
|
||||||
|
CheckNotFoundError: Raised when status_code is 404 or response text has "not found" in it
|
||||||
|
BadAPIRequestError: Raised when status_code is 400, or if you pass a uuid and a slug, or if
|
||||||
|
pinging by a slug and do not have a ping key set
|
||||||
|
HCAPIRateLimitError: Raised when status code is 429 or response text has "rate limited" in it
|
||||||
|
NonUniqueSlugError: Raused when status code is 409.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
CheckTrap: self
|
||||||
|
"""
|
||||||
|
if isinstance(self.client, AsyncClient):
|
||||||
|
raise WrongClientError(
|
||||||
|
"You passed an AsyncClient, use this as an async context manager"
|
||||||
|
)
|
||||||
|
result = self.client.start_ping(uuid=self.uuid, slug=self.slug)
|
||||||
|
if not result[0]:
|
||||||
|
raise PingFailedError(result[1])
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(
|
||||||
|
self,
|
||||||
|
exc_type: Optional[Type[BaseException]],
|
||||||
|
exc: Optional[BaseException],
|
||||||
|
traceback: Optional[TracebackType],
|
||||||
|
) -> Optional[bool]:
|
||||||
|
"""Exit the context manager.
|
||||||
|
|
||||||
|
If there is an exception, add it to any log lines and send a fail ping.
|
||||||
|
Otherwise, send a success ping with any log lines appended.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
exc_type (Optional[Type[BaseException]]): [description]
|
||||||
|
exc (Optional[BaseException]): [description]
|
||||||
|
traceback (Optional[TracebackType]): [description]
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Optional[bool]: self.suppress_exceptions, if true will not raise any exceptions
|
||||||
|
"""
|
||||||
|
if exc_type is None:
|
||||||
|
self.client.success_ping(
|
||||||
|
self.uuid, self.slug, data="\n".join(self.log_lines)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.add_log(str(exc))
|
||||||
|
self.add_log(str(traceback))
|
||||||
|
self.client.fail_ping(self.uuid, self.slug, data="\n".join(self.log_lines))
|
||||||
|
return self.suppress_exceptions
|
||||||
|
|
||||||
|
async def __aenter__(self) -> "CheckTrap":
|
||||||
|
"""Enter the context manager.
|
||||||
|
|
||||||
|
Sends a start ping to the check represented by self.uuid or self.slug.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
WrongClientError: Raised when using an AsyncClient with this as a sync client manager
|
||||||
|
PingFailedError: When a ping fails for any reason not handled by a custom exception
|
||||||
|
HCAPIAuthError: Raised when status_code == 401 or 403
|
||||||
|
HCAPIError: Raised when status_code is 5xx
|
||||||
|
CheckNotFoundError: Raised when status_code is 404 or response text has "not found" in it
|
||||||
|
BadAPIRequestError: Raised when status_code is 400, or if you pass a uuid and a slug, or if
|
||||||
|
pinging by a slug and do not have a ping key set
|
||||||
|
HCAPIRateLimitError: Raised when status code is 429 or response text has "rate limited" in it
|
||||||
|
NonUniqueSlugError: Raused when status code is 409.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
CheckTrap: self
|
||||||
|
"""
|
||||||
|
if isinstance(self.client, Client):
|
||||||
|
raise WrongClientError(
|
||||||
|
"You passed a sync Client, use this as a regular context manager"
|
||||||
|
)
|
||||||
|
result = await self.client.start_ping(self.uuid, self.slug)
|
||||||
|
if not result[0]:
|
||||||
|
raise PingFailedError(result[1])
|
||||||
|
return self
|
||||||
|
|
||||||
|
async def __aexit__(
|
||||||
|
self,
|
||||||
|
exc_type: Optional[Type[BaseException]],
|
||||||
|
exc: Optional[BaseException],
|
||||||
|
traceback: Optional[TracebackType],
|
||||||
|
) -> Optional[bool]:
|
||||||
|
"""Exit the context manager.
|
||||||
|
|
||||||
|
If there is an exception, add it to any log lines and send a fail ping.
|
||||||
|
Otherwise, send a success ping with any log lines appended.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
exc_type (Optional[Type[BaseException]]): [description]
|
||||||
|
exc (Optional[BaseException]): [description]
|
||||||
|
traceback (Optional[TracebackType]): [description]
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Optional[bool]: self.suppress_exceptions, if true will not raise any exceptions
|
||||||
|
"""
|
||||||
|
if exc_type is None:
|
||||||
|
# ignore typing, if we've gotten here we know its an async client
|
||||||
|
await self.client.success_ping( # type: ignore
|
||||||
|
self.uuid, self.slug, data="\n".join(self.log_lines)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.add_log(str(exc))
|
||||||
|
self.add_log(str(traceback))
|
||||||
|
await self.client.fail_ping( # type: ignore
|
||||||
|
self.uuid, self.slug, data="\n".join(self.log_lines)
|
||||||
|
)
|
||||||
|
return self.suppress_exceptions
|
||||||
@@ -35,3 +35,15 @@ class NonUniqueSlugError(HCAPIError):
|
|||||||
"""Thrown when the api returns a 409 when pinging."""
|
"""Thrown when the api returns a 409 when pinging."""
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
|
class WrongClientError(HCAPIError):
|
||||||
|
"""Thrown when trying to use a CheckTrap with the wrong client type."""
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
class PingFailedError(HCAPIError):
|
||||||
|
"""Thrown when a ping fails."""
|
||||||
|
|
||||||
|
...
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
"""An async healthchecks.io client."""
|
"""An async healthchecks.io client."""
|
||||||
|
from types import TracebackType
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
from typing import Type
|
||||||
|
|
||||||
from httpx import Client as HTTPXClient
|
from httpx import Client as HTTPXClient
|
||||||
|
|
||||||
@@ -50,6 +52,23 @@ class Client(AbstractClient):
|
|||||||
self._client.headers["user-agent"] = f"py-healthchecks.io/{client_version}"
|
self._client.headers["user-agent"] = f"py-healthchecks.io/{client_version}"
|
||||||
self._client.headers["Content-type"] = "application/json"
|
self._client.headers["Content-type"] = "application/json"
|
||||||
|
|
||||||
|
def __enter__(self) -> "Client":
|
||||||
|
"""Context manager entrance.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Client: returns this client as a context manager
|
||||||
|
"""
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(
|
||||||
|
self,
|
||||||
|
exc_type: Optional[Type[BaseException]],
|
||||||
|
exc: Optional[BaseException],
|
||||||
|
traceback: Optional[TracebackType],
|
||||||
|
) -> None:
|
||||||
|
"""Context manager exit."""
|
||||||
|
self._finalizer_method()
|
||||||
|
|
||||||
def _finalizer_method(self) -> None:
|
def _finalizer_method(self) -> None:
|
||||||
"""Closes the httpx client."""
|
"""Closes the httpx client."""
|
||||||
self._client.close()
|
self._client.close()
|
||||||
@@ -119,7 +138,7 @@ class Client(AbstractClient):
|
|||||||
"""
|
"""
|
||||||
request_url = self._get_api_request_url("checks/")
|
request_url = self._get_api_request_url("checks/")
|
||||||
response = self.check_response(
|
response = self.check_response(
|
||||||
self._client.post(request_url, json=new_check.dict())
|
self._client.post(request_url, json=new_check.dict(exclude_none=True))
|
||||||
)
|
)
|
||||||
return Check.from_api_result(response.json())
|
return Check.from_api_result(response.json())
|
||||||
|
|
||||||
@@ -144,7 +163,10 @@ class Client(AbstractClient):
|
|||||||
"""
|
"""
|
||||||
request_url = self._get_api_request_url(f"checks/{uuid}")
|
request_url = self._get_api_request_url(f"checks/{uuid}")
|
||||||
response = self.check_response(
|
response = self.check_response(
|
||||||
self._client.post(request_url, json=update_check.dict(exclude_unset=True))
|
self._client.post(
|
||||||
|
request_url,
|
||||||
|
json=update_check.dict(exclude_unset=True, exclude_none=True),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
return Check.from_api_result(response.json())
|
return Check.from_api_result(response.json())
|
||||||
|
|
||||||
@@ -305,7 +327,9 @@ class Client(AbstractClient):
|
|||||||
for key, item in response.json()["badges"].items()
|
for key, item in response.json()["badges"].items()
|
||||||
}
|
}
|
||||||
|
|
||||||
def success_ping(self, uuid: str = "", slug: str = "") -> Tuple[bool, str]:
|
def success_ping(
|
||||||
|
self, uuid: str = "", slug: str = "", data: str = ""
|
||||||
|
) -> Tuple[bool, str]:
|
||||||
"""Signals to Healthchecks.io that a job has completed successfully.
|
"""Signals to Healthchecks.io that a job has completed successfully.
|
||||||
|
|
||||||
Can also be used to indicate a continuously running process is still running and healthy.
|
Can also be used to indicate a continuously running process is still running and healthy.
|
||||||
@@ -321,6 +345,7 @@ class Client(AbstractClient):
|
|||||||
Args:
|
Args:
|
||||||
uuid (str): Check's UUID. Defaults to "".
|
uuid (str): Check's UUID. Defaults to "".
|
||||||
slug (str): Check's Slug. Defaults to "".
|
slug (str): Check's Slug. Defaults to "".
|
||||||
|
data (str): Text data to append to this check. Defaults to ""
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
HCAPIAuthError: Raised when status_code == 401 or 403
|
HCAPIAuthError: Raised when status_code == 401 or 403
|
||||||
@@ -335,10 +360,12 @@ class Client(AbstractClient):
|
|||||||
Tuple[bool, str]: success (true or false) and the response text
|
Tuple[bool, str]: success (true or false) and the response text
|
||||||
"""
|
"""
|
||||||
ping_url = self._get_ping_url(uuid, slug, "")
|
ping_url = self._get_ping_url(uuid, slug, "")
|
||||||
response = self.check_ping_response(self._client.get(ping_url))
|
response = self.check_ping_response(self._client.post(ping_url, content=data))
|
||||||
return (True if response.status_code == 200 else False, response.text)
|
return (True if response.status_code == 200 else False, response.text)
|
||||||
|
|
||||||
def start_ping(self, uuid: str = "", slug: str = "") -> Tuple[bool, str]:
|
def start_ping(
|
||||||
|
self, uuid: str = "", slug: str = "", data: str = ""
|
||||||
|
) -> Tuple[bool, str]:
|
||||||
"""Sends a "job has started!" message to Healthchecks.io.
|
"""Sends a "job has started!" message to Healthchecks.io.
|
||||||
|
|
||||||
Sending a "start" signal is optional, but it enables a few extra features:
|
Sending a "start" signal is optional, but it enables a few extra features:
|
||||||
@@ -356,6 +383,7 @@ class Client(AbstractClient):
|
|||||||
Args:
|
Args:
|
||||||
uuid (str): Check's UUID. Defaults to "".
|
uuid (str): Check's UUID. Defaults to "".
|
||||||
slug (str): Check's Slug. Defaults to "".
|
slug (str): Check's Slug. Defaults to "".
|
||||||
|
data (str): Text data to append to this check. Defaults to ""
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
HCAPIAuthError: Raised when status_code == 401 or 403
|
HCAPIAuthError: Raised when status_code == 401 or 403
|
||||||
@@ -370,10 +398,12 @@ class Client(AbstractClient):
|
|||||||
Tuple[bool, str]: success (true or false) and the response text
|
Tuple[bool, str]: success (true or false) and the response text
|
||||||
"""
|
"""
|
||||||
ping_url = self._get_ping_url(uuid, slug, "/start")
|
ping_url = self._get_ping_url(uuid, slug, "/start")
|
||||||
response = self.check_ping_response(self._client.get(ping_url))
|
response = self.check_ping_response(self._client.post(ping_url, content=data))
|
||||||
return (True if response.status_code == 200 else False, response.text)
|
return (True if response.status_code == 200 else False, response.text)
|
||||||
|
|
||||||
def fail_ping(self, uuid: str = "", slug: str = "") -> Tuple[bool, str]:
|
def fail_ping(
|
||||||
|
self, uuid: str = "", slug: str = "", data: str = ""
|
||||||
|
) -> Tuple[bool, str]:
|
||||||
"""Signals to Healthchecks.io that the job has failed.
|
"""Signals to Healthchecks.io that the job has failed.
|
||||||
|
|
||||||
Actively signaling a failure minimizes the delay from your monitored service failing to you receiving an alert.
|
Actively signaling a failure minimizes the delay from your monitored service failing to you receiving an alert.
|
||||||
@@ -389,6 +419,7 @@ class Client(AbstractClient):
|
|||||||
Args:
|
Args:
|
||||||
uuid (str): Check's UUID. Defaults to "".
|
uuid (str): Check's UUID. Defaults to "".
|
||||||
slug (str): Check's Slug. Defaults to "".
|
slug (str): Check's Slug. Defaults to "".
|
||||||
|
data (str): Text data to append to this check. Defaults to ""
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
HCAPIAuthError: Raised when status_code == 401 or 403
|
HCAPIAuthError: Raised when status_code == 401 or 403
|
||||||
@@ -403,11 +434,11 @@ class Client(AbstractClient):
|
|||||||
Tuple[bool, str]: success (true or false) and the response text
|
Tuple[bool, str]: success (true or false) and the response text
|
||||||
"""
|
"""
|
||||||
ping_url = self._get_ping_url(uuid, slug, "/fail")
|
ping_url = self._get_ping_url(uuid, slug, "/fail")
|
||||||
response = self.check_ping_response(self._client.get(ping_url))
|
response = self.check_ping_response(self._client.post(ping_url, content=data))
|
||||||
return (True if response.status_code == 200 else False, response.text)
|
return (True if response.status_code == 200 else False, response.text)
|
||||||
|
|
||||||
def exit_code_ping(
|
def exit_code_ping(
|
||||||
self, exit_code: int, uuid: str = "", slug: str = ""
|
self, exit_code: int, uuid: str = "", slug: str = "", data: str = ""
|
||||||
) -> Tuple[bool, str]:
|
) -> Tuple[bool, str]:
|
||||||
"""Signals to Healthchecks.io that the job has failed.
|
"""Signals to Healthchecks.io that the job has failed.
|
||||||
|
|
||||||
@@ -425,6 +456,7 @@ class Client(AbstractClient):
|
|||||||
exit_code (int): Exit code to sent, int from 0 to 255
|
exit_code (int): Exit code to sent, int from 0 to 255
|
||||||
uuid (str): Check's UUID. Defaults to "".
|
uuid (str): Check's UUID. Defaults to "".
|
||||||
slug (str): Check's Slug. Defaults to "".
|
slug (str): Check's Slug. Defaults to "".
|
||||||
|
data (str): Text data to append to this check. Defaults to ""
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
HCAPIAuthError: Raised when status_code == 401 or 403
|
HCAPIAuthError: Raised when status_code == 401 or 403
|
||||||
@@ -439,5 +471,5 @@ class Client(AbstractClient):
|
|||||||
Tuple[bool, str]: success (true or false) and the response text
|
Tuple[bool, str]: success (true or false) and the response text
|
||||||
"""
|
"""
|
||||||
ping_url = self._get_ping_url(uuid, slug, f"/{exit_code}")
|
ping_url = self._get_ping_url(uuid, slug, f"/{exit_code}")
|
||||||
response = self.check_ping_response(self._client.get(ping_url))
|
response = self.check_ping_response(self._client.post(ping_url, content=data))
|
||||||
return (True if response.status_code == 200 else False, response.text)
|
return (True if response.status_code == 200 else False, response.text)
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class Check(BaseModel):
|
|||||||
update_url: Optional[str]
|
update_url: Optional[str]
|
||||||
pause_url: Optional[str]
|
pause_url: Optional[str]
|
||||||
channels: Optional[str]
|
channels: Optional[str]
|
||||||
timeout: int
|
timeout: Optional[int]
|
||||||
uuid: Optional[str]
|
uuid: Optional[str]
|
||||||
|
|
||||||
@validator("uuid", always=True)
|
@validator("uuid", always=True)
|
||||||
@@ -65,11 +65,11 @@ class Check(BaseModel):
|
|||||||
class CheckCreate(BaseModel):
|
class CheckCreate(BaseModel):
|
||||||
"""Pydantic object for creating a check."""
|
"""Pydantic object for creating a check."""
|
||||||
|
|
||||||
name: Optional[str] = Field(..., description="Name of the check")
|
name: Optional[str] = Field("", description="Name of the check")
|
||||||
tags: Optional[str] = Field(
|
tags: Optional[str] = Field(
|
||||||
..., description="String separated list of tags to apply"
|
"", description="String separated list of tags to apply"
|
||||||
)
|
)
|
||||||
desc: Optional[str] = Field(..., description="Description of the check")
|
desc: Optional[str] = Field("", description="Description of the check")
|
||||||
timeout: Optional[int] = Field(
|
timeout: Optional[int] = Field(
|
||||||
86400,
|
86400,
|
||||||
description="The expected period of this check in seconds.",
|
description="The expected period of this check in seconds.",
|
||||||
@@ -83,7 +83,7 @@ class CheckCreate(BaseModel):
|
|||||||
lte=31536000,
|
lte=31536000,
|
||||||
)
|
)
|
||||||
schedule: Optional[str] = Field(
|
schedule: Optional[str] = Field(
|
||||||
"* * * * *",
|
None,
|
||||||
description="A cron expression defining this check's schedule. "
|
description="A cron expression defining this check's schedule. "
|
||||||
"If you specify both timeout and schedule parameters, "
|
"If you specify both timeout and schedule parameters, "
|
||||||
"Healthchecks.io will create a Cron check and ignore the "
|
"Healthchecks.io will create a Cron check and ignore the "
|
||||||
|
|||||||
@@ -14,6 +14,42 @@ from healthchecks_io.client.exceptions import HCAPIAuthError
|
|||||||
from healthchecks_io.client.exceptions import HCAPIError
|
from healthchecks_io.client.exceptions import HCAPIError
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
@pytest.mark.respx
|
||||||
|
async def test_acreate_check_200_context_manager(
|
||||||
|
fake_check_api_result, respx_mock, test_async_client
|
||||||
|
):
|
||||||
|
checks_url = urljoin(test_async_client._api_url, "checks/")
|
||||||
|
respx_mock.post(checks_url).mock(
|
||||||
|
return_value=Response(
|
||||||
|
status_code=200,
|
||||||
|
json={
|
||||||
|
"channels": "",
|
||||||
|
"desc": "",
|
||||||
|
"grace": 60,
|
||||||
|
"last_ping": None,
|
||||||
|
"n_pings": 0,
|
||||||
|
"name": "Backups",
|
||||||
|
"slug": "backups",
|
||||||
|
"next_ping": None,
|
||||||
|
"manual_resume": False,
|
||||||
|
"methods": "",
|
||||||
|
"pause_url": "https://healthchecks.io/api/v1/checks/f618072a-7bde-4eee-af63-71a77c5723bc/pause",
|
||||||
|
"ping_url": "https://hc-ping.com/f618072a-7bde-4eee-af63-71a77c5723bc",
|
||||||
|
"status": "new",
|
||||||
|
"tags": "prod www",
|
||||||
|
"timeout": 3600,
|
||||||
|
"update_url": "https://healthchecks.io/api/v1/checks/f618072a-7bde-4eee-af63-71a77c5723bc",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
)
|
||||||
|
async with test_async_client as test_client:
|
||||||
|
check = await test_client.create_check(
|
||||||
|
CheckCreate(name="test", tags="test", desc="test")
|
||||||
|
)
|
||||||
|
assert check.name == "Backups"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
@pytest.mark.respx
|
@pytest.mark.respx
|
||||||
async def test_acreate_check_200(fake_check_api_result, respx_mock, test_async_client):
|
async def test_acreate_check_200(fake_check_api_result, respx_mock, test_async_client):
|
||||||
@@ -357,9 +393,9 @@ ping_test_parameters = [
|
|||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"respx_mocker, tc, url, ping_method, method_kwargs", ping_test_parameters
|
"respx_mocker, tc, url, ping_method, method_kwargs", ping_test_parameters
|
||||||
)
|
)
|
||||||
async def test_success_ping(respx_mocker, tc, url, ping_method, method_kwargs):
|
async def test_asuccess_ping(respx_mocker, tc, url, ping_method, method_kwargs):
|
||||||
channels_url = urljoin(tc._ping_url, url)
|
channels_url = urljoin(tc._ping_url, url)
|
||||||
respx_mocker.get(channels_url).mock(
|
respx_mocker.post(channels_url).mock(
|
||||||
return_value=Response(status_code=200, text="OK")
|
return_value=Response(status_code=200, text="OK")
|
||||||
)
|
)
|
||||||
ping_method = getattr(tc, ping_method)
|
ping_method = getattr(tc, ping_method)
|
||||||
|
|||||||
97
tests/client/test_check_trap.py
Normal file
97
tests/client/test_check_trap.py
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
from urllib.parse import urljoin
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
import respx
|
||||||
|
from httpx import Client as HTTPXClient
|
||||||
|
from httpx import Response
|
||||||
|
|
||||||
|
from healthchecks_io import CheckCreate
|
||||||
|
from healthchecks_io import CheckTrap
|
||||||
|
from healthchecks_io import CheckUpdate
|
||||||
|
from healthchecks_io import PingFailedError
|
||||||
|
from healthchecks_io import WrongClientError
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.respx
|
||||||
|
def test_check_trap_sync(respx_mock, test_client):
|
||||||
|
start_url = urljoin(test_client._ping_url, "test/start")
|
||||||
|
respx_mock.post(start_url).mock(return_value=Response(status_code=200, text="OK"))
|
||||||
|
success_url = urljoin(test_client._ping_url, "test")
|
||||||
|
respx_mock.post(success_url).mock(return_value=Response(status_code=200, text="OK"))
|
||||||
|
|
||||||
|
with CheckTrap(test_client, uuid="test") as ct:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.respx
|
||||||
|
def test_check_trap_sync_failed_ping(respx_mock, test_client):
|
||||||
|
start_url = urljoin(test_client._ping_url, "test/start")
|
||||||
|
respx_mock.post(start_url).mock(return_value=Response(status_code=444, text="OK"))
|
||||||
|
with pytest.raises(PingFailedError):
|
||||||
|
with CheckTrap(test_client, uuid="test") as ct:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.respx
|
||||||
|
def test_check_trap_sync_exception(respx_mock, test_client):
|
||||||
|
start_url = urljoin(test_client._ping_url, "test/start")
|
||||||
|
respx_mock.post(start_url).mock(return_value=Response(status_code=200, text="OK"))
|
||||||
|
fail_url = urljoin(test_client._ping_url, "test/fail")
|
||||||
|
respx_mock.post(fail_url).mock(return_value=Response(status_code=200, text="OK"))
|
||||||
|
with pytest.raises(Exception):
|
||||||
|
with CheckTrap(test_client, uuid="test") as ct:
|
||||||
|
raise Exception("Exception")
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
@pytest.mark.respx
|
||||||
|
async def test_check_trap_async(respx_mock, test_async_client):
|
||||||
|
start_url = urljoin(test_async_client._ping_url, "test/start")
|
||||||
|
respx_mock.post(start_url).mock(return_value=Response(status_code=200, text="OK"))
|
||||||
|
success_url = urljoin(test_async_client._ping_url, "test")
|
||||||
|
respx_mock.post(success_url).mock(return_value=Response(status_code=200, text="OK"))
|
||||||
|
|
||||||
|
async with CheckTrap(test_async_client, uuid="test") as ct:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
@pytest.mark.respx
|
||||||
|
async def test_check_trap_async_failed_ping(respx_mock, test_async_client):
|
||||||
|
start_url = urljoin(test_async_client._ping_url, "test/start")
|
||||||
|
respx_mock.post(start_url).mock(return_value=Response(status_code=444, text="OK"))
|
||||||
|
with pytest.raises(PingFailedError):
|
||||||
|
async with CheckTrap(test_async_client, uuid="test") as ct:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
@pytest.mark.respx
|
||||||
|
async def test_check_trap_async_exception(respx_mock, test_async_client):
|
||||||
|
start_url = urljoin(test_async_client._ping_url, "test/start")
|
||||||
|
respx_mock.post(start_url).mock(return_value=Response(status_code=200, text="OK"))
|
||||||
|
fail_url = urljoin(test_async_client._ping_url, "test/fail")
|
||||||
|
respx_mock.post(fail_url).mock(return_value=Response(status_code=200, text="OK"))
|
||||||
|
|
||||||
|
with pytest.raises(Exception):
|
||||||
|
async with CheckTrap(test_async_client, uuid="test") as ct:
|
||||||
|
raise Exception("Exception")
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_check_trap_wrong_client_error(test_client, test_async_client):
|
||||||
|
|
||||||
|
with pytest.raises(WrongClientError):
|
||||||
|
async with CheckTrap(test_client, uuid="test") as ct:
|
||||||
|
pass
|
||||||
|
|
||||||
|
with pytest.raises(WrongClientError):
|
||||||
|
with CheckTrap(test_async_client, uuid="test") as ct:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def test_check_trap_no_uuid_or_slug(test_client):
|
||||||
|
with pytest.raises(Exception) as exc:
|
||||||
|
with CheckTrap(test_client):
|
||||||
|
pass
|
||||||
|
assert str(exc) == "Must pass a slug or an uuid"
|
||||||
@@ -14,6 +14,39 @@ from healthchecks_io.client.exceptions import HCAPIAuthError
|
|||||||
from healthchecks_io.client.exceptions import HCAPIError
|
from healthchecks_io.client.exceptions import HCAPIError
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.respx
|
||||||
|
def test_create_check_200_context_manager(
|
||||||
|
fake_check_api_result, respx_mock, test_client
|
||||||
|
):
|
||||||
|
checks_url = urljoin(test_client._api_url, "checks/")
|
||||||
|
respx_mock.post(checks_url).mock(
|
||||||
|
return_value=Response(
|
||||||
|
status_code=200,
|
||||||
|
json={
|
||||||
|
"channels": "",
|
||||||
|
"desc": "",
|
||||||
|
"grace": 60,
|
||||||
|
"last_ping": None,
|
||||||
|
"n_pings": 0,
|
||||||
|
"name": "Backups",
|
||||||
|
"slug": "backups",
|
||||||
|
"next_ping": None,
|
||||||
|
"manual_resume": False,
|
||||||
|
"methods": "",
|
||||||
|
"pause_url": "https://healthchecks.io/api/v1/checks/f618072a-7bde-4eee-af63-71a77c5723bc/pause",
|
||||||
|
"ping_url": "https://hc-ping.com/f618072a-7bde-4eee-af63-71a77c5723bc",
|
||||||
|
"status": "new",
|
||||||
|
"tags": "prod www",
|
||||||
|
"timeout": 3600,
|
||||||
|
"update_url": "https://healthchecks.io/api/v1/checks/f618072a-7bde-4eee-af63-71a77c5723bc",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
)
|
||||||
|
with test_client as tc:
|
||||||
|
check = tc.create_check(CheckCreate(name="test", tags="test", desc="test"))
|
||||||
|
assert check.name == "Backups"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.respx
|
@pytest.mark.respx
|
||||||
def test_create_check_200(fake_check_api_result, respx_mock, test_client):
|
def test_create_check_200(fake_check_api_result, respx_mock, test_client):
|
||||||
checks_url = urljoin(test_client._api_url, "checks/")
|
checks_url = urljoin(test_client._api_url, "checks/")
|
||||||
@@ -325,7 +358,7 @@ ping_test_parameters = [
|
|||||||
)
|
)
|
||||||
def test_success_ping(respx_mocker, tc, url, ping_method, method_kwargs):
|
def test_success_ping(respx_mocker, tc, url, ping_method, method_kwargs):
|
||||||
channels_url = urljoin(tc._ping_url, url)
|
channels_url = urljoin(tc._ping_url, url)
|
||||||
respx_mocker.get(channels_url).mock(
|
respx_mocker.post(channels_url).mock(
|
||||||
return_value=Response(status_code=200, text="OK")
|
return_value=Response(status_code=200, text="OK")
|
||||||
)
|
)
|
||||||
ping_method = getattr(tc, ping_method)
|
ping_method = getattr(tc, ping_method)
|
||||||
|
|||||||
Reference in New Issue
Block a user