From cb962bf098ce97f1750f4e12d8078934d621d695 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Thu, 28 Apr 2022 05:05:05 +0200 Subject: [PATCH] :tada: idk first commit --- .idea/inspectionProfiles/Project_Default.xml | 19 + .idea/misc.xml | 2 +- .idea/modules.xml | 2 +- PACKAGE_NAME/__init__.py | 5 - PACKAGE_NAME/__main__.py | 8 - README.md | 6 +- docs/source/cli.rst | 75 ++ docs/source/conf.py | 8 +- docs/source/index.rst | 14 +- docs/source/io-dota.webp | Bin 0 -> 6736 bytes docs/source/reference.rst | 21 + docs/source/tokens.png | Bin 0 -> 15970 bytes docs/source/trivia.rst | 7 + template-poetry.iml => io-beep-boop.iml | 3 +- io_beep_boop/__init__.py | 2 + io_beep_boop/api/__init__.py | 6 + io_beep_boop/api/client.py | 132 +++ io_beep_boop/api/models.py | 92 ++ io_beep_boop/cli/__main__.py | 179 ++++ .../tests/conftest.py | 0 .../tests/test_something.py | 0 poetry.lock | 896 ++++++++++++++++++ pyproject.toml | 20 +- 23 files changed, 1461 insertions(+), 36 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 PACKAGE_NAME/__init__.py delete mode 100644 PACKAGE_NAME/__main__.py create mode 100644 docs/source/cli.rst create mode 100644 docs/source/io-dota.webp create mode 100644 docs/source/reference.rst create mode 100644 docs/source/tokens.png create mode 100644 docs/source/trivia.rst rename template-poetry.iml => io-beep-boop.iml (88%) create mode 100644 io_beep_boop/__init__.py create mode 100644 io_beep_boop/api/__init__.py create mode 100644 io_beep_boop/api/client.py create mode 100644 io_beep_boop/api/models.py create mode 100644 io_beep_boop/cli/__main__.py rename {PACKAGE_NAME => io_beep_boop}/tests/conftest.py (100%) rename {PACKAGE_NAME => io_beep_boop}/tests/test_something.py (100%) create mode 100644 poetry.lock diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..e06a3ae --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,19 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 7fc1dbf..b2e30fd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,7 +3,7 @@ IDE - + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 489225d..5aaa0da 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/PACKAGE_NAME/__init__.py b/PACKAGE_NAME/__init__.py deleted file mode 100644 index 8c571c4..0000000 --- a/PACKAGE_NAME/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# If you are building a **library**, use this file to export objects! - -__all__ = ( - # "", -) diff --git a/PACKAGE_NAME/__main__.py b/PACKAGE_NAME/__main__.py deleted file mode 100644 index a015126..0000000 --- a/PACKAGE_NAME/__main__.py +++ /dev/null @@ -1,8 +0,0 @@ -# If you are building an **application**, use this file to run code! - -def main(): - pass - - -if __name__ == "__main__": - main() diff --git a/README.md b/README.md index 5975e2d..5f51dca 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ -# `PACKAGE_NAME` +# `io-beep-boop` You should probably update this description to reflect your project :) ## Installation ```console -$ pip install PACKAGE_NAME +$ pip install io-beep-boop ``` ## Usage ```console -$ PACKAGE-NAME +$ io-beep-boop ``` ## Development diff --git a/docs/source/cli.rst b/docs/source/cli.rst new file mode 100644 index 0000000..9f4b363 --- /dev/null +++ b/docs/source/cli.rst @@ -0,0 +1,75 @@ +###################### +Command-line interface +###################### + +:mod:`io_beep_boop` includes a command line interface to (hopefully) facilitate the execution of certain tasks with the IO API. + +The interface can be invoked by entering the following in environments where the package is installed: + +.. code-block:: console + + $ io-beep-boop + +All commands can be suffixed with ``--help`` to read their documentation: + +.. code-block:: console + + $ io-beep-boop --help + Usage: io-beep-boop [OPTIONS] COMMAND [ARGS]... + + Options: + -t, --token TEXT One of the two IO App API tokens of the service you want + to use. + --base-url TEXT The base URL of the IO App API to use. + --help Show this message and exit. + + Commands: + registered-fast + registered-slow + +All tasks require a valid API key obtained from the `IO Developer website `_: + +.. figure:: tokens.png + + Example key in the IO Developer website. + +API keys can be passed programmatically as the ``--token`` parameter, or manually when prompted by the CLI: + +.. code-block:: console + + $ io-beep-boop --token="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + +.. code-block:: console + + $ io-beep-boop + Token: + + +Discover who is registered to a given service +============================================= + +Given a text file containing a list of fiscal codes separated by newlines, :mod:`io_beep_boop` can find which ones are registered to a certain IO service. + + +Using the fast method +--------------------- + +.. todo:: + + Description of the fast method. + +.. code-block:: console + + $ io-beep-boop registered-fast + + +Using the slow method +--------------------- + +.. todo:: + + Description of the fast method. + +.. code-block:: console + + $ io-beep-boop registered-slow diff --git a/docs/source/conf.py b/docs/source/conf.py index 0715cee..9d0d0da 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -15,9 +15,9 @@ import datetime # Alter these to reflect the nature of your project! # Project name -project = 'PROJECT NAME' +project = 'Io Beep Boop' # Project author -author = 'Your Name' +author = 'Stefano Pigozzi' # Project copyright project_copyright = f'{datetime.date.today().year}, {author}' @@ -27,14 +27,14 @@ language = "en" # Configuration for the theme html_theme_options = { # Set this to the main color of your project - "style_nav_header_background": "#FF7F00", + # "style_nav_header_background": "#FF7F00", } html_context = { "display_github": True, # Set this to the name of the organization this GitHub repository is in "github_user": "Steffo99", # Set this to the name of this repository - "github_repo": "template-poetry", + "github_repo": "io-beep-boop", # Set this to the name of the main branch slash docs slash "github_version": "main/docs/", } diff --git a/docs/source/index.rst b/docs/source/index.rst index 438a0cc..ec05101 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,11 +1,15 @@ -.. Write your documentation in this file! +############ +Io Beep Boop +############ + +An experimental wrapper and command line interface for the Italian `IO App API `_. -Welcome to PROJECT_NAME's documentation! -======================================== .. toctree:: - :maxdepth: 2 - :caption: Contents + + cli + reference + trivia Indices and tables diff --git a/docs/source/io-dota.webp b/docs/source/io-dota.webp new file mode 100644 index 0000000000000000000000000000000000000000..85f2ac6915dc79819ae28a3e7eb6696f3d059039 GIT binary patch literal 6736 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 literal 0 HcmV?d00001 diff --git a/docs/source/reference.rst b/docs/source/reference.rst new file mode 100644 index 0000000..7e4dadb --- /dev/null +++ b/docs/source/reference.rst @@ -0,0 +1,21 @@ +############# +API Reference +############# + + +:mod:`io_beep_boop.api` +======================= + +.. automodule:: io_beep_boop.api + + +:mod:`io_beep_boop.api.client` +------------------------------ + +.. automodule:: io_beep_boop.api.client + + +:mod:`io_beep_boop.api.models` +------------------------------ + +.. automodule:: io_beep_boop.api.models diff --git a/docs/source/tokens.png b/docs/source/tokens.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec16f16739b6dc37baf628f24814c7e23ef0704 GIT binary patch literal 15970 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 JT<9C%zW}}P<0k+B literal 0 HcmV?d00001 diff --git a/docs/source/trivia.rst b/docs/source/trivia.rst new file mode 100644 index 0000000..ee74439 --- /dev/null +++ b/docs/source/trivia.rst @@ -0,0 +1,7 @@ +###### +Trivia +###### + +.. figure:: io-dota.webp + + The package name is a tribute to the Dota 2 hero of the same name, Io. \ No newline at end of file diff --git a/template-poetry.iml b/io-beep-boop.iml similarity index 88% rename from template-poetry.iml rename to io-beep-boop.iml index 0f4a63b..199ca6b 100644 --- a/template-poetry.iml +++ b/io-beep-boop.iml @@ -3,11 +3,12 @@ - + + diff --git a/io_beep_boop/__init__.py b/io_beep_boop/__init__.py new file mode 100644 index 0000000..35137f9 --- /dev/null +++ b/io_beep_boop/__init__.py @@ -0,0 +1,2 @@ +# This module doesn't export anything. +# Are you perhaps looking for io_beep_boop.api ? diff --git a/io_beep_boop/api/__init__.py b/io_beep_boop/api/__init__.py new file mode 100644 index 0000000..775f1b8 --- /dev/null +++ b/io_beep_boop/api/__init__.py @@ -0,0 +1,6 @@ +""" +This module defines the models used by the `IO App API `_, and defines a client to interact with the API in a (kind of) Pythonic way. +""" + +from .client import * +from .models import * diff --git a/io_beep_boop/api/client.py b/io_beep_boop/api/client.py new file mode 100644 index 0000000..18cf505 --- /dev/null +++ b/io_beep_boop/api/client.py @@ -0,0 +1,132 @@ +import httpx +import time +import datetime +import functools +import typing as t +import pkg_resources + +from . import models + + +MODEL = t.TypeVar("MODEL") + + +def extract_data(model: t.Type[MODEL]) -> t.Callable[[t.Callable[..., httpx.Response]], t.Callable[..., MODEL]]: + """ + Decorator which captures errors occurring inside methods of :class:`.IOServiceClient` and converts the received data into its corresponding model. + """ + + def decorator(f: t.Callable[..., httpx.Response]) -> t.Callable[..., MODEL]: + + @functools.wraps(f) + def decorated(*args, **kwargs): + response: httpx.Response = f(*args, **kwargs) + response.raise_for_status() + data = response.json() + return model(**data) + + return decorated + + return decorator + + +class IOServiceClient(httpx.Client): + """ + Simplified wrapper for the `IO App API `_. + """ + + def __init__(self, token: str, base_url: str = "https://api.io.italia.it/api/v1", user_agent: t.Optional[str] = None) -> None: + """ + Create a new :class:`.IOAppService`. + + :param token: The token to use when performing requests to the API. On registration of a new service, two tokens are provided, and either may be used. + :param base_url: The base URL of the IO App API. Defaults to ``https://api.io.italia.it/api/v1``. + """ + + super().__init__( + base_url=base_url, + headers={ + "User-Agent": user_agent or f"io-beep-boop/{pkg_resources.get_distribution('io-beep-boop').version}", + "Ocp-Apim-Subscription-Key": token, + } + ) + + @extract_data(models.SendMessageResponse) + def send_legal_message(self, fiscal_code: str, content: models.MessageContent, legal_mail: str, time_to_live: int = 3600, default_addresses: t.Optional[models.DefaultAddresses] = None): + """ + Send a message to the user with the given ``fiscal_code`` on behalf of the service identified by the PEC given in ``legal_mail``. + + .. seealso:: + + https://developer.io.italia.it/openapi.html#operation/submitLegalMessageforUserWithFiscalCodeInBodyOnBehalfOfService + """ + + return self.post(f"/legal-messages/{legal_mail}", json={ + "time_to_live": time_to_live, + "content": content, + "default_addresses": default_addresses, + "fiscal_code": fiscal_code, + }) + + @extract_data(models.SendMessageResponse) + def send_message(self, fiscal_code: str, content: models.MessageContent, time_to_live: int = 3600, default_addresses: t.Optional[models.DefaultAddresses] = None): + """ + Send a message to the user with the given ``fiscal_code``. + + .. seealso:: + + https://developer.io.italia.it/openapi.html#operation/submitMessageforUser + """ + + return self.post(f"/messages/{fiscal_code}", json={ + "time_to_live": time_to_live, + "content": content, + "default_addresses": default_addresses, + }) + + @extract_data(models.SendMessageResponse) + def get_message(self, fiscal_code: str, message_id: str): + """ + Get the message with the given ``message_id`` addressed to the user with the given ``fiscal_code``. + + .. seealso:: + + https://developer.io.italia.it/openapi.html#operation/getMessage + """ + + return self.get(f"/messages/{fiscal_code}/{message_id}") + + @extract_data(models.UserProfile) + def get_profile(self, fiscal_code: str): + """ + Get the profile of the user with the given ``fiscal_code``. + + .. seealso:: + + https://developer.io.italia.it/openapi.html#operation/getProfile + """ + + return self.get(f"/profiles/{fiscal_code}") + + @extract_data(models.SubscriptionsFeed) + def get_subscriptions_on_day(self, date: datetime.date): + """ + Get a list of hashed fiscal codes which subscribed and unsubscribed from the service on the given ``date``. + + .. warning:: + + Requires special authorization. + + .. seealso:: + + https://developer.io.italia.it/openapi.html#operation/getSubscriptionsFeedForDate + """ + + return self.get(f"/subscriptions-feed/{date.isoformat()}") + + # TODO: Service-level endpoints - since it seems weird to me that a service can spawn endless clones of itself? + + +__all__ = ( + "IOServiceClient", +) diff --git a/io_beep_boop/api/models.py b/io_beep_boop/api/models.py new file mode 100644 index 0000000..6db2491 --- /dev/null +++ b/io_beep_boop/api/models.py @@ -0,0 +1,92 @@ +from pydantic import BaseModel +from typing import Optional +from datetime import datetime as DateTime +from datetime import date as Date + + +class IOModel(BaseModel): + pass + + +class Payee(IOModel): + fiscal_code: str + + +class PaymentData(IOModel): + amount: int + notice_number: str + invalid_after_due_date: bool + payee: Payee + + +class PrescriptionData(IOModel): + nre: str + iup: str + prescriber_fiscal_code: str + + +class LegalData(IOModel): + sender_email_from: str + has_attachment: bool + message_unique_id: str + original_message_url: str + pec_server_service_id: str + + +class EuCovidCert(IOModel): + auth_code: str + + +class MessageContent(IOModel): + subject: str + markdown: str + payment_data: Optional[PaymentData] + prescription_data: Optional[PrescriptionData] + legal_data: Optional[LegalData] + eu_covid_cert: Optional[EuCovidCert] + due_date: DateTime + + +class DefaultAddresses(IOModel): + email: str + + +class SendMessageResponse(IOModel): + id: str + + +class NotificationStatus(IOModel): + email: str + + +class GetMessageResponse(IOModel): + message: MessageContent + notification: NotificationStatus + + +class UserProfile(IOModel): + email: str + version: int + sender_allowed: bool + + +class SubscriptionsFeed(IOModel): + date_utc: Date + subscriptions: list[str] + unsubscriptions: list[str] + + +__all__ = ( + "Payee", + "PaymentData", + "PrescriptionData", + "LegalData", + "EuCovidCert", + "MessageContent", + "DefaultAddresses", + "SendMessageResponse", + "NotificationStatus", + "GetMessageResponse", + "UserProfile", + "SubscriptionsFeed", +) diff --git a/io_beep_boop/cli/__main__.py b/io_beep_boop/cli/__main__.py new file mode 100644 index 0000000..d58dccc --- /dev/null +++ b/io_beep_boop/cli/__main__.py @@ -0,0 +1,179 @@ +import click +import datetime +import hashlib +import typing as t +import time + +import httpx + +from ..api.client import IOServiceClient +from ..api.models import SubscriptionsFeed + + +def hash_fiscal_code(code: str) -> str: + uppercased_code = code.upper() + hashed_code = hashlib.sha256(uppercased_code) + hexed_hash = hashed_code.hexdigest() + lowercased_hash = hexed_hash.lower() + return lowercased_hash + + +@click.group() +@click.option( + "-t", + "--token", + type=str, + help="One of the two IO App API tokens of the service you want to use.", + prompt=True, +) +@click.option( + "--base-url", + default="https://api.io.italia.it/api/v1", + type=str, + help="The base URL of the IO App API to use.", +) +@click.pass_context +def main(ctx: click.Context, token: str, base_url: str): + ctx.ensure_object(dict) + ctx.obj["CLIENT"] = IOServiceClient(token=token, base_url=base_url) + + +@main.command("registered-fast") +@click.option( + "--input", + "input_file", + type=click.File("r"), + help="The path to the file to use as input.", + prompt=True, + default="./input.txt", +) +@click.option( + "--registered", + "registered_file", + type=click.File("w"), + help="The path to the file to output registered users to.", + prompt=True, + default="./registered.txt", +) +@click.option( + "--unregistered", + "unregistered_file", + type=click.File("w"), + help="The path to the file to output unregistered users to.", + prompt=True, + default="./unregistered.txt", +) +@click.option( + "--start-date", + type=datetime.date, + help="The date to start retrieving fiscal codes from.", + prompt=True, +) +@click.option( + "--end-date", + type=datetime.date, + help="The date to stop retrieving fiscal codes at.", + default=datetime.date.today(), +) +@click.option( + "--sleep", + type=float, + help="Time to sleep between two subscription feed requests.", + default=1.0, +) +@click.pass_context +def registered_fast(ctx: click.Context, input_file: t.TextIO, registered_file: t.TextIO, unregistered_file: t.TextIO, start_date: datetime.date, end_date: datetime.date, sleep: float): + # Clean up input file + click.echo("Cleaning up input file...") + input_codes: set[str] = set(filter(lambda line: bool(line), map(lambda line: line.strip().upper(), input_file))) + + # Convert codes into a map of hash → code + click.echo("Hashing fiscal codes...") + input_map: dict[str, str] = {hash_fiscal_code(code): code for code in input_codes} + + # Retrieve objects from the API + client: IOServiceClient = ctx.obj["CLIENT"] + + api_codes: set[str] = set() + total_days: int = (end_date - start_date).days + 1 + + with click.progressbar(range(0, total_days), length=total_days, label="Retrieving data from the API...") as days: + for day in days: + feed: SubscriptionsFeed = client.get_subscriptions_on_day(date=start_date + datetime.timedelta(days=day)) + + api_codes += set(feed.subscriptions) + api_codes -= set(feed.unsubscriptions) + + time.sleep(sleep) + + # Convert objects back to fiscal codes + click.echo("Calculating registered fiscal codes...") + registered_codes: set[str] = {input_map.get(code) for code in api_codes} + unregistered_codes: set[str] = input_codes.difference(registered_codes) + + click.echo("Writing registered codes file...") + for code in registered_codes: + registered_file.write(f"{code}\n") + + click.echo("Writing unregistered codes file...") + for code in unregistered_codes: + unregistered_file.write(f"{code}\n") + + +@main.command("registered-slow") +@click.option( + "--input", + "input_file", + type=click.File("r"), + help="The path to the file to use as input.", + prompt=True, + default="./input.txt", +) +@click.option( + "--registered", + "registered_file", + type=click.File("w"), + help="The path to the file to output registered users to.", + prompt=True, + default="./registered.txt", +) +@click.option( + "--unregistered", + "unregistered_file", + type=click.File("w"), + help="The path to the file to output unregistered users to.", + prompt=True, + default="./unregistered.txt", +) +@click.option( + "--sleep", + type=float, + help="Time to sleep between two profile requests.", + default=1.0, +) +@click.pass_context +def registered_slow(ctx: click.Context, input_file: t.TextIO, registered_file: t.TextIO, unregistered_file: t.TextIO, sleep: float): + # Clean up input file + click.echo("Cleaning up input file...") + input_codes: set[str] = set(filter(lambda line: bool(line), map(lambda line: line.strip().upper(), input_file))) + + # Retrieve objects from the API + client: IOServiceClient = ctx.obj["CLIENT"] + + with click.progressbar(input_codes, label="Performing checks...") as codes: + for code in codes: + try: + profile = client.get_profile(fiscal_code=code) + except httpx.HTTPStatusError: + unregistered_file.write(f"{code}\n") + else: + if not profile.sender_allowed: + unregistered_file.write(f"{code}\n") + else: + registered_file.write(f"{code}\n") + finally: + time.sleep(sleep) + + +if __name__ == "__main__": + main() diff --git a/PACKAGE_NAME/tests/conftest.py b/io_beep_boop/tests/conftest.py similarity index 100% rename from PACKAGE_NAME/tests/conftest.py rename to io_beep_boop/tests/conftest.py diff --git a/PACKAGE_NAME/tests/test_something.py b/io_beep_boop/tests/test_something.py similarity index 100% rename from PACKAGE_NAME/tests/test_something.py rename to io_beep_boop/tests/test_something.py diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..1362165 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,896 @@ +[[package]] +name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "anyio" +version = "3.5.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16)"] + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.4.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] + +[[package]] +name = "babel" +version = "2.10.1" +description = "Internationalization utilities" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +name = "certifi" +version = "2021.10.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "cfig" +version = "0.2.3" +description = "A configuration manager for Python" +category = "main" +optional = false +python-versions = ">=3.10,<4.0" + +[package.dependencies] +click = {version = ">=8.1.2,<9.0.0", optional = true, markers = "extra == \"cli\""} +colorama = {version = ">=0.4.4,<0.5.0", optional = true, markers = "extra == \"cli\""} +lazy-object-proxy = ">=1.7.1,<2.0.0" + +[package.extras] +cli = ["click (>=8.1.2,<9.0.0)", "colorama (>=0.4.4,<0.5.0)"] + +[[package]] +name = "charset-normalizer" +version = "2.0.12" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "click" +version = "8.1.2" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "coverage" +version = "6.3.2" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "docutils" +version = "0.17.1" +description = "Docutils -- Python Documentation Utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "h11" +version = "0.12.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "httpcore" +version = "0.14.7" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +anyio = ">=3.0.0,<4.0.0" +certifi = "*" +h11 = ">=0.11,<0.13" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httpx" +version = "0.22.0" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +certifi = "*" +charset-normalizer = "*" +httpcore = ">=0.14.5,<0.15.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotlicffi", "brotli"] +cli = ["click (>=8.0.0,<9.0.0)", "rich (>=10.0.0,<11.0.0)", "pygments (>=2.0.0,<3.0.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "imagesize" +version = "1.3.0" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "jinja2" +version = "3.1.1" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "lazy-object-proxy" +version = "1.7.1" +description = "A fast and thorough lazy object proxy." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pydantic" +version = "1.9.0" +description = "Data validation and settings management using python 3.6 type hinting" +category = "main" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +typing-extensions = ">=3.7.4.3" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pygments" +version = "2.12.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyparsing" +version = "3.0.8" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "3.0.0" +description = "Pytest plugin for measuring coverage." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] + +[[package]] +name = "pytest-github-actions-annotate-failures" +version = "0.1.6" +description = "pytest plugin to annotate failed tests with a workflow command for GitHub Actions" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pytest = ">=4.0.0" + +[[package]] +name = "pytz" +version = "2022.1" +description = "World timezone definitions, modern and historical" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "requests" +version = "2.27.1" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "sniffio" +version = "1.2.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "sphinx" +version = "4.5.0" +description = "Python documentation generator" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.14,<0.18" +imagesize = "*" +Jinja2 = ">=2.3" +packaging = "*" +Pygments = ">=2.0" +requests = ">=2.5.0" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] +test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] + +[[package]] +name = "sphinx-rtd-theme" +version = "1.0.0" +description = "Read the Docs theme for Sphinx" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + +[package.dependencies] +docutils = "<0.18" +sphinx = ">=1.6" + +[package.extras] +dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +test = ["pytest", "flake8", "mypy"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "typing-extensions" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "urllib3" +version = "1.26.9" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.10" +content-hash = "e0915bad08386dd6bf6f29ad95958e43f5c05d713a3f62c771d44422bd1676c4" + +[metadata.files] +alabaster = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] +anyio = [ + {file = "anyio-3.5.0-py3-none-any.whl", hash = "sha256:b5fa16c5ff93fa1046f2eeb5bbff2dad4d3514d6cda61d02816dba34fa8c3c2e"}, + {file = "anyio-3.5.0.tar.gz", hash = "sha256:a0aeffe2fb1fdf374a8e4b471444f0f3ac4fb9f5a5b542b48824475e0042a5a6"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] +babel = [ + {file = "Babel-2.10.1-py3-none-any.whl", hash = "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2"}, + {file = "Babel-2.10.1.tar.gz", hash = "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +cfig = [ + {file = "cfig-0.2.3-py3-none-any.whl", hash = "sha256:8dcd3447f30a05c771f5e5586c1aee2e424b53b0095f1da89fdca6ab4811a61a"}, + {file = "cfig-0.2.3.tar.gz", hash = "sha256:32c50a429023617540e9ab099bd7a02a456b71ddc20f02cc9696c0d9044314da"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, +] +click = [ + {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, + {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +coverage = [ + {file = "coverage-6.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b27d894748475fa858f9597c0ee1d4829f44683f3813633aaf94b19cb5453cf"}, + {file = "coverage-6.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37d1141ad6b2466a7b53a22e08fe76994c2d35a5b6b469590424a9953155afac"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9987b0354b06d4df0f4d3e0ec1ae76d7ce7cbca9a2f98c25041eb79eec766f1"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26e2deacd414fc2f97dd9f7676ee3eaecd299ca751412d89f40bc01557a6b1b4"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd8bafa458b5c7d061540f1ee9f18025a68e2d8471b3e858a9dad47c8d41903"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46191097ebc381fbf89bdce207a6c107ac4ec0890d8d20f3360345ff5976155c"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6f89d05e028d274ce4fa1a86887b071ae1755082ef94a6740238cd7a8178804f"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58303469e9a272b4abdb9e302a780072c0633cdcc0165db7eec0f9e32f901e05"}, + {file = "coverage-6.3.2-cp310-cp310-win32.whl", hash = "sha256:2fea046bfb455510e05be95e879f0e768d45c10c11509e20e06d8fcaa31d9e39"}, + {file = "coverage-6.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:a2a8b8bcc399edb4347a5ca8b9b87e7524c0967b335fbb08a83c8421489ddee1"}, + {file = "coverage-6.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f1555ea6d6da108e1999b2463ea1003fe03f29213e459145e70edbaf3e004aaa"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5f4e1edcf57ce94e5475fe09e5afa3e3145081318e5fd1a43a6b4539a97e518"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a15dc0a14008f1da3d1ebd44bdda3e357dbabdf5a0b5034d38fcde0b5c234b7"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21b7745788866028adeb1e0eca3bf1101109e2dc58456cb49d2d9b99a8c516e6"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8ce257cac556cb03be4a248d92ed36904a59a4a5ff55a994e92214cde15c5bad"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b0be84e5a6209858a1d3e8d1806c46214e867ce1b0fd32e4ea03f4bd8b2e3359"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:acf53bc2cf7282ab9b8ba346746afe703474004d9e566ad164c91a7a59f188a4"}, + {file = "coverage-6.3.2-cp37-cp37m-win32.whl", hash = "sha256:8bdde1177f2311ee552f47ae6e5aa7750c0e3291ca6b75f71f7ffe1f1dab3dca"}, + {file = "coverage-6.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b31651d018b23ec463e95cf10070d0b2c548aa950a03d0b559eaa11c7e5a6fa3"}, + {file = "coverage-6.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07e6db90cd9686c767dcc593dff16c8c09f9814f5e9c51034066cad3373b914d"}, + {file = "coverage-6.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c6dbb42f3ad25760010c45191e9757e7dce981cbfb90e42feef301d71540059"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76aeef1b95aff3905fb2ae2d96e319caca5b76fa41d3470b19d4e4a3a313512"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cf5cfcb1521dc3255d845d9dca3ff204b3229401994ef8d1984b32746bb45ca"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fbbdc8d55990eac1b0919ca69eb5a988a802b854488c34b8f37f3e2025fa90d"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ec6bc7fe73a938933d4178c9b23c4e0568e43e220aef9472c4f6044bfc6dd0f0"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9baff2a45ae1f17c8078452e9e5962e518eab705e50a0aa8083733ea7d45f3a6"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd9e830e9d8d89b20ab1e5af09b32d33e1a08ef4c4e14411e559556fd788e6b2"}, + {file = "coverage-6.3.2-cp38-cp38-win32.whl", hash = "sha256:f7331dbf301b7289013175087636bbaf5b2405e57259dd2c42fdcc9fcc47325e"}, + {file = "coverage-6.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:68353fe7cdf91f109fc7d474461b46e7f1f14e533e911a2a2cbb8b0fc8613cf1"}, + {file = "coverage-6.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b78e5afb39941572209f71866aa0b206c12f0109835aa0d601e41552f9b3e620"}, + {file = "coverage-6.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e21876082ed887baed0146fe222f861b5815455ada3b33b890f4105d806128d"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34626a7eee2a3da12af0507780bb51eb52dca0e1751fd1471d0810539cefb536"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ebf730d2381158ecf3dfd4453fbca0613e16eaa547b4170e2450c9707665ce7"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd6fe30bd519694b356cbfcaca9bd5c1737cddd20778c6a581ae20dc8c04def2"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96f8a1cb43ca1422f36492bebe63312d396491a9165ed3b9231e778d43a7fca4"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dd035edafefee4d573140a76fdc785dc38829fe5a455c4bb12bac8c20cfc3d69"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ca5aeb4344b30d0bec47481536b8ba1181d50dbe783b0e4ad03c95dc1296684"}, + {file = "coverage-6.3.2-cp39-cp39-win32.whl", hash = "sha256:f5fa5803f47e095d7ad8443d28b01d48c0359484fec1b9d8606d0e3282084bc4"}, + {file = "coverage-6.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9548f10d8be799551eb3a9c74bbf2b4934ddb330e08a73320123c07f95cc2d92"}, + {file = "coverage-6.3.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf"}, + {file = "coverage-6.3.2.tar.gz", hash = "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9"}, +] +docutils = [ + {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, + {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, +] +h11 = [ + {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, + {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, +] +httpcore = [ + {file = "httpcore-0.14.7-py3-none-any.whl", hash = "sha256:47d772f754359e56dd9d892d9593b6f9870a37aeb8ba51e9a88b09b3d68cfade"}, + {file = "httpcore-0.14.7.tar.gz", hash = "sha256:7503ec1c0f559066e7e39bc4003fd2ce023d01cf51793e3c173b864eb456ead1"}, +] +httpx = [ + {file = "httpx-0.22.0-py3-none-any.whl", hash = "sha256:e35e83d1d2b9b2a609ef367cc4c1e66fd80b750348b20cc9e19d1952fc2ca3f6"}, + {file = "httpx-0.22.0.tar.gz", hash = "sha256:d8e778f76d9bbd46af49e7f062467e3157a5a3d2ae4876a4bbfd8a51ed9c9cb4"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +imagesize = [ + {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, + {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +jinja2 = [ + {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, + {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, +] +lazy-object-proxy = [ + {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, + {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pydantic = [ + {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, + {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, + {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, + {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, + {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, + {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, + {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, + {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, + {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, + {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, + {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, + {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, + {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, + {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, + {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, + {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, + {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, + {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, + {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, + {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, + {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, + {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, + {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, + {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, + {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, + {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, + {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, + {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, + {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, + {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, + {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, + {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, + {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, + {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, + {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, +] +pygments = [ + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, +] +pyparsing = [ + {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, + {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, +] +pytest = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] +pytest-cov = [ + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, +] +pytest-github-actions-annotate-failures = [ + {file = "pytest-github-actions-annotate-failures-0.1.6.tar.gz", hash = "sha256:162e2fe18b8ab24716c4c3a8d88c29aa67126dc75b4e54be54b58e6fa04653c2"}, + {file = "pytest_github_actions_annotate_failures-0.1.6-py2.py3-none-any.whl", hash = "sha256:5222dfa315c49d705912826335488ac1c75946c4b06782ab9a99379a7ee3af66"}, +] +pytz = [ + {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, + {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, +] +requests = [ + {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, + {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, +] +rfc3986 = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] +sniffio = [ + {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, + {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, +] +snowballstemmer = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] +sphinx = [ + {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, + {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, +] +sphinx-rtd-theme = [ + {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, + {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, +] +sphinxcontrib-applehelp = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] +sphinxcontrib-devhelp = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] +sphinxcontrib-htmlhelp = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] +sphinxcontrib-jsmath = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] +sphinxcontrib-qthelp = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] +sphinxcontrib-serializinghtml = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +typing-extensions = [ + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, +] +urllib3 = [ + {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, + {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, +] diff --git a/pyproject.toml b/pyproject.toml index e8cdc57..a446f11 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ build-backend = "poetry.core.masonry.api" # The name of your project. # Ensure that it is available on PyPI: https://pypi.org/ -name = "PACKAGE_NAME" +name = "io-beep-boop" # The version of the package. version = "0.1.0" @@ -29,31 +29,31 @@ description = "" # A list of the authors of the project. authors = [ - "Your Name ", + "Stefano Pigozzi ", ] # A list of maintainers of the project. # Often, it is the same as the authors list. maintainers = [ - "Your Name ", + "Stefano Pigozzi ", ] # The license of the package. # Uses SPDX format: https://spdx.org/licenses/ -license = "" +license = "AGPL-3.0-or-later" # The README file. readme = "README.md" # The URL of the project website. # Not the GitHub repository! -homepage = "https://example.org/" +# homepage = "https://example.org/" # The URL of the project repository. -repository = "https://github.com/" +repository = "https://github.com/Steffo99/io-beep-boop" # The URL of the project documentation location. -documentation = "https://example.org/docs" +# documentation = "https://example.org/docs" # Up to five keywords related to your project. # See also: https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/#keywords @@ -111,7 +111,7 @@ classifiers = [ # If you are building a library, comment this. # If you are building an application, replace PACKAGE-NAME and PACKAGE_NAME with your package name in kebab-case and snake_case respectively. -PACKAGE-NAME = "PACKAGE_NAME.__main__:main" +io-beep-boop = "io_beep_boop.cli.__main__:main" @@ -132,6 +132,10 @@ PACKAGE-NAME = "PACKAGE_NAME.__main__:main" # 3.10.1 → == 3.10.1 python = "^3.10" +cfig = {extras = ["cli"], version = "^0.2.3"} +click = "^8.1.2" +httpx = "^0.22.0" +pydantic = "^1.9.0"