From 41e6ca513c46592533d5e8ca3060a00652124020 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Tue, 26 Nov 2024 12:59:46 -0500 Subject: [PATCH] Adding docstrings and introducing sphinx draft (#12) --- .github/workflows/docs.yml | 41 +++ Makefile | 5 + docs/Makefile | 21 ++ docs/_static/localstack-horizontal.png | Bin 0 -> 119107 bytes docs/conf.py | 59 ++++ docs/index.rst | 52 ++++ docs/modules.rst | 7 + .../localstack/sdk/aws/client.py | 73 ++++- .../localstack/sdk/chaos/client.py | 38 ++- .../localstack/sdk/chaos/managers.py | 5 + .../localstack/{ => sdk}/clients.py | 17 +- .../localstack/sdk/pods/client.py | 72 +++-- .../localstack/sdk/pods/exceptions.py | 18 ++ .../localstack/sdk/state/client.py | 10 +- pyproject.toml | 7 +- uv.lock | 290 +++++++++++++++++- 16 files changed, 680 insertions(+), 35 deletions(-) create mode 100644 .github/workflows/docs.yml create mode 100644 docs/Makefile create mode 100644 docs/_static/localstack-horizontal.png create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/modules.rst rename localstack-sdk-python/localstack/{ => sdk}/clients.py (51%) create mode 100644 localstack-sdk-python/localstack/sdk/pods/exceptions.py diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..fdf7d8d --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,41 @@ +name: Build sphinx documentation + +on: + push: + paths: + - 'docs/**' + branches: + - main + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + + - name: Install uv + uses: astral-sh/setup-uv@v3 + + - name: Install project + run: | + make install-dev + + - name: Generate docs + run: + make sphinx-docs + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: html-docs + path: docs/_build/html/ + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + if: github.ref == 'refs/heads/main' + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: docs/_build/html diff --git a/Makefile b/Makefile index d680319..9f8ce05 100644 --- a/Makefile +++ b/Makefile @@ -23,6 +23,11 @@ clean-generated: ## Cleanup generated code generate: ## Generate the code from the OpenAPI specs ./bin/generate.sh +sphinx-docs: ## Generate the documentation; uses the sphinx-generated Makefile in docs to clean and build html + ($(VENV_RUN); sphinx-apidoc --implicit-namespaces -o docs localstack-sdk-python/localstack) + $(MAKE) -C docs clean + $(MAKE) -C docs html + format: ($(VENV_RUN); python -m ruff format --exclude packages .; python -m ruff check --output-format=full --exclude packages --fix .) diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..eb12baa --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,21 @@ +# Minimal makefile for Sphinx documentation +# Mostly use by the project Makefile to access the clean and html targets +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/localstack-horizontal.png b/docs/_static/localstack-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..3c40da772a98cb6ffc0e7e5fbd12785a9be4e22e GIT binary patch literal 119107 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

@8^#pcw3E#e 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 literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..9febad2 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,59 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +import os +import sys + +sys.path.insert(0, os.path.abspath("../localstack-sdk-python/localstack")) + + +def _get_version() -> str: + with open(os.path.abspath("../VERSION"), "r") as f: + version = f.read() + return version + + +project = "LocalStack Python SDK" +copyright = "2024, LocalStack Team" +author = "LocalStack Team" +release = _get_version() + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +# enable auto-doc extension +extensions = ["sphinx.ext.autodoc"] + +templates_path = ["_templates"] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = "alabaster" +html_static_path = ["_static"] + +html_sidebars = { + "**": [ + "about.html", + "searchfield.html", + "navigation.html", + ] +} + +html_theme_options = { + "extra_nav_links": { + "Source": "https://github.com/localstack/localstack-sdk-python", + "Issues": "https://github.com/localstack/localstack-sdk-python/issues", + "PyPI": "https://pypi.org/project/localstack-sdk-python/", + }, + "description": "Python SDK to interact with LocalStack developer endpoints", + "github_user": "localstack", + "github_repo": "localstack-sdk-python", +} diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..8ef51b2 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,52 @@ +.. image:: _static/localstack-horizontal.png + :align: center + :target: https://localstack.cloud + +This is the documentation for the Python +`LocalStack's SDK `_. + +LocalStack offers a number of developer endpoints to programmatically interact +with LocalStack's features. + +The complete OpenAPI spec can be found in the +`OpenAPI repository `_. + +Installation +------------ + +We recommend to user virtual environments to manage the dependencies of your project. + +To create and activate a virtual environment inside your project run: + +.. code-block:: shell + + python3 -m venv venv + +You can activate the correspondent provider with: + +.. code-block:: shell + + . venv/bin/activate + +With the activated environment, use the following command to install the LocalStack Python SDK. + +.. code-block:: shell + + pip install localstack-sdk-python + +Getting Started +--------------- + +To learn about the basic SDK concepts and see how you can use it, please have a look at our +official `LocalStack documentation `_. + +API Reference +------------- + +If you are looking for information on a specific function, class or +method, this part of the documentation is for you. + +.. toctree:: + :maxdepth: 1 + + modules \ No newline at end of file diff --git a/docs/modules.rst b/docs/modules.rst new file mode 100644 index 0000000..0c7973d --- /dev/null +++ b/docs/modules.rst @@ -0,0 +1,7 @@ +API Reference +============= + +.. toctree:: + :maxdepth: 4 + + localstack.sdk \ No newline at end of file diff --git a/localstack-sdk-python/localstack/sdk/aws/client.py b/localstack-sdk-python/localstack/sdk/aws/client.py index 8a48302..01f8973 100644 --- a/localstack-sdk-python/localstack/sdk/aws/client.py +++ b/localstack-sdk-python/localstack/sdk/aws/client.py @@ -1,7 +1,7 @@ import json -from localstack.clients import BaseClient from localstack.sdk.api.aws_api import AwsApi +from localstack.sdk.clients import BaseClient from localstack.sdk.models import ( Message, SesSentEmail, @@ -36,6 +36,12 @@ def _from_sqs_query_to_json(xml_dict: dict) -> list[Message]: class AWSClient(BaseClient): + """ + The client to interact with all the LocalStack's AWS endpoints. + These endpoints offer specific features in addition to the ones offered by the AWS services. For instance, + access all the messages withing a SQS without the side effect of deleting them. + """ + def __init__(self, **kwargs) -> None: super().__init__(**kwargs) self._client = AwsApi(self._api_client) @@ -45,12 +51,26 @@ def __init__(self, **kwargs) -> None: ######## def list_sqs_messages(self, account_id: str, region: str, queue_name: str) -> list[Message]: + """ + Lists all the SQS messages in a given queue in a specific account id and region, without any side effect. + + :param account_id: the account id of the queue + :param region: the region of the queue + :param queue_name: the name of the queue + :return: the list of messages in the queue + """ response = self._client.list_sqs_messages_with_http_info( account_id=account_id, region=region, queue_name=queue_name ) return _from_sqs_query_to_json(json.loads(response.raw_data)) - def list_sqs_messages_from_queue_url(self, queue_url) -> list[Message]: + def list_sqs_messages_from_queue_url(self, queue_url: str) -> list[Message]: + """ + Lists all the SQS messages in a given queue, without any side effect. + + :param queue_url: the URL of the queue + :return: the list of messages in the queue + """ response = self._client.list_all_sqs_messages_with_http_info(queue_url=queue_url) return _from_sqs_query_to_json(json.loads(response.raw_data)) @@ -61,10 +81,23 @@ def list_sqs_messages_from_queue_url(self, queue_url) -> list[Message]: def get_ses_messages( self, id_filter: str | None = None, email_filter: str | None = None ) -> list[SesSentEmail]: + """ + Returns all the in-memory saved SES messages. They can be filtered by message ID and/or message source. + + :param id_filter: the message id used as filter for the SES messages + :param email_filter: the message source filter + :return: a list of email sent with SES + """ response = self._client.get_ses_messages(id=id_filter, email=email_filter) return response.messages def discard_ses_messages(self, id_filter: str | None = None) -> None: + """ + Clears all SES messages. An ID filter can be provided to delete only a specific message. + + :param id_filter: the id filter + :return: None + """ return self._client.discard_ses_messages(id=id_filter) ######## @@ -77,6 +110,15 @@ def get_sns_sms_messages( account_id: str = "000000000000", region: str = "us-east-1", ) -> SNSSMSMessagesResponse: + """ + Returns all SMS messages published to a phone number. + + :param phone_number: the phone number to which the messages have been published. If not specified, all messages + are returned. + :param account_id: the AWS Account ID from which the messages have been published. '000000000000' by default + :param region: the AWS region from which the messages have been published. us-east-1 by default + :return: + """ return self._client.get_sns_sms_messages( phone_number=phone_number, account_id=account_id, region=region ) @@ -87,6 +129,15 @@ def discard_sns_sms_messages( account_id: str = "000000000000", region: str = "us-east-1", ) -> None: + """ + Discards all SMS messages published to a phone number. + + :param phone_number: the phone number to which the messages have been published. If not specified, all messages + are deleted. + :param account_id: the AWS Account ID from which the messages have been published. '000000000000' by default + :param region: the AWS region from which the messages have been published. us-east-1 by default + :return: None + """ return self._client.discard_sns_sms_messages( phone_number=phone_number, account_id=account_id, region=region ) @@ -97,6 +148,15 @@ def get_sns_endpoint_messages( account_id: str = "000000000000", region: str = "us-east-1", ) -> SNSPlatformEndpointResponse: + """ + Returns all the messages published to a platform endpoint. + + :param endpoint_arn: the ARN to which the messages have been published. If not specified, will return all the + messages. + :param account_id: the AWS Account ID from which the messages have been published. 000000000000 if not specified + :param region: the AWS region from which the messages have been published. us-east-1 by default + :return: a response with the list of messages and the queried region + """ return self._client.get_sns_endpoint_messages( endpoint_arn=endpoint_arn, account_id=account_id, region=region ) @@ -107,6 +167,15 @@ def discard_sns_endpoint_messages( account_id: str = "000000000000", region: str = "us-east-1", ) -> None: + """ + Discards all the messaged published to a platform endpoint. + + :param endpoint_arn: the ARN to which the messages have been published. If not specified, will discard all the + messages. + :param account_id: the AWS Account ID from which the messages have been published. 000000000000 if not specified + :param region: the AWS region from which the messages have been published. us-east-1 by default + :return: None + """ return self._client.discard_sns_endpoint_messages( endpoint_arn=endpoint_arn, account_id=account_id, region=region ) diff --git a/localstack-sdk-python/localstack/sdk/chaos/client.py b/localstack-sdk-python/localstack/sdk/chaos/client.py index 137a607..9b1bb07 100644 --- a/localstack-sdk-python/localstack/sdk/chaos/client.py +++ b/localstack-sdk-python/localstack/sdk/chaos/client.py @@ -1,12 +1,11 @@ -from localstack.clients import BaseClient from localstack.sdk.api.chaos_api import ChaosApi +from localstack.sdk.clients import BaseClient from localstack.sdk.models import FaultRule, NetworkEffectsConfig class ChaosClient(BaseClient): """ - The client for the ChaosAPI. - This is mostly a wrapper of the ChaosApi class, which is automatically generated from the OpenAPI specs. + The client to interact with the LocalStack's Chaos API. """ def __init__(self, **kwargs) -> None: @@ -14,26 +13,57 @@ def __init__(self, **kwargs) -> None: self._client = ChaosApi(self._api_client) def set_fault_rules(self, fault_rules: list[FaultRule]) -> list[FaultRule]: + """ + Creates a new sets of fault rules. It overwrites the previous ones. + :param fault_rules: the list of FaultRule we want to set + :return: the list of FaultRule currently in place + """ return self._client.set_fault_rules_0(fault_rule=fault_rules) def add_fault_rules(self, fault_rules: list[FaultRule]) -> list[FaultRule]: + """ + Adds a new set of rules to the current fault configuration. + :param fault_rules: the FaultRule rules to add + :return: the list of FaultRule currently in place + """ return self._client.add_fault_rules_0(fault_rule=fault_rules) def delete_fault_rules(self, fault_rules: list[FaultRule]) -> list[FaultRule]: + """ + Deletes a set of rules from the fault configuration. + :param fault_rules: the FaultRule to delete + :return: the list of FaultRule currently in place + """ return self._client.delete_fault_rules_0(fault_rule=fault_rules) def get_fault_rules(self) -> list[FaultRule]: + """ + Gets the current fault configuration. + :return: the list of FaultRule of the current configuration + """ return self._client.get_fault_rules_0() def get_network_effects(self) -> NetworkEffectsConfig: + """ + Gets the current network effect configuration. + :return: the current NetworkEffectsConfig + """ return self._client.get_network_effects_0() def set_network_effects( self, network_effects_config: NetworkEffectsConfig ) -> NetworkEffectsConfig: + """ + Configure a new network effect, e.g, latency. + :param network_effects_config: the network config to be set + :return: the current configuration of network effects + """ return self._client.set_network_effects_0(network_effects_config=network_effects_config) def get_default(**args) -> ChaosClient: - """Return a default chaos client with a default configuration""" + """ + Return a chaos client with a default configuration. You can pass a host argument to overwrite the fault one + (http://localhost.localstack.cloud:4566). + """ return ChaosClient(**args) diff --git a/localstack-sdk-python/localstack/sdk/chaos/managers.py b/localstack-sdk-python/localstack/sdk/chaos/managers.py index 8990bf8..9ba837a 100644 --- a/localstack-sdk-python/localstack/sdk/chaos/managers.py +++ b/localstack-sdk-python/localstack/sdk/chaos/managers.py @@ -6,6 +6,11 @@ @contextmanager def fault_configuration(fault_rules: list[FaultRule]): + """ + This is a context manager that temporarily applies a given set of fault rules. + :param fault_rules: a list of FaultRule to be applied. + :return: None + """ client = get_default() try: client.set_fault_rules(fault_rules=fault_rules) diff --git a/localstack-sdk-python/localstack/clients.py b/localstack-sdk-python/localstack/sdk/clients.py similarity index 51% rename from localstack-sdk-python/localstack/clients.py rename to localstack-sdk-python/localstack/sdk/clients.py index 372e067..3c7207c 100644 --- a/localstack-sdk-python/localstack/clients.py +++ b/localstack-sdk-python/localstack/sdk/clients.py @@ -3,21 +3,30 @@ class BaseClient: - """A BaseClient creates a configuration and instantiate a ApiClient""" + """ + A BaseClient creates a configuration and instantiate a ApiClient, which is a generic OpenAPI client automatically + generated by the openapitools/openapi-generator tool. + """ configuration: Configuration + """The configuration for the base client""" _api_client: ApiClient + """The OpenAPI client""" + host: str + """The LocalStack host (http://localhost.localstack.cloud:4566 by default)""" auth_token: str | None + """A client can be injected with a LocalStack auth token. If not provided, the one used to start up the + LocalStack instance will be used (for the features needing it, e.g., Cloud Pods).""" def __init__(self, host: str | None = None, auth_token: str | None = None, **kwargs) -> None: """ - Initialize a base client to interact with LocalStack developer endpoint. + Initializes a base client to interact with LocalStack developer endpoint. :param host: the host, http://localhost.localstack.cloud:4566 by default. :param auth_token: if provided, this token would be used for authentication against platform. It not, the LocalStack runtime will use the one used to start the container. The token used determines the Cloud Pods identity, i.e., which pods are available. """ - _host = host or "http://localhost.localstack.cloud:4566" + self.host = host or "http://localhost.localstack.cloud:4566" self.auth_token = auth_token - self.configuration = Configuration(host=_host) + self.configuration = Configuration(host=self.host) self._api_client = ApiClient(configuration=self.configuration) diff --git a/localstack-sdk-python/localstack/sdk/pods/client.py b/localstack-sdk-python/localstack/sdk/pods/client.py index aa17c3e..4a338df 100644 --- a/localstack-sdk-python/localstack/sdk/pods/client.py +++ b/localstack-sdk-python/localstack/sdk/pods/client.py @@ -1,9 +1,10 @@ import base64 import json -from localstack.clients import BaseClient from localstack.sdk.api import PodsApi -from localstack.sdk.models import PodSaveRequest, RemoteConfig +from localstack.sdk.clients import BaseClient +from localstack.sdk.models import PodList, PodSaveRequest, RemoteConfig +from localstack.sdk.pods.exceptions import PodLoadException, PodSaveException def _empty_remote_config() -> RemoteConfig: @@ -11,17 +12,37 @@ def _empty_remote_config() -> RemoteConfig: def _read_ndjson(raw_content: bytes) -> list[dict]: + """ + Reads the byte content of a ndjson response into a list of dictionaries. + :param raw_content: the byte content of a ndjson response. + :return: a list of dicts. + """ ndjson_str = raw_content.decode("utf-8") return [json.loads(line) for line in ndjson_str.splitlines()] def _get_completion_event(streamed_response: list[dict]) -> dict | None: + """ + Parses the chucked response returned form the Cloud Pod save and load endpoints and return the completion event, + i.e., the one summarizing the output (success or error) of the operation. + :param streamed_response: a list of dictionaries for the chunked response. + :return: the dictionary of the completion event, if found. None otherwise. + """ completion_events = [line for line in streamed_response if line.get("event") == "completion"] return completion_events[0] if completion_events else None class PodsClient(BaseClient): + """ + The client to interact with the Cloud Pod feature. + """ + def __init__(self, **args) -> None: + """ + Initializes a Cloud Pods client. + :param auth_token: if provided, this token will be used for platform authentication. If not, it will be + fetched from within the container itself. + """ super().__init__(**args) self._client = PodsApi(self._api_client) if self.auth_token: @@ -33,47 +54,62 @@ def __init__(self, **args) -> None: def save_pod(self, pod_name: str) -> None: """ - :raise exception if the save does not succeed + Saves the state in the LocalStack container into a Cloud Pod and uploads it to the LocalStack's platform. + If a Cloud Pod with the given name already exists, a new version is created. + :param pod_name: the name of the Cloud Pod to be saved. + :return: None + :raises PodSaveException: if the save operation returns an error """ - try: - response = self._client.save_pod_0_with_http_info( - name=pod_name, pod_save_request=PodSaveRequest() - ) - except Exception as e: - raise (e) + response = self._client.save_pod_0_with_http_info( + name=pod_name, pod_save_request=PodSaveRequest() + ) if response.status_code != 200: - pass + raise PodSaveException(pod_name=pod_name) streamed_response = _read_ndjson(response.raw_data) completion_event = _get_completion_event(streamed_response) if completion_event["status"] == "error": - # todo: define exception - raise Exception(completion_event.get("message")) + raise PodSaveException(pod_name=pod_name, error=completion_event.get("message")) def load_pod(self, pod_name: str) -> None: """ - :raise exception if the load does not succeed + Loads a Cloud Pod into the LocalStack container. + :param pod_name: the name of the Cloud Pod to load + :return: None + :raises PodLoadException: if the load operation returns an error """ response = self._client.load_pod_0_with_http_info( name=pod_name, remote_config=_empty_remote_config() ) if response.status_code != 200: - pass + raise PodLoadException(pod_name=pod_name) streamed_response = _read_ndjson(response.raw_data) completion_event = _get_completion_event(streamed_response) if completion_event["status"] == "error": - # todo: define exception - raise Exception(completion_event.get("message")) + raise PodLoadException(pod_name=pod_name, error=completion_event.get("message")) def delete_pod(self, pod_name: str) -> None: + """ + Deletes a Cloud Pod. + :param pod_name: the name of the Cloud Pod to be deleted. + :return: None + """ return self._client.delete_pod_0(name=pod_name, remote_config=_empty_remote_config()) - def list_pods(self): - # todo: fix CloudPodInner model; + def list_pods(self) -> PodList: + """ + Returns the list of the Cloud Pods visible in the organization. + :return: a PodList object + """ pods = self._client.list_pods_0(remote_config=_empty_remote_config()) return pods def get_platform_auth_header(token: str) -> dict[str, str]: + """ + Given the auth token, crafts the authorization header to authenticate platform calls. + :param token: the localstack auth token + :return: a dictionary for the authorization header + """ _token = f":{token}" auth_encoded = base64.b64encode(_token.encode("utf-8")).decode("utf-8") return {"Authorization": f"Basic {auth_encoded}"} diff --git a/localstack-sdk-python/localstack/sdk/pods/exceptions.py b/localstack-sdk-python/localstack/sdk/pods/exceptions.py new file mode 100644 index 0000000..faae703 --- /dev/null +++ b/localstack-sdk-python/localstack/sdk/pods/exceptions.py @@ -0,0 +1,18 @@ +class PodSaveException(Exception): + message = "An error occurred while saving the Cloud Pod" + + def __init__(self, pod_name: str, error: str | None = None) -> None: + _message = f"{self.message} '{pod_name}'" + if error: + _message += f": {error}" + super().__init__(_message) + + +class PodLoadException(Exception): + message = "An error occurred while loading the Cloud Pod" + + def __init__(self, pod_name: str, error: str | None = None) -> None: + _message = f"{self.message} '{pod_name}'" + if error: + _message += f": {error}" + super().__init__(_message) diff --git a/localstack-sdk-python/localstack/sdk/state/client.py b/localstack-sdk-python/localstack/sdk/state/client.py index 560437d..8c55e80 100644 --- a/localstack-sdk-python/localstack/sdk/state/client.py +++ b/localstack-sdk-python/localstack/sdk/state/client.py @@ -1,11 +1,19 @@ -from localstack.clients import BaseClient from localstack.sdk.api import StateApi +from localstack.sdk.clients import BaseClient class StateClient(BaseClient): + """ + Initializes a client to handle LocalStack's state. + """ + def __init__(self, **args) -> None: super().__init__(**args) self._client = StateApi(self._api_client) def reset_state(self) -> None: + """ + Resets the state of LocalStack for all running services. + :return: None + """ self._client.localstack_state_reset_post_0() diff --git a/pyproject.toml b/pyproject.toml index f3ca690..dec9f45 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,9 +25,10 @@ readme = { file = ["README.md"], content-type = "text/markdown"} [tool.uv] dev-dependencies=[ - "pytest", - "ruff", - "boto3" + "pytest>=8.3.3", + "ruff>=0.6.9", + "boto3>=1.35.40", + "sphinx>=8.1.3" ] [tool.uv.sources] diff --git a/uv.lock b/uv.lock index e47d888..b28829b 100644 --- a/uv.lock +++ b/uv.lock @@ -11,6 +11,15 @@ members = [ "localstack-sdk-python", ] +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929 }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -20,6 +29,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, ] +[[package]] +name = "babel" +version = "2.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/74/f1bc80f23eeba13393b7222b11d95ca3af2c1e28edca18af487137eefed9/babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316", size = 9348104 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", size = 9587599 }, +] + [[package]] name = "boto3" version = "1.35.40" @@ -48,6 +66,69 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/1f/48869905da0090c061b127caf13e722e95d95772d54bba3bc0aedee3ff33/botocore-1.35.40-py3-none-any.whl", hash = "sha256:072cc47f29cb1de4fa77ce6632e4f0480af29b70816973ff415fbaa3f50bd1db", size = 12617487 }, ] +[[package]] +name = "certifi" +version = "2024.8.30" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", size = 193339 }, + { url = "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", size = 124366 }, + { url = "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", size = 118874 }, + { url = "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", size = 138243 }, + { url = "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", size = 148676 }, + { url = "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", size = 141289 }, + { url = "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", size = 142585 }, + { url = "https://files.pythonhosted.org/packages/3b/a0/a68980ab8a1f45a36d9745d35049c1af57d27255eff8c907e3add84cf68f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", size = 144408 }, + { url = "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", size = 139076 }, + { url = "https://files.pythonhosted.org/packages/fb/9d/9c13753a5a6e0db4a0a6edb1cef7aee39859177b64e1a1e748a6e3ba62c2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", size = 146874 }, + { url = "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", size = 150871 }, + { url = "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", size = 148546 }, + { url = "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", size = 143048 }, + { url = "https://files.pythonhosted.org/packages/01/f8/38842422988b795220eb8038745d27a675ce066e2ada79516c118f291f07/charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", size = 94389 }, + { url = "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", size = 101752 }, + { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, + { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, + { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, + { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, + { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, + { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, + { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, + { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, + { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, + { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, + { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, + { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, + { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, + { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -57,6 +138,33 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] +[[package]] +name = "docutils" +version = "0.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, +] + [[package]] name = "iniconfig" version = "2.0.0" @@ -66,6 +174,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, ] +[[package]] +name = "jinja2" +version = "3.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271 }, +] + [[package]] name = "jmespath" version = "1.0.1" @@ -115,6 +235,7 @@ dev = [ { name = "boto3" }, { name = "pytest" }, { name = "ruff" }, + { name = "sphinx" }, ] [package.metadata] @@ -122,9 +243,58 @@ requires-dist = [{ name = "localstack-sdk-generated", editable = "packages/local [package.metadata.requires-dev] dev = [ - { name = "boto3" }, - { name = "pytest" }, - { name = "ruff" }, + { name = "boto3", specifier = ">=1.35.40" }, + { name = "pytest", specifier = ">=8.3.3" }, + { name = "ruff", specifier = ">=0.6.9" }, + { name = "sphinx", specifier = ">=8.1.3" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, ] [[package]] @@ -206,6 +376,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a5/ae/e14b0ff8b3f48e02394d8acd911376b7b66e164535687ef7dc24ea03072f/pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5", size = 1919411 }, ] +[[package]] +name = "pygments" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 }, +] + [[package]] name = "pytest" version = "8.3.3" @@ -233,6 +412,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, ] +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + [[package]] name = "ruff" version = "0.6.9" @@ -279,6 +473,96 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 }, ] +[[package]] +name = "snowballstemmer" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, +] + +[[package]] +name = "sphinx" +version = "8.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125 }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, +] + [[package]] name = "typing-extensions" version = "4.12.2"