├── tests ├── __init__.py ├── conftest.py ├── test_fakeit.py └── test_backend.py ├── .gitignore ├── autofake ├── exceptions.py ├── __init__.py ├── models.py ├── fakeit.py └── backend.py ├── .github └── workflows │ └── tests.yml ├── LICENSE ├── pyproject.toml ├── README.md └── poetry.lock /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | .coverage 3 | dist 4 | -------------------------------------------------------------------------------- /autofake/exceptions.py: -------------------------------------------------------------------------------- 1 | class FakeItException(Exception): 2 | pass 3 | 4 | 5 | class RecordNotFound(FakeItException): 6 | pass 7 | 8 | 9 | class NotUniqueName(FakeItException): 10 | pass 11 | -------------------------------------------------------------------------------- /autofake/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.5.0" 2 | 3 | from .backend import JSONBackend, PickleBackend 4 | from .exceptions import FakeItException, NotUniqueName, RecordNotFound 5 | from .fakeit import FakeIt 6 | from .models import Mode, Record 7 | -------------------------------------------------------------------------------- /tests/conftest.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from autofake import FakeIt, Mode 4 | 5 | 6 | @pytest.fixture(scope="function", name="fakeit") 7 | def fixture_fakeit(): 8 | return FakeIt(Mode.RECORD) 9 | 10 | 11 | @pytest.fixture(name="function") 12 | def fixture_function(fakeit): 13 | @fakeit 14 | def function(a, b): 15 | return a + b 16 | 17 | return function 18 | -------------------------------------------------------------------------------- /autofake/models.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from dataclasses import dataclass, field 4 | from enum import Enum 5 | from typing import Any, Tuple 6 | 7 | 8 | @dataclass 9 | class Record: 10 | args: Tuple[Any, ...] = field(default_factory=tuple) 11 | kwargs: dict[str, Any] = field(default_factory=dict) 12 | result: Any = None 13 | 14 | 15 | class Mode(str, Enum): 16 | RECORD = "RECORD" 17 | FAKE = "FAKE" 18 | PRODUCTION = "PRODUCTION" 19 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: 4 | - pull_request 5 | 6 | jobs: 7 | build: 8 | 9 | runs-on: ubuntu-latest 10 | strategy: 11 | matrix: 12 | python-version: ["3.8", "3.9", "3.10", "3.11"] 13 | 14 | steps: 15 | - uses: actions/checkout@v3 16 | - name: Set up Python ${{ matrix.python-version }} 17 | uses: actions/setup-python@v4 18 | with: 19 | python-version: ${{ matrix.python-version }} 20 | - name: Install dependencies 21 | run: | 22 | python -m pip install --upgrade pip 23 | pip install pytest 24 | - name: Test with pytest 25 | run: | 26 | pytest 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Agustin Marquez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "autofake" 3 | version = "0.5.0" 4 | description = "" 5 | authors = ["Agustin Marquez "] 6 | repository = "https://github.com/agusdmb/autofake" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.8" 10 | 11 | [tool.poetry.dev-dependencies] 12 | pytest = "^7.2.1" 13 | black = "^22.12.0" 14 | mypy = "^0.991" 15 | pylint = "^2.15.10" 16 | isort = "^5.11.4" 17 | coverage = "^7.1.0" 18 | bandit = "^1.7.4" 19 | 20 | [build-system] 21 | requires = ["poetry-core>=1.0.0"] 22 | build-backend = "poetry.core.masonry.api" 23 | 24 | [tool.pylint.messages_control] 25 | disable = [ 26 | # "C0103", # Argument name X doesnt conform to snake_case naming style 27 | "C0114", # Missing module docstring 28 | "C0115", # Missing class docstring 29 | "C0116", # Missing function or method docstring 30 | # "R0902", # Too many instance attributes 31 | # "R0903", # Too few public methods 32 | # "R0913", # Too many arguments 33 | # "R0914", # Too many local variables 34 | # "W0212", # Access to a protected member 35 | # "W0511", # TODO XXX FIXME 36 | # "R0801", # similarities 37 | ] 38 | extension-pkg-whitelist = "pydantic" 39 | 40 | -------------------------------------------------------------------------------- /autofake/fakeit.py: -------------------------------------------------------------------------------- 1 | import os 2 | from collections.abc import Callable 3 | from functools import wraps 4 | from typing import Optional 5 | 6 | from .backend import Backend, InMemoryBackend 7 | from .exceptions import NotUniqueName 8 | from .models import Mode, Record 9 | 10 | 11 | class FakeIt: 12 | def __init__(self, mode: Optional[Mode] = None, backend: Optional[Backend] = None): 13 | self._mode = self._determine_mode(mode) 14 | self._backend = backend or InMemoryBackend() 15 | self._decorated: set[str] = set() 16 | 17 | def _determine_mode(self, mode: Optional[Mode] = None): 18 | if mode: 19 | return mode 20 | env_mode = os.environ.get("AUTOFAKE") 21 | if env_mode: 22 | return Mode(env_mode) 23 | return Mode.PRODUCTION 24 | 25 | def _production_mode(self, function: Callable): 26 | return function 27 | 28 | def _fake_mode(self, function: Callable, name: str) -> Callable: 29 | @wraps(function) 30 | def wrapper(*args, **kwargs): 31 | return self._backend.get_result(name, *args, **kwargs) 32 | 33 | return wrapper 34 | 35 | def _record_mode(self, function: Callable, name: str) -> Callable: 36 | @wraps(function) 37 | def wrapper(*args, **kwargs): 38 | result = function(*args, **kwargs) 39 | record = Record(args=args, kwargs=kwargs, result=result) 40 | self._backend.record_call(name, record) 41 | return result 42 | 43 | return wrapper 44 | 45 | def __call__(self, function: Callable): 46 | self._record_decorated(function) 47 | if self._mode == Mode.FAKE: 48 | return self._fake_mode(function, function.__name__) 49 | if self._mode == Mode.RECORD: 50 | return self._record_mode(function, function.__name__) 51 | return self._production_mode(function) 52 | 53 | def _record_decorated(self, function): 54 | if function.__name__ in self._decorated: 55 | raise NotUniqueName( 56 | f"There is already a decorated function called {function.__name__}" 57 | ) 58 | self._decorated.add(function.__name__) 59 | -------------------------------------------------------------------------------- /tests/test_fakeit.py: -------------------------------------------------------------------------------- 1 | import os 2 | from typing import Callable 3 | from unittest import mock 4 | 5 | import pytest 6 | 7 | from autofake import FakeIt, Mode, NotUniqueName, RecordNotFound 8 | 9 | 10 | def test_function(function): 11 | assert function(3, b=4) == 7, "function works the same with decorator" 12 | 13 | 14 | def test_production_doesnt_record(): 15 | fake_backend = mock.MagicMock() 16 | fakeit = FakeIt(Mode.PRODUCTION, fake_backend) 17 | 18 | @fakeit 19 | def function(): 20 | return 1 21 | 22 | function() 23 | 24 | fake_backend.record_call.assert_not_called() 25 | 26 | 27 | def test_get_recrods(fakeit: FakeIt, function: Callable): 28 | function(3, b=4) 29 | function(6, b=7) 30 | 31 | assert fakeit._backend.get_result("function", 6, b=7) == 13 32 | assert fakeit._backend.get_result("function", 3, b=4) == 7 33 | 34 | 35 | def test_get_non_existing_recrods(fakeit: FakeIt, function: Callable): 36 | function(3, b=4) 37 | 38 | with pytest.raises(RecordNotFound): 39 | assert fakeit._backend.get_result("function", 6, b=7) == 13 40 | 41 | 42 | def test_replay(): 43 | fake_backend = mock.MagicMock() 44 | fakeit = FakeIt(Mode.FAKE, fake_backend) 45 | 46 | @fakeit 47 | def function(a, *, b): 48 | raise Exception("Should not run") 49 | 50 | function(3, b=4) 51 | 52 | fake_backend.record_call.assert_not_called() 53 | fake_backend.get_result.assert_called_once_with("function", 3, b=4) 54 | 55 | 56 | @pytest.mark.parametrize("mode_env", ["RECORD", "FAKE", "PRODUCTION"]) 57 | def test_env(mode_env): 58 | previous = os.environ.get("AUTOFAKE") 59 | os.environ["AUTOFAKE"] = mode_env 60 | fakeit = FakeIt() 61 | assert fakeit._mode == Mode(mode_env) 62 | os.environ["AUTOFAKE"] = previous or "" 63 | 64 | 65 | @pytest.mark.parametrize("mode_env", ["RECORD", "FAKE", "PRODUCTION"]) 66 | @pytest.mark.parametrize("mode_arg", ["RECORD", "FAKE", "PRODUCTION"]) 67 | def test_env_overrited(mode_env, mode_arg): 68 | previous = os.environ.get("AUTOFAKE") 69 | os.environ["AUTOFAKE"] = mode_env 70 | fakeit = FakeIt(mode=Mode(mode_arg)) 71 | assert fakeit._mode == Mode(mode_arg) 72 | os.environ["AUTOFAKE"] = previous or "" 73 | 74 | 75 | def test_default_mode(): 76 | previous = os.environ.get("AUTOFAKE") 77 | os.environ["AUTOFAKE"] = "" 78 | fakeit = FakeIt() 79 | assert fakeit._mode == Mode.PRODUCTION 80 | os.environ["AUTOFAKE"] = previous or "" 81 | 82 | 83 | def test_same_name_decorated(fakeit): 84 | @fakeit 85 | def function(): 86 | pass 87 | 88 | with pytest.raises(NotUniqueName): 89 | 90 | @fakeit 91 | def function(): 92 | pass 93 | -------------------------------------------------------------------------------- /autofake/backend.py: -------------------------------------------------------------------------------- 1 | import json 2 | import pickle 3 | from collections import defaultdict 4 | from typing import Any, Protocol 5 | 6 | from .exceptions import RecordNotFound 7 | from .models import Record 8 | 9 | 10 | class Backend(Protocol): 11 | def record_call(self, name: str, record: Record): 12 | ... 13 | 14 | def get_result(self, name: str, record: Record) -> Any: 15 | ... 16 | 17 | 18 | class InMemoryBackend: 19 | def __init__(self): 20 | self._records = defaultdict(list) 21 | 22 | def record_call(self, name: str, record: Record): 23 | self._records[name].append(record) 24 | 25 | def get_result(self, name: str, *args, **kwargs) -> Any: 26 | for record in self._records[name]: 27 | if record.args == args and record.kwargs == kwargs: 28 | return record.result 29 | raise RecordNotFound("Record not found") 30 | 31 | 32 | class PickleBackend: 33 | def __init__(self, filename): 34 | self._filename = filename 35 | self._records = defaultdict(list) 36 | 37 | def record_call(self, name: str, record: Record): 38 | self._records[name].append(record) 39 | self.dump() 40 | 41 | def dump(self): 42 | with open(self._filename, "wb") as file: 43 | pickle.dump(self._records, file) 44 | 45 | def get_result(self, name: str, *args, **kwargs) -> Any: 46 | if not self._records: 47 | self._load_records() 48 | 49 | for record in self._records[name]: 50 | if record.args == args and record.kwargs == kwargs: 51 | return record.result 52 | raise RecordNotFound("Record not found") 53 | 54 | def _load_records(self): 55 | try: 56 | with open(self._filename, "rb") as file: 57 | self._records = pickle.load(file) 58 | except EOFError: 59 | pass 60 | 61 | def __repr__(self): 62 | return f"" 63 | 64 | 65 | class JSONBackend: 66 | def __init__(self, filename): 67 | self._filename = filename 68 | self._records = [] 69 | 70 | def record_call(self, name: str, record: Record): 71 | with open(self._filename, "a") as file: 72 | json.dump({name: record.__dict__}, file) 73 | file.write("\n") 74 | 75 | def get_result(self, name: str, *args, **kwargs) -> Any: 76 | if not self._records: 77 | self._load_records() 78 | 79 | for raw_record in self._records: 80 | for func, record in raw_record.items(): 81 | if func == name: 82 | if record["args"] == list(args) and record["kwargs"] == kwargs: 83 | return record["result"] 84 | 85 | raise RecordNotFound("Record not found") 86 | 87 | def _load_records(self): 88 | with open(self._filename) as file: 89 | for line in file: 90 | self._records.append(json.loads(line)) 91 | -------------------------------------------------------------------------------- /tests/test_backend.py: -------------------------------------------------------------------------------- 1 | import json 2 | import pickle 3 | import tempfile 4 | 5 | import pytest 6 | 7 | from autofake.backend import JSONBackend, PickleBackend 8 | from autofake.exceptions import RecordNotFound 9 | from autofake.models import Record 10 | 11 | 12 | class TestJsonBackend: 13 | def test_json_backend_record(self): 14 | with tempfile.NamedTemporaryFile() as temp: 15 | record = Record(args=(3,), kwargs={"b": 4}, result=7) 16 | 17 | json_backend = JSONBackend(temp.name) 18 | json_backend.record_call("function", record) 19 | 20 | data = json.load(temp) 21 | assert data == {"function": {"args": [3], "kwargs": {"b": 4}, "result": 7}} 22 | 23 | def test_json_backend_get(self): 24 | with tempfile.NamedTemporaryFile() as temp: 25 | json_backend = JSONBackend(temp.name) 26 | json_backend.record_call( 27 | "function", Record(args=(3,), kwargs={"b": 4}, result=7) 28 | ) 29 | assert json_backend.get_result("function", 3, b=4) == 7 30 | 31 | def test_json_backend_get_multi(self): 32 | with tempfile.NamedTemporaryFile() as temp: 33 | json_backend = JSONBackend(temp.name) 34 | json_backend.record_call( 35 | "function", Record(args=(3,), kwargs={"b": 4}, result=7) 36 | ) 37 | json_backend.record_call( 38 | "function", Record(args=(9,), kwargs={"b": 11}, result=20) 39 | ) 40 | assert json_backend.get_result("function", 3, b=4) == 7 41 | assert json_backend.get_result("function", 9, b=11) == 20 42 | 43 | def test_json_backend_no_value(self): 44 | with tempfile.NamedTemporaryFile() as temp: 45 | json_backend = JSONBackend(temp.name) 46 | with pytest.raises(RecordNotFound): 47 | assert json_backend.get_result("function", 3, b=4) == 7 48 | 49 | 50 | class TestPickleBackend: 51 | def test_pickle_backend_get(self): 52 | with tempfile.NamedTemporaryFile() as temp: 53 | pickle_backend = PickleBackend(temp.name) 54 | pickle_backend.record_call( 55 | "function", Record(args=(3,), kwargs={"b": 4}, result=7) 56 | ) 57 | 58 | new_pickle_backend = PickleBackend(temp.name) 59 | assert new_pickle_backend.get_result("function", 3, b=4) == 7 60 | 61 | def test_pickle_backend_get_multi(self): 62 | with tempfile.NamedTemporaryFile() as temp: 63 | pickle_backend = PickleBackend(temp.name) 64 | pickle_backend.record_call( 65 | "function", Record(args=(3,), kwargs={"b": 4}, result=7) 66 | ) 67 | pickle_backend.record_call( 68 | "function", Record(args=(9,), kwargs={"b": 11}, result=20) 69 | ) 70 | 71 | new_pickle_backend = PickleBackend(temp.name) 72 | assert new_pickle_backend.get_result("function", 3, b=4) == 7 73 | assert new_pickle_backend.get_result("function", 9, b=11) == 20 74 | 75 | def test_pickle_backend_no_value(self): 76 | with tempfile.NamedTemporaryFile() as temp: 77 | pickle_backend = PickleBackend(temp.name) 78 | with pytest.raises(RecordNotFound): 79 | assert pickle_backend.get_result("function", 3, b=4) == 7 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Tests](https://github.com/agusdmb/autofake/actions/workflows/tests.yml/badge.svg) 2 | 3 | # AutoFake 4 | 5 | ## A Python Library for Mocking Functions in Testing 6 | 7 | AutoFake is a Python library that makes it easy to mock functions in your 8 | tests. It allows you to run your code normally and records the calls and 9 | returns of specified functions. The results are then stored in a backend. 10 | During testing, you can reproduce the results of these functions instead of 11 | executing their actual implementation, which is useful for isolating the code 12 | you are testing and avoiding external dependencies, side effects, and 13 | long-running functions. AutoFake is also well-suited for adding tests to 14 | legacy code and refactoring (it works well with 15 | [ApprovalTesting](https://approvaltests.com/)) 16 | 17 | ## Getting Started 18 | 19 | ### Installation 20 | 21 | To install AutoFake, simply run: 22 | 23 | ```bash 24 | pip install autofake 25 | ``` 26 | 27 | ### Usage 28 | 29 | Here's an example of how to use AutoFake: 30 | 31 | 32 | ```python 33 | # example.py 34 | 35 | import smtplib 36 | import time 37 | 38 | import requests 39 | 40 | from autofake import FakeIt, PickleBackend 41 | 42 | fakeit = FakeIt(backend=PickleBackend("output.pickle")) 43 | 44 | 45 | # Mocking external services 46 | @fakeit 47 | def get_data(payload): 48 | return requests.get("https://www.example.com/data", params=payload).json() 49 | 50 | 51 | # Avoiding side effects 52 | @fakeit 53 | def send_email(to, subject, message): 54 | server = smtplib.SMTP("smtp.gmail.com", 587) 55 | server.ehlo() 56 | server.starttls() 57 | server.ehlo() 58 | server.login("email@example.com", "password") 59 | message = f"Subject: {subject}\n\n{message}" 60 | server.sendmail("email@example.com", to, message) 61 | server.quit() 62 | 63 | 64 | # As a cache for long running functions 65 | @fakeit 66 | def long_running_process(duration, n): 67 | time.sleep(duration) 68 | return n 69 | 70 | ``` 71 | 72 | To record the function calls, parameters, and results, run: 73 | 74 | ```bash 75 | AUTOFAKE=RECORD python example.py 76 | ``` 77 | 78 | This will run the functions normally and store the results in the 79 | `output.pickle` file. 80 | 81 | To fake the functions, run: 82 | 83 | ```bash 84 | AUTOFAKE=FAKE python example.py 85 | ``` 86 | 87 | This time, the decorated functions will not be executed but their return values 88 | (if any) will be retrieved from the backend. 89 | 90 | ## The FakeIt Object 91 | 92 | The `FakeIt` class is the main class in AutoFake and can be initialized with a 93 | mode and a backend. 94 | 95 | ### Modes 96 | 97 | You can run your code in three modes: 98 | 99 | - `PRODUCTION` mode: the function will be executed normally without any action 100 | (this is the default behavior). 101 | 102 | - `RECORD` mode: the function will be executed normally and the call, 103 | arguments, and result will be recorded in the backend. 104 | 105 | - `FAKE` mode: the function will not be executed, and its recorded result will 106 | be retrieved from the backend for the given arguments. 107 | 108 | You can either set the mode when instantiating the FakeIt class by passing the 109 | argument mode, or by setting an environment variable `AUTOFAKE` to one of 110 | `PRODUCTION`, `RECORD` or `FAKE`. 111 | 112 | ### Backends 113 | 114 | The backend determines where the calls, parameters and returns values are 115 | stored. Different backends are provided such as `PickleBackend` and 116 | `JSONBackend`. Pass the backend as an argument to the FakeIt Initialization. 117 | 118 | ### Decorating functions 119 | 120 | To use FakeIt, you have to wrap the functions you want to fake with a FakeIt 121 | decorator. This decorator accepts a name, which is used to store the results of 122 | the function call with the given name. 123 | 124 | ## Contributing 125 | 126 | To contribute to AutoFake, simply fork the repository and create a pull request 127 | with your changes. 128 | 129 | ## License 130 | 131 | AutoFake is licensed under the MIT License. See the LICENSE file for more 132 | information. 133 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "astroid" 3 | version = "2.13.3" 4 | description = "An abstract syntax tree for Python with inference support." 5 | category = "dev" 6 | optional = false 7 | python-versions = ">=3.7.2" 8 | 9 | [package.dependencies] 10 | lazy-object-proxy = ">=1.4.0" 11 | typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} 12 | typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} 13 | wrapt = [ 14 | {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, 15 | {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, 16 | ] 17 | 18 | [[package]] 19 | name = "attrs" 20 | version = "22.2.0" 21 | description = "Classes Without Boilerplate" 22 | category = "dev" 23 | optional = false 24 | python-versions = ">=3.6" 25 | 26 | [package.extras] 27 | cov = ["attrs", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] 28 | dev = ["attrs"] 29 | docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] 30 | tests = ["attrs", "zope.interface"] 31 | tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=0.971,<0.990)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist"] 32 | tests_no_zope = ["cloudpickle", "hypothesis", "mypy (>=0.971,<0.990)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist"] 33 | 34 | [[package]] 35 | name = "bandit" 36 | version = "1.7.4" 37 | description = "Security oriented static analyser for python code." 38 | category = "dev" 39 | optional = false 40 | python-versions = ">=3.7" 41 | 42 | [package.dependencies] 43 | colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} 44 | GitPython = ">=1.0.1" 45 | PyYAML = ">=5.3.1" 46 | stevedore = ">=1.20.0" 47 | 48 | [package.extras] 49 | test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "toml"] 50 | toml = ["toml"] 51 | yaml = ["pyyaml"] 52 | 53 | [[package]] 54 | name = "black" 55 | version = "22.12.0" 56 | description = "The uncompromising code formatter." 57 | category = "dev" 58 | optional = false 59 | python-versions = ">=3.7" 60 | 61 | [package.dependencies] 62 | click = ">=8.0.0" 63 | mypy-extensions = ">=0.4.3" 64 | pathspec = ">=0.9.0" 65 | platformdirs = ">=2" 66 | tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} 67 | typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} 68 | typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} 69 | 70 | [package.extras] 71 | colorama = ["colorama (>=0.4.3)"] 72 | d = ["aiohttp (>=3.7.4)"] 73 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 74 | uvloop = ["uvloop (>=0.15.2)"] 75 | 76 | [[package]] 77 | name = "click" 78 | version = "8.1.3" 79 | description = "Composable command line interface toolkit" 80 | category = "dev" 81 | optional = false 82 | python-versions = ">=3.7" 83 | 84 | [package.dependencies] 85 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 86 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 87 | 88 | [[package]] 89 | name = "colorama" 90 | version = "0.4.6" 91 | description = "Cross-platform colored terminal text." 92 | category = "dev" 93 | optional = false 94 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 95 | 96 | [[package]] 97 | name = "coverage" 98 | version = "7.1.0" 99 | description = "Code coverage measurement for Python" 100 | category = "dev" 101 | optional = false 102 | python-versions = ">=3.7" 103 | 104 | [package.extras] 105 | toml = ["tomli"] 106 | 107 | [[package]] 108 | name = "dill" 109 | version = "0.3.6" 110 | description = "serialize all of python" 111 | category = "dev" 112 | optional = false 113 | python-versions = ">=3.7" 114 | 115 | [package.extras] 116 | graph = ["objgraph (>=1.7.2)"] 117 | 118 | [[package]] 119 | name = "exceptiongroup" 120 | version = "1.1.0" 121 | description = "Backport of PEP 654 (exception groups)" 122 | category = "dev" 123 | optional = false 124 | python-versions = ">=3.7" 125 | 126 | [package.extras] 127 | test = ["pytest (>=6)"] 128 | 129 | [[package]] 130 | name = "gitdb" 131 | version = "4.0.10" 132 | description = "Git Object Database" 133 | category = "dev" 134 | optional = false 135 | python-versions = ">=3.7" 136 | 137 | [package.dependencies] 138 | smmap = ">=3.0.1,<6" 139 | 140 | [[package]] 141 | name = "gitpython" 142 | version = "3.1.30" 143 | description = "GitPython is a python library used to interact with Git repositories" 144 | category = "dev" 145 | optional = false 146 | python-versions = ">=3.7" 147 | 148 | [package.dependencies] 149 | gitdb = ">=4.0.1,<5" 150 | typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""} 151 | 152 | [[package]] 153 | name = "importlib-metadata" 154 | version = "6.0.0" 155 | description = "Read metadata from Python packages" 156 | category = "dev" 157 | optional = false 158 | python-versions = ">=3.7" 159 | 160 | [package.dependencies] 161 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 162 | zipp = ">=0.5" 163 | 164 | [package.extras] 165 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 166 | perf = ["ipython"] 167 | 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)"] 168 | 169 | [[package]] 170 | name = "iniconfig" 171 | version = "2.0.0" 172 | description = "brain-dead simple config-ini parsing" 173 | category = "dev" 174 | optional = false 175 | python-versions = ">=3.7" 176 | 177 | [[package]] 178 | name = "isort" 179 | version = "5.11.4" 180 | description = "A Python utility / library to sort Python imports." 181 | category = "dev" 182 | optional = false 183 | python-versions = ">=3.7.0" 184 | 185 | [package.extras] 186 | colors = ["colorama (>=0.4.3,<0.5.0)"] 187 | pipfile-deprecated-finder = ["pipreqs", "requirementslib"] 188 | plugins = ["setuptools"] 189 | requirements-deprecated-finder = ["pip-api", "pipreqs"] 190 | 191 | [[package]] 192 | name = "lazy-object-proxy" 193 | version = "1.9.0" 194 | description = "A fast and thorough lazy object proxy." 195 | category = "dev" 196 | optional = false 197 | python-versions = ">=3.7" 198 | 199 | [[package]] 200 | name = "mccabe" 201 | version = "0.7.0" 202 | description = "McCabe checker, plugin for flake8" 203 | category = "dev" 204 | optional = false 205 | python-versions = ">=3.6" 206 | 207 | [[package]] 208 | name = "mypy" 209 | version = "0.991" 210 | description = "Optional static typing for Python" 211 | category = "dev" 212 | optional = false 213 | python-versions = ">=3.7" 214 | 215 | [package.dependencies] 216 | mypy-extensions = ">=0.4.3" 217 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 218 | typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} 219 | typing-extensions = ">=3.10" 220 | 221 | [package.extras] 222 | dmypy = ["psutil (>=4.0)"] 223 | install-types = ["pip"] 224 | python2 = ["typed-ast (>=1.4.0,<2)"] 225 | reports = ["lxml"] 226 | 227 | [[package]] 228 | name = "mypy-extensions" 229 | version = "0.4.3" 230 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 231 | category = "dev" 232 | optional = false 233 | python-versions = "*" 234 | 235 | [[package]] 236 | name = "packaging" 237 | version = "21.3" 238 | description = "Core utilities for Python packages" 239 | category = "dev" 240 | optional = false 241 | python-versions = ">=3.6" 242 | 243 | [package.dependencies] 244 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 245 | 246 | [[package]] 247 | name = "pathspec" 248 | version = "0.11.0" 249 | description = "Utility library for gitignore style pattern matching of file paths." 250 | category = "dev" 251 | optional = false 252 | python-versions = ">=3.7" 253 | 254 | [[package]] 255 | name = "pbr" 256 | version = "5.11.1" 257 | description = "Python Build Reasonableness" 258 | category = "dev" 259 | optional = false 260 | python-versions = ">=2.6" 261 | 262 | [[package]] 263 | name = "platformdirs" 264 | version = "2.6.2" 265 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 266 | category = "dev" 267 | optional = false 268 | python-versions = ">=3.7" 269 | 270 | [package.dependencies] 271 | typing-extensions = {version = ">=4.4", markers = "python_version < \"3.8\""} 272 | 273 | [package.extras] 274 | docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] 275 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] 276 | 277 | [[package]] 278 | name = "pluggy" 279 | version = "1.0.0" 280 | description = "plugin and hook calling mechanisms for python" 281 | category = "dev" 282 | optional = false 283 | python-versions = ">=3.6" 284 | 285 | [package.dependencies] 286 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 287 | 288 | [package.extras] 289 | dev = ["pre-commit", "tox"] 290 | testing = ["pytest", "pytest-benchmark"] 291 | 292 | [[package]] 293 | name = "pylint" 294 | version = "2.15.10" 295 | description = "python code static checker" 296 | category = "dev" 297 | optional = false 298 | python-versions = ">=3.7.2" 299 | 300 | [package.dependencies] 301 | astroid = ">=2.12.13,<=2.14.0-dev0" 302 | colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} 303 | dill = [ 304 | {version = ">=0.2", markers = "python_version < \"3.11\""}, 305 | {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, 306 | ] 307 | isort = ">=4.2.5,<6" 308 | mccabe = ">=0.6,<0.8" 309 | platformdirs = ">=2.2.0" 310 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 311 | tomlkit = ">=0.10.1" 312 | typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} 313 | 314 | [package.extras] 315 | spelling = ["pyenchant (>=3.2,<4.0)"] 316 | testutils = ["gitpython (>3)"] 317 | 318 | [[package]] 319 | name = "pyparsing" 320 | version = "3.0.9" 321 | description = "pyparsing module - Classes and methods to define and execute parsing grammars" 322 | category = "dev" 323 | optional = false 324 | python-versions = ">=3.6.8" 325 | 326 | [package.extras] 327 | diagrams = ["jinja2", "railroad-diagrams"] 328 | 329 | [[package]] 330 | name = "pytest" 331 | version = "7.2.1" 332 | description = "pytest: simple powerful testing with Python" 333 | category = "dev" 334 | optional = false 335 | python-versions = ">=3.7" 336 | 337 | [package.dependencies] 338 | attrs = ">=19.2.0" 339 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 340 | exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} 341 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 342 | iniconfig = "*" 343 | packaging = "*" 344 | pluggy = ">=0.12,<2.0" 345 | tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} 346 | 347 | [package.extras] 348 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] 349 | 350 | [[package]] 351 | name = "pyyaml" 352 | version = "6.0" 353 | description = "YAML parser and emitter for Python" 354 | category = "dev" 355 | optional = false 356 | python-versions = ">=3.6" 357 | 358 | [[package]] 359 | name = "smmap" 360 | version = "5.0.0" 361 | description = "A pure Python implementation of a sliding window memory map manager" 362 | category = "dev" 363 | optional = false 364 | python-versions = ">=3.6" 365 | 366 | [[package]] 367 | name = "stevedore" 368 | version = "4.1.1" 369 | description = "Manage dynamic plugins for Python applications" 370 | category = "dev" 371 | optional = false 372 | python-versions = ">=3.8" 373 | 374 | [package.dependencies] 375 | pbr = ">=2.0.0,<2.1.0 || >2.1.0" 376 | 377 | [[package]] 378 | name = "tomli" 379 | version = "2.0.1" 380 | description = "A lil' TOML parser" 381 | category = "dev" 382 | optional = false 383 | python-versions = ">=3.7" 384 | 385 | [[package]] 386 | name = "tomlkit" 387 | version = "0.11.6" 388 | description = "Style preserving TOML library" 389 | category = "dev" 390 | optional = false 391 | python-versions = ">=3.6" 392 | 393 | [[package]] 394 | name = "typed-ast" 395 | version = "1.5.4" 396 | description = "a fork of Python 2 and 3 ast modules with type comment support" 397 | category = "dev" 398 | optional = false 399 | python-versions = ">=3.6" 400 | 401 | [[package]] 402 | name = "typing-extensions" 403 | version = "4.4.0" 404 | description = "Backported and Experimental Type Hints for Python 3.7+" 405 | category = "dev" 406 | optional = false 407 | python-versions = ">=3.7" 408 | 409 | [[package]] 410 | name = "wrapt" 411 | version = "1.14.1" 412 | description = "Module for decorators, wrappers and monkey patching." 413 | category = "dev" 414 | optional = false 415 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 416 | 417 | [[package]] 418 | name = "zipp" 419 | version = "3.12.0" 420 | description = "Backport of pathlib-compatible object wrapper for zip files" 421 | category = "dev" 422 | optional = false 423 | python-versions = ">=3.7" 424 | 425 | [package.extras] 426 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 427 | testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 428 | 429 | [metadata] 430 | lock-version = "1.1" 431 | python-versions = "^3.7" 432 | content-hash = "38f0c0f0d7198d29305624a086c5621a60308e440b9ee5c12a32a283a2573754" 433 | 434 | [metadata.files] 435 | astroid = [ 436 | {file = "astroid-2.13.3-py3-none-any.whl", hash = "sha256:14c1603c41cc61aae731cad1884a073c4645e26f126d13ac8346113c95577f3b"}, 437 | {file = "astroid-2.13.3.tar.gz", hash = "sha256:6afc22718a48a689ca24a97981ad377ba7fb78c133f40335dfd16772f29bcfb1"}, 438 | ] 439 | attrs = [ 440 | {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, 441 | {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, 442 | ] 443 | bandit = [ 444 | {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, 445 | {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, 446 | ] 447 | black = [ 448 | {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, 449 | {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, 450 | {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, 451 | {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, 452 | {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, 453 | {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, 454 | {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, 455 | {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, 456 | {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, 457 | {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, 458 | {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, 459 | {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, 460 | ] 461 | click = [ 462 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 463 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 464 | ] 465 | colorama = [ 466 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 467 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 468 | ] 469 | coverage = [ 470 | {file = "coverage-7.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b946bbcd5a8231383450b195cfb58cb01cbe7f8949f5758566b881df4b33baf"}, 471 | {file = "coverage-7.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec8e767f13be637d056f7e07e61d089e555f719b387a7070154ad80a0ff31801"}, 472 | {file = "coverage-7.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a5a5879a939cb84959d86869132b00176197ca561c664fc21478c1eee60d75"}, 473 | {file = "coverage-7.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b643cb30821e7570c0aaf54feaf0bfb630b79059f85741843e9dc23f33aaca2c"}, 474 | {file = "coverage-7.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32df215215f3af2c1617a55dbdfb403b772d463d54d219985ac7cd3bf124cada"}, 475 | {file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:33d1ae9d4079e05ac4cc1ef9e20c648f5afabf1a92adfaf2ccf509c50b85717f"}, 476 | {file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:29571503c37f2ef2138a306d23e7270687c0efb9cab4bd8038d609b5c2393a3a"}, 477 | {file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:63ffd21aa133ff48c4dff7adcc46b7ec8b565491bfc371212122dd999812ea1c"}, 478 | {file = "coverage-7.1.0-cp310-cp310-win32.whl", hash = "sha256:4b14d5e09c656de5038a3f9bfe5228f53439282abcab87317c9f7f1acb280352"}, 479 | {file = "coverage-7.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:8361be1c2c073919500b6601220a6f2f98ea0b6d2fec5014c1d9cfa23dd07038"}, 480 | {file = "coverage-7.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:da9b41d4539eefd408c46725fb76ecba3a50a3367cafb7dea5f250d0653c1040"}, 481 | {file = "coverage-7.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5b15ed7644ae4bee0ecf74fee95808dcc34ba6ace87e8dfbf5cb0dc20eab45a"}, 482 | {file = "coverage-7.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d12d076582507ea460ea2a89a8c85cb558f83406c8a41dd641d7be9a32e1274f"}, 483 | {file = "coverage-7.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2617759031dae1bf183c16cef8fcfb3de7617f394c813fa5e8e46e9b82d4222"}, 484 | {file = "coverage-7.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4e4881fa9e9667afcc742f0c244d9364d197490fbc91d12ac3b5de0bf2df146"}, 485 | {file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9d58885215094ab4a86a6aef044e42994a2bd76a446dc59b352622655ba6621b"}, 486 | {file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ffeeb38ee4a80a30a6877c5c4c359e5498eec095878f1581453202bfacc8fbc2"}, 487 | {file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3baf5f126f30781b5e93dbefcc8271cb2491647f8283f20ac54d12161dff080e"}, 488 | {file = "coverage-7.1.0-cp311-cp311-win32.whl", hash = "sha256:ded59300d6330be27bc6cf0b74b89ada58069ced87c48eaf9344e5e84b0072f7"}, 489 | {file = "coverage-7.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:6a43c7823cd7427b4ed763aa7fb63901ca8288591323b58c9cd6ec31ad910f3c"}, 490 | {file = "coverage-7.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a726d742816cb3a8973c8c9a97539c734b3a309345236cd533c4883dda05b8d"}, 491 | {file = "coverage-7.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc7c85a150501286f8b56bd8ed3aa4093f4b88fb68c0843d21ff9656f0009d6a"}, 492 | {file = "coverage-7.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5b4198d85a3755d27e64c52f8c95d6333119e49fd001ae5798dac872c95e0f8"}, 493 | {file = "coverage-7.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb726cb861c3117a553f940372a495fe1078249ff5f8a5478c0576c7be12050"}, 494 | {file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:51b236e764840a6df0661b67e50697aaa0e7d4124ca95e5058fa3d7cbc240b7c"}, 495 | {file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7ee5c9bb51695f80878faaa5598040dd6c9e172ddcf490382e8aedb8ec3fec8d"}, 496 | {file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c31b75ae466c053a98bf26843563b3b3517b8f37da4d47b1c582fdc703112bc3"}, 497 | {file = "coverage-7.1.0-cp37-cp37m-win32.whl", hash = "sha256:3b155caf3760408d1cb903b21e6a97ad4e2bdad43cbc265e3ce0afb8e0057e73"}, 498 | {file = "coverage-7.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2a60d6513781e87047c3e630b33b4d1e89f39836dac6e069ffee28c4786715f5"}, 499 | {file = "coverage-7.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2cba5c6db29ce991029b5e4ac51eb36774458f0a3b8d3137241b32d1bb91f06"}, 500 | {file = "coverage-7.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beeb129cacea34490ffd4d6153af70509aa3cda20fdda2ea1a2be870dfec8d52"}, 501 | {file = "coverage-7.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c45948f613d5d18c9ec5eaa203ce06a653334cf1bd47c783a12d0dd4fd9c851"}, 502 | {file = "coverage-7.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef382417db92ba23dfb5864a3fc9be27ea4894e86620d342a116b243ade5d35d"}, 503 | {file = "coverage-7.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c7c0d0827e853315c9bbd43c1162c006dd808dbbe297db7ae66cd17b07830f0"}, 504 | {file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e5cdbb5cafcedea04924568d990e20ce7f1945a1dd54b560f879ee2d57226912"}, 505 | {file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9817733f0d3ea91bea80de0f79ef971ae94f81ca52f9b66500c6a2fea8e4b4f8"}, 506 | {file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:218fe982371ac7387304153ecd51205f14e9d731b34fb0568181abaf7b443ba0"}, 507 | {file = "coverage-7.1.0-cp38-cp38-win32.whl", hash = "sha256:04481245ef966fbd24ae9b9e537ce899ae584d521dfbe78f89cad003c38ca2ab"}, 508 | {file = "coverage-7.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8ae125d1134bf236acba8b83e74c603d1b30e207266121e76484562bc816344c"}, 509 | {file = "coverage-7.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2bf1d5f2084c3932b56b962a683074a3692bce7cabd3aa023c987a2a8e7612f6"}, 510 | {file = "coverage-7.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:98b85dd86514d889a2e3dd22ab3c18c9d0019e696478391d86708b805f4ea0fa"}, 511 | {file = "coverage-7.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38da2db80cc505a611938d8624801158e409928b136c8916cd2e203970dde4dc"}, 512 | {file = "coverage-7.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3164d31078fa9efe406e198aecd2a02d32a62fecbdef74f76dad6a46c7e48311"}, 513 | {file = "coverage-7.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db61a79c07331e88b9a9974815c075fbd812bc9dbc4dc44b366b5368a2936063"}, 514 | {file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ccb092c9ede70b2517a57382a601619d20981f56f440eae7e4d7eaafd1d1d09"}, 515 | {file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:33ff26d0f6cc3ca8de13d14fde1ff8efe1456b53e3f0273e63cc8b3c84a063d8"}, 516 | {file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d47dd659a4ee952e90dc56c97d78132573dc5c7b09d61b416a9deef4ebe01a0c"}, 517 | {file = "coverage-7.1.0-cp39-cp39-win32.whl", hash = "sha256:d248cd4a92065a4d4543b8331660121b31c4148dd00a691bfb7a5cdc7483cfa4"}, 518 | {file = "coverage-7.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7ed681b0f8e8bcbbffa58ba26fcf5dbc8f79e7997595bf071ed5430d8c08d6f3"}, 519 | {file = "coverage-7.1.0-pp37.pp38.pp39-none-any.whl", hash = "sha256:755e89e32376c850f826c425ece2c35a4fc266c081490eb0a841e7c1cb0d3bda"}, 520 | {file = "coverage-7.1.0.tar.gz", hash = "sha256:10188fe543560ec4874f974b5305cd1a8bdcfa885ee00ea3a03733464c4ca265"}, 521 | ] 522 | dill = [ 523 | {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, 524 | {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, 525 | ] 526 | exceptiongroup = [ 527 | {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, 528 | {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, 529 | ] 530 | gitdb = [ 531 | {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, 532 | {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, 533 | ] 534 | gitpython = [ 535 | {file = "GitPython-3.1.30-py3-none-any.whl", hash = "sha256:cd455b0000615c60e286208ba540271af9fe531fa6a87cc590a7298785ab2882"}, 536 | {file = "GitPython-3.1.30.tar.gz", hash = "sha256:769c2d83e13f5d938b7688479da374c4e3d49f71549aaf462b646db9602ea6f8"}, 537 | ] 538 | importlib-metadata = [ 539 | {file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"}, 540 | {file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"}, 541 | ] 542 | iniconfig = [ 543 | {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, 544 | {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, 545 | ] 546 | isort = [ 547 | {file = "isort-5.11.4-py3-none-any.whl", hash = "sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b"}, 548 | {file = "isort-5.11.4.tar.gz", hash = "sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6"}, 549 | ] 550 | lazy-object-proxy = [ 551 | {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, 552 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, 553 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, 554 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, 555 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, 556 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, 557 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, 558 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, 559 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, 560 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, 561 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, 562 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, 563 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, 564 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, 565 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, 566 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, 567 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, 568 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, 569 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, 570 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, 571 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, 572 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, 573 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, 574 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, 575 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, 576 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, 577 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, 578 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, 579 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, 580 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, 581 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, 582 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, 583 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, 584 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, 585 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, 586 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, 587 | ] 588 | mccabe = [ 589 | {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, 590 | {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, 591 | ] 592 | mypy = [ 593 | {file = "mypy-0.991-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab"}, 594 | {file = "mypy-0.991-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d"}, 595 | {file = "mypy-0.991-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6"}, 596 | {file = "mypy-0.991-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb"}, 597 | {file = "mypy-0.991-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305"}, 598 | {file = "mypy-0.991-cp310-cp310-win_amd64.whl", hash = "sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c"}, 599 | {file = "mypy-0.991-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372"}, 600 | {file = "mypy-0.991-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f"}, 601 | {file = "mypy-0.991-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33"}, 602 | {file = "mypy-0.991-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05"}, 603 | {file = "mypy-0.991-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad"}, 604 | {file = "mypy-0.991-cp311-cp311-win_amd64.whl", hash = "sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297"}, 605 | {file = "mypy-0.991-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813"}, 606 | {file = "mypy-0.991-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711"}, 607 | {file = "mypy-0.991-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd"}, 608 | {file = "mypy-0.991-cp37-cp37m-win_amd64.whl", hash = "sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef"}, 609 | {file = "mypy-0.991-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a"}, 610 | {file = "mypy-0.991-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93"}, 611 | {file = "mypy-0.991-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf"}, 612 | {file = "mypy-0.991-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135"}, 613 | {file = "mypy-0.991-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70"}, 614 | {file = "mypy-0.991-cp38-cp38-win_amd64.whl", hash = "sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243"}, 615 | {file = "mypy-0.991-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d"}, 616 | {file = "mypy-0.991-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5"}, 617 | {file = "mypy-0.991-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3"}, 618 | {file = "mypy-0.991-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648"}, 619 | {file = "mypy-0.991-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476"}, 620 | {file = "mypy-0.991-cp39-cp39-win_amd64.whl", hash = "sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461"}, 621 | {file = "mypy-0.991-py3-none-any.whl", hash = "sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb"}, 622 | {file = "mypy-0.991.tar.gz", hash = "sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06"}, 623 | ] 624 | mypy-extensions = [ 625 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 626 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 627 | ] 628 | packaging = [ 629 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 630 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 631 | ] 632 | pathspec = [ 633 | {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, 634 | {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, 635 | ] 636 | pbr = [ 637 | {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, 638 | {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, 639 | ] 640 | platformdirs = [ 641 | {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, 642 | {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, 643 | ] 644 | pluggy = [ 645 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, 646 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, 647 | ] 648 | pylint = [ 649 | {file = "pylint-2.15.10-py3-none-any.whl", hash = "sha256:9df0d07e8948a1c3ffa3b6e2d7e6e63d9fb457c5da5b961ed63106594780cc7e"}, 650 | {file = "pylint-2.15.10.tar.gz", hash = "sha256:b3dc5ef7d33858f297ac0d06cc73862f01e4f2e74025ec3eff347ce0bc60baf5"}, 651 | ] 652 | pyparsing = [ 653 | {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, 654 | {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, 655 | ] 656 | pytest = [ 657 | {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, 658 | {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, 659 | ] 660 | pyyaml = [ 661 | {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, 662 | {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, 663 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, 664 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, 665 | {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"}, 666 | {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, 667 | {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, 668 | {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, 669 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, 670 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, 671 | {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"}, 672 | {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, 673 | {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, 674 | {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, 675 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, 676 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, 677 | {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"}, 678 | {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, 679 | {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, 680 | {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, 681 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, 682 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, 683 | {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"}, 684 | {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, 685 | {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, 686 | {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, 687 | {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, 688 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, 689 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, 690 | {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"}, 691 | {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, 692 | {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, 693 | {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, 694 | ] 695 | smmap = [ 696 | {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, 697 | {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, 698 | ] 699 | stevedore = [ 700 | {file = "stevedore-4.1.1-py3-none-any.whl", hash = "sha256:aa6436565c069b2946fe4ebff07f5041e0c8bf18c7376dd29edf80cf7d524e4e"}, 701 | {file = "stevedore-4.1.1.tar.gz", hash = "sha256:7f8aeb6e3f90f96832c301bff21a7eb5eefbe894c88c506483d355565d88cc1a"}, 702 | ] 703 | tomli = [ 704 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 705 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 706 | ] 707 | tomlkit = [ 708 | {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, 709 | {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, 710 | ] 711 | typed-ast = [ 712 | {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, 713 | {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, 714 | {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, 715 | {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, 716 | {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, 717 | {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, 718 | {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, 719 | {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, 720 | {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, 721 | {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, 722 | {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, 723 | {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, 724 | {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, 725 | {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, 726 | {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, 727 | {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, 728 | {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, 729 | {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, 730 | {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, 731 | {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, 732 | {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, 733 | {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, 734 | {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, 735 | {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, 736 | ] 737 | typing-extensions = [ 738 | {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, 739 | {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, 740 | ] 741 | wrapt = [ 742 | {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, 743 | {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, 744 | {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, 745 | {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, 746 | {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, 747 | {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, 748 | {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, 749 | {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, 750 | {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, 751 | {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, 752 | {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, 753 | {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, 754 | {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, 755 | {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, 756 | {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, 757 | {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, 758 | {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, 759 | {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, 760 | {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, 761 | {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, 762 | {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, 763 | {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, 764 | {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, 765 | {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, 766 | {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, 767 | {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, 768 | {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, 769 | {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, 770 | {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, 771 | {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, 772 | {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, 773 | {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, 774 | {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, 775 | {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, 776 | {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, 777 | {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, 778 | {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, 779 | {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, 780 | {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, 781 | {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, 782 | {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, 783 | {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, 784 | {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, 785 | {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, 786 | {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, 787 | {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, 788 | {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, 789 | {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, 790 | {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, 791 | {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, 792 | {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, 793 | {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, 794 | {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, 795 | {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, 796 | {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, 797 | {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, 798 | {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, 799 | {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, 800 | {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, 801 | {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, 802 | {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, 803 | {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, 804 | {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, 805 | {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, 806 | ] 807 | zipp = [ 808 | {file = "zipp-3.12.0-py3-none-any.whl", hash = "sha256:9eb0a4c5feab9b08871db0d672745b53450d7f26992fd1e4653aa43345e97b86"}, 809 | {file = "zipp-3.12.0.tar.gz", hash = "sha256:73efd63936398aac78fd92b6f4865190119d6c91b531532e798977ea8dd402eb"}, 810 | ] 811 | --------------------------------------------------------------------------------