diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 876b68a..0000000 --- a/.flake8 +++ /dev/null @@ -1,2 +0,0 @@ -[flake8] -ignore = E501,E222 diff --git a/.github/workflows/publish_docker.yml b/.github/workflows/publish_docker.yml index 4ef38d5..63b0b6b 100644 --- a/.github/workflows/publish_docker.yml +++ b/.github/workflows/publish_docker.yml @@ -40,4 +40,4 @@ jobs: context: . push: true tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 5fc8e2f..79f8182 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -5,9 +5,9 @@ name: Python on: push: - branches: [ master ] + branches: [master] pull_request: - branches: [ master ] + branches: [master] permissions: contents: read @@ -17,19 +17,19 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: Set up Python 3.10 - uses: actions/setup-python@v3 - with: - python-version: "3.10" - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install poetry flake8 - poetry install - - name: Lint with flake8 - run: | - # stop the build if there are Python syntax errors or undefined names - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - uses: actions/checkout@v3 + - name: Set up Python 3.10 + uses: actions/setup-python@v3 + with: + python-version: "3.10" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install poetry flake8 + poetry install + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics diff --git a/.gitignore b/.gitignore index a3ba1f0..05b8866 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ dist .DS_Store .idea flow* -swagger \ No newline at end of file +swagger +.vscode diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 0000000..2125b7d --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,3 @@ +default: true +line-length: false +no-inline-html: false diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..b878ba1 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,61 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +exclude: ^(api_protobuf/.*|docs/protobuf_docs\.md|dhaul_openapi/messages/.*)$ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.2.0 + hooks: + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + - id: check-json + - id: detect-private-key + - id: fix-encoding-pragma + - id: check-merge-conflict + - id: check-added-large-files + - repo: https://github.com/psf/black + rev: 23.1.0 + hooks: + - id: black + args: [--config=pyproject.toml] + - repo: https://github.com/PyCQA/isort + rev: 5.12.0 + hooks: + - id: isort + - repo: https://github.com/pre-commit/mirrors-mypy + rev: "v1.0.1" + hooks: + - id: mypy + - repo: https://github.com/PyCQA/docformatter + rev: v1.5.1 + hooks: + - id: docformatter + args: + - --in-place + - --config=pyproject.toml + - repo: https://github.com/PyCQA/autoflake + rev: v2.0.1 + hooks: + - id: autoflake + - repo: https://github.com/pycqa/flake8 + rev: 6.0.0 + hooks: + - id: flake8 + entry: pflake8 + additional_dependencies: [pyproject-flake8] + - repo: https://github.com/netromdk/vermin + rev: v1.5.1 + hooks: + - id: vermin + # specify your target version here, OR in a Vermin config file as usual: + args: ["-t=3.9-", "--violations"] + # (if your target is specified in a Vermin config, you may omit the 'args' entry entirely) + - repo: https://github.com/adrienverge/yamllint.git + rev: v1.29.0 + hooks: + - id: yamllint + - repo: https://github.com/igorshubovych/markdownlint-cli + rev: v0.33.0 + hooks: + - id: markdownlint-fix + - id: markdownlint diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index de45074..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Python: mitmproxy2swagger.py", - "type": "python", - "request": "launch", - "program": "${workspaceRoot}/mitmproxy2swagger/mitmproxy2swagger.py", - "cwd": "${workspaceRoot}", - "args": ["-i", "flows/www.x-kom.pl.har", "-o", "ass.yaml", "-p", "https://mobileapi.x-kom.pl"], - "console": "integratedTerminal", - "justMyCode": true - } - ] -} diff --git a/.yamllint b/.yamllint new file mode 100644 index 0000000..e2d4291 --- /dev/null +++ b/.yamllint @@ -0,0 +1,12 @@ +extends: default +yaml-files: + - "*.yaml" + - "*.yml" + - ".yamllint" +rules: + line-length: + max: 120 + level: warning + document-start: disable + truthy: disable + indentation: disable diff --git a/Dockerfile b/Dockerfile index 35f936a..4a6668f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,16 +6,15 @@ RUN apk update && \ apk upgrade && \ apk add gcc libc-dev libffi-dev cargo && \ python -m pip install --upgrade pip && \ - pip install poetry + pip install poetry COPY ["pyproject.toml", "./"] -RUN poetry install +RUN poetry install COPY . . RUN pip install . CMD [ "mitmproxy2swagger" ] - diff --git a/README.md b/README.md index b0511b6..4915445 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,14 @@ # mitmproxy2swagger - [![PyPI version](https://badge.fury.io/py/mitmproxy2swagger.svg)](https://badge.fury.io/py/mitmproxy2swagger) [![Arch Linux repository](https://img.shields.io/badge/archlinux-mitmproxy2swagger-blue)](https://archlinux.org/packages/community/any/mitmproxy2swagger/) - -https://user-images.githubusercontent.com/5400940/168086818-c48f60ab-3f95-42eb-b435-c8b1a6326b81.mp4 - - + A tool for automatically converting [mitmproxy](https://mitmproxy.org/) captures to [OpenAPI 3.0](https://swagger.io/specification/) specifications. This means that you can automatically reverse-engineer REST APIs by just running the apps and capturing the traffic. --- + **🆕 NEW!** Added support for processing HAR exported from the browser DevTools. See [Usage - HAR](#har) for more details. @@ -23,7 +20,7 @@ Added support for processing HAR exported from the browser DevTools. See [Usage First you will need python3 and pip3. ```bash -$ pip install mitmproxy2swagger +$ pip install mitmproxy2swagger # ... or ... $ pip3 install mitmproxy2swagger # ... or ... @@ -42,82 +39,84 @@ To create a specification by inspecting HTTP traffic you will need to: 1. Capture the traffic by using the mitmproxy tool. I personally recommend using mitmweb, which is a web interface built-in to mitmproxy. - ```bash - $ mitmweb - Web server listening at http://127.0.0.1:8081/ - Proxy server listening at http://*:9999 - ... - ``` - **IMPORTANT** + ```bash + $ mitmweb + Web server listening at http://127.0.0.1:8081/ + Proxy server listening at http://*:9999 + ... + ``` - To configure your client to use the proxy exposed by mitm proxy, please consult the [mitmproxy documentation](https://docs.mitmproxy.org/stable/) for more information. + **IMPORTANT** + + To configure your client to use the proxy exposed by mitm proxy, please consult the [mitmproxy documentation](https://docs.mitmproxy.org/stable/) for more information. 2. Save the traffic to a flow file. - In mitmweb you can do this by using the "File" menu and selecting "Save": - - ![](./docs/mitmweb_save.png) + In mitmweb you can do this by using the "File" menu and selecting "Save": + + ![A screenshot showing the location of the "Save" option in the "File" menu](./docs/mitmweb_save.png) 3. Run the first pass of mitmproxy2swagger: - ```bash - $ mitmproxy2swagger -i -o -p - # ... or ... - $ docker run -it -v $PWD:/app mitmproxy2swagger mitmproxy2swagger -i -o -p - ``` + ```bash + $ mitmproxy2swagger -i -o -p + # ... or ... + $ docker run -it -v $PWD:/app mitmproxy2swagger mitmproxy2swagger -i -o -p + ``` - Please note that you can use an existing schema, in which case the existing schema will be extended with the new data. You can also run it a few times with different flow captures, the captured data will be safely merged. + Please note that you can use an existing schema, in which case the existing schema will be extended with the new data. You can also run it a few times with different flow captures, the captured data will be safely merged. - `` is the base url of the API you wish to reverse-engineer. You will need to obtain it by observing the requests being made in mitmproxy. + `` is the base url of the API you wish to reverse-engineer. You will need to obtain it by observing the requests being made in mitmproxy. - For example if an app has made requests like these: + For example if an app has made requests like these: - ``` - https://api.example.com/v1/login - https://api.example.com/v1/users/2 - https://api.example.com/v1/users/2/profile - ``` + ```http + https://api.example.com/v1/login + https://api.example.com/v1/users/2 + https://api.example.com/v1/users/2/profile + ``` - The likely prefix is `https://api.example.com/v1`. + The likely prefix is `https://api.example.com/v1`. 4. Running the first pass should have created a section in the schema file like this: - ```yaml - x-path-templates: - # Remove the ignore: prefix to generate an endpoint with its URL - # Lines that are closer to the top take precedence, the matching is greedy - - ignore:/addresses - - ignore:/basket - - ignore:/basket/add - - ignore:/basket/checkouts - - ignore:/basket/coupons/attach/{id} - - ignore:/basket/coupons/attach/104754 - ``` + ```yaml + x-path-templates: + # Remove the ignore: prefix to generate an endpoint with its URL + # Lines that are closer to the top take precedence, the matching is greedy + - ignore:/addresses + - ignore:/basket + - ignore:/basket/add + - ignore:/basket/checkouts + - ignore:/basket/coupons/attach/{id} + - ignore:/basket/coupons/attach/104754 + ``` - You should edit the schema file with a text editor and remove the `ignore:` prefix from the paths you wish to be generated. You can also adjust the parameters appearing in the paths. + You should edit the schema file with a text editor and remove the `ignore:` prefix from the paths you wish to be generated. You can also adjust the parameters appearing in the paths. 5. Run the second pass of mitmproxy2swagger: - ```bash - $ mitmproxy2swagger -i -o -p [--examples] - # ... or ... - $ docker run -it -v $PWD:/app mitmproxy2swagger mitmproxy2swagger -i -o -p [--examples] - ``` + ```bash + $ mitmproxy2swagger -i -o -p [--examples] + # ... or ... + $ docker run -it -v $PWD:/app mitmproxy2swagger mitmproxy2swagger -i -o -p [--examples] + ``` - Run the command a second time (with the same schema file). It will pick up the edited lines and generate endpoint descriptions. + Run the command a second time (with the same schema file). It will pick up the edited lines and generate endpoint descriptions. - Please note that mitmproxy2swagger will not overwrite existing endpoint descriptions, if you want to overwrite them, you can delete them before running the second pass. + Please note that mitmproxy2swagger will not overwrite existing endpoint descriptions, if you want to overwrite them, you can delete them before running the second pass. - Passing `--examples` will add example data to requests and responses. Take caution when using this option, as it may add sensitive data (tokens, passwords, personal information etc.) to the schema. - Passing `--headers` will add headers data to requests and responses. Take caution when using this option, as it may add sensitive data (tokens, passwords, personal information etc.) to the schema. + Passing `--examples` will add example data to requests and responses. Take caution when using this option, as it may add sensitive data (tokens, passwords, personal information etc.) to the schema. + Passing `--headers` will add headers data to requests and responses. Take caution when using this option, as it may add sensitive data (tokens, passwords, personal information etc.) to the schema. ### HAR 1. Capture and export the traffic from the browser DevTools. - In the browser DevTools, go to the Network tab and click the "Export HAR" button. + In the browser DevTools, go to the Network tab and click the "Export HAR" button. + + ![A screenshot showing where the export har button is located](./docs/export_har_button.png) - ![A screenshot showing where the export har button is located](./docs/export_har_button.png) 2. Continue the same way you would do with the mitmproxy dump. `mitmproxy2swagger` will automatically detect the HAR file and process it. ## Example output @@ -127,5 +126,5 @@ See the [examples](./example_outputs/). You will find a generated schema there a See the generated html file [here](https://raw.githack.com/alufers/mitmproxy2swagger/master/example_outputs/lisek-static.html). ## License -MIT +MIT diff --git a/example_outputs/lisek-static.html b/example_outputs/lisek-static.html index c7d8eb1..e0b0573 100644 --- a/example_outputs/lisek-static.html +++ b/example_outputs/lisek-static.html @@ -97,7 +97,7 @@ select:-webkit-autofill { background-color: #004daa !important; color: #e8e6e3 !important; } - + flows/flows_lisek_filtered Mitmproxy2Swagger @@ -1772,7 +1772,7 @@ select:-webkit-autofill { margin-top: 10px; line-height: 1.4; font-size: 0.9em; - + li { background-color: inherit; } @@ -2135,7 +2135,7 @@ data-styled.g131[id="sc-eWnToP"]{content:"kLtxdB,"}/*!sc*/ - +
- \ No newline at end of file + diff --git a/mitmproxy2swagger/console_util.py b/mitmproxy2swagger/console_util.py index b1a174a..a8423e1 100644 --- a/mitmproxy2swagger/console_util.py +++ b/mitmproxy2swagger/console_util.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import sys ANSI_RGB = "\033[38;2;{};{};{}m" diff --git a/mitmproxy2swagger/har_capture_reader.py b/mitmproxy2swagger/har_capture_reader.py index 2cf6330..261cb25 100644 --- a/mitmproxy2swagger/har_capture_reader.py +++ b/mitmproxy2swagger/har_capture_reader.py @@ -1,8 +1,10 @@ +# -*- coding: utf-8 -*- import os -import json_stream from base64 import b64decode from typing import Iterator, Union +import json_stream + # a heuristic to determine if a file is a har archive def har_archive_heuristic(file_path: str) -> int: @@ -37,13 +39,14 @@ class HarFlowWrapper: def get_url(self): return self.flow["request"]["url"] + def get_matching_url(self, prefix) -> Union[str, None]: - """ - Get the requests URL if the prefix matches the URL, None otherwise - """ + """Get the requests URL if the prefix matches the URL, None + otherwise.""" if self.flow["request"]["url"].startswith(prefix): return self.flow["request"]["url"] return None + def get_method(self): return self.flow["request"]["method"] diff --git a/mitmproxy2swagger/mitmproxy2swagger.py b/mitmproxy2swagger/mitmproxy2swagger.py index 53af975..1c27be5 100644 --- a/mitmproxy2swagger/mitmproxy2swagger.py +++ b/mitmproxy2swagger/mitmproxy2swagger.py @@ -1,7 +1,6 @@ #!/usr/bin/env python -""" -Converts a mitmproxy dump file to a swagger schema. -""" +# -*- coding: utf-8 -*- +"""Converts a mitmproxy dump file to a swagger schema.""" import argparse import json import os @@ -14,8 +13,11 @@ import ruamel.yaml from mitmproxy.exceptions import FlowReadException from mitmproxy2swagger import console_util, swagger_util -from mitmproxy2swagger.har_capture_reader import har_archive_heuristic, HarCaptureReader -from mitmproxy2swagger.mitmproxy_capture_reader import mitmproxy_dump_file_huristic, MitmproxyCaptureReader +from mitmproxy2swagger.har_capture_reader import HarCaptureReader, har_archive_heuristic +from mitmproxy2swagger.mitmproxy_capture_reader import ( + MitmproxyCaptureReader, + mitmproxy_dump_file_huristic, +) def path_to_regex(path): @@ -118,7 +120,6 @@ def main(): swagger = yaml.load(f) except FileNotFoundError: print("No existing swagger file found. Creating new one.") - pass if swagger is None: swagger = ruamel.yaml.comments.CommentedMap( { @@ -166,7 +167,7 @@ def main(): for f in capture_reader.captured_requests(): # strip the api prefix from the url url = f.get_matching_url(args.api_prefix) - + if url is None: continue method = f.get_method().lower() @@ -201,12 +202,14 @@ def main(): params = swagger_util.url_to_params(url, path_template_to_set) if args.headers: - headers_request = swagger_util.request_to_headers(f.get_request_headers()) + headers_request = swagger_util.request_to_headers( + f.get_request_headers() + ) if headers_request is not None and len(headers_request) > 0: set_key_if_not_exists( swagger["paths"][path_template_to_set][method], "parameters", - headers_request + headers_request, ) if params is not None and len(params) > 0: set_key_if_not_exists( @@ -288,7 +291,9 @@ def main(): "example" ] = swagger_util.limit_example_size(response_json) if args.headers: - resp_data_to_set["headers"] = swagger_util.response_to_headers(f.get_response_headers()) + resp_data_to_set["headers"] = swagger_util.response_to_headers( + f.get_response_headers() + ) set_key_if_not_exists( swagger["paths"][path_template_to_set][method]["responses"], diff --git a/mitmproxy2swagger/mitmproxy_capture_reader.py b/mitmproxy2swagger/mitmproxy_capture_reader.py index bfed2b7..e010698 100644 --- a/mitmproxy2swagger/mitmproxy_capture_reader.py +++ b/mitmproxy2swagger/mitmproxy_capture_reader.py @@ -1,10 +1,14 @@ -from typing import Iterator -from mitmproxy import io as iom, http -from mitmproxy.exceptions import FlowReadException +# -*- coding: utf-8 -*- import os import typing +from typing import Iterator from urllib.parse import urlparse +from mitmproxy import http +from mitmproxy import io as iom +from mitmproxy.exceptions import FlowReadException + + def mitmproxy_dump_file_huristic(file_path: str) -> int: val = 0 if "flow" in file_path: @@ -36,12 +40,11 @@ class MitmproxyFlowWrapper: return self.flow.request.url def get_matching_url(self, prefix) -> typing.Union[str, None]: - """ - Get the requests URL if the prefix matches the URL, None otherwise + """Get the requests URL if the prefix matches the URL, None otherwise. - This takes into account a quirk of mitmproxy where it sometimes puts the - raw IP address in the URL instead of the hostname. Then the hostname is - in the Host header. + This takes into account a quirk of mitmproxy where it sometimes + puts the raw IP address in the URL instead of the hostname. Then + the hostname is in the Host header. """ if self.flow.request.url.startswith(prefix): return self.flow.request.url @@ -49,11 +52,15 @@ class MitmproxyFlowWrapper: replacement_hostnames = [ self.flow.request.headers.get("Host", ""), self.flow.request.host_header, - self.flow.request.host + self.flow.request.host, ] for replacement_hostname in replacement_hostnames: if replacement_hostname is not None and replacement_hostname != "": - fixed_url = urlparse(self.flow.request.url)._replace(netloc=replacement_hostname).geturl() + fixed_url = ( + urlparse(self.flow.request.url) + ._replace(netloc=replacement_hostname) + .geturl() + ) if fixed_url.startswith(prefix): return fixed_url return None @@ -61,8 +68,8 @@ class MitmproxyFlowWrapper: def get_method(self) -> str: return self.flow.request.method - def get_request_headers(self) -> dict: - headers = {} + def get_request_headers(self) -> dict[str, typing.List[str]]: + headers: dict[str, typing.List[str]] = {} for k, v in self.flow.request.headers.items(multi=True): # create list on key if it does not exist headers[k] = headers.get(k, []) diff --git a/mitmproxy2swagger/swagger_util.py b/mitmproxy2swagger/swagger_util.py index b8a4632..67628b9 100644 --- a/mitmproxy2swagger/swagger_util.py +++ b/mitmproxy2swagger/swagger_util.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import urllib VERBS = [ @@ -104,9 +105,7 @@ def response_to_headers(headers): for key in headers: header[key] = { "description": headers[key][0], - "schema": { - "type": "number" if headers[key][0].isdigit() else "string" - }, + "schema": {"type": "number" if headers[key][0].isdigit() else "string"}, } return header diff --git a/poetry.lock b/poetry.lock index 0d447af..481210b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. [[package]] name = "asgiref" @@ -15,6 +15,56 @@ files = [ [package.extras] tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] +[[package]] +name = "black" +version = "23.3.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, + {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, + {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, + {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, + {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, + {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, + {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, + {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, + {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, + {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, + {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, + {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, + {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, + {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + [[package]] name = "brotli" version = "1.0.9" @@ -196,6 +246,103 @@ files = [ [package.dependencies] pycparser = "*" +[[package]] +name = "cfgv" +version = "3.3.1" +description = "Validate configuration and produce human readable error messages." +category = "dev" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + [[package]] name = "click" version = "8.1.3" @@ -270,6 +417,104 @@ sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] + +[[package]] +name = "docformatter" +version = "1.6.0" +description = "Formats docstrings to follow PEP 257" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "docformatter-1.6.0-py3-none-any.whl", hash = "sha256:dfad58437b560708eb74ccaccba5c91a0f98f534ed51b7af02aa35225e9eb6c2"}, + {file = "docformatter-1.6.0.tar.gz", hash = "sha256:2346dcc239b73bc4b62d1035e240d1338d154fb047a7e492f0168a93744222e2"}, +] + +[package.dependencies] +charset_normalizer = ">=3.0.0,<4.0.0" +tomli = {version = ">=2.0.0,<3.0.0", optional = true, markers = "extra == \"tomli\""} +untokenize = ">=0.1.1,<0.2.0" + +[package.extras] +tomli = ["tomli (>=2.0.0,<3.0.0)"] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "filelock" +version = "3.11.0" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.11.0-py3-none-any.whl", hash = "sha256:f08a52314748335c6460fc8fe40cd5638b85001225db78c2aa01c8c0db83b318"}, + {file = "filelock-3.11.0.tar.gz", hash = "sha256:3618c0da67adcc0506b015fd11ef7faf1b493f0b40d87728e19986b536890c37"}, +] + +[package.extras] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "flake8" +version = "6.0.0" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, + {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.10.0,<2.11.0" +pyflakes = ">=3.0.0,<3.1.0" + +[[package]] +name = "flake8-pyproject" +version = "1.2.3" +description = "Flake8 plug-in loading the configuration from pyproject.toml" +category = "dev" +optional = false +python-versions = ">= 3.6" +files = [ + {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, +] + +[package.dependencies] +Flake8 = ">=5" +TOMLi = {version = "*", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["pyTest", "pyTest-cov"] + [[package]] name = "flask" version = "2.2.3" @@ -345,16 +590,31 @@ files = [ {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, ] +[[package]] +name = "identify" +version = "2.5.22" +description = "File identification library for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "identify-2.5.22-py2.py3-none-any.whl", hash = "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f"}, + {file = "identify-2.5.22.tar.gz", hash = "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e"}, +] + +[package.extras] +license = ["ukkonen"] + [[package]] name = "importlib-metadata" -version = "6.0.0" +version = "6.3.0" description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"}, - {file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"}, + {file = "importlib_metadata-6.3.0-py3-none-any.whl", hash = "sha256:8f8bd2af397cf33bd344d35cfe7f489219b7d14fc79a3f854b75b8417e9226b0"}, + {file = "importlib_metadata-6.3.0.tar.gz", hash = "sha256:23c2bcae4762dfb0bbe072d358faec24957901d75b6c4ab11172c0c982532402"}, ] [package.dependencies] @@ -365,6 +625,36 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + [[package]] name = "itsdangerous" version = "2.1.2" @@ -397,18 +687,18 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "json-stream" -version = "2.2.0" +version = "2.3.0" description = "Streaming JSON encoder and decoder" category = "main" optional = false python-versions = "<4,>=3.5" files = [ - {file = "json-stream-2.2.0.tar.gz", hash = "sha256:560eb3178891e18a9502cc7ddc6cb998ed89365766d9fec184d06d8f3558f36c"}, - {file = "json_stream-2.2.0-py3-none-any.whl", hash = "sha256:d403cda067cbd7b823827af92efeb3c6b0ab7cd3247c1c111d8bdf2efd00ba69"}, + {file = "json-stream-2.3.0.tar.gz", hash = "sha256:3300e95f7212271a34026dedfeeb940bc193c9916e5051add60ec1793635cffd"}, + {file = "json_stream-2.3.0-py3-none-any.whl", hash = "sha256:411034b77e0c10d6f83ffe541debcf5f26712cf9433749477651c3cd58c415fb"}, ] [package.dependencies] -json-stream-rs-tokenizer = ">=0.4.8" +json-stream-rs-tokenizer = ">=0.4.16" [package.extras] httpx = ["httpx"] @@ -416,54 +706,54 @@ requests = ["requests"] [[package]] name = "json-stream-rs-tokenizer" -version = "0.4.15" +version = "0.4.16" description = "A faster tokenizer for the json-stream Python library" category = "main" optional = false python-versions = ">=3.7,<4" files = [ - {file = "json-stream-rs-tokenizer-0.4.15.tar.gz", hash = "sha256:27c99f4b0e48f661d3ee7ece9f52363ee732cbacfe6f0e413a24c8b663728636"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d776b6f32574b4310dee284a6064329b81439f19b23677eeb29204a38c88f0e"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6e79bd9de85b3ff531fc7d7fb0b2c6d37ea65fdc4998b2490b5283d3897bcab1"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3291ca5f1a634ed2566b1ae0ddd27ee641ae554a7d04e2b9b7b3e738f975d207"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42d0942a21fa83f01a13cf74c3b760dae17991810b772fdd57e911d15f276bda"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp310-cp310-win32.whl", hash = "sha256:235b28b31d694e82bb09fda9643de6c65a64947306836c6b9a970b5dc4b8d654"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp310-cp310-win_amd64.whl", hash = "sha256:92d826a6235f421ffbbbe72d9f21622aab63d786ed313098d6f7d14f00001d10"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7b812a4326784f4627939b2efacd6ebee233e8ad460e17e816b70710401c5060"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ee10cf262910bb6197fa47595950d0ef09cedecf742706f6a9db400a78a12def"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38929a55c71e4e49e35c59e4ff890125e1a21a10b10a7a4751b1fc83b2b945e9"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fab0ce0b1dacdfb457cad6b705bbe7464afce66d86d9cfa0923762c6fec2ce8"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp311-cp311-win32.whl", hash = "sha256:7aa057aa5f17acf4e83a84752c3cd33a029442987ad4ad3073031bfd29920f82"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp311-cp311-win_amd64.whl", hash = "sha256:19cf3f403f2a0c25c8d7a45e67e5491fbde0832fae596c221d5efd94e01ecc56"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0b98d3311b77b61ba6454eb846ff0b06689fa8bbfc51e72d98ca827e0287e686"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4babd5120a512e56d7a618294d402256c9f1856db40ba79a5ef62a655cf3f5a"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1638939a06d9fe937375ab642265afdcbaa0c755417672bd7bd17c6dc0141c53"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp37-cp37m-win32.whl", hash = "sha256:0f6c0020b48e3ebc649e005cf3781e2b0655208139c099a8d0c22af01872c6ae"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp37-cp37m-win_amd64.whl", hash = "sha256:4d875331d42c71294ca9acacd04724508148f3fa6a45988a149c3ffdc33af54a"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:228f4f2a1844209d74930d1fc6548432cdd09e2fe05d1e7af53d38d0c2b16402"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:15f2fb85c78be964c6d97d6a06a59932be88bece0d2a72851d2732d3b2bcfe12"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae3bc585d183cdaf6f4d403c23b5fffcc7110acc20719f49a19bc3fc6a3dd7c"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0703b68f40b59ffb46c9e42b23ae7c6296b771077690460b2fd6de64986e20ef"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp38-cp38-win32.whl", hash = "sha256:d426d8a139324885f14a5c7d0652c529656b48c423433b2ece2e625d0eb63a57"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp38-cp38-win_amd64.whl", hash = "sha256:ba1f4c10ed89843dd262c1fd0752afecca46bc88f0ffa5d63ee0b45cf7b4d407"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3bdc05bb8a8c207bc3547c33646ed7c3de5d33d8dd72e215b1e27e911251fb89"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2209a9ddf1340503550676da3d6178f31ea4298334598473834257a78aa055f"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82ce170f21e0b98a35bc2733b0b3f68921315cd133cdb41375354ac1561ebc96"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8d53aca042b33b4dc5c130d751ad543f4b47f5a141ec82e8647a06918a71a6"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp39-cp39-win32.whl", hash = "sha256:f27f99804f84e7798cba23a6a87f821d2f628ab4d0309fda6eecab54e0b765c9"}, - {file = "json_stream_rs_tokenizer-0.4.15-cp39-cp39-win_amd64.whl", hash = "sha256:79ddc357eb41e527e9092e62185b7ce082139bb752f88d1b70f89aa64823d8b4"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bb9730db205638a8932021570ecf822fc385bdcf439b14f311fa9e4e77fd8b05"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2933e9d3adca8be61cd918d2f3aff0d8d0951daf357ffb7d67377336e077c1e"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca2b4c6fbf7dd28268f6dad35d3181b2df4e7061ebd64fb036f6bbde56fc5062"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:5549a23d485945561590747a11eaabe557d55a505148f7bec9d1cdd3e8a7fdf4"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3ae49d9731be5d258f765b62c73c52a5fe8245643c268ff6aa8079bd24bf0d60"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c427debb75ecef381c551d01feaeb02dbc3b8023544d8d86df1eeeb5f50a3cf"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf524107b1c7039a6280856c1084835f35fa5fad94afa8736dcd9666a382ac3d"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:48a703a4528abb64804d6e8ca484bc5064d184b6941c5c0ed51b4c5208fe5e20"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:14ff3c27f127ecb87c58a9a86de38bfd85bf18b19193816ecc5fab0e4de636ec"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06a15c5ada1890ec1957240c13b05dfc4dfcdbb8a40198bdaf7a2a20ccc74abf"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76bd1452d18574410a0d298419a51cc68c3e9e6c30e5ef180f6415d796766a94"}, - {file = "json_stream_rs_tokenizer-0.4.15-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33c987367e67bf36998016e855541e5cb131f9dbae9d6968a3f447e290071bd"}, + {file = "json-stream-rs-tokenizer-0.4.16.tar.gz", hash = "sha256:772c75cf0725ccd0ed1ed1e01a00ec28b1b79ea24b2b3d1291239befccd93b42"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6abcfb2724a73a6ba06bc72fa20d5c0c24b88a8bda8f9155224992147ad9db2d"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d56a7eda601b37f6d62503ceb16bc1274f601bdc8c216c71a176c5bd1b5b5050"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a64f76415105b1dbfd55b60dd6896c05556cd757d43c31dfb5ee79dd7ab83fd"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0611e472103c13577dc784204e0c6584029f3d27d050f45ce6bc8a1aee8b881"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp310-cp310-win32.whl", hash = "sha256:6d9035b8bee5e3e1971ef494c3a5d83f8523457b708024a8d4654eafca592102"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp310-cp310-win_amd64.whl", hash = "sha256:98d95cfadef641e594ad387848725b539c382a06b679d20ad7fce3f5d7e4c4da"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53a9d1158ed24f9666f80403d42d0c935e74d1d95d49d55ccdb3d6ede6a37fd2"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5815fc92009b0c0d3d2326657d5587717a92b190334cb694ed4c32b10f4bd70c"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b53188ce18b3bf1b2fdea9d1d3bbb21bb59798d44459cb29992a3eecf0a915f"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc71c8d60cb7da39e5d5bf2b15e08be303880dd5b013e3c4b1b59a5192473e0"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp311-cp311-win32.whl", hash = "sha256:80b122300fcdc29675f3509f4b11399d59a9827f8ffacdb072e4713316adc24a"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp311-cp311-win_amd64.whl", hash = "sha256:a2ec43e6d9f6070b4bf2c4817806aee94e40e8c1d3574a511d27fc7141e24976"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0941222485f0434ff519d34bfa4262be19074712bb20fa3bbc5442489c99e3f"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b1e1ace56c5ffc3eea84609e493fe485138435140451a041a1e354010fd6ce2"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c06439bb839ae7466d31c158e453db1fa69a5c8b5ee4636fc47ade5366cfed5"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp37-cp37m-win32.whl", hash = "sha256:23f110ba570bee7616e78cf9a2b3f30026747f6045af37983369e9544ddb9588"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp37-cp37m-win_amd64.whl", hash = "sha256:f1289c8803689c4345decd2d62add658b977894cf27ef4e19b069729800bfe76"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e491c5fb31cce2d160c55e5aaa82f50622596796951b6b2ddb66a871b51e358f"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6ec1fc58ed7d01bca454ed4755e4c8e64ebeda667fe7dcaa9b32b1b2ddf495cc"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d19036688e4079c2578bb3c7247a75d7b7c5bd33c70f2e5b39be7d6cdd04474"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32bf387041f00af673b65c9d61c62c9bb14c0169ac310d6620724ae8909d169f"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp38-cp38-win32.whl", hash = "sha256:db8d49cfe4dabae8c91789de9a7acc700a307b4f482ea6f88e51747fa5cc0850"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp38-cp38-win_amd64.whl", hash = "sha256:063f9725ef2f67dd08594a64ea32f491f0c6133c1cc1f9778ac1266a1627b595"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd64de59ee1d8ef85595001fe5859892fb2dcbef9406322836a45a40d1e6b34"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:405bb651e25d9d86fc30b4fe3c8015e71f6ebb8d99739cf98b149c101f492b17"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f07ea8458c17ed303d90d424339ace7c8ce12454e7f2a16b0482257cd2e6f6e"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dddd3bb220f9ea91bc1c6cc41c97b67105bf63a851f1e8182d19cdfff35aed01"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp39-cp39-win32.whl", hash = "sha256:51a4b9905079fcfcba879cc729fc727e44c6d25622ea047160c4883d02046dc3"}, + {file = "json_stream_rs_tokenizer-0.4.16-cp39-cp39-win_amd64.whl", hash = "sha256:dbcb271512a7ec7d74c50b71ebf9623a966855478ee4747c2f435e7dc83c9e6a"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3f92435e35c163c5c516d81a2a5fa1e10c8f3293703dad7efae22c472fbfde0e"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dc2a961ac302729c9be1f6d6c682ea716c06139177d52fc51a30af8195fdb45"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12cf070bb066e35b044badca3b5044672ff855e90bdc9730974e48afb47c1962"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:493dd491142c1c1911b0f279b78c9c50b554981803ee41cf6dfad598a7fa9404"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6ed7224a939dccf1fa1bca47aa6ae9435f898a5e25d72309dd42df34a677f52c"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e66095e47c428177383940f120c23bd38f532f698efb21c19fcffd836a148f"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bccc45c4cf7d67676e9ded19c9a113ae0cf48a7ec46dc335d4cb2c127530e2cf"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ae49594abd759e5640035214909b8344d036a59ea626a962d04b4c4c079f7ca0"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3899a40b19a28dcf9a6aab81603c3e76ed1a7ef42c880944568d9adcf5abbfb5"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f923c5610e64710c999221bc7f9035b4bf00cc781f074a82057c80ea660ca15e"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:adf68d1e948396b624b89666fc17d9c0ca93725c31cd4458279ae471cee808c8"}, + {file = "json_stream_rs_tokenizer-0.4.16-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:dcd0702dabd9f5181ca2ca882b93335a74e324c669dfae4ff6b3c9c06edaa55d"}, ] [package.extras] @@ -557,6 +847,18 @@ files = [ {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, ] +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + [[package]] name = "mitmproxy" version = "9.0.1" @@ -601,18 +903,18 @@ dev = ["click (>=7.0,<8.2)", "hypothesis (>=5.8,<7)", "parver (>=0.1,<2.0)", "pd [[package]] name = "mitmproxy-wireguard" -version = "0.1.20" +version = "0.1.23" description = "WireGuard interface for mitmproxy" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "mitmproxy_wireguard-0.1.20-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:9b8c90d19bd48ab29d6cbc03c775f20e0c3f6c8544c5c464b0276f7083ef5a74"}, - {file = "mitmproxy_wireguard-0.1.20-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:d53104a07a1f318d85b26d0a9daa9b2bd505a8c8692038b77659f33cd704a6be"}, - {file = "mitmproxy_wireguard-0.1.20-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca83ba39b0b01f4363cacbeb1bf8f5094730bd2c8591bc87aa023ccd0e643f06"}, - {file = "mitmproxy_wireguard-0.1.20-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:568bab7c406311109885a3746e2df874efe30c3b4a9ba9e941c908bc4e17c9f6"}, - {file = "mitmproxy_wireguard-0.1.20-cp37-abi3-win_amd64.whl", hash = "sha256:d808a656115c0c90c5019bce98d32fded13c8bb0d24510e13521275baebd0b42"}, - {file = "mitmproxy_wireguard-0.1.20.tar.gz", hash = "sha256:440edb39623110e1a5b8793a70afb3833f25dba05cf02b07b083848b31cb0523"}, + {file = "mitmproxy_wireguard-0.1.23-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:661471e8a363b16d5d871c6c6c30205b16b636574b5bc062b3f158d8b76951ad"}, + {file = "mitmproxy_wireguard-0.1.23-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:f433fa20358ab2999ba9233819649d2a5a5c2b95eac7e95f4533de90d978d115"}, + {file = "mitmproxy_wireguard-0.1.23-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82ac397bcd8ac3cfd08c91b2039b0ba5dc67edfa65fb52ab0e5df81220bdb913"}, + {file = "mitmproxy_wireguard-0.1.23-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23a55cd010d9d116b23101b5b8b963d10f3d38d6f9be0f58ba53288012f4fef9"}, + {file = "mitmproxy_wireguard-0.1.23-cp37-abi3-win_amd64.whl", hash = "sha256:f2f6121dc4d2d8b692124f3d027f4c839ef764278d473fb89357841b0a4406cf"}, + {file = "mitmproxy_wireguard-0.1.23.tar.gz", hash = "sha256:b0f7b44ef9b0601307c122c5fe1ce57368c2fc9330097ec576984a0d640b4727"}, ] [[package]] @@ -688,6 +990,92 @@ files = [ {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, ] +[[package]] +name = "mypy" +version = "1.2.0" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mypy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:701189408b460a2ff42b984e6bd45c3f41f0ac9f5f58b8873bbedc511900086d"}, + {file = "mypy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fe91be1c51c90e2afe6827601ca14353bbf3953f343c2129fa1e247d55fd95ba"}, + {file = "mypy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d26b513225ffd3eacece727f4387bdce6469192ef029ca9dd469940158bc89e"}, + {file = "mypy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a2d219775a120581a0ae8ca392b31f238d452729adbcb6892fa89688cb8306a"}, + {file = "mypy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:2e93a8a553e0394b26c4ca683923b85a69f7ccdc0139e6acd1354cc884fe0128"}, + {file = "mypy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3efde4af6f2d3ccf58ae825495dbb8d74abd6d176ee686ce2ab19bd025273f41"}, + {file = "mypy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:695c45cea7e8abb6f088a34a6034b1d273122e5530aeebb9c09626cea6dca4cb"}, + {file = "mypy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0e9464a0af6715852267bf29c9553e4555b61f5904a4fc538547a4d67617937"}, + {file = "mypy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8293a216e902ac12779eb7a08f2bc39ec6c878d7c6025aa59464e0c4c16f7eb9"}, + {file = "mypy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:f46af8d162f3d470d8ffc997aaf7a269996d205f9d746124a179d3abe05ac602"}, + {file = "mypy-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:031fc69c9a7e12bcc5660b74122ed84b3f1c505e762cc4296884096c6d8ee140"}, + {file = "mypy-1.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390bc685ec209ada4e9d35068ac6988c60160b2b703072d2850457b62499e336"}, + {file = "mypy-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4b41412df69ec06ab141808d12e0bf2823717b1c363bd77b4c0820feaa37249e"}, + {file = "mypy-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4e4a682b3f2489d218751981639cffc4e281d548f9d517addfd5a2917ac78119"}, + {file = "mypy-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a197ad3a774f8e74f21e428f0de7f60ad26a8d23437b69638aac2764d1e06a6a"}, + {file = "mypy-1.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c9a084bce1061e55cdc0493a2ad890375af359c766b8ac311ac8120d3a472950"}, + {file = "mypy-1.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaeaa0888b7f3ccb7bcd40b50497ca30923dba14f385bde4af78fac713d6d6f6"}, + {file = "mypy-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bea55fc25b96c53affab852ad94bf111a3083bc1d8b0c76a61dd101d8a388cf5"}, + {file = "mypy-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:4c8d8c6b80aa4a1689f2a179d31d86ae1367ea4a12855cc13aa3ba24bb36b2d8"}, + {file = "mypy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70894c5345bea98321a2fe84df35f43ee7bb0feec117a71420c60459fc3e1eed"}, + {file = "mypy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4a99fe1768925e4a139aace8f3fb66db3576ee1c30b9c0f70f744ead7e329c9f"}, + {file = "mypy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023fe9e618182ca6317ae89833ba422c411469156b690fde6a315ad10695a521"}, + {file = "mypy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d19f1a239d59f10fdc31263d48b7937c585810288376671eaf75380b074f238"}, + {file = "mypy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:2de7babe398cb7a85ac7f1fd5c42f396c215ab3eff731b4d761d68d0f6a80f48"}, + {file = "mypy-1.2.0-py3-none-any.whl", hash = "sha256:d8e9187bfcd5ffedbe87403195e1fc340189a68463903c39e2b63307c9fa0394"}, + {file = "mypy-1.2.0.tar.gz", hash = "sha256:f70a40410d774ae23fcb4afbbeca652905a04de7948eaf0b1789c8d1426b72d1"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nodeenv" +version = "1.7.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + [[package]] name = "passlib" version = "1.7.4" @@ -706,27 +1094,90 @@ bcrypt = ["bcrypt (>=3.1.0)"] build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] totp = ["cryptography"] +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "platformdirs" +version = "3.2.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, + {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, +] + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pre-commit" +version = "3.2.2" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.2.2-py2.py3-none-any.whl", hash = "sha256:0b4210aea813fe81144e87c5a291f09ea66f199f367fa1df41b55e1d26e1e2b4"}, + {file = "pre_commit-3.2.2.tar.gz", hash = "sha256:5b808fcbda4afbccf6d6633a56663fed35b6c2bc08096fd3d47ce197ac351d9d"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + [[package]] name = "protobuf" -version = "4.22.1" +version = "4.22.3" description = "" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "protobuf-4.22.1-cp310-abi3-win32.whl", hash = "sha256:85aa9acc5a777adc0c21b449dafbc40d9a0b6413ff3a4f77ef9df194be7f975b"}, - {file = "protobuf-4.22.1-cp310-abi3-win_amd64.whl", hash = "sha256:8bc971d76c03f1dd49f18115b002254f2ddb2d4b143c583bb860b796bb0d399e"}, - {file = "protobuf-4.22.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:5917412347e1da08ce2939eb5cd60650dfb1a9ab4606a415b9278a1041fb4d19"}, - {file = "protobuf-4.22.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:9e12e2810e7d297dbce3c129ae5e912ffd94240b050d33f9ecf023f35563b14f"}, - {file = "protobuf-4.22.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:953fc7904ef46900262a26374b28c2864610b60cdc8b272f864e22143f8373c4"}, - {file = "protobuf-4.22.1-cp37-cp37m-win32.whl", hash = "sha256:6e100f7bc787cd0a0ae58dbf0ab8bbf1ee7953f862b89148b6cf5436d5e9eaa1"}, - {file = "protobuf-4.22.1-cp37-cp37m-win_amd64.whl", hash = "sha256:87a6393fa634f294bf24d1cfe9fdd6bb605cbc247af81b9b10c4c0f12dfce4b3"}, - {file = "protobuf-4.22.1-cp38-cp38-win32.whl", hash = "sha256:e3fb58076bdb550e75db06ace2a8b3879d4c4f7ec9dd86e4254656118f4a78d7"}, - {file = "protobuf-4.22.1-cp38-cp38-win_amd64.whl", hash = "sha256:651113695bc2e5678b799ee5d906b5d3613f4ccfa61b12252cfceb6404558af0"}, - {file = "protobuf-4.22.1-cp39-cp39-win32.whl", hash = "sha256:67b7d19da0fda2733702c2299fd1ef6cb4b3d99f09263eacaf1aa151d9d05f02"}, - {file = "protobuf-4.22.1-cp39-cp39-win_amd64.whl", hash = "sha256:b8700792f88e59ccecfa246fa48f689d6eee6900eddd486cdae908ff706c482b"}, - {file = "protobuf-4.22.1-py3-none-any.whl", hash = "sha256:3e19dcf4adbf608924d3486ece469dd4f4f2cf7d2649900f0efcd1a84e8fd3ba"}, - {file = "protobuf-4.22.1.tar.gz", hash = "sha256:dce7a55d501c31ecf688adb2f6c3f763cf11bc0be815d1946a84d74772ab07a7"}, + {file = "protobuf-4.22.3-cp310-abi3-win32.whl", hash = "sha256:8b54f56d13ae4a3ec140076c9d937221f887c8f64954673d46f63751209e839a"}, + {file = "protobuf-4.22.3-cp310-abi3-win_amd64.whl", hash = "sha256:7760730063329d42a9d4c4573b804289b738d4931e363ffbe684716b796bde51"}, + {file = "protobuf-4.22.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:d14fc1a41d1a1909998e8aff7e80d2a7ae14772c4a70e4bf7db8a36690b54425"}, + {file = "protobuf-4.22.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:70659847ee57a5262a65954538088a1d72dfc3e9882695cab9f0c54ffe71663b"}, + {file = "protobuf-4.22.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:13233ee2b9d3bd9a5f216c1fa2c321cd564b93d8f2e4f521a85b585447747997"}, + {file = "protobuf-4.22.3-cp37-cp37m-win32.whl", hash = "sha256:ecae944c6c2ce50dda6bf76ef5496196aeb1b85acb95df5843cd812615ec4b61"}, + {file = "protobuf-4.22.3-cp37-cp37m-win_amd64.whl", hash = "sha256:d4b66266965598ff4c291416be429cef7989d8fae88b55b62095a2331511b3fa"}, + {file = "protobuf-4.22.3-cp38-cp38-win32.whl", hash = "sha256:f08aa300b67f1c012100d8eb62d47129e53d1150f4469fd78a29fa3cb68c66f2"}, + {file = "protobuf-4.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:f2f4710543abec186aee332d6852ef5ae7ce2e9e807a3da570f36de5a732d88e"}, + {file = "protobuf-4.22.3-cp39-cp39-win32.whl", hash = "sha256:7cf56e31907c532e460bb62010a513408e6cdf5b03fb2611e4b67ed398ad046d"}, + {file = "protobuf-4.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:e0e630d8e6a79f48c557cd1835865b593d0547dce221c66ed1b827de59c66c97"}, + {file = "protobuf-4.22.3-py3-none-any.whl", hash = "sha256:52f0a78141078077cfe15fe333ac3e3a077420b9a3f5d1bf9b5fe9d286b4d881"}, + {file = "protobuf-4.22.3.tar.gz", hash = "sha256:23452f2fdea754a8251d0fc88c0317735ae47217e0d27bf330a30eec2848811a"}, ] [[package]] @@ -753,6 +1204,18 @@ files = [ {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, ] +[[package]] +name = "pycodestyle" +version = "2.10.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, + {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, +] + [[package]] name = "pycparser" version = "2.21" @@ -781,6 +1244,18 @@ files = [ docs = ["sphinx (>=1.4.8)"] test = ["codecov (>=2.0.5)", "hypothesis (>=3.5.3)", "mock (>=1.0.1)", "pytest (>=3.0.3)", "pytest-cov (>=2.2.1)", "pytest-faulthandler (>=1.3.0,<2)", "pytest-timeout (>=1.0.0,<2)", "wheel (>=0.29)"] +[[package]] +name = "pyflakes" +version = "3.0.1" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, + {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, +] + [[package]] name = "pyopenssl" version = "22.1.0" @@ -826,6 +1301,98 @@ files = [ {file = "pyperclip-1.8.2.tar.gz", hash = "sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57"}, ] +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.20.3" +description = "Pytest support for asyncio" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-asyncio-0.20.3.tar.gz", hash = "sha256:83cbf01169ce3e8eb71c6c278ccb0574d1a7a3bb8eaaf5e50e0ad342afb33b36"}, + {file = "pytest_asyncio-0.20.3-py3-none-any.whl", hash = "sha256:f129998b209d04fcc65c96fc85c11e5316738358909a8399e93be553d7656442"}, +] + +[package.dependencies] +pytest = ">=6.1.0" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + [[package]] name = "ruamel-yaml" version = "0.17.21" @@ -891,6 +1458,23 @@ files = [ {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, ] +[[package]] +name = "setuptools" +version = "67.6.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"}, + {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "sortedcontainers" version = "2.4.0" @@ -903,6 +1487,18 @@ files = [ {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + [[package]] name = "tornado" version = "6.2" @@ -936,6 +1532,17 @@ files = [ {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, ] +[[package]] +name = "untokenize" +version = "0.1.1" +description = "Transforms tokens into original source code (while preserving whitespace)." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "untokenize-0.1.1.tar.gz", hash = "sha256:3865dbbbb8efb4bb5eaa72f1be7f3e0be00ea8b7f125c69cbd1f5fda926f37a2"}, +] + [[package]] name = "urwid" version = "2.1.2" @@ -947,6 +1554,38 @@ files = [ {file = "urwid-2.1.2.tar.gz", hash = "sha256:588bee9c1cb208d0906a9f73c613d2bd32c3ed3702012f51efe318a3f2127eae"}, ] +[[package]] +name = "vermin" +version = "1.5.1" +description = "Concurrently detect the minimum Python versions needed to run code" +category = "dev" +optional = false +python-versions = ">=2.7" +files = [ + {file = "vermin-1.5.1-py2.py3-none-any.whl", hash = "sha256:420995de564ac0c31e2157220259d7ac82556e8fa69c112d8005b78c14b0caf5"}, +] + +[[package]] +name = "virtualenv" +version = "20.21.0" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, + {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.4.1,<4" +platformdirs = ">=2.4,<4" + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] + [[package]] name = "werkzeug" version = "2.2.3" @@ -1066,4 +1705,4 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "1378e6669662f0345c2eeb32e8bb510785e83725c4be7105d8562bfbafef3109" +content-hash = "16321978e1b36e7b409d066c388ddb3a553bad6a6d18dbdf8ee9e5f8ec761545" diff --git a/pyproject.toml b/pyproject.toml index fefccad..39bb5d1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,17 @@ mitmproxy = "^9.0.1" "ruamel.yaml" = "^0.17.21" json-stream = "^2.2.0" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] +black = "^23.1.0" +isort = "^5.12.0" +mypy = "^1.0.1" +flake8 = "^6.0.0" +docformatter = {extras = ["tomli"], version = "^1.5.1"} +flake8-pyproject = "^1.2.2" +pre-commit = "^3.1.1" +pytest = "^7.2.1" +pytest-asyncio = "^0.20.3" +vermin = "^1.5.1" [build-system] requires = ["poetry-core>=1.0.0"] @@ -20,3 +30,22 @@ build-backend = "poetry.core.masonry.api" [tool.poetry.scripts] mitmproxy2swagger = 'mitmproxy2swagger.mitmproxy2swagger:main' + +[tool.black] +line-length = 88 +target-version = ['py310'] +include = 'mitmproxy2swagger/(.*)\.pyi?$' + +[tool.flake8] +max-line-length = 120 +extend-ignore = 'E203,E501' + +[tool.isort] +profile = "black" + +[tool.mypy] +python_version = "3.10" + +[tool.docformatter] +recursive = true +wrap-summaries = 88