From 6c36aa64bb6776375b4e68c17dd4c662cc5e97a7 Mon Sep 17 00:00:00 2001 From: Roger Zhang Date: Tue, 2 May 2023 16:19:43 -0700 Subject: [PATCH 01/17] POC of user-agent - Need to review on how to import botocore - Review how to get PT version - better solution than implementing in __init__.py ? --- aws_lambda_powertools/__init__.py | 3 ++ .../shared/add_user_agent.py | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 aws_lambda_powertools/shared/add_user_agent.py diff --git a/aws_lambda_powertools/__init__.py b/aws_lambda_powertools/__init__.py index 574c9b257f1..d3fab3e65f7 100644 --- a/aws_lambda_powertools/__init__.py +++ b/aws_lambda_powertools/__init__.py @@ -7,6 +7,7 @@ from .logging import Logger from .metrics import Metrics, single_metric from .package_logger import set_package_logger_handler +from .shared import add_user_agent from .tracing import Tracer __author__ = """Amazon Web Services""" @@ -20,3 +21,5 @@ PACKAGE_PATH = Path(__file__).parent set_package_logger_handler() + +add_user_agent.register_user_agent() diff --git a/aws_lambda_powertools/shared/add_user_agent.py b/aws_lambda_powertools/shared/add_user_agent.py new file mode 100644 index 00000000000..de780b9fd1f --- /dev/null +++ b/aws_lambda_powertools/shared/add_user_agent.py @@ -0,0 +1,30 @@ +try: + import botocore.handlers +except ImportError: + botocore = None + +try: + import pkg_resources + + # there should be a more elegant way to get module version and feature version + pt_version = pkg_resources.get_distribution("aws_lambda_powertools").version +except ImportError: + pkg_resources = None + # Not available + pt_version = "NA" +import os + +ENV_KEY = "AWS_EXECUTION_ENV" +EXEC_ENV = os.environ.get(ENV_KEY, "NA") + + +# add user-agent like powertools/2.14.1 EXEC-ENV/AWS_Lambda_python3.9 +def add_user_agent(request, **kwargs): + headers = request.headers + headers["User-Agent"] = f"{headers['User-Agent']} powertools/{pt_version} EXEC-ENV/{EXEC_ENV}" + + +def register_user_agent(): + if botocore: + # register add_user_agent to BUILTIN_HANDLERS so every aws sdk session will have this event registered + botocore.handlers.BUILTIN_HANDLERS.append(("request-created", add_user_agent)) From 23f41553a5ddf03602d398518e4ec9db7f86ef91 Mon Sep 17 00:00:00 2001 From: Roger Zhang Date: Mon, 15 May 2023 14:49:30 -0700 Subject: [PATCH 02/17] Changes for Heitor's review - rename module to `user_agent` - add feature name "parameters", "idempotency" to user-agent --- aws_lambda_powertools/__init__.py | 4 +- .../shared/add_user_agent.py | 30 -------- aws_lambda_powertools/shared/user_agent.py | 70 +++++++++++++++++++ .../idempotency/persistence/dynamodb.py | 4 +- .../utilities/parameters/base.py | 12 +++- 5 files changed, 84 insertions(+), 36 deletions(-) delete mode 100644 aws_lambda_powertools/shared/add_user_agent.py create mode 100644 aws_lambda_powertools/shared/user_agent.py diff --git a/aws_lambda_powertools/__init__.py b/aws_lambda_powertools/__init__.py index d3fab3e65f7..05f239169a3 100644 --- a/aws_lambda_powertools/__init__.py +++ b/aws_lambda_powertools/__init__.py @@ -7,7 +7,7 @@ from .logging import Logger from .metrics import Metrics, single_metric from .package_logger import set_package_logger_handler -from .shared import add_user_agent +from .shared import user_agent from .tracing import Tracer __author__ = """Amazon Web Services""" @@ -22,4 +22,4 @@ set_package_logger_handler() -add_user_agent.register_user_agent() +user_agent.inject_user_agent() diff --git a/aws_lambda_powertools/shared/add_user_agent.py b/aws_lambda_powertools/shared/add_user_agent.py deleted file mode 100644 index de780b9fd1f..00000000000 --- a/aws_lambda_powertools/shared/add_user_agent.py +++ /dev/null @@ -1,30 +0,0 @@ -try: - import botocore.handlers -except ImportError: - botocore = None - -try: - import pkg_resources - - # there should be a more elegant way to get module version and feature version - pt_version = pkg_resources.get_distribution("aws_lambda_powertools").version -except ImportError: - pkg_resources = None - # Not available - pt_version = "NA" -import os - -ENV_KEY = "AWS_EXECUTION_ENV" -EXEC_ENV = os.environ.get(ENV_KEY, "NA") - - -# add user-agent like powertools/2.14.1 EXEC-ENV/AWS_Lambda_python3.9 -def add_user_agent(request, **kwargs): - headers = request.headers - headers["User-Agent"] = f"{headers['User-Agent']} powertools/{pt_version} EXEC-ENV/{EXEC_ENV}" - - -def register_user_agent(): - if botocore: - # register add_user_agent to BUILTIN_HANDLERS so every aws sdk session will have this event registered - botocore.handlers.BUILTIN_HANDLERS.append(("request-created", add_user_agent)) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py new file mode 100644 index 00000000000..9ec44c7a78e --- /dev/null +++ b/aws_lambda_powertools/shared/user_agent.py @@ -0,0 +1,70 @@ +import os + +from importlib_metadata import version + +pt_version = version("aws-lambda-powertools") + +try: + import botocore.handlers +except ImportError: + # if botocore failed to import, user might be using custom runtime. We can ignore here + botocore = None + + +ENV_KEY = "AWS_EXECUTION_ENV" +EXEC_ENV = os.environ.get(ENV_KEY, "NA") +target_sdk_event = "request-created" + + +# add user-agent like powertools/2.14.1 EXEC-ENV/AWS_Lambda_python3.9 +def _add_pt_version(request, **kwargs): + headers = request.headers + if "PT/" not in headers: + # assume we always have a User-Agent. + # Q: do we need to check if field: User-Agent exist in request.headers? + # Q: do we care if User-Agent string exceed 256 characters? + headers["User-Agent"] = f"{headers['User-Agent']} PT/no-op/{pt_version} PTEnv/{EXEC_ENV}" + + +# creates the `add_feature_string` function with given feature parameter +def _create_feature_function(feature): + def add_pt_feature(request, **kwargs): + headers = request.headers + # Actually, only one handler can be registered, registering a new one will replace the prev handler + # We don't need to replace/detect previous registered user-agent + """ + # replace existing no-op user-agent with feature + if "PT/no-op" in headers["User-Agent"]: + headers["User-Agent"] = headers['User-Agent'].replace("PT/no-op", f"PT/{feature}") + return + # already registered, exit + if f"PT/{feature}/" in headers["User-Agent"]: + return + # other feature registered, append + # Q: do we want this? or replace the original feature? + if "PT/" in headers["User-Agent"]: + headers["User-Agent"] = f"{headers['User-Agent']} PT/{feature}/{pt_version}" + return""" + + # no PT header found, insert new one + headers["User-Agent"] = f"{headers['User-Agent']} PT/{feature}/{pt_version} PTEnv/{EXEC_ENV}" + + # return created function + return add_pt_feature + + +# add feature user-agent to given sdk session +def register_feature_to_session(session, feature): + session.events.register(target_sdk_event, _create_feature_function(feature)) + + +# add feature user-agent to given sdk client +def register_feature_to_client(client, feature): + client.meta.events.register(target_sdk_event, _create_feature_function(feature)) + + +# register add_pt_version for all AWS SDK in runtime +def inject_user_agent(): + if botocore: + # register add_user_agent to BUILTIN_HANDLERS so every aws sdk session will have this event registered + botocore.handlers.BUILTIN_HANDLERS.append((target_sdk_event, _add_pt_version)) diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py b/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py index 654f8ca99d4..4392b275821 100644 --- a/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +++ b/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py @@ -10,7 +10,7 @@ from botocore.config import Config from botocore.exceptions import ClientError -from aws_lambda_powertools.shared import constants +from aws_lambda_powertools.shared import constants, user_agent from aws_lambda_powertools.utilities.idempotency import BasePersistenceLayer from aws_lambda_powertools.utilities.idempotency.exceptions import ( IdempotencyItemAlreadyExistsError, @@ -94,6 +94,8 @@ def __init__( else: self.client = boto3_client + user_agent.register_feature_to_client(self.client, "idempotency") + if sort_key_attr == key_attr: raise ValueError(f"key_attr [{key_attr}] and sort_key_attr [{sort_key_attr}] cannot be the same!") diff --git a/aws_lambda_powertools/utilities/parameters/base.py b/aws_lambda_powertools/utilities/parameters/base.py index 8ec1052ae37..d8c703d6290 100644 --- a/aws_lambda_powertools/utilities/parameters/base.py +++ b/aws_lambda_powertools/utilities/parameters/base.py @@ -25,7 +25,7 @@ import boto3 from botocore.config import Config -from aws_lambda_powertools.shared import constants +from aws_lambda_powertools.shared import constants, user_agent from aws_lambda_powertools.shared.functions import resolve_max_age from aws_lambda_powertools.utilities.parameters.types import TransformOptions @@ -254,11 +254,14 @@ def _build_boto3_client( Instance of a boto3 client for Parameters feature (e.g., ssm, appconfig, secretsmanager, etc.) """ if client is not None: + user_agent.register_feature_to_client(client, "parameters") return client session = session or boto3.Session() config = config or Config() - return session.client(service_name=service_name, config=config) + client_to_return = session.client(service_name=service_name, config=config) + user_agent.register_feature_to_client(client_to_return, "parameters") + return client_to_return # maintenance: change DynamoDBServiceResource type to ParameterResourceClients when we expand @staticmethod @@ -288,11 +291,14 @@ def _build_boto3_resource_client( Instance of a boto3 resource client for Parameters feature (e.g., dynamodb, etc.) """ if client is not None: + user_agent.register_feature_to_client(client, "parameters") return client session = session or boto3.Session() config = config or Config() - return session.resource(service_name=service_name, config=config, endpoint_url=endpoint_url) + client_to_return = session.resource(service_name=service_name, config=config, endpoint_url=endpoint_url) + user_agent.register_feature_to_client(client_to_return, "parameters") + return client_to_return def get_transform_method(value: str, transform: TransformOptions = None) -> Callable[..., Any]: From dc8d1ada16bf06404b7a17c1a61513a2068898a2 Mon Sep 17 00:00:00 2001 From: Roger Zhang Date: Mon, 15 May 2023 15:11:53 -0700 Subject: [PATCH 03/17] Changes for Heitor's review - rename module to `user_agent` - add feature name "parameters", "idempotency" to user-agent --- aws_lambda_powertools/shared/user_agent.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index 9ec44c7a78e..bedd67cf860 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -5,10 +5,10 @@ pt_version = version("aws-lambda-powertools") try: - import botocore.handlers + from botocore import handlers except ImportError: # if botocore failed to import, user might be using custom runtime. We can ignore here - botocore = None + handlers = None ENV_KEY = "AWS_EXECUTION_ENV" @@ -65,6 +65,6 @@ def register_feature_to_client(client, feature): # register add_pt_version for all AWS SDK in runtime def inject_user_agent(): - if botocore: + if handlers: # register add_user_agent to BUILTIN_HANDLERS so every aws sdk session will have this event registered - botocore.handlers.BUILTIN_HANDLERS.append((target_sdk_event, _add_pt_version)) + handlers.BUILTIN_HANDLERS.append((target_sdk_event, _add_pt_version)) From 6404ee2100df7b745de7f2a5178967e4217f31c0 Mon Sep 17 00:00:00 2001 From: Roger Zhang Date: Mon, 15 May 2023 15:18:54 -0700 Subject: [PATCH 04/17] Changes for Heitor's review - rename module to `user_agent` - add feature name "parameters", "idempotency" to user-agent --- aws_lambda_powertools/shared/user_agent.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index bedd67cf860..53814d1db89 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -1,3 +1,4 @@ +import logging import os from importlib_metadata import version @@ -10,6 +11,7 @@ # if botocore failed to import, user might be using custom runtime. We can ignore here handlers = None +logger = logging.getLogger(__name__) ENV_KEY = "AWS_EXECUTION_ENV" EXEC_ENV = os.environ.get(ENV_KEY, "NA") @@ -55,12 +57,18 @@ def add_pt_feature(request, **kwargs): # add feature user-agent to given sdk session def register_feature_to_session(session, feature): - session.events.register(target_sdk_event, _create_feature_function(feature)) + try: + session.events.register(target_sdk_event, _create_feature_function(feature)) + except AttributeError as e: + logger.debug(f"session passed in doesn't have a event system:{e}") # add feature user-agent to given sdk client def register_feature_to_client(client, feature): - client.meta.events.register(target_sdk_event, _create_feature_function(feature)) + try: + client.meta.events.register(target_sdk_event, _create_feature_function(feature)) + except AttributeError as e: + logger.debug(f"session passed in doesn't have a event system:{e}") # register add_pt_version for all AWS SDK in runtime From b2402e0ca49223667c350855dc2e5c9a13a1b5c2 Mon Sep 17 00:00:00 2001 From: Roger Zhang Date: Tue, 16 May 2023 14:16:12 -0700 Subject: [PATCH 05/17] add patching function for resource add user-agent in streaming --- aws_lambda_powertools/shared/user_agent.py | 32 +++++++------------ .../utilities/parameters/base.py | 4 +-- .../utilities/streaming/_s3_seekable_io.py | 5 +++ 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index 53814d1db89..5a09f6b4921 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -21,11 +21,10 @@ # add user-agent like powertools/2.14.1 EXEC-ENV/AWS_Lambda_python3.9 def _add_pt_version(request, **kwargs): headers = request.headers - if "PT/" not in headers: - # assume we always have a User-Agent. - # Q: do we need to check if field: User-Agent exist in request.headers? - # Q: do we care if User-Agent string exceed 256 characters? - headers["User-Agent"] = f"{headers['User-Agent']} PT/no-op/{pt_version} PTEnv/{EXEC_ENV}" + # assume we always have a User-Agent. + # Q: do we need to check if field: User-Agent exist in request.headers? + # Q: do we care if User-Agent string exceed 256 characters? + headers["User-Agent"] = f"{headers['User-Agent']} PT/no-op/{pt_version} PTEnv/{EXEC_ENV}" # creates the `add_feature_string` function with given feature parameter @@ -34,21 +33,6 @@ def add_pt_feature(request, **kwargs): headers = request.headers # Actually, only one handler can be registered, registering a new one will replace the prev handler # We don't need to replace/detect previous registered user-agent - """ - # replace existing no-op user-agent with feature - if "PT/no-op" in headers["User-Agent"]: - headers["User-Agent"] = headers['User-Agent'].replace("PT/no-op", f"PT/{feature}") - return - # already registered, exit - if f"PT/{feature}/" in headers["User-Agent"]: - return - # other feature registered, append - # Q: do we want this? or replace the original feature? - if "PT/" in headers["User-Agent"]: - headers["User-Agent"] = f"{headers['User-Agent']} PT/{feature}/{pt_version}" - return""" - - # no PT header found, insert new one headers["User-Agent"] = f"{headers['User-Agent']} PT/{feature}/{pt_version} PTEnv/{EXEC_ENV}" # return created function @@ -71,6 +55,14 @@ def register_feature_to_client(client, feature): logger.debug(f"session passed in doesn't have a event system:{e}") +# add feature user-agent to given sdk session.resource +def register_feature_to_resource(resource, feature): + try: + resource.meta.client.meta.events.register(target_sdk_event, _create_feature_function(feature)) + except AttributeError as e: + logger.debug(f"resource passed in doesn't have a event system:{e}") + + # register add_pt_version for all AWS SDK in runtime def inject_user_agent(): if handlers: diff --git a/aws_lambda_powertools/utilities/parameters/base.py b/aws_lambda_powertools/utilities/parameters/base.py index d8c703d6290..d4f1975d81f 100644 --- a/aws_lambda_powertools/utilities/parameters/base.py +++ b/aws_lambda_powertools/utilities/parameters/base.py @@ -291,13 +291,13 @@ def _build_boto3_resource_client( Instance of a boto3 resource client for Parameters feature (e.g., dynamodb, etc.) """ if client is not None: - user_agent.register_feature_to_client(client, "parameters") + user_agent.register_feature_to_resource(client, "parameters") return client session = session or boto3.Session() config = config or Config() client_to_return = session.resource(service_name=service_name, config=config, endpoint_url=endpoint_url) - user_agent.register_feature_to_client(client_to_return, "parameters") + user_agent.register_feature_to_resource(client_to_return, "parameters") return client_to_return diff --git a/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py b/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py index 8e280f3f7d7..f90b38462eb 100644 --- a/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +++ b/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py @@ -15,6 +15,7 @@ import boto3 +from aws_lambda_powertools.shared import user_agent from aws_lambda_powertools.utilities.streaming.compat import PowertoolsStreamingBody if TYPE_CHECKING: @@ -67,6 +68,7 @@ def __init__( self._sdk_options = sdk_options self._sdk_options["Bucket"] = bucket self._sdk_options["Key"] = key + self._user_agent_added = False if version_id is not None: self._sdk_options["VersionId"] = version_id @@ -77,6 +79,9 @@ def s3_client(self) -> "Client": """ if self._s3_client is None: self._s3_client = boto3.client("s3") + if not self._user_agent_added: + user_agent.register_feature_to_client(self._s3_client, "streaming") + self._user_agent_added = True return self._s3_client @property From d1a0128db4b49165091b1abf4e0f95919d97fdcd Mon Sep 17 00:00:00 2001 From: Roger Zhang Date: Wed, 17 May 2023 10:05:05 -0700 Subject: [PATCH 06/17] add importlib-metadata in poetry --- poetry.lock | 10 +++++----- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1de16cbac05..20a8c9b18a6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. [[package]] name = "anyio" @@ -1093,7 +1093,7 @@ files = [ name = "importlib-metadata" version = "6.6.0" description = "Read metadata from Python packages" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3056,7 +3056,7 @@ requests = ">=2.0,<3.0" name = "zipp" version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3069,7 +3069,7 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [extras] -all = ["pydantic", "aws-xray-sdk", "fastjsonschema"] +all = ["aws-xray-sdk", "fastjsonschema", "pydantic"] aws-sdk = ["boto3"] parser = ["pydantic"] tracer = ["aws-xray-sdk"] @@ -3078,4 +3078,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = "^3.7.4" -content-hash = "80772072960025e2e1c804a7d8cc2cc2afe024aba13a30f16af022a0258072f9" +content-hash = "f8c392dcfc5f0be57e55c43de61b63cb72712fa119be60153af8a134a1bcfe59" diff --git a/pyproject.toml b/pyproject.toml index 56844398d85..946a92d23a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ fastjsonschema = { version = "^2.14.5", optional = true } pydantic = { version = "^1.8.2", optional = true } boto3 = { version = "^1.20.32", optional = true } typing-extensions = "^4.4.0" +importlib-metadata = "^6.6.0" [tool.poetry.dev-dependencies] coverage = {extras = ["toml"], version = "^7.2"} @@ -86,7 +87,6 @@ mkdocs-material = "^9.1.12" filelock = "^3.12.0" checksumdir = "^1.2.0" mypy-boto3-appconfigdata = "^1.26.70" -importlib-metadata = "^6.6" ijson = "^3.2.0" typed-ast = { version = "^1.5.4", python = "< 3.8"} hvac = "^1.1.0" From 5c7a5a29f2f29f56647a8ca4471da2ab13fd3bc4 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 17 May 2023 23:12:18 +0100 Subject: [PATCH 07/17] user-agent: fixing small things --- aws_lambda_powertools/shared/user_agent.py | 52 +++++++++++++--------- poetry.lock | 4 +- pyproject.toml | 2 +- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index 5a09f6b4921..b6ea14a76c5 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -1,9 +1,15 @@ import logging import os +from sys import version_info -from importlib_metadata import version +# Since Python 3.8 there is a built-in. Remove this when support for Python3.7 is dropped +# See https://docs.python.org/3/library/importlib.metadata.html +if version_info.major == 3 and version_info.minor == 7: + from importlib_metadata import version +else: + from importlib.metadata import version -pt_version = version("aws-lambda-powertools") +powertools_version = version("aws-lambda-powertools") try: from botocore import handlers @@ -13,52 +19,54 @@ logger = logging.getLogger(__name__) -ENV_KEY = "AWS_EXECUTION_ENV" -EXEC_ENV = os.environ.get(ENV_KEY, "NA") -target_sdk_event = "request-created" +EXEC_ENV = os.environ.get("AWS_EXECUTION_ENV", "NA") +TARGET_SDK_EVENT = "request-created" +FEATURE_PREFIX = "PT" -# add user-agent like powertools/2.14.1 EXEC-ENV/AWS_Lambda_python3.9 -def _add_pt_version(request, **kwargs): - headers = request.headers - # assume we always have a User-Agent. - # Q: do we need to check if field: User-Agent exist in request.headers? - # Q: do we care if User-Agent string exceed 256 characters? - headers["User-Agent"] = f"{headers['User-Agent']} PT/no-op/{pt_version} PTEnv/{EXEC_ENV}" +# In case of no Powertools utility: PT/no-op/2.15.0 PTEnv/AWS_Lambda_python3.9 +def _add_powertools_version(request, **kwargs): + try: + headers = request.headers + headers["User-Agent"] = f"{headers['User-Agent']} {FEATURE_PREFIX}/no-op/{powertools_version} PTEnv/{EXEC_ENV}" + except Exception: + logger.debug("Missing header User-Agent") # creates the `add_feature_string` function with given feature parameter def _create_feature_function(feature): - def add_pt_feature(request, **kwargs): + def add_powertools_feature(request, **kwargs): headers = request.headers # Actually, only one handler can be registered, registering a new one will replace the prev handler # We don't need to replace/detect previous registered user-agent - headers["User-Agent"] = f"{headers['User-Agent']} PT/{feature}/{pt_version} PTEnv/{EXEC_ENV}" + headers[ + "User-Agent" + ] = f"{headers['User-Agent']} {FEATURE_PREFIX}/{feature}/{powertools_version} PTEnv/{EXEC_ENV}" # return created function - return add_pt_feature + return add_powertools_feature -# add feature user-agent to given sdk session +# add feature user-agent to given sdk boto3.session def register_feature_to_session(session, feature): try: - session.events.register(target_sdk_event, _create_feature_function(feature)) + session.events.register(TARGET_SDK_EVENT, _create_feature_function(feature)) except AttributeError as e: logger.debug(f"session passed in doesn't have a event system:{e}") -# add feature user-agent to given sdk client +# add feature user-agent to given sdk boto3.client def register_feature_to_client(client, feature): try: - client.meta.events.register(target_sdk_event, _create_feature_function(feature)) + client.meta.events.register(TARGET_SDK_EVENT, _create_feature_function(feature)) except AttributeError as e: logger.debug(f"session passed in doesn't have a event system:{e}") -# add feature user-agent to given sdk session.resource +# add feature user-agent to given sdk boto3.resource def register_feature_to_resource(resource, feature): try: - resource.meta.client.meta.events.register(target_sdk_event, _create_feature_function(feature)) + resource.meta.client.meta.events.register(TARGET_SDK_EVENT, _create_feature_function(feature)) except AttributeError as e: logger.debug(f"resource passed in doesn't have a event system:{e}") @@ -67,4 +75,4 @@ def register_feature_to_resource(resource, feature): def inject_user_agent(): if handlers: # register add_user_agent to BUILTIN_HANDLERS so every aws sdk session will have this event registered - handlers.BUILTIN_HANDLERS.append((target_sdk_event, _add_pt_version)) + handlers.BUILTIN_HANDLERS.append((TARGET_SDK_EVENT, _add_powertools_version)) diff --git a/poetry.lock b/poetry.lock index 20a8c9b18a6..6e9ae2d5372 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. [[package]] name = "anyio" @@ -3078,4 +3078,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = "^3.7.4" -content-hash = "f8c392dcfc5f0be57e55c43de61b63cb72712fa119be60153af8a134a1bcfe59" +content-hash = "de1750fc69b07f6858d1d09307b6b43574167a1b16796ba01abe1f91cdaae7a8" diff --git a/pyproject.toml b/pyproject.toml index 946a92d23a9..2219303e5cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ fastjsonschema = { version = "^2.14.5", optional = true } pydantic = { version = "^1.8.2", optional = true } boto3 = { version = "^1.20.32", optional = true } typing-extensions = "^4.4.0" -importlib-metadata = "^6.6.0" +importlib-metadata = {version = "^6.6.0", python = "<3.8"} [tool.poetry.dev-dependencies] coverage = {extras = ["toml"], version = "^7.2"} From 17d6df1dcd12cb34476a754d7972a485a2d238a2 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 17 May 2023 23:18:38 +0100 Subject: [PATCH 08/17] fix poetry --- poetry.lock | 381 ++++++++++++++++++++++++++-------------------------- 1 file changed, 192 insertions(+), 189 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6e9ae2d5372..a09e2c8d9eb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -24,37 +24,40 @@ trio = ["trio (>=0.16,<0.22)"] [[package]] name = "attrs" -version = "22.2.0" +version = "23.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + [package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "aws-cdk-asset-awscli-v1" -version = "2.2.145" +version = "2.2.177" description = "A library that contains the AWS CLI for use in Lambda Layers" category = "dev" optional = false python-versions = "~=3.7" files = [ - {file = "aws-cdk.asset-awscli-v1-2.2.145.tar.gz", hash = "sha256:74098ca36a0e3d0655c98638174c77f1c6599f1b16fb4e4387721a955b431aac"}, - {file = "aws_cdk.asset_awscli_v1-2.2.145-py3-none-any.whl", hash = "sha256:bf736e03cff78b6bad51777cfa204985368975d5b0139434ef6d7e069b757bb7"}, + {file = "aws-cdk.asset-awscli-v1-2.2.177.tar.gz", hash = "sha256:cb2357f445830da36f365f4152aac82803e78c7c8f75a537c409c3210ad77992"}, + {file = "aws_cdk.asset_awscli_v1-2.2.177-py3-none-any.whl", hash = "sha256:0ff8e146ad5f1a91332476a7a37961e291367310ecc6b55fd557e2f5662a0f5b"}, ] [package.dependencies] -jsii = ">=1.80.0,<2.0.0" +jsii = ">=1.81.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<2.14.0" @@ -77,98 +80,98 @@ typeguard = ">=2.13.3,<2.14.0" [[package]] name = "aws-cdk-asset-node-proxy-agent-v5" -version = "2.0.120" +version = "2.0.148" description = "@aws-cdk/asset-node-proxy-agent-v5" category = "dev" optional = false python-versions = "~=3.7" files = [ - {file = "aws-cdk.asset-node-proxy-agent-v5-2.0.120.tar.gz", hash = "sha256:5c885003685fe86aafe1611a4f1310f1cda62b27036e3528e1fe4e16ba3a3ac4"}, - {file = "aws_cdk.asset_node_proxy_agent_v5-2.0.120-py3-none-any.whl", hash = "sha256:6264375b03fa62a3a2e67e360517276874ec814dc4367d7c9eff55a4e8dff155"}, + {file = "aws-cdk.asset-node-proxy-agent-v5-2.0.148.tar.gz", hash = "sha256:52c3441c3f4662b1670028fe1aee1016ff387efe4d8ea1df1bba9fc9672f3d52"}, + {file = "aws_cdk.asset_node_proxy_agent_v5-2.0.148-py3-none-any.whl", hash = "sha256:2581c27ed140b7b00e80a69f7b6b7d517cfaa478aa654dcd9b3954bd3b4502ca"}, ] [package.dependencies] -jsii = ">=1.80.0,<2.0.0" +jsii = ">=1.81.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<2.14.0" [[package]] name = "aws-cdk-aws-apigatewayv2-alpha" -version = "2.75.1a0" +version = "2.79.1a0" description = "The CDK Construct Library for AWS::APIGatewayv2" category = "dev" optional = false python-versions = "~=3.7" files = [ - {file = "aws-cdk.aws-apigatewayv2-alpha-2.75.1a0.tar.gz", hash = "sha256:ddfa9b4ad8c9a4968fd637081ed732b0e099ccedb4d7ccd7c1526bff7f036b93"}, - {file = "aws_cdk.aws_apigatewayv2_alpha-2.75.1a0-py3-none-any.whl", hash = "sha256:cf1920e37a60265286c0ab50ea78e1e065278f3758c0dde9e79d0811bd7c90d9"}, + {file = "aws-cdk.aws-apigatewayv2-alpha-2.79.1a0.tar.gz", hash = "sha256:414a4c547f56a5f85d5fe5fa391ff07d7e6ae2eb3bbc21d99b1256bcd79aff0b"}, + {file = "aws_cdk.aws_apigatewayv2_alpha-2.79.1a0-py3-none-any.whl", hash = "sha256:5ea3491bb23aa9c03505e97aeacfb8a3ab9589fa8d66b3354f2958cf42db4054"}, ] [package.dependencies] -aws-cdk-lib = "2.75.1" +aws-cdk-lib = "2.79.1" constructs = ">=10.0.0,<11.0.0" -jsii = ">=1.78.1,<2.0.0" +jsii = ">=1.80.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<2.14.0" [[package]] name = "aws-cdk-aws-apigatewayv2-authorizers-alpha" -version = "2.75.1a0" +version = "2.79.1a0" description = "Authorizers for AWS APIGateway V2" category = "dev" optional = false python-versions = "~=3.7" files = [ - {file = "aws-cdk.aws-apigatewayv2-authorizers-alpha-2.75.1a0.tar.gz", hash = "sha256:524918a1aebf29c72f345162079bbb34cca87213480dc106931444a37496c8fe"}, - {file = "aws_cdk.aws_apigatewayv2_authorizers_alpha-2.75.1a0-py3-none-any.whl", hash = "sha256:493ea5f7e981c08dd772e50c95158aa7223b395a0668b5bba05b8c0ccb694f5a"}, + {file = "aws-cdk.aws-apigatewayv2-authorizers-alpha-2.79.1a0.tar.gz", hash = "sha256:e07efae363ba7afcb23d961a46e949f3ed3ed1658f625c3aa265ca27bd62bf3c"}, + {file = "aws_cdk.aws_apigatewayv2_authorizers_alpha-2.79.1a0-py3-none-any.whl", hash = "sha256:0606a3abd3dbfa7a994a710e4beb2614ce331f7227e3beb1807975cf62db88d6"}, ] [package.dependencies] -"aws-cdk.aws-apigatewayv2-alpha" = "2.75.1.a0" -aws-cdk-lib = "2.75.1" +"aws-cdk.aws-apigatewayv2-alpha" = "2.79.1.a0" +aws-cdk-lib = "2.79.1" constructs = ">=10.0.0,<11.0.0" -jsii = ">=1.78.1,<2.0.0" +jsii = ">=1.80.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<2.14.0" [[package]] name = "aws-cdk-aws-apigatewayv2-integrations-alpha" -version = "2.75.1a0" +version = "2.79.1a0" description = "Integrations for AWS APIGateway V2" category = "dev" optional = false python-versions = "~=3.7" files = [ - {file = "aws-cdk.aws-apigatewayv2-integrations-alpha-2.75.1a0.tar.gz", hash = "sha256:bfc11f80ad38b092c2ce861579b1bfa3b841773c85fb79c3ed548170f80cc115"}, - {file = "aws_cdk.aws_apigatewayv2_integrations_alpha-2.75.1a0-py3-none-any.whl", hash = "sha256:f536d663a1fffb55e0785151d2def5a94f1b914a59463824e69ca185b6018f4c"}, + {file = "aws-cdk.aws-apigatewayv2-integrations-alpha-2.79.1a0.tar.gz", hash = "sha256:7fa1cb81940f0a3955e293ea6e993c55b615d6bdd9ba150805bf7ad867f438f9"}, + {file = "aws_cdk.aws_apigatewayv2_integrations_alpha-2.79.1a0-py3-none-any.whl", hash = "sha256:4b42cf713187f41ff4d5acf59839a74c922eabab418f5aea329630a791c32d4f"}, ] [package.dependencies] -"aws-cdk.aws-apigatewayv2-alpha" = "2.75.1.a0" -aws-cdk-lib = "2.75.1" +"aws-cdk.aws-apigatewayv2-alpha" = "2.79.1.a0" +aws-cdk-lib = "2.79.1" constructs = ">=10.0.0,<11.0.0" -jsii = ">=1.78.1,<2.0.0" +jsii = ">=1.80.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<2.14.0" [[package]] name = "aws-cdk-lib" -version = "2.75.1" +version = "2.79.1" description = "Version 2 of the AWS Cloud Development Kit library" category = "dev" optional = false python-versions = "~=3.7" files = [ - {file = "aws-cdk-lib-2.75.1.tar.gz", hash = "sha256:7b9c285ea9681e59c215e2ad3917b046ef47c48d83bc9c555b425a37df30d34d"}, - {file = "aws_cdk_lib-2.75.1-py3-none-any.whl", hash = "sha256:1a4a61ce69280f522b7cee7b910284ab01ef091af220e7e0fad8433fd58e4325"}, + {file = "aws-cdk-lib-2.79.1.tar.gz", hash = "sha256:7d88118827ed42025c7b661547b38c54b89afef2cd54214459df51104a1034c3"}, + {file = "aws_cdk_lib-2.79.1-py3-none-any.whl", hash = "sha256:89f51117cc9c2cb2561605fdd5641ceb705ebe0185276dab799193783a70123b"}, ] [package.dependencies] -"aws-cdk.asset-awscli-v1" = ">=2.2.97,<3.0.0" +"aws-cdk.asset-awscli-v1" = ">=2.2.165,<3.0.0" "aws-cdk.asset-kubectl-v20" = ">=2.1.1,<3.0.0" -"aws-cdk.asset-node-proxy-agent-v5" = ">=2.0.77,<3.0.0" +"aws-cdk.asset-node-proxy-agent-v5" = ">=2.0.139,<3.0.0" constructs = ">=10.0.0,<11.0.0" -jsii = ">=1.78.1,<2.0.0" +jsii = ">=1.80.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<2.14.0" @@ -189,14 +192,14 @@ requests = ">=0.14.0" [[package]] name = "aws-sam-translator" -version = "1.66.0" +version = "1.67.0" description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates" category = "dev" optional = false python-versions = ">=3.7, <=4.0, !=4.0" files = [ - {file = "aws-sam-translator-1.66.0.tar.gz", hash = "sha256:0b9e9684ea0384fd84f5e722f7fea61896c514b95d3403aa782b69acd485dbbf"}, - {file = "aws_sam_translator-1.66.0-py3-none-any.whl", hash = "sha256:dc4f38cd7ce2a4875d943bf10ba0745901a3a7b7fec1e40b8d13072641630c58"}, + {file = "aws-sam-translator-1.67.0.tar.gz", hash = "sha256:207a216bec1ac3323b58e15ed7231c0f476b1a1a10892c9a6b22784041d32506"}, + {file = "aws_sam_translator-1.67.0-py3-none-any.whl", hash = "sha256:291fed2f08bad7f38368f4ee8609fce64dfe5c6b1872bb24b93cda1880bc9f7d"}, ] [package.dependencies] @@ -206,7 +209,7 @@ pydantic = ">=1.8,<2.0" typing-extensions = ">=4.4,<5" [package.extras] -dev = ["black (==23.1.0)", "boto3 (>=1.23,<2)", "boto3-stubs[appconfig,serverlessrepo] (>=1.19.5,<2.0.0)", "coverage (>=5.3,<8)", "dateparser (>=1.1,<2.0)", "mypy (>=1.1.0,<1.2.0)", "parameterized (>=0.7,<1.0)", "pytest (>=6.2,<8)", "pytest-cov (>=2.10,<5)", "pytest-env (>=0.6,<1)", "pytest-rerunfailures (>=9.1,<12)", "pytest-xdist (>=2.5,<4)", "pyyaml (>=6.0,<7.0)", "requests (>=2.28,<3.0)", "ruamel.yaml (==0.17.21)", "ruff (==0.0.261)", "tenacity (>=8.0,<9.0)", "types-PyYAML (>=6.0,<7.0)", "types-jsonschema (>=3.2,<4.0)"] +dev = ["black (==23.1.0)", "boto3 (>=1.23,<2)", "boto3-stubs[appconfig,serverlessrepo] (>=1.19.5,<2.0.0)", "coverage (>=5.3,<8)", "dateparser (>=1.1,<2.0)", "importlib-metadata", "mypy (>=1.1.0,<1.2.0)", "parameterized (>=0.7,<1.0)", "pytest (>=6.2,<8)", "pytest-cov (>=2.10,<5)", "pytest-env (>=0.6,<1)", "pytest-rerunfailures (>=9.1,<12)", "pytest-xdist (>=2.5,<4)", "pyyaml (>=6.0,<7.0)", "requests (>=2.28,<3.0)", "ruamel.yaml (==0.17.21)", "ruff (==0.0.261)", "tenacity (>=8.0,<9.0)", "types-PyYAML (>=6.0,<7.0)", "types-jsonschema (>=3.2,<4.0)"] [[package]] name = "aws-xray-sdk" @@ -301,18 +304,18 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.26.115" +version = "1.26.135" description = "The AWS SDK for Python" category = "main" optional = false python-versions = ">= 3.7" files = [ - {file = "boto3-1.26.115-py3-none-any.whl", hash = "sha256:deb53ad15ff0e75ae0be6d7115a2d34e4bafb0541484485f0feb61dabdfb5513"}, - {file = "boto3-1.26.115.tar.gz", hash = "sha256:2272a060005bf8299f7342cbf1344304eb44b7060cddba6784f676e3bc737bb8"}, + {file = "boto3-1.26.135-py3-none-any.whl", hash = "sha256:ba7ca9215a1026620741273da10d0d3cceb9f7649f7c101e616a287071826f9d"}, + {file = "boto3-1.26.135.tar.gz", hash = "sha256:23523d5d6aa51bba2461d67f6eb458d83b6a52d18e3d953b1ce71209b66462ec"}, ] [package.dependencies] -botocore = ">=1.29.115,<1.30.0" +botocore = ">=1.29.135,<1.30.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.6.0,<0.7.0" @@ -321,14 +324,14 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.29.115" +version = "1.29.135" description = "Low-level, data-driven core of boto 3." category = "main" optional = false python-versions = ">= 3.7" files = [ - {file = "botocore-1.29.115-py3-none-any.whl", hash = "sha256:dff327977d7c9f98f2dc54b51b8f70326952dd50ae23b885fdfa8bfeec014b76"}, - {file = "botocore-1.29.115.tar.gz", hash = "sha256:58eee8cf8f4f3e515df29f6dc535dd86ed3f4cea40999c5bc74640ff40bdc71f"}, + {file = "botocore-1.29.135-py3-none-any.whl", hash = "sha256:06502a4473924ef60ac0de908385a5afab9caee6c5b49cf6a330fab0d76ddf5f"}, + {file = "botocore-1.29.135.tar.gz", hash = "sha256:0c61d4e5e04fe5329fa65da6b31492ef9d0d5174d72fc2af69de2ed0f87804ca"}, ] [package.dependencies] @@ -358,14 +361,14 @@ typing_extensions = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] [[package]] @@ -519,18 +522,18 @@ files = [ [[package]] name = "constructs" -version = "10.2.1" +version = "10.2.26" description = "A programming model for software-defined state" category = "dev" optional = false python-versions = "~=3.7" files = [ - {file = "constructs-10.2.1-py3-none-any.whl", hash = "sha256:398d32c65d2945949195dcc642bc7bd7b7552758d274fa0e1616ca0069d01a25"}, - {file = "constructs-10.2.1.tar.gz", hash = "sha256:36e86d1092edd1f2ee8895d21c49bdabf81e62deb5f18329b275ee8ec1f67aa3"}, + {file = "constructs-10.2.26-py3-none-any.whl", hash = "sha256:4841de26c2150484ed19ea7762211a01bdeee22d44113671c1089793f6d041c5"}, + {file = "constructs-10.2.26.tar.gz", hash = "sha256:6b0a40b5d587472053aade2fc9616f7fa3b6c47be090ccbc87f6415e6af27b2c"}, ] [package.dependencies] -jsii = ">=1.80.0,<2.0.0" +jsii = ">=1.81.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<2.14.0" @@ -929,14 +932,14 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "httpcore" -version = "0.17.0" +version = "0.17.1" description = "A minimal low-level HTTP client." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "httpcore-0.17.0-py3-none-any.whl", hash = "sha256:0fdfea45e94f0c9fd96eab9286077f9ff788dd186635ae61b312693e4d943599"}, - {file = "httpcore-0.17.0.tar.gz", hash = "sha256:cc045a3241afbf60ce056202301b4d8b6af08845e3294055eb26b09913ef903c"}, + {file = "httpcore-0.17.1-py3-none-any.whl", hash = "sha256:628e768aaeec1f7effdc6408ba1c3cdbd7487c1fc570f7d66844ec4f003e1ca4"}, + {file = "httpcore-0.17.1.tar.gz", hash = "sha256:caf508597c525f9b8bfff187e270666309f63115af30f7d68b16143a403c8356"}, ] [package.dependencies] @@ -1208,18 +1211,18 @@ pbr = "*" [[package]] name = "jsii" -version = "1.80.0" +version = "1.81.0" description = "Python client for jsii runtime" category = "dev" optional = false python-versions = "~=3.7" files = [ - {file = "jsii-1.80.0-py3-none-any.whl", hash = "sha256:ea3cace063f6a47cdf0a74c929618d779efab426fedb7692a8ac1b9b29797f8c"}, - {file = "jsii-1.80.0.tar.gz", hash = "sha256:4da63ab99f2696cd063574460c94221f0a7de9d345e71dfb19dfbcecf8ca8355"}, + {file = "jsii-1.81.0-py3-none-any.whl", hash = "sha256:6d12cd881053bafbac19d2a28fc616497479739784e017534e4cf128ff977b62"}, + {file = "jsii-1.81.0.tar.gz", hash = "sha256:585f6bedd9b586f48ce058451d24f362ee52936179987dd897a100f5355f228f"}, ] [package.dependencies] -attrs = ">=21.2,<23.0" +attrs = ">=21.2,<24.0" cattrs = ">=1.8,<22.3" importlib-resources = ">=5.2.0" publication = ">=0.0.3" @@ -1528,14 +1531,14 @@ test = ["coverage", "flake8 (>=3.0)", "shtab"] [[package]] name = "mkdocs" -version = "1.4.2" +version = "1.4.3" description = "Project documentation with Markdown." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "mkdocs-1.4.2-py3-none-any.whl", hash = "sha256:c8856a832c1e56702577023cd64cc5f84948280c1c0fcc6af4cd39006ea6aa8c"}, - {file = "mkdocs-1.4.2.tar.gz", hash = "sha256:8947af423a6d0facf41ea1195b8e1e8c85ad94ac95ae307fe11232e0424b11c5"}, + {file = "mkdocs-1.4.3-py3-none-any.whl", hash = "sha256:6ee46d309bda331aac915cd24aab882c179a933bd9e77b80ce7d2eaaa3f689dd"}, + {file = "mkdocs-1.4.3.tar.gz", hash = "sha256:5955093bbd4dd2e9403c5afaf57324ad8b04f16886512a3ee6ef828956481c57"}, ] [package.dependencies] @@ -1574,14 +1577,14 @@ mkdocs = ">=0.17" [[package]] name = "mkdocs-material" -version = "9.1.12" +version = "9.1.13" description = "Documentation that simply works" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "mkdocs_material-9.1.12-py3-none-any.whl", hash = "sha256:68c57d95d10104179c8c3ce9a88ee9d2322a5145b3d0f1f38ff686253fb5ec98"}, - {file = "mkdocs_material-9.1.12.tar.gz", hash = "sha256:d4ebe9b5031ce63a265c19fb5eab4d27ea4edadb05de206372e831b2b7570fb5"}, + {file = "mkdocs_material-9.1.13-py3-none-any.whl", hash = "sha256:5705cf8cb6c47c747606bd914bb6c01993ff141295cd259475559a1f09f07d5d"}, + {file = "mkdocs_material-9.1.13.tar.gz", hash = "sha256:9102e7604d73e507021847601b0a8b4fe9035422788390183f464fa3b30dd508"}, ] [package.dependencies] @@ -1795,14 +1798,14 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.9\""} [[package]] name = "mypy-boto3-secretsmanager" -version = "1.26.116" -description = "Type annotations for boto3.SecretsManager 1.26.116 service generated with mypy-boto3-builder 7.14.5" +version = "1.26.135" +description = "Type annotations for boto3.SecretsManager 1.26.135 service generated with mypy-boto3-builder 7.14.5" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "mypy-boto3-secretsmanager-1.26.116.tar.gz", hash = "sha256:d95bbef7fdd39876fe42799ed15abd83eee80b612734bd83513b8ce720e7ceec"}, - {file = "mypy_boto3_secretsmanager-1.26.116-py3-none-any.whl", hash = "sha256:3d2f4c42945447e6abdd18289c159a8d5b0e45ccc32067915863e93e38cd9c49"}, + {file = "mypy-boto3-secretsmanager-1.26.135.tar.gz", hash = "sha256:cf523d3e4f6729e244e24d97c692855883e69fa270d11f5021a293fb2aa483e8"}, + {file = "mypy_boto3_secretsmanager-1.26.135-py3-none-any.whl", hash = "sha256:15cf8d8a16eb0a49984ef9f19821a1d2b97bf1e6b56c703f27973a27b32aef4c"}, ] [package.dependencies] @@ -1935,22 +1938,22 @@ files = [ [[package]] name = "platformdirs" -version = "3.2.0" +version = "3.5.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, - {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, + {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, + {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, ] [package.dependencies] typing-extensions = {version = ">=4.5", markers = "python_version < \"3.8\""} [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -2136,14 +2139,14 @@ files = [ [[package]] name = "pymdown-extensions" -version = "10.0" +version = "10.0.1" description = "Extension pack for Python Markdown." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pymdown_extensions-10.0-py3-none-any.whl", hash = "sha256:e6cbe8ace7d8feda30bc4fd6a21a073893a9a0e90c373e92d69ce5b653051f55"}, - {file = "pymdown_extensions-10.0.tar.gz", hash = "sha256:9a77955e63528c2ee98073a1fb3207c1a45607bc74a34ef21acd098f46c3aa8a"}, + {file = "pymdown_extensions-10.0.1-py3-none-any.whl", hash = "sha256:ae66d84013c5d027ce055693e09a4628b67e9dec5bce05727e45b0918e36f274"}, + {file = "pymdown_extensions-10.0.1.tar.gz", hash = "sha256:b44e1093a43b8a975eae17b03c3a77aad4681b3b56fce60ce746dbef1944c8cb"}, ] [package.dependencies] @@ -2467,119 +2470,119 @@ mando = ">=0.6,<0.7" [[package]] name = "regex" -version = "2022.10.31" +version = "2023.5.5" description = "Alternative regular expression module, to replace re." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"}, - {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0e5af9a9effb88535a472e19169e09ce750c3d442fb222254a276d77808620b"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d03fe67b2325cb3f09be029fd5da8df9e6974f0cde2c2ac6a79d2634e791dd57"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9d0b68ac1743964755ae2d89772c7e6fb0118acd4d0b7464eaf3921c6b49dd4"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a45b6514861916c429e6059a55cf7db74670eaed2052a648e3e4d04f070e001"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b0886885f7323beea6f552c28bff62cbe0983b9fbb94126531693ea6c5ebb90"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5aefb84a301327ad115e9d346c8e2760009131d9d4b4c6b213648d02e2abe144"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:702d8fc6f25bbf412ee706bd73019da5e44a8400861dfff7ff31eb5b4a1276dc"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a3c1ebd4ed8e76e886507c9eddb1a891673686c813adf889b864a17fafcf6d66"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:50921c140561d3db2ab9f5b11c5184846cde686bb5a9dc64cae442926e86f3af"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7db345956ecce0c99b97b042b4ca7326feeec6b75facd8390af73b18e2650ffc"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"}, - {file = "regex-2022.10.31-cp310-cp310-win32.whl", hash = "sha256:44136355e2f5e06bf6b23d337a75386371ba742ffa771440b85bed367c1318d1"}, - {file = "regex-2022.10.31-cp310-cp310-win_amd64.whl", hash = "sha256:bfff48c7bd23c6e2aec6454aaf6edc44444b229e94743b34bdcdda2e35126cf5"}, - {file = "regex-2022.10.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b4b1fe58cd102d75ef0552cf17242705ce0759f9695334a56644ad2d83903fe"}, - {file = "regex-2022.10.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:542e3e306d1669b25936b64917285cdffcd4f5c6f0247636fec037187bd93542"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c27cc1e4b197092e50ddbf0118c788d9977f3f8f35bfbbd3e76c1846a3443df7"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e38472739028e5f2c3a4aded0ab7eadc447f0d84f310c7a8bb697ec417229e"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76c598ca73ec73a2f568e2a72ba46c3b6c8690ad9a07092b18e48ceb936e9f0c"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28d3309ebd6d6b2cf82969b5179bed5fefe6142c70f354ece94324fa11bf6a1"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9af69f6746120998cd9c355e9c3c6aec7dff70d47247188feb4f829502be8ab4"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a5f9505efd574d1e5b4a76ac9dd92a12acb2b309551e9aa874c13c11caefbe4f"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5ff525698de226c0ca743bfa71fc6b378cda2ddcf0d22d7c37b1cc925c9650a5"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe7fda2fe7c8890d454f2cbc91d6c01baf206fbc96d89a80241a02985118c0c"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2cdc55ca07b4e70dda898d2ab7150ecf17c990076d3acd7a5f3b25cb23a69f1c"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:44a6c2f6374e0033873e9ed577a54a3602b4f609867794c1a3ebba65e4c93ee7"}, - {file = "regex-2022.10.31-cp311-cp311-win32.whl", hash = "sha256:d8716f82502997b3d0895d1c64c3b834181b1eaca28f3f6336a71777e437c2af"}, - {file = "regex-2022.10.31-cp311-cp311-win_amd64.whl", hash = "sha256:61edbca89aa3f5ef7ecac8c23d975fe7261c12665f1d90a6b1af527bba86ce61"}, - {file = "regex-2022.10.31-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a069c8483466806ab94ea9068c34b200b8bfc66b6762f45a831c4baaa9e8cdd"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26166acf62f731f50bdd885b04b38828436d74e8e362bfcb8df221d868b5d9b"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac741bf78b9bb432e2d314439275235f41656e189856b11fb4e774d9f7246d81"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75f591b2055523fc02a4bbe598aa867df9e953255f0b7f7715d2a36a9c30065c"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bddd61d2a3261f025ad0f9ee2586988c6a00c780a2fb0a92cea2aa702c54"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef4163770525257876f10e8ece1cf25b71468316f61451ded1a6f44273eedeb5"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7b280948d00bd3973c1998f92e22aa3ecb76682e3a4255f33e1020bd32adf443"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d0213671691e341f6849bf33cd9fad21f7b1cb88b89e024f33370733fec58742"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:22e7ebc231d28393dfdc19b185d97e14a0f178bedd78e85aad660e93b646604e"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad241da7fac963d7573cc67a064c57c58766b62a9a20c452ca1f21050868dfa"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:586b36ebda81e6c1a9c5a5d0bfdc236399ba6595e1397842fd4a45648c30f35e"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0653d012b3bf45f194e5e6a41df9258811ac8fc395579fa82958a8b76286bea4"}, - {file = "regex-2022.10.31-cp36-cp36m-win32.whl", hash = "sha256:144486e029793a733e43b2e37df16a16df4ceb62102636ff3db6033994711066"}, - {file = "regex-2022.10.31-cp36-cp36m-win_amd64.whl", hash = "sha256:c14b63c9d7bab795d17392c7c1f9aaabbffd4cf4387725a0ac69109fb3b550c6"}, - {file = "regex-2022.10.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4cac3405d8dda8bc6ed499557625585544dd5cbf32072dcc72b5a176cb1271c8"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23cbb932cc53a86ebde0fb72e7e645f9a5eec1a5af7aa9ce333e46286caef783"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74bcab50a13960f2a610cdcd066e25f1fd59e23b69637c92ad470784a51b1347"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d680ef3e4d405f36f0d6d1ea54e740366f061645930072d39bca16a10d8c93"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6910b56b700bea7be82c54ddf2e0ed792a577dfaa4a76b9af07d550af435c6"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:659175b2144d199560d99a8d13b2228b85e6019b6e09e556209dfb8c37b78a11"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ddf14031a3882f684b8642cb74eea3af93a2be68893901b2b387c5fd92a03ec"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b683e5fd7f74fb66e89a1ed16076dbab3f8e9f34c18b1979ded614fe10cdc4d9"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2bde29cc44fa81c0a0c8686992c3080b37c488df167a371500b2a43ce9f026d1"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4919899577ba37f505aaebdf6e7dc812d55e8f097331312db7f1aab18767cce8"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:9c94f7cc91ab16b36ba5ce476f1904c91d6c92441f01cd61a8e2729442d6fcf5"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae1e96785696b543394a4e3f15f3f225d44f3c55dafe3f206493031419fedf95"}, - {file = "regex-2022.10.31-cp37-cp37m-win32.whl", hash = "sha256:c670f4773f2f6f1957ff8a3962c7dd12e4be54d05839b216cb7fd70b5a1df394"}, - {file = "regex-2022.10.31-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0caeff18b96ea90fc0eb6e3bdb2b10ab5b01a95128dfeccb64a7238decf5f0"}, - {file = "regex-2022.10.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:131d4be09bea7ce2577f9623e415cab287a3c8e0624f778c1d955ec7c281bd4d"}, - {file = "regex-2022.10.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e613a98ead2005c4ce037c7b061f2409a1a4e45099edb0ef3200ee26ed2a69a8"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052b670fafbe30966bbe5d025e90b2a491f85dfe5b2583a163b5e60a85a321ad"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa62a07ac93b7cb6b7d0389d8ef57ffc321d78f60c037b19dfa78d6b17c928ee"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5352bea8a8f84b89d45ccc503f390a6be77917932b1c98c4cdc3565137acc714"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f61c9944f0be2dc2b75689ba409938c14876c19d02f7585af4460b6a21403e"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29c04741b9ae13d1e94cf93fca257730b97ce6ea64cfe1eba11cf9ac4e85afb6"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543883e3496c8b6d58bd036c99486c3c8387c2fc01f7a342b760c1ea3158a318"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7a8b43ee64ca8f4befa2bea4083f7c52c92864d8518244bfa6e88c751fa8fff"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6a9a19bea8495bb419dc5d38c4519567781cd8d571c72efc6aa959473d10221a"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6ffd55b5aedc6f25fd8d9f905c9376ca44fcf768673ffb9d160dd6f409bfda73"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4bdd56ee719a8f751cf5a593476a441c4e56c9b64dc1f0f30902858c4ef8771d"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ca88da1bd78990b536c4a7765f719803eb4f8f9971cc22d6ca965c10a7f2c4c"}, - {file = "regex-2022.10.31-cp38-cp38-win32.whl", hash = "sha256:5a260758454580f11dd8743fa98319bb046037dfab4f7828008909d0aa5292bc"}, - {file = "regex-2022.10.31-cp38-cp38-win_amd64.whl", hash = "sha256:5e6a5567078b3eaed93558842346c9d678e116ab0135e22eb72db8325e90b453"}, - {file = "regex-2022.10.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5217c25229b6a85049416a5c1e6451e9060a1edcf988641e309dbe3ab26d3e49"}, - {file = "regex-2022.10.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bf41b8b0a80708f7e0384519795e80dcb44d7199a35d52c15cc674d10b3081b"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf0da36a212978be2c2e2e2d04bdff46f850108fccc1851332bcae51c8907cc"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d403d781b0e06d2922435ce3b8d2376579f0c217ae491e273bab8d092727d244"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a37d51fa9a00d265cf73f3de3930fa9c41548177ba4f0faf76e61d512c774690"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f781ffedd17b0b834c8731b75cce2639d5a8afe961c1e58ee7f1f20b3af185"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d243b36fbf3d73c25e48014961e83c19c9cc92530516ce3c43050ea6276a2ab7"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:370f6e97d02bf2dd20d7468ce4f38e173a124e769762d00beadec3bc2f4b3bc4"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:597f899f4ed42a38df7b0e46714880fb4e19a25c2f66e5c908805466721760f5"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7dbdce0c534bbf52274b94768b3498abdf675a691fec5f751b6057b3030f34c1"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:22960019a842777a9fa5134c2364efaed5fbf9610ddc5c904bd3a400973b0eb8"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7f5a3ffc731494f1a57bd91c47dc483a1e10048131ffb52d901bfe2beb6102e8"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ef6b5942e6bfc5706301a18a62300c60db9af7f6368042227ccb7eeb22d0892"}, - {file = "regex-2022.10.31-cp39-cp39-win32.whl", hash = "sha256:395161bbdbd04a8333b9ff9763a05e9ceb4fe210e3c7690f5e68cedd3d65d8e1"}, - {file = "regex-2022.10.31-cp39-cp39-win_amd64.whl", hash = "sha256:957403a978e10fb3ca42572a23e6f7badff39aa1ce2f4ade68ee452dc6807692"}, - {file = "regex-2022.10.31.tar.gz", hash = "sha256:a3a98921da9a1bf8457aeee6a551948a83601689e5ecdd736894ea9bbec77e83"}, + {file = "regex-2023.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:48c9ec56579d4ba1c88f42302194b8ae2350265cb60c64b7b9a88dcb7fbde309"}, + {file = "regex-2023.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f4541550459c08fdd6f97aa4e24c6f1932eec780d58a2faa2068253df7d6ff"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e22e4460f0245b468ee645156a4f84d0fc35a12d9ba79bd7d79bdcd2f9629d"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b870b6f632fc74941cadc2a0f3064ed8409e6f8ee226cdfd2a85ae50473aa94"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:171c52e320fe29260da550d81c6b99f6f8402450dc7777ef5ced2e848f3b6f8f"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad5524c2aedaf9aa14ef1bc9327f8abd915699dea457d339bebbe2f0d218f86"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a0f874ee8c0bc820e649c900243c6d1e6dc435b81da1492046716f14f1a2a96"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e645c757183ee0e13f0bbe56508598e2d9cd42b8abc6c0599d53b0d0b8dd1479"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a4c5da39bca4f7979eefcbb36efea04471cd68db2d38fcbb4ee2c6d440699833"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5e3f4468b8c6fd2fd33c218bbd0a1559e6a6fcf185af8bb0cc43f3b5bfb7d636"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:59e4b729eae1a0919f9e4c0fc635fbcc9db59c74ad98d684f4877be3d2607dd6"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ba73a14e9c8f9ac409863543cde3290dba39098fc261f717dc337ea72d3ebad2"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0bbd5dcb19603ab8d2781fac60114fb89aee8494f4505ae7ad141a3314abb1f9"}, + {file = "regex-2023.5.5-cp310-cp310-win32.whl", hash = "sha256:40005cbd383438aecf715a7b47fe1e3dcbc889a36461ed416bdec07e0ef1db66"}, + {file = "regex-2023.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:59597cd6315d3439ed4b074febe84a439c33928dd34396941b4d377692eca810"}, + {file = "regex-2023.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f08276466fedb9e36e5193a96cb944928301152879ec20c2d723d1031cd4ddd"}, + {file = "regex-2023.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cd46f30e758629c3ee91713529cfbe107ac50d27110fdcc326a42ce2acf4dafc"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2910502f718828cecc8beff004917dcf577fc5f8f5dd40ffb1ea7612124547b"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:445d6f4fc3bd9fc2bf0416164454f90acab8858cd5a041403d7a11e3356980e8"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18196c16a584619c7c1d843497c069955d7629ad4a3fdee240eb347f4a2c9dbe"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d430a23b661629661f1fe8395be2004006bc792bb9fc7c53911d661b69dd7e"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72a28979cc667e5f82ef433db009184e7ac277844eea0f7f4d254b789517941d"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f764e4dfafa288e2eba21231f455d209f4709436baeebb05bdecfb5d8ddc3d35"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23d86ad2121b3c4fc78c58f95e19173790e22ac05996df69b84e12da5816cb17"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:690a17db524ee6ac4a27efc5406530dd90e7a7a69d8360235323d0e5dafb8f5b"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1ecf3dcff71f0c0fe3e555201cbe749fa66aae8d18f80d2cc4de8e66df37390a"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:811040d7f3dd9c55eb0d8b00b5dcb7fd9ae1761c454f444fd9f37fe5ec57143a"}, + {file = "regex-2023.5.5-cp311-cp311-win32.whl", hash = "sha256:c8c143a65ce3ca42e54d8e6fcaf465b6b672ed1c6c90022794a802fb93105d22"}, + {file = "regex-2023.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:586a011f77f8a2da4b888774174cd266e69e917a67ba072c7fc0e91878178a80"}, + {file = "regex-2023.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b6365703e8cf1644b82104cdd05270d1a9f043119a168d66c55684b1b557d008"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a56c18f21ac98209da9c54ae3ebb3b6f6e772038681d6cb43b8d53da3b09ee81"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8b942d8b3ce765dbc3b1dad0a944712a89b5de290ce8f72681e22b3c55f3cc8"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:844671c9c1150fcdac46d43198364034b961bd520f2c4fdaabfc7c7d7138a2dd"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2ce65bdeaf0a386bb3b533a28de3994e8e13b464ac15e1e67e4603dd88787fa"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fee0016cc35a8a91e8cc9312ab26a6fe638d484131a7afa79e1ce6165328a135"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:18f05d14f14a812fe9723f13afafefe6b74ca042d99f8884e62dbd34dcccf3e2"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:941b3f1b2392f0bcd6abf1bc7a322787d6db4e7457be6d1ffd3a693426a755f2"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:921473a93bcea4d00295799ab929522fc650e85c6b9f27ae1e6bb32a790ea7d3"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:e2205a81f815b5bb17e46e74cc946c575b484e5f0acfcb805fb252d67e22938d"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:385992d5ecf1a93cb85adff2f73e0402dd9ac29b71b7006d342cc920816e6f32"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:890a09cb0a62198bff92eda98b2b507305dd3abf974778bae3287f98b48907d3"}, + {file = "regex-2023.5.5-cp36-cp36m-win32.whl", hash = "sha256:821a88b878b6589c5068f4cc2cfeb2c64e343a196bc9d7ac68ea8c2a776acd46"}, + {file = "regex-2023.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:7918a1b83dd70dc04ab5ed24c78ae833ae8ea228cef84e08597c408286edc926"}, + {file = "regex-2023.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:338994d3d4ca4cf12f09822e025731a5bdd3a37aaa571fa52659e85ca793fb67"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a69cf0c00c4d4a929c6c7717fd918414cab0d6132a49a6d8fc3ded1988ed2ea"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f5e06df94fff8c4c85f98c6487f6636848e1dc85ce17ab7d1931df4a081f657"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8906669b03c63266b6a7693d1f487b02647beb12adea20f8840c1a087e2dfb5"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fda3e50abad8d0f48df621cf75adc73c63f7243cbe0e3b2171392b445401550"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ac2b7d341dc1bd102be849d6dd33b09701223a851105b2754339e390be0627a"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fb2b495dd94b02de8215625948132cc2ea360ae84fe6634cd19b6567709c8ae2"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aa7d032c1d84726aa9edeb6accf079b4caa87151ca9fabacef31fa028186c66d"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d45864693351c15531f7e76f545ec35000d50848daa833cead96edae1665559"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21e90a288e6ba4bf44c25c6a946cb9b0f00b73044d74308b5e0afd190338297c"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:10250a093741ec7bf74bcd2039e697f519b028518f605ff2aa7ac1e9c9f97423"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6b8d0c153f07a953636b9cdb3011b733cadd4178123ef728ccc4d5969e67f3c2"}, + {file = "regex-2023.5.5-cp37-cp37m-win32.whl", hash = "sha256:10374c84ee58c44575b667310d5bbfa89fb2e64e52349720a0182c0017512f6c"}, + {file = "regex-2023.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9b320677521aabf666cdd6e99baee4fb5ac3996349c3b7f8e7c4eee1c00dfe3a"}, + {file = "regex-2023.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:afb1c70ec1e594a547f38ad6bf5e3d60304ce7539e677c1429eebab115bce56e"}, + {file = "regex-2023.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf123225945aa58b3057d0fba67e8061c62d14cc8a4202630f8057df70189051"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99757ad7fe5c8a2bb44829fc57ced11253e10f462233c1255fe03888e06bc19"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a623564d810e7a953ff1357f7799c14bc9beeab699aacc8b7ab7822da1e952b8"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ced02e3bd55e16e89c08bbc8128cff0884d96e7f7a5633d3dc366b6d95fcd1d6"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cbe6b5be3b9b698d8cc4ee4dee7e017ad655e83361cd0ea8e653d65e469468"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a6e4b0e0531223f53bad07ddf733af490ba2b8367f62342b92b39b29f72735a"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e9c4f778514a560a9c9aa8e5538bee759b55f6c1dcd35613ad72523fd9175b8"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:256f7f4c6ba145f62f7a441a003c94b8b1af78cee2cccacfc1e835f93bc09426"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd7b68fd2e79d59d86dcbc1ccd6e2ca09c505343445daaa4e07f43c8a9cc34da"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4a5059bd585e9e9504ef9c07e4bc15b0a621ba20504388875d66b8b30a5c4d18"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:6893544e06bae009916a5658ce7207e26ed17385149f35a3125f5259951f1bbe"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c64d5abe91a3dfe5ff250c6bb267ef00dbc01501518225b45a5f9def458f31fb"}, + {file = "regex-2023.5.5-cp38-cp38-win32.whl", hash = "sha256:7923470d6056a9590247ff729c05e8e0f06bbd4efa6569c916943cb2d9b68b91"}, + {file = "regex-2023.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:4035d6945cb961c90c3e1c1ca2feb526175bcfed44dfb1cc77db4fdced060d3e"}, + {file = "regex-2023.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50fd2d9b36938d4dcecbd684777dd12a407add4f9f934f235c66372e630772b0"}, + {file = "regex-2023.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d19e57f888b00cd04fc38f5e18d0efbd91ccba2d45039453ab2236e6eec48d4d"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd966475e963122ee0a7118ec9024388c602d12ac72860f6eea119a3928be053"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db09e6c18977a33fea26fe67b7a842f706c67cf8bda1450974d0ae0dd63570df"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6164d4e2a82f9ebd7752a06bd6c504791bedc6418c0196cd0a23afb7f3e12b2d"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84397d3f750d153ebd7f958efaa92b45fea170200e2df5e0e1fd4d85b7e3f58a"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c3efee9bb53cbe7b285760c81f28ac80dc15fa48b5fe7e58b52752e642553f1"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:144b5b017646b5a9392a5554a1e5db0000ae637be4971c9747566775fc96e1b2"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1189fbbb21e2c117fda5303653b61905aeeeea23de4a94d400b0487eb16d2d60"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f83fe9e10f9d0b6cf580564d4d23845b9d692e4c91bd8be57733958e4c602956"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:72aa4746993a28c841e05889f3f1b1e5d14df8d3daa157d6001a34c98102b393"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:de2f780c3242ea114dd01f84848655356af4dd561501896c751d7b885ea6d3a1"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:290fd35219486dfbc00b0de72f455ecdd63e59b528991a6aec9fdfc0ce85672e"}, + {file = "regex-2023.5.5-cp39-cp39-win32.whl", hash = "sha256:732176f5427e72fa2325b05c58ad0b45af341c459910d766f814b0584ac1f9ac"}, + {file = "regex-2023.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:1307aa4daa1cbb23823d8238e1f61292fd07e4e5d8d38a6efff00b67a7cdb764"}, + {file = "regex-2023.5.5.tar.gz", hash = "sha256:7d76a8a1fc9da08296462a18f16620ba73bcbf5909e42383b253ef34d9d5141e"}, ] [[package]] name = "requests" -version = "2.28.2" +version = "2.30.0" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"}, + {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -2603,14 +2606,14 @@ py = ">=1.4.26,<2.0.0" [[package]] name = "rich" -version = "13.3.4" +version = "13.3.5" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.3.4-py3-none-any.whl", hash = "sha256:22b74cae0278fd5086ff44144d3813be1cedc9115bdfabbfefd86400cb88b20a"}, - {file = "rich-13.3.4.tar.gz", hash = "sha256:b5d573e13605423ec80bdd0cd5f8541f7844a0e71a13f74cf454ccb2f490708b"}, + {file = "rich-13.3.5-py3-none-any.whl", hash = "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"}, + {file = "rich-13.3.5.tar.gz", hash = "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c"}, ] [package.dependencies] @@ -2623,14 +2626,14 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "s3transfer" -version = "0.6.0" +version = "0.6.1" description = "An Amazon S3 Transfer Manager" category = "main" optional = false python-versions = ">= 3.7" files = [ - {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, - {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, + {file = "s3transfer-0.6.1-py3-none-any.whl", hash = "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346"}, + {file = "s3transfer-0.6.1.tar.gz", hash = "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"}, ] [package.dependencies] @@ -2657,14 +2660,14 @@ pbr = "*" [[package]] name = "sentry-sdk" -version = "1.23.0" +version = "1.23.1" description = "Python client for Sentry (https://sentry.io)" category = "dev" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.23.0.tar.gz", hash = "sha256:58f4ff9e76c21bc7172eeec9f1bccb3ff2247c74c71d5590438ce36c803f46ea"}, - {file = "sentry_sdk-1.23.0-py2.py3-none-any.whl", hash = "sha256:01b56a276642d31cf9b4aaf0b55938677265d7006be4785a10ef6330d0f5bba9"}, + {file = "sentry-sdk-1.23.1.tar.gz", hash = "sha256:0300fbe7a07b3865b3885929fb863a68ff01f59e3bcfb4e7953d0bf7fd19c67f"}, + {file = "sentry_sdk-1.23.1-py2.py3-none-any.whl", hash = "sha256:a884e2478e0b055776ea2b9234d5de9339b4bae0b3a5e74ae43d131db8ded27e"}, ] [package.dependencies] @@ -2856,14 +2859,14 @@ types-urllib3 = "*" [[package]] name = "types-urllib3" -version = "1.26.25.10" +version = "1.26.25.13" description = "Typing stubs for urllib3" category = "dev" optional = false python-versions = "*" files = [ - {file = "types-urllib3-1.26.25.10.tar.gz", hash = "sha256:c44881cde9fc8256d05ad6b21f50c4681eb20092552351570ab0a8a0653286d6"}, - {file = "types_urllib3-1.26.25.10-py3-none-any.whl", hash = "sha256:12c744609d588340a07e45d333bf870069fc8793bcf96bae7a96d4712a42591d"}, + {file = "types-urllib3-1.26.25.13.tar.gz", hash = "sha256:3300538c9dc11dad32eae4827ac313f5d986b8b21494801f1bf97a1ac6c03ae5"}, + {file = "types_urllib3-1.26.25.13-py3-none-any.whl", hash = "sha256:5dbd1d2bef14efee43f5318b5d36d805a489f6600252bb53626d4bfafd95e27c"}, ] [[package]] From 0dec5b2994f2ccc131aa2b3ad2031fb9dbcb07a1 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 17 May 2023 23:42:20 +0100 Subject: [PATCH 09/17] fix mypy --- aws_lambda_powertools/shared/user_agent.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index b6ea14a76c5..55d694aa308 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -5,9 +5,9 @@ # Since Python 3.8 there is a built-in. Remove this when support for Python3.7 is dropped # See https://docs.python.org/3/library/importlib.metadata.html if version_info.major == 3 and version_info.minor == 7: - from importlib_metadata import version + from importlib_metadata import version # type: ignore else: - from importlib.metadata import version + from importlib.metadata import version # type: ignore powertools_version = version("aws-lambda-powertools") From afe0ee9c32a78000953b664cfdde7fc6ea1f2812 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 18 May 2023 00:01:52 +0100 Subject: [PATCH 10/17] fix mypy --- aws_lambda_powertools/shared/user_agent.py | 4 ++-- mypy.ini | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index 55d694aa308..b6ea14a76c5 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -5,9 +5,9 @@ # Since Python 3.8 there is a built-in. Remove this when support for Python3.7 is dropped # See https://docs.python.org/3/library/importlib.metadata.html if version_info.major == 3 and version_info.minor == 7: - from importlib_metadata import version # type: ignore + from importlib_metadata import version else: - from importlib.metadata import version # type: ignore + from importlib.metadata import version powertools_version = version("aws-lambda-powertools") diff --git a/mypy.ini b/mypy.ini index 4af89217fdc..2b50293b561 100644 --- a/mypy.ini +++ b/mypy.ini @@ -63,4 +63,5 @@ ignore_missing_imports = True [mypy-ijson] ignore_missing_imports = True - +[mypy-importlib.metadata] +ignore_missing_imports = True From 37bf6563847884fc2e7e5db6534464d87f897b50 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 18 May 2023 10:10:03 +0100 Subject: [PATCH 11/17] fix mypy --- aws_lambda_powertools/shared/user_agent.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index b6ea14a76c5..6c22ab4d058 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -1,13 +1,13 @@ import logging import os -from sys import version_info +import sys # Since Python 3.8 there is a built-in. Remove this when support for Python3.7 is dropped # See https://docs.python.org/3/library/importlib.metadata.html -if version_info.major == 3 and version_info.minor == 7: - from importlib_metadata import version -else: +if sys.version_info >= (3, 8): from importlib.metadata import version +else: + from importlib_metadata import version powertools_version = version("aws-lambda-powertools") @@ -19,7 +19,7 @@ logger = logging.getLogger(__name__) -EXEC_ENV = os.environ.get("AWS_EXECUTION_ENV", "NA") +EXEC_ENV = os.getenv("AWS_EXECUTION_ENV", "NA") TARGET_SDK_EVENT = "request-created" FEATURE_PREFIX = "PT" From c53e38447a79a949d3cca7a3d7be432827187916 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 18 May 2023 23:23:35 +0100 Subject: [PATCH 12/17] feat(user-agent): using default botocore initializer + minor changes --- aws_lambda_powertools/__init__.py | 14 +++-- aws_lambda_powertools/shared/user_agent.py | 71 +++++++++++----------- aws_lambda_powertools/shared/version.py | 16 +++++ 3 files changed, 60 insertions(+), 41 deletions(-) create mode 100644 aws_lambda_powertools/shared/version.py diff --git a/aws_lambda_powertools/__init__.py b/aws_lambda_powertools/__init__.py index 05f239169a3..14237bc7119 100644 --- a/aws_lambda_powertools/__init__.py +++ b/aws_lambda_powertools/__init__.py @@ -4,12 +4,14 @@ from pathlib import Path -from .logging import Logger -from .metrics import Metrics, single_metric -from .package_logger import set_package_logger_handler -from .shared import user_agent -from .tracing import Tracer +from aws_lambda_powertools.logging import Logger +from aws_lambda_powertools.metrics import Metrics, single_metric +from aws_lambda_powertools.package_logger import set_package_logger_handler +from aws_lambda_powertools.shared.user_agent import inject_user_agent +from aws_lambda_powertools.shared.version import VERSION +from aws_lambda_powertools.tracing import Tracer +__version__ = VERSION __author__ = """Amazon Web Services""" __all__ = [ "Logger", @@ -22,4 +24,4 @@ set_package_logger_handler() -user_agent.inject_user_agent() +inject_user_agent() diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index 6c22ab4d058..db743c8b09d 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -1,53 +1,54 @@ import logging import os -import sys -# Since Python 3.8 there is a built-in. Remove this when support for Python3.7 is dropped -# See https://docs.python.org/3/library/importlib.metadata.html -if sys.version_info >= (3, 8): - from importlib.metadata import version -else: - from importlib_metadata import version +from aws_lambda_powertools.shared.version import VERSION -powertools_version = version("aws-lambda-powertools") +powertools_version = VERSION +inject_header = True try: - from botocore import handlers + import botocore except ImportError: - # if botocore failed to import, user might be using custom runtime. We can ignore here - handlers = None + # if botocore failed to import, user might be using custom runtime and we can't inject header + inject_header = False logger = logging.getLogger(__name__) -EXEC_ENV = os.getenv("AWS_EXECUTION_ENV", "NA") -TARGET_SDK_EVENT = "request-created" -FEATURE_PREFIX = "PT" +EXEC_ENV: str = os.environ.get("AWS_EXECUTION_ENV", "NA") +TARGET_SDK_EVENT: str = "request-created" +FEATURE_PREFIX: str = "PT" +HEADER_NO_OP: str = f"{FEATURE_PREFIX}/no-op/{powertools_version} PTEnv/{EXEC_ENV}" -# In case of no Powertools utility: PT/no-op/2.15.0 PTEnv/AWS_Lambda_python3.9 -def _add_powertools_version(request, **kwargs): +def _initializer_botocore_session(session): try: - headers = request.headers - headers["User-Agent"] = f"{headers['User-Agent']} {FEATURE_PREFIX}/no-op/{powertools_version} PTEnv/{EXEC_ENV}" + session.user_agent_extra = HEADER_NO_OP except Exception: - logger.debug("Missing header User-Agent") + logger.debug("Can't add extra header User-Agent") -# creates the `add_feature_string` function with given feature parameter def _create_feature_function(feature): def add_powertools_feature(request, **kwargs): - headers = request.headers - # Actually, only one handler can be registered, registering a new one will replace the prev handler - # We don't need to replace/detect previous registered user-agent - headers[ - "User-Agent" - ] = f"{headers['User-Agent']} {FEATURE_PREFIX}/{feature}/{powertools_version} PTEnv/{EXEC_ENV}" - - # return created function + try: + headers = request.headers + header_user_agent: str = ( + f"{headers['User-Agent']} {FEATURE_PREFIX}/{feature}/{powertools_version} PTEnv/{EXEC_ENV}" + ) + + # This function is exclusive to client and resources objects created in Powertools + # and must remove the no-op header, if present + if HEADER_NO_OP in headers["User-Agent"]: + # Remove HEADER_NO_OP + space + header_user_agent = header_user_agent.replace(f"{HEADER_NO_OP} ", "") + + headers["User-Agent"] = f"{header_user_agent}" + except Exception: + logger.debug("Can't find User-Agent header") + return add_powertools_feature -# add feature user-agent to given sdk boto3.session +# Add feature user-agent to given sdk boto3.session def register_feature_to_session(session, feature): try: session.events.register(TARGET_SDK_EVENT, _create_feature_function(feature)) @@ -55,7 +56,7 @@ def register_feature_to_session(session, feature): logger.debug(f"session passed in doesn't have a event system:{e}") -# add feature user-agent to given sdk boto3.client +# Add feature user-agent to given sdk boto3.client def register_feature_to_client(client, feature): try: client.meta.events.register(TARGET_SDK_EVENT, _create_feature_function(feature)) @@ -63,7 +64,7 @@ def register_feature_to_client(client, feature): logger.debug(f"session passed in doesn't have a event system:{e}") -# add feature user-agent to given sdk boto3.resource +# Add feature user-agent to given sdk boto3.resource def register_feature_to_resource(resource, feature): try: resource.meta.client.meta.events.register(TARGET_SDK_EVENT, _create_feature_function(feature)) @@ -71,8 +72,8 @@ def register_feature_to_resource(resource, feature): logger.debug(f"resource passed in doesn't have a event system:{e}") -# register add_pt_version for all AWS SDK in runtime def inject_user_agent(): - if handlers: - # register add_user_agent to BUILTIN_HANDLERS so every aws sdk session will have this event registered - handlers.BUILTIN_HANDLERS.append((TARGET_SDK_EVENT, _add_powertools_version)) + if inject_header: + # Customize botocore session to inject Powertools header + # See: https://github.com/boto/botocore/pull/2682 + botocore.register_initializer(_initializer_botocore_session) diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py new file mode 100644 index 00000000000..0db71627089 --- /dev/null +++ b/aws_lambda_powertools/shared/version.py @@ -0,0 +1,16 @@ +""" + This file serves to create a constant that informs + the current version of the Powertools package and exposes it in the main module + + Since Python 3.8 there the built-in importlib.metadata + When support for Python3.7 is dropped, we can remove the optional importlib_metadata dependency + See: https://docs.python.org/3/library/importlib.metadata.html +""" +import sys + +if sys.version_info >= (3, 8): + from importlib.metadata import version +else: + from importlib_metadata import version + +VERSION = version("aws-lambda-powertools") From 12150e2f56c48fc57a7a074dd957a63a9b5af7af Mon Sep 17 00:00:00 2001 From: Roger Zhang Date: Fri, 19 May 2023 10:27:13 -0700 Subject: [PATCH 13/17] change back to use register in initializer --- aws_lambda_powertools/shared/user_agent.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index db743c8b09d..88376038ac3 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -17,12 +17,13 @@ EXEC_ENV: str = os.environ.get("AWS_EXECUTION_ENV", "NA") TARGET_SDK_EVENT: str = "request-created" FEATURE_PREFIX: str = "PT" -HEADER_NO_OP: str = f"{FEATURE_PREFIX}/no-op/{powertools_version} PTEnv/{EXEC_ENV}" +DEFAULT_FEATURE: str = "no-op" +HEADER_NO_OP: str = f"{FEATURE_PREFIX}/{DEFAULT_FEATURE}/{powertools_version} PTEnv/{EXEC_ENV}" def _initializer_botocore_session(session): try: - session.user_agent_extra = HEADER_NO_OP + session.register(TARGET_SDK_EVENT, _create_feature_function(DEFAULT_FEATURE)) except Exception: logger.debug("Can't add extra header User-Agent") @@ -37,7 +38,7 @@ def add_powertools_feature(request, **kwargs): # This function is exclusive to client and resources objects created in Powertools # and must remove the no-op header, if present - if HEADER_NO_OP in headers["User-Agent"]: + if HEADER_NO_OP in headers["User-Agent"] and feature != DEFAULT_FEATURE: # Remove HEADER_NO_OP + space header_user_agent = header_user_agent.replace(f"{HEADER_NO_OP} ", "") From 6b86d40c00b827ec17d33b8293dee2bb89bcd8cd Mon Sep 17 00:00:00 2001 From: Roger Zhang Date: Fri, 19 May 2023 11:12:44 -0700 Subject: [PATCH 14/17] add docstring --- aws_lambda_powertools/shared/user_agent.py | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index 88376038ac3..5fba08acefb 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -22,6 +22,19 @@ def _initializer_botocore_session(session): + """ + Pass in Botocore session and register _create_feature_function to append user-agent, for more details see + https://github.com/boto/botocore/pull/2682 + + session.register: + https://github.com/boto/botocore/blob/develop/botocore/session.py#L703 + + Parameters + ---------- + session: Botocore.session.Session + A botocore session passed in to register user-agent function + + """ try: session.register(TARGET_SDK_EVENT, _create_feature_function(DEFAULT_FEATURE)) except Exception: @@ -29,7 +42,27 @@ def _initializer_botocore_session(session): def _create_feature_function(feature): + """ + Create a add_powertools_feature function using the given feature paramter + add_powertools_feature will be returned and to be regiestered in boto3's event system + once registered, add_powertools_feature will append the given feature string to user-agent of AWS SDK's request + + Parameters + ---------- + feature: str + + Returns: + ------- + add_powertools_feature: Callable + + """ + def add_powertools_feature(request, **kwargs): + """ + Signiture of this function is required at Boto3's event system. See: + https://boto3.amazonaws.com/v1/documentation/api/latest/guide/events.html + + """ try: headers = request.headers header_user_agent: str = ( @@ -51,6 +84,18 @@ def add_powertools_feature(request, **kwargs): # Add feature user-agent to given sdk boto3.session def register_feature_to_session(session, feature): + """ + Register the given feature string given session's event system + When this session makes an api request, the given feature will be appended to request's user-agent + + Parameters + ---------- + session: boto3.session.Session + session to register + feature: str + the feature string in Powertools, e.g.:streaming + + """ try: session.events.register(TARGET_SDK_EVENT, _create_feature_function(feature)) except AttributeError as e: @@ -59,6 +104,18 @@ def register_feature_to_session(session, feature): # Add feature user-agent to given sdk boto3.client def register_feature_to_client(client, feature): + """ + Register the given feature string given client's event system + When this client makes an api request, the given feature will be appended to request's user-agent + + Parameters + ---------- + client: boto3.session.Session.client + client to register + feature: str + the feature string in Powertools, e.g.:streaming + + """ try: client.meta.events.register(TARGET_SDK_EVENT, _create_feature_function(feature)) except AttributeError as e: @@ -67,6 +124,18 @@ def register_feature_to_client(client, feature): # Add feature user-agent to given sdk boto3.resource def register_feature_to_resource(resource, feature): + """ + Register the given feature string given resource's event system + When this resource makes an api request, the given feature will be appended to request's user-agent + + Parameters + ---------- + resource: boto3.session.Session.resource + resource to register + feature: str + the feature string in Powertools, e.g.:streaming + + """ try: resource.meta.client.meta.events.register(TARGET_SDK_EVENT, _create_feature_function(feature)) except AttributeError as e: From 6c7767b0d46792630122908d2ab026731461858a Mon Sep 17 00:00:00 2001 From: Roger Zhang Date: Sun, 28 May 2023 20:34:01 -0700 Subject: [PATCH 15/17] style/typo fixes for review --- aws_lambda_powertools/shared/user_agent.py | 16 ++++++++-------- .../data_classes/code_pipeline_job_event.py | 5 ++++- .../idempotency/persistence/dynamodb.py | 2 +- .../utilities/parameters/base.py | 16 ++++++++-------- .../utilities/streaming/_s3_seekable_io.py | 8 ++++---- 5 files changed, 25 insertions(+), 22 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index 5fba08acefb..a719c33cbc0 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -14,11 +14,11 @@ logger = logging.getLogger(__name__) -EXEC_ENV: str = os.environ.get("AWS_EXECUTION_ENV", "NA") -TARGET_SDK_EVENT: str = "request-created" -FEATURE_PREFIX: str = "PT" -DEFAULT_FEATURE: str = "no-op" -HEADER_NO_OP: str = f"{FEATURE_PREFIX}/{DEFAULT_FEATURE}/{powertools_version} PTEnv/{EXEC_ENV}" +EXEC_ENV = os.environ.get("AWS_EXECUTION_ENV", "NA") +TARGET_SDK_EVENT = "request-created" +FEATURE_PREFIX = "PT" +DEFAULT_FEATURE = "no-op" +HEADER_NO_OP = f"{FEATURE_PREFIX}/{DEFAULT_FEATURE}/{powertools_version} PTEnv/{EXEC_ENV}" def _initializer_botocore_session(session): @@ -43,8 +43,8 @@ def _initializer_botocore_session(session): def _create_feature_function(feature): """ - Create a add_powertools_feature function using the given feature paramter - add_powertools_feature will be returned and to be regiestered in boto3's event system + Create a add_powertools_feature function using the given feature parameter + add_powertools_feature will be returned and to be registered in boto3's event system once registered, add_powertools_feature will append the given feature string to user-agent of AWS SDK's request Parameters @@ -65,7 +65,7 @@ def add_powertools_feature(request, **kwargs): """ try: headers = request.headers - header_user_agent: str = ( + header_user_agent = ( f"{headers['User-Agent']} {FEATURE_PREFIX}/{feature}/{powertools_version} PTEnv/{EXEC_ENV}" ) diff --git a/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py b/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py index c502aacb090..434df509deb 100644 --- a/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +++ b/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py @@ -6,6 +6,7 @@ import boto3 +from aws_lambda_powertools.shared import user_agent from aws_lambda_powertools.utilities.data_classes.common import DictWrapper @@ -203,12 +204,14 @@ def setup_s3_client(self): BaseClient An S3 client with the appropriate credentials """ - return boto3.client( + s3 = boto3.client( "s3", aws_access_key_id=self.data.artifact_credentials.access_key_id, aws_secret_access_key=self.data.artifact_credentials.secret_access_key, aws_session_token=self.data.artifact_credentials.session_token, ) + user_agent.register_feature_to_client(client=s3, feature="data_classes") + return s3 def find_input_artifact(self, artifact_name: str) -> Optional[CodePipelineArtifact]: """Find an input artifact by artifact name diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py b/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py index 4392b275821..d69e42f9287 100644 --- a/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +++ b/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py @@ -94,7 +94,7 @@ def __init__( else: self.client = boto3_client - user_agent.register_feature_to_client(self.client, "idempotency") + user_agent.register_feature_to_client(client=self.client, feature="idempotency") if sort_key_attr == key_attr: raise ValueError(f"key_attr [{key_attr}] and sort_key_attr [{sort_key_attr}] cannot be the same!") diff --git a/aws_lambda_powertools/utilities/parameters/base.py b/aws_lambda_powertools/utilities/parameters/base.py index d4f1975d81f..4357b5d520e 100644 --- a/aws_lambda_powertools/utilities/parameters/base.py +++ b/aws_lambda_powertools/utilities/parameters/base.py @@ -254,14 +254,14 @@ def _build_boto3_client( Instance of a boto3 client for Parameters feature (e.g., ssm, appconfig, secretsmanager, etc.) """ if client is not None: - user_agent.register_feature_to_client(client, "parameters") + user_agent.register_feature_to_client(client=client, feature="parameters") return client session = session or boto3.Session() config = config or Config() - client_to_return = session.client(service_name=service_name, config=config) - user_agent.register_feature_to_client(client_to_return, "parameters") - return client_to_return + client = session.client(service_name=service_name, config=config) + user_agent.register_feature_to_client(client=client, feature="parameters") + return client # maintenance: change DynamoDBServiceResource type to ParameterResourceClients when we expand @staticmethod @@ -291,14 +291,14 @@ def _build_boto3_resource_client( Instance of a boto3 resource client for Parameters feature (e.g., dynamodb, etc.) """ if client is not None: - user_agent.register_feature_to_resource(client, "parameters") + user_agent.register_feature_to_resource(resource=client, feature="parameters") return client session = session or boto3.Session() config = config or Config() - client_to_return = session.resource(service_name=service_name, config=config, endpoint_url=endpoint_url) - user_agent.register_feature_to_resource(client_to_return, "parameters") - return client_to_return + client = session.resource(service_name=service_name, config=config, endpoint_url=endpoint_url) + user_agent.register_feature_to_resource(resource=client, feature="parameters") + return client def get_transform_method(value: str, transform: TransformOptions = None) -> Callable[..., Any]: diff --git a/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py b/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py index f90b38462eb..de9b77410a3 100644 --- a/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +++ b/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py @@ -68,7 +68,7 @@ def __init__( self._sdk_options = sdk_options self._sdk_options["Bucket"] = bucket self._sdk_options["Key"] = key - self._user_agent_added = False + self._has_user_agent = False if version_id is not None: self._sdk_options["VersionId"] = version_id @@ -79,9 +79,9 @@ def s3_client(self) -> "Client": """ if self._s3_client is None: self._s3_client = boto3.client("s3") - if not self._user_agent_added: - user_agent.register_feature_to_client(self._s3_client, "streaming") - self._user_agent_added = True + if not self._has_user_agent: + user_agent.register_feature_to_client(client=self._s3_client, feature="streaming") + self._has_user_agent = True return self._s3_client @property From 7148647ce62507ec209884575c3e4c6afd64e6fb Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 31 May 2023 21:52:50 +0100 Subject: [PATCH 16/17] chore: docstring --- aws_lambda_powertools/shared/user_agent.py | 88 +++++++++++++--------- 1 file changed, 52 insertions(+), 36 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index a719c33cbc0..fb3525d7782 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -23,16 +23,18 @@ def _initializer_botocore_session(session): """ - Pass in Botocore session and register _create_feature_function to append user-agent, for more details see - https://github.com/boto/botocore/pull/2682 - - session.register: - https://github.com/boto/botocore/blob/develop/botocore/session.py#L703 + This function is used to add an extra header for the User-Agent in the Botocore session, + as described in the pull request: https://github.com/boto/botocore/pull/2682 Parameters ---------- - session: Botocore.session.Session - A botocore session passed in to register user-agent function + session : botocore.session.Session + The Botocore session to which the user-agent function will be registered. + + Raises + ------ + Exception + If there is an issue while adding the extra header for the User-Agent. """ try: @@ -43,26 +45,25 @@ def _initializer_botocore_session(session): def _create_feature_function(feature): """ - Create a add_powertools_feature function using the given feature parameter - add_powertools_feature will be returned and to be registered in boto3's event system - once registered, add_powertools_feature will append the given feature string to user-agent of AWS SDK's request + Create and return the `add_powertools_feature` function. + + The `add_powertools_feature` function is designed to be registered in boto3's event system. + When registered, it appends the given feature string to the User-Agent header of AWS SDK requests. Parameters ---------- - feature: str + feature : str + The feature string to be appended to the User-Agent header. - Returns: + Returns ------- - add_powertools_feature: Callable + add_powertools_feature : Callable + The `add_powertools_feature` function that modifies the User-Agent header. + """ def add_powertools_feature(request, **kwargs): - """ - Signiture of this function is required at Boto3's event system. See: - https://boto3.amazonaws.com/v1/documentation/api/latest/guide/events.html - - """ try: headers = request.headers header_user_agent = ( @@ -85,15 +86,20 @@ def add_powertools_feature(request, **kwargs): # Add feature user-agent to given sdk boto3.session def register_feature_to_session(session, feature): """ - Register the given feature string given session's event system - When this session makes an api request, the given feature will be appended to request's user-agent + Register the given feature string to the event system of the provided boto3 session + and append the feature to the User-Agent header of the request Parameters ---------- - session: boto3.session.Session - session to register - feature: str - the feature string in Powertools, e.g.:streaming + session : boto3.session.Session + The boto3 session to which the feature will be registered. + feature : str + The feature string to be appended to the User-Agent header, e.g., "streaming" in Powertools. + + Raises + ------ + AttributeError + If the provided session does not have an event system. """ try: @@ -105,15 +111,20 @@ def register_feature_to_session(session, feature): # Add feature user-agent to given sdk boto3.client def register_feature_to_client(client, feature): """ - Register the given feature string given client's event system - When this client makes an api request, the given feature will be appended to request's user-agent + Register the given feature string to the event system of the provided boto3 client + and append the feature to the User-Agent header of the request Parameters ---------- - client: boto3.session.Session.client - client to register - feature: str - the feature string in Powertools, e.g.:streaming + session : boto3.session.Session.client + The boto3 client to which the feature will be registered. + feature : str + The feature string to be appended to the User-Agent header, e.g., "streaming" in Powertools. + + Raises + ------ + AttributeError + If the provided client does not have an event system. """ try: @@ -125,15 +136,20 @@ def register_feature_to_client(client, feature): # Add feature user-agent to given sdk boto3.resource def register_feature_to_resource(resource, feature): """ - Register the given feature string given resource's event system - When this resource makes an api request, the given feature will be appended to request's user-agent + Register the given feature string to the event system of the provided boto3 resource + and append the feature to the User-Agent header of the request Parameters ---------- - resource: boto3.session.Session.resource - resource to register - feature: str - the feature string in Powertools, e.g.:streaming + session : boto3.session.Session.resource + The boto3 client to which the feature will be registered. + feature : str + The feature string to be appended to the User-Agent header, e.g., "streaming" in Powertools. + + Raises + ------ + AttributeError + If the provided resource does not have an event system. """ try: From b79bd839203befbb9c4b4b1557dddc9c07429049 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 1 Jun 2023 00:58:37 +0100 Subject: [PATCH 17/17] chore: docstring --- aws_lambda_powertools/shared/user_agent.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aws_lambda_powertools/shared/user_agent.py b/aws_lambda_powertools/shared/user_agent.py index fb3525d7782..62cdc16601d 100644 --- a/aws_lambda_powertools/shared/user_agent.py +++ b/aws_lambda_powertools/shared/user_agent.py @@ -116,7 +116,7 @@ def register_feature_to_client(client, feature): Parameters ---------- - session : boto3.session.Session.client + client : boto3.session.Session.client The boto3 client to which the feature will be registered. feature : str The feature string to be appended to the User-Agent header, e.g., "streaming" in Powertools. @@ -141,8 +141,8 @@ def register_feature_to_resource(resource, feature): Parameters ---------- - session : boto3.session.Session.resource - The boto3 client to which the feature will be registered. + resource : boto3.session.Session.resource + The boto3 resource to which the feature will be registered. feature : str The feature string to be appended to the User-Agent header, e.g., "streaming" in Powertools.