From 3859bc7aba5c5a1087308096311c5fa2e40f782d Mon Sep 17 00:00:00 2001 From: sinofseven Date: Sat, 28 Dec 2024 00:16:16 +0900 Subject: [PATCH 001/139] impl --- .../event_handler/async_execution/__init__.py | 0 .../async_execution/exceptions.py | 2 + .../event_handler/async_execution/router.py | 169 ++++++++++++++++++ .../async_execution/routes/__init__.py | 0 .../async_execution/routes/aws_config_rule.py | 45 +++++ .../async_execution/routes/base.py | 12 ++ .../routes/cloud_watch_alarm.py | 42 +++++ .../routes/cloud_watch_logs.py | 146 +++++++++++++++ .../routes/code_deploy_lifecycle_hook.py | 20 +++ .../async_execution/routes/event_bridge.py | 111 ++++++++++++ .../async_execution/routes/s3.py | 147 +++++++++++++++ .../async_execution/routes/secrets_manager.py | 37 ++++ .../async_execution/routes/ses.py | 128 +++++++++++++ .../async_execution/routes/sns.py | 94 ++++++++++ .../event_handler/async_trigger.py | 37 ++++ 15 files changed, 990 insertions(+) create mode 100644 aws_lambda_powertools/event_handler/async_execution/__init__.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/exceptions.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/router.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/__init__.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/base.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/code_deploy_lifecycle_hook.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/s3.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/ses.py create mode 100644 aws_lambda_powertools/event_handler/async_execution/routes/sns.py create mode 100644 aws_lambda_powertools/event_handler/async_trigger.py diff --git a/aws_lambda_powertools/event_handler/async_execution/__init__.py b/aws_lambda_powertools/event_handler/async_execution/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/aws_lambda_powertools/event_handler/async_execution/exceptions.py b/aws_lambda_powertools/event_handler/async_execution/exceptions.py new file mode 100644 index 00000000000..3e4c091eb04 --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/exceptions.py @@ -0,0 +1,2 @@ +class RouteNotFoundError(Exception): + pass diff --git a/aws_lambda_powertools/event_handler/async_execution/router.py b/aws_lambda_powertools/event_handler/async_execution/router.py new file mode 100644 index 00000000000..f6cfc1bbaca --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/router.py @@ -0,0 +1,169 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Callable + +from .routes.aws_config_rule import AwsConfigRuleRoute +from .routes.cloud_watch_alarm import CloudWatchAlarmRoute +from .routes.cloud_watch_logs import CloudWatchLogsRoute +from .routes.code_deploy_lifecycle_hook import CodeDeployLifecycleHookRoute +from .routes.event_bridge import EventBridgeRoute +from .routes.s3 import S3Route +from .routes.secrets_manager import SecretsManagerRoute +from .routes.ses import SESRoute +from .routes.sns import SNSRoute + +if TYPE_CHECKING: + from .routes.base import BaseRoute + + +class Router: + _routes: list[BaseRoute] + + def __init__(self): + self._routes = [] + + def aws_config_rule( + self, + arn: str | None = None, + rule_name: str | None = None, + rule_name_prefix: str | None = None, + rule_id: str | None = None, + ) -> Callable: + def wrapper_aws_config_rule(func: Callable): + self._routes.append( + AwsConfigRuleRoute( + func=func, + arn=arn, + rule_name=rule_name, + rule_name_prefix=rule_name_prefix, + rule_id=rule_id, + ), + ) + + return wrapper_aws_config_rule + + def cloud_watch_alarm( + self, + arn: str | None = None, + alarm_name: str | None = None, + alarm_name_prefix: str | None = None, + ) -> Callable: + def wrapper_cloud_watch_alarm(func: Callable): + self._routes.append( + CloudWatchAlarmRoute(func=func, arn=arn, alarm_name=alarm_name, alarm_name_prefix=alarm_name_prefix), + ) + + return wrapper_cloud_watch_alarm + + def cloud_watch_logs( + self, + log_group: str | None = None, + log_group_prefix: str | None = None, + log_stream: str | None = None, + log_stream_prefix: str | None = None, + subscription_filters: str | list[str] | None = None, + ) -> Callable: + def wrapper_cloud_watch_logs(func: Callable): + self._routes.append( + CloudWatchLogsRoute( + func=func, + log_group=log_group, + log_group_prefix=log_group_prefix, + log_stream=log_stream, + log_stream_prefix=log_stream_prefix, + subscription_filters=subscription_filters, + ), + ) + + return wrapper_cloud_watch_logs + + def code_deploy_lifecycle_hook(self) -> Callable: + def wrapper_code_deploy_lifecycle_hook(func: Callable): + self._routes.append(CodeDeployLifecycleHookRoute(func=func)) + + return wrapper_code_deploy_lifecycle_hook + + def event_bridge( + self, + detail_type: str | None = None, + source: str | None = None, + resources: str | list[str] | None = None, + ) -> Callable: + def wrap_event_bridge(func: Callable): + self._routes.append( + EventBridgeRoute(func=func, detail_type=detail_type, source=source, resources=resources), + ) + + return wrap_event_bridge + + def s3( + self, + bucket: str | None = None, + bucket_prefix: str | None = None, + key: str | None = None, + key_prefix: str | None = None, + key_suffix: str | None = None, + event_name: str | None = None, + ) -> Callable: + def wrap_s3(func: Callable): + self._routes.append( + S3Route( + func=func, + bucket=bucket, + bucket_prefix=bucket_prefix, + key=key, + key_prefix=key_prefix, + key_suffix=key_suffix, + event_name=event_name, + ), + ) + + return wrap_s3 + + def secrets_manager(self, secret_id: str | None = None, secret_name_prefix: str | None = None): + def wrap_secrets_manager(func: Callable): + self._routes.append( + SecretsManagerRoute(func=func, secret_id=secret_id, secret_name_prefix=secret_name_prefix), + ) + + return wrap_secrets_manager + + def ses( + self, + mail_to: str | list[str] | None = None, + mail_from: str | list[str] | None = None, + mail_subject: str | None = None, + ) -> Callable: + def wrap_ses(func: Callable): + self._routes.append(SESRoute(func=func, mail_to=mail_to, mail_from=mail_from, mail_subject=mail_subject)) + + return wrap_ses + + def sns( + self, + arn: str | None = None, + name: str | None = None, + name_prefix: str | None = None, + subject: str | None = None, + subject_prefix: str | None = None, + ) -> Callable: + def wrap_sns(func: Callable): + self._routes.append( + SNSRoute( + func=func, + arn=arn, + name=name, + name_prefix=name_prefix, + subject=subject, + subject_prefix=subject_prefix, + ), + ) + + return wrap_sns + + def resolve_route(self, event: dict[str, Any]) -> tuple[Callable, Any] | None: + for route in self._routes: + data = route.match(event=event) + if data is not None: + return data + return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/__init__.py b/aws_lambda_powertools/event_handler/async_execution/routes/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py b/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py new file mode 100644 index 00000000000..f9d44ec34cb --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +from typing import Any, Callable + +from aws_lambda_powertools.utilities.data_classes.aws_config_rule_event import ( + AWSConfigRuleEvent, +) + +from .base import BaseRoute + + +class AwsConfigRuleRoute(BaseRoute): + arn: str | None + rule_name: str | None + rule_name_prefix: str | None + rule_id: str | None + + def __init__( + self, + func: Callable, + arn: str | None = None, + rule_name: str | None = None, + rule_name_prefix: str | None = None, + rule_id: str | None = None, + ): + self.func = func + self.arn = arn + self.rule_name = rule_name + self.rule_name_prefix = rule_name_prefix + self.rule_id = rule_id + + if not self.arn and not self.rule_name and not self.rule_name_prefix and not self.rule_id: + raise ValueError("arn, rule_name, rule_name_prefix, or rule_id must be not null") + + def match(self, event: dict[str, Any]) -> tuple[Callable, AWSConfigRuleEvent] | None: + if self.arn and event.get("configRuleArn") == self.arn: + return self.func, AWSConfigRuleEvent(event) + elif self.rule_name and event.get("configRuleName") == self.rule_name: + return self.func, AWSConfigRuleEvent(event) + elif self.rule_name_prefix and event.get("configRuleName", "").find(self.rule_name_prefix) == 0: + return self.func, AWSConfigRuleEvent(event) + elif self.rule_id and event.get("configRuleId") == self.rule_id: + return self.func, AWSConfigRuleEvent(event) + else: + return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/base.py b/aws_lambda_powertools/event_handler/async_execution/routes/base.py new file mode 100644 index 00000000000..8d71faada26 --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/routes/base.py @@ -0,0 +1,12 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import Any, Callable + + +class BaseRoute(ABC): + func: Callable + + @abstractmethod + def match(self, event: dict[str, Any]) -> tuple[Callable, Any] | None: + raise NotImplementedError() diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py new file mode 100644 index 00000000000..6cb8327c220 --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from typing import Any, Callable + +from aws_lambda_powertools.utilities.data_classes.cloud_watch_alarm_event import ( + CloudWatchAlarmEvent, +) + +from .base import BaseRoute + + +class CloudWatchAlarmRoute(BaseRoute): + arn: str | None + alarm_name: str | None + alarm_name_prefix: str | None + + def __init__( + self, + func: Callable, + arn: str | None = None, + alarm_name: str | None = None, + alarm_name_prefix: str | None = None, + ): + self.func = func + self.arn = arn + self.alarm_name = alarm_name + self.alarm_name_prefix = alarm_name_prefix + + if not self.arn and not self.alarm_name and not self.alarm_name_prefix: + raise ValueError("arn, alarm_name, or alarm_name_prefix must be not null") + + def match(self, event: dict[str, Any]) -> tuple[Callable, CloudWatchAlarmEvent] | None: + if self.arn and event.get("alarmArn") == self.arn: + return self.func, CloudWatchAlarmEvent(event) + + alarm_name = event.get("alarmData", {}).get("alarmName", "") + if self.alarm_name and alarm_name == self.alarm_name: + return self.func, CloudWatchAlarmEvent(event) + elif self.alarm_name_prefix and alarm_name.find(self.alarm_name_prefix) == 0: + return self.func, CloudWatchAlarmEvent(event) + else: + return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py new file mode 100644 index 00000000000..c9574bac773 --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py @@ -0,0 +1,146 @@ +from __future__ import annotations + +from typing import Any, Callable + +from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import ( + CloudWatchLogsEvent, +) + +from .base import BaseRoute + + +class CloudWatchLogsRoute(BaseRoute): + log_group: str | None + log_group_prefix: str | None + log_stream: str | None + log_stream_prefix: str | None + subscribe_filters: list[str] | None + + def __init__( + self, + func: Callable, + log_group: str | None = None, + log_group_prefix: str | None = None, + log_stream: str | None = None, + log_stream_prefix: str | None = None, + subscription_filters: str | list[str] | None = None, + ): + self.func = func + self.log_group = log_group + self.log_group_prefix = log_group_prefix + self.log_stream = log_stream + self.log_stream_prefix = log_stream_prefix + + if isinstance(subscription_filters, str): + self.subscribe_filters = [subscription_filters] + else: + self.subscribe_filters = subscription_filters + + if ( + not self.log_group + and not self.log_group_prefix + and not self.log_stream + and not self.log_stream_prefix + and not self.subscribe_filters + ): + raise ValueError( + "log_group, log_group_prefix, log_stream, log_stream_prefix, or subscription_filters must be not null", + ) + + def is_target_with_log_group(self, log_group: str | None) -> bool: + if not log_group: + return False + elif self.log_group: + return self.log_group == log_group + elif self.log_group_prefix: + return log_group.find(self.log_group_prefix) == 0 + else: + return False + + def is_target_with_log_stream(self, log_stream: str | None) -> bool: + if not log_stream: + return False + elif self.log_stream: + return self.log_stream == log_stream + elif self.log_stream_prefix: + return log_stream.find(self.log_stream_prefix) == 0 + else: + return False + + def is_target_with_subscription_filters(self, subscription_filters: list[str] | None) -> bool: + if not subscription_filters: + return False + elif not self.subscribe_filters: + return False + + for name in self.subscribe_filters: + if name in subscription_filters: + return True + + return False + + def is_target(self, log_group: str | None, log_stream: str | None, subscription_filters: list[str] | None) -> bool: + flag_log_group = self.is_target_with_log_group(log_group=log_group) + flag_log_stream = self.is_target_with_log_stream(log_stream=log_stream) + flag_subscription_filters = self.is_target_with_subscription_filters(subscription_filters=subscription_filters) + + if log_group and log_stream and subscription_filters: + text = "log_group, log_stream, subscription_filters" + elif log_group and log_stream and not subscription_filters: + text = "log_group, log_stream" + elif log_group and not log_stream and subscription_filters: + text = "log_group, subscription_filters" + elif not log_group and log_stream and subscription_filters: + text = "log_stream, subscription_filters" + elif log_group and not log_stream and not subscription_filters: + text = "log_group" + elif not log_group and log_stream and not subscription_filters: + text = "log_stream" + elif not log_group and not log_stream and subscription_filters: + text = "subscription_filters" + else: # not log_group and not log_stream and not subscription_filters + text = "" + + mapping = { + "log_group, log_stream, subscription_filters": flag_log_group + and flag_log_stream + and flag_subscription_filters, + "log_group, log_stream": flag_log_group and flag_log_stream, + "log_group, subscription_filters": flag_log_group and flag_subscription_filters, + "log_stream, subscription_filters": flag_log_stream and flag_subscription_filters, + "log_group": flag_log_group, + "log_stream": flag_log_stream, + "subscription_filters": flag_subscription_filters, + "": False, + } + + return mapping[text] + + def match(self, event: dict[str, Any]) -> tuple[Callable, CloudWatchLogsEvent] | None: + text = event.get("awslogs", {}).get("data") + + if not isinstance(text, str): + return None + + data = CloudWatchLogsEvent(**event) + decoded = data.parse_logs_data() + + if self.log_group or self.log_group_prefix: + log_group = decoded.log_group + else: + log_group = None + + if self.log_stream or self.log_stream_prefix: + log_stream = decoded.log_stream + else: + log_stream = None + + if self.subscribe_filters: + subscription_filters = decoded.subscription_filters + else: + subscription_filters = None + + if self.is_target(log_group, log_stream, subscription_filters): + return self.func, data + else: + return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/code_deploy_lifecycle_hook.py b/aws_lambda_powertools/event_handler/async_execution/routes/code_deploy_lifecycle_hook.py new file mode 100644 index 00000000000..152ca3df961 --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/routes/code_deploy_lifecycle_hook.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +from typing import Any, Callable + +from aws_lambda_powertools.utilities.data_classes.code_deploy_lifecycle_hook_event import ( + CodeDeployLifecycleHookEvent, +) + +from .base import BaseRoute + + +class CodeDeployLifecycleHookRoute(BaseRoute): + def __init__(self, func: Callable): + self.func = func + + def match(self, event: dict[str, Any]) -> tuple[Callable, CodeDeployLifecycleHookEvent] | None: + if "DeploymentId" in event and "LifecycleEventHookExecutionId" in event: + return self.func, CodeDeployLifecycleHookEvent(**event) + else: + return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py b/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py new file mode 100644 index 00000000000..a9b0523effa --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +from typing import Any, Callable + +from aws_lambda_powertools.utilities.data_classes.event_bridge_event import ( + EventBridgeEvent, +) + +from .base import BaseRoute + + +class EventBridgeRoute(BaseRoute): + detail_type: str | None + source: str | None + resources: list[str] | None + + def __init__( + self, + func: Callable, + detail_type: str | None = None, + source: str | None = None, + resources: str | list[str] | None = None, + ): + self.func = func + self.detail_type = detail_type + self.source = source + + if isinstance(resources, str): + self.resources = [resources] + else: + self.resources = resources + + if not self.detail_type and not self.source and not self.resources: + raise ValueError("detail_type, source, or resources must be not null") + + def is_target_with_detail_type(self, detail_type: str | None) -> bool: + if detail_type and self.detail_type: + return self.detail_type == detail_type + else: + return False + + def is_target_with_source(self, source: str | None) -> bool: + if source and self.source: + return self.source == source + else: + return False + + def is_target_with_resources(self, resources: list[str] | None) -> bool: + if resources and self.resources: + for item in self.resources: + if item in resources: + return True + + return False + + def is_target(self, detail_type: str | None, source: str | None, resources: list[str] | None) -> bool: + flag_detail_type = self.is_target_with_detail_type(detail_type=detail_type) + flag_source = self.is_target_with_source(source=source) + flag_resources = self.is_target_with_resources(resources=resources) + + if detail_type and source and resources: + text = "detail_type, source, resources" + elif detail_type and source and not resources: + text = "detail_type, source" + elif detail_type and not source and resources: + text = "detail_type, resources" + elif not detail_type and source and resources: + text = "source, resources" + elif detail_type and not source and not resources: + text = "detail_type" + elif not detail_type and source and not resources: + text = "source" + elif not detail_type and not source and resources: + text = "resources" + else: # not detail_type and not source and not resources + text = "" + + mapping = { + "detail_type, source, resources": flag_detail_type and flag_source and flag_resources, + "detail_type, source": flag_detail_type and flag_source, + "detail_type, resources": flag_detail_type and flag_resources, + "source, resources": flag_source and flag_resources, + "detail_type": flag_detail_type, + "source": flag_source, + "resources": flag_resources, + "": False, + } + + return mapping[text] + + def match(self, event: dict[str, Any]) -> tuple[Callable, EventBridgeEvent] | None: + detail_type: str | None = event.get("detail-type") + source: str | None = event.get("source") + resources: list[str] | None = event.get("resources") + + if not detail_type and not source and not resources: + return None + + if self.detail_type: + detail_type = None + + if self.source: + source = None + + if self.resources: + resources = None + + if self.is_target(detail_type, source, resources): + return self.func, EventBridgeEvent(**event) + else: + return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/s3.py b/aws_lambda_powertools/event_handler/async_execution/routes/s3.py new file mode 100644 index 00000000000..230615c4c59 --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/routes/s3.py @@ -0,0 +1,147 @@ +from __future__ import annotations + +from typing import Any, Callable + +from aws_lambda_powertools.utilities.data_classes.s3_event import S3Event + +from .base import BaseRoute + + +class S3Route(BaseRoute): + bucket: str | None + bucket_prefix: str | None + key: str | None + key_prefix: str | None + key_suffix: str | None + event_name: str | None + + def __init__( + self, + func: Callable, + bucket: str | None = None, + bucket_prefix: str | None = None, + key: str | None = None, + key_prefix: str | None = None, + key_suffix: str | None = None, + event_name: str | None = None, + ): + self.func = func + self.bucket = bucket + self.bucket_prefix = bucket_prefix + self.key = key + self.key_prefix = key_prefix + self.key_suffix = key_suffix + self.event_name = event_name + + if ( + not self.bucket + and not self.bucket_prefix + and not self.key + and not self.key_prefix + and not self.key_suffix + and not self.event_name + ): + raise ValueError("bucket, bucket_prefix, key, key_prefix, key_suffix, or event_name must be not null") + + def is_target_with_bucket(self, bucket: str | None) -> bool: + if not bucket: + return False + elif self.bucket and self.bucket == bucket: + return True + elif self.bucket_prefix and bucket.find(self.bucket_prefix) == 0: + return True + else: + return False + + def is_target_with_key(self, key: str | None) -> bool: + if not key: + return False + elif self.key: + return self.key == key + elif self.key_prefix and not self.key_suffix: + return key.find(self.key_prefix) == 0 + elif not self.key_prefix and self.key_suffix: + length_suffix = len(self.key_suffix) + suffix = key[-length_suffix:] + return self.key_suffix == suffix + elif self.key_prefix and self.key_suffix: + length_suffix = len(self.key_suffix) + suffix = key[-length_suffix:] + return key.find(self.key_prefix) == 0 and self.key_suffix == suffix + else: + return False + + def is_target_with_event_name(self, event_name: str | None) -> bool: + if not event_name: + return False + elif self.event_name: + return self.event_name == event_name + else: + return False + + def is_target(self, bucket: str | None, key: str | None, event_name: str | None) -> bool: + flag_bucket = self.is_target_with_bucket(bucket=bucket) + flag_key = self.is_target_with_key(key=key) + flag_event_name = self.is_target_with_event_name(event_name=event_name) + + if bucket and key and event_name: + text = "bucket, key, event_name" + elif bucket and key and not event_name: + text = "bucket, key" + elif bucket and not key and event_name: + text = "bucket, event_name" + elif not bucket and key and event_name: + text = "key, event_name" + elif bucket and not key and not event_name: + text = "bucket" + elif not bucket and key and not event_name: + text = "key" + elif not bucket and not key and event_name: + text = "event_name" + else: # not bucket and not key and not event_name + text = "" + + mapping = { + "bucket, key, event_name": flag_bucket and flag_key and flag_event_name, + "bucket, key": flag_bucket and flag_key, + "bucket, event_name": flag_bucket and flag_event_name, + "key, event_name": flag_key and flag_event_name, + "bucket": flag_bucket, + "key": flag_key, + "event_name": flag_event_name, + "": False, + } + + return mapping[text] + + def match(self, event: dict[str, Any]) -> tuple[Callable, S3Event] | None: + all_records: list[dict[str, Any]] = event.get("Records", []) + + if len(all_records) == 0: + return None + + record = all_records[0] + event_name = record.get("eventName") + s3_data: dict[str, Any] = record.get("s3") + if not event_name or not s3_data: + return None + + bucket: str | None = s3_data.get("bucket", {}).get("name") + key: str | None = s3_data.get("object", {}).get("key") + + if not bucket and not key: + return None + + if not self.event_name: + event_name = None + + if not self.bucket and not self.bucket_prefix: + bucket = None + + if not self.key and not self.key_prefix and not self.key_suffix: + key = None + + if self.is_target(bucket, key, event_name): + return self.func, S3Event(**event) + else: + return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py b/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py new file mode 100644 index 00000000000..f0bc805e565 --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from typing import Any, Callable + +from aws_lambda_powertools.utilities.data_classes.secrets_manager_event import ( + SecretsManagerEvent, +) + +from .base import BaseRoute + + +class SecretsManagerRoute(BaseRoute): + secret_id: str | None + secret_name_prefix: str | None + + def __init__(self, func: Callable, secret_id: str | None = None, secret_name_prefix: str | None = None): + self.func = func + self.secret_id = secret_id + self.secret_name_prefix = secret_name_prefix + + if not self.secret_id and not self.secret_name_prefix: + raise ValueError("secret_id, or secret_name_prefix must be not null") + + def match(self, event: dict[str, Any]) -> tuple[Callable, SecretsManagerEvent] | None: + secret_id: str | None = event.get("SecretId") + + if not secret_id: + return None + elif self.secret_id and self.secret_id == secret_id: + return self.func, SecretsManagerEvent(**event) + elif self.secret_name_prefix: + part = secret_id.split(":") + secret_name = part[-1] + if secret_name.find(self.secret_name_prefix) == 0: + return self.func, SecretsManagerEvent(**event) + + return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/ses.py b/aws_lambda_powertools/event_handler/async_execution/routes/ses.py new file mode 100644 index 00000000000..73f4e9238c6 --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/routes/ses.py @@ -0,0 +1,128 @@ +from __future__ import annotations + +from typing import Any, Callable + +from aws_lambda_powertools.utilities.data_classes.ses_event import SESEvent + +from .base import BaseRoute + + +class SESRoute(BaseRoute): + mail_to: list[str] | None + mail_from: list[str] | None + mail_subject: str | None + + def __init__( + self, + func: Callable, + mail_to: str | list[str] | None = None, + mail_from: str | list[str] | None = None, + mail_subject: str | None = None, + ): + self.func = func + + if isinstance(mail_to, str): + self.mail_to = [mail_to] + else: + self.mail_to = mail_to + + if isinstance(mail_from, str): + self.mail_from = [mail_from] + else: + self.mail_from = mail_from + + self.mail_subject = mail_subject + + if not self.mail_to and not self.mail_from and not self.mail_subject: + raise ValueError("mail_to, mail_from, or mail_subject must be not null") + + def is_target_with_mail_to(self, mail_to: list[str] | None) -> bool: + if not mail_to or not self.mail_to: + return False + + for address in self.mail_to: + if address in mail_to: + return True + + return False + + def is_target_with_mail_from(self, mail_from: list[str] | None) -> bool: + if not mail_from or not self.mail_from: + return False + + for address in self.mail_from: + if address in mail_from: + return True + + return False + + def is_target_with_mail_subject(self, mail_subject: str | None) -> bool: + if mail_subject and self.mail_subject: + return self.mail_subject == mail_subject + else: + return False + + def is_target(self, mail_to: list[str] | None, mail_from: list[str] | None, mail_subject: str | None) -> bool: + flag_mail_to = self.is_target_with_mail_to(mail_to=mail_to) + flag_mail_from = self.is_target_with_mail_from(mail_from=mail_from) + flag_mail_subject = self.is_target_with_mail_subject(mail_subject=mail_subject) + + if mail_to and mail_from and mail_subject: + text = "mail_to, mail_from, mail_subject" + elif mail_to and mail_from and not mail_subject: + text = "mail_to, mail_from" + elif mail_to and not mail_from and mail_subject: + text = "mail_to, mail_subject" + elif not mail_to and mail_from and mail_subject: + text = "mail_from, mail_subject" + elif mail_to and not mail_from and not mail_subject: + text = "mail_to" + elif not mail_to and mail_from and not mail_subject: + text = "mail_from" + elif not mail_to and not mail_from and mail_subject: + text = "mail_subject" + else: # not mail_to and not mail_from and not mail_subject + text = "" + + mapping = { + "mail_to, mail_from, mail_subject": flag_mail_to and flag_mail_from and flag_mail_subject, + "mail_to, mail_from": flag_mail_to and flag_mail_from, + "mail_to, mail_subject": flag_mail_to and flag_mail_subject, + "mail_from, mail_subject": flag_mail_from and flag_mail_subject, + "mail_to": flag_mail_to, + "mail_from": flag_mail_from, + "mail_subject": flag_mail_subject, + "": False, + } + return mapping[text] + + def match(self, event: dict[str, Any]) -> tuple[Callable, SESEvent] | None: + all_records: list[dict[str, Any]] = event.get("Records", []) + + if len(all_records) == 0: + return None + + common_header: dict[str, Any] | None = all_records[0].get("ses", {}).get("mail", {}).get("commonHeaders") + + if common_header is None: + return None + + if self.mail_to: + mail_to = common_header.get("to") + else: + mail_to = None + + if self.mail_from: + mail_from = common_header.get("from") + else: + mail_from = None + + if self.mail_subject: + mail_subject = common_header.get("subject") + else: + mail_subject = None + + if self.is_target(mail_to, mail_from, mail_subject): + return self.func, SESEvent(**event) + else: + return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/sns.py b/aws_lambda_powertools/event_handler/async_execution/routes/sns.py new file mode 100644 index 00000000000..1dc5a8fa6a1 --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_execution/routes/sns.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +from typing import Any, Callable + +from aws_lambda_powertools.utilities.data_classes.sns_event import SNSEvent + +from .base import BaseRoute + + +class SNSRoute(BaseRoute): + arn: str | None + name: str | None + name_prefix: str | None + subject: str | None + subject_prefix: str | None + + def __init__( + self, + func: Callable, + arn: str | None = None, + name: str | None = None, + name_prefix: str | None = None, + subject: str | None = None, + subject_prefix: str | None = None, + ): + self.func = func + self.arn = arn + self.name = name + self.name_prefix = name_prefix + self.subject = subject + self.subject_prefix = subject_prefix + + if not self.arn and not self.name and not self.name_prefix and not self.subject and not self.subject_prefix: + raise ValueError("arn, name, name_prefix, subject, or subject_prefix must be not null") + + def is_target_with_arn(self, arn: str | None) -> bool: + if not arn: + return False + elif self.arn: + return self.arn == arn + elif not self.name and not self.name_prefix: + return False + + part = arn.split(":") + name = part[-1] + if self.name: + return self.name == name + else: # if self.name_prefix + return name.find(self.name_prefix) == 0 + + def is_target_with_subject(self, subject: str | None) -> bool: + if not subject: + return False + elif self.subject: + return self.subject == subject + elif self.subject_prefix: + return subject.find(self.subject_prefix) == 0 + else: + return False + + def is_target(self, arn: str | None, subject: str | None) -> bool: + if arn and subject: + return self.is_target_with_arn(arn) and self.is_target_with_subject(subject) + elif arn and not subject: + return self.is_target_with_arn(arn) + elif not arn and subject: + return self.is_target_with_subject(subject) + else: + return False + + def match(self, event: dict[str, Any]) -> tuple[Callable, SNSEvent] | None: + all_records: list[dict[str, Any]] = event.get("Records", []) + + if len(all_records) == 0: + return None + + sns_data: dict[str, Any] | None = all_records[0].get("Sns") + if not sns_data: + return None + + if self.arn or self.name or self.name_prefix: + arn = sns_data.get("TopicArn") + else: + arn = None + + if self.subject or self.subject_prefix: + subject = sns_data.get("Subject") + else: + subject = None + + if self.is_target(arn, subject): + return self.func, SNSEvent(**event) + else: + return None diff --git a/aws_lambda_powertools/event_handler/async_trigger.py b/aws_lambda_powertools/event_handler/async_trigger.py new file mode 100644 index 00000000000..4e60fc9bce6 --- /dev/null +++ b/aws_lambda_powertools/event_handler/async_trigger.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +from .async_execution.exceptions import RouteNotFoundError +from .async_execution.router import Router + +if TYPE_CHECKING: + from aws_lambda_powertools.utilities.typing import LambdaContext + + +class AsyncTriggerResolver(Router): + current_event: Any + lambda_context: LambdaContext + raise_when_not_found: bool + + def __init__(self, raise_when_not_found: bool = True): + super().__init__() + self.current_event = None + self.lambda_context = None + self.raise_when_not_found = raise_when_not_found + + def resolve(self, event: dict[str, Any], context: LambdaContext): + data = self.resolve_route(event=event) + if data is None: + if self.raise_when_not_found: + raise RouteNotFoundError() + else: + return + func, current_event = data + try: + self.current_event = current_event + self.lambda_context = context + return func() + finally: + self.current_event = None + self.lambda_context = None From c579416ac8b2aa9ccf79ea572e05404f8a320e3b Mon Sep 17 00:00:00 2001 From: sinofseven Date: Sun, 5 Jan 2025 16:27:14 +0900 Subject: [PATCH 002/139] fix mypy, and test aws_config_rule.py --- .../async_execution/routes/aws_config_rule.py | 24 +- .../routes/cloud_watch_alarm.py | 4 +- .../routes/cloud_watch_logs.py | 5 +- .../routes/code_deploy_lifecycle_hook.py | 6 +- .../async_execution/routes/event_bridge.py | 5 +- .../async_execution/routes/s3.py | 7 +- .../async_execution/routes/secrets_manager.py | 7 +- .../async_execution/routes/ses.py | 5 +- .../async_execution/routes/sns.py | 9 +- .../event_handler/async_trigger.py | 2 +- .../_async_execution/__init__.py | 0 .../_async_execution/_routes/__init__.py | 0 .../_routes/test_aws_config_rule.py | 282 ++++++++++++++++++ 13 files changed, 334 insertions(+), 22 deletions(-) create mode 100644 tests/unit/event_handler/_async_execution/__init__.py create mode 100644 tests/unit/event_handler/_async_execution/_routes/__init__.py create mode 100644 tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py b/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py index f9d44ec34cb..1db76be9b75 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py @@ -33,13 +33,19 @@ def __init__( raise ValueError("arn, rule_name, rule_name_prefix, or rule_id must be not null") def match(self, event: dict[str, Any]) -> tuple[Callable, AWSConfigRuleEvent] | None: - if self.arn and event.get("configRuleArn") == self.arn: - return self.func, AWSConfigRuleEvent(event) - elif self.rule_name and event.get("configRuleName") == self.rule_name: - return self.func, AWSConfigRuleEvent(event) - elif self.rule_name_prefix and event.get("configRuleName", "").find(self.rule_name_prefix) == 0: - return self.func, AWSConfigRuleEvent(event) - elif self.rule_id and event.get("configRuleId") == self.rule_id: - return self.func, AWSConfigRuleEvent(event) - else: + if not isinstance(event, dict): return None + elif self.arn: + if event.get("configRuleArn") == self.arn: + return self.func, AWSConfigRuleEvent(event) + elif self.rule_name: + if event.get("configRuleName") == self.rule_name: + return self.func, AWSConfigRuleEvent(event) + elif self.rule_name_prefix: + if event.get("configRuleName", "").find(self.rule_name_prefix) == 0: + return self.func, AWSConfigRuleEvent(event) + elif self.rule_id: + if event.get("configRuleId") == self.rule_id: + return self.func, AWSConfigRuleEvent(event) + + return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py index 6cb8327c220..080be4e23ea 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py @@ -30,7 +30,9 @@ def __init__( raise ValueError("arn, alarm_name, or alarm_name_prefix must be not null") def match(self, event: dict[str, Any]) -> tuple[Callable, CloudWatchAlarmEvent] | None: - if self.arn and event.get("alarmArn") == self.arn: + if not isinstance(event, dict): + return None + elif self.arn and event.get("alarmArn") == self.arn: return self.func, CloudWatchAlarmEvent(event) alarm_name = event.get("alarmData", {}).get("alarmName", "") diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py index c9574bac773..6872a51e0d1 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py @@ -117,12 +117,15 @@ def is_target(self, log_group: str | None, log_stream: str | None, subscription_ return mapping[text] def match(self, event: dict[str, Any]) -> tuple[Callable, CloudWatchLogsEvent] | None: + if not isinstance(event, dict): + return None + text = event.get("awslogs", {}).get("data") if not isinstance(text, str): return None - data = CloudWatchLogsEvent(**event) + data = CloudWatchLogsEvent(event) decoded = data.parse_logs_data() if self.log_group or self.log_group_prefix: diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/code_deploy_lifecycle_hook.py b/aws_lambda_powertools/event_handler/async_execution/routes/code_deploy_lifecycle_hook.py index 152ca3df961..1148b601f89 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/code_deploy_lifecycle_hook.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/code_deploy_lifecycle_hook.py @@ -14,7 +14,9 @@ def __init__(self, func: Callable): self.func = func def match(self, event: dict[str, Any]) -> tuple[Callable, CodeDeployLifecycleHookEvent] | None: - if "DeploymentId" in event and "LifecycleEventHookExecutionId" in event: - return self.func, CodeDeployLifecycleHookEvent(**event) + if not isinstance(event, dict): + return None + elif "DeploymentId" in event and "LifecycleEventHookExecutionId" in event: + return self.func, CodeDeployLifecycleHookEvent(event) else: return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py b/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py index a9b0523effa..ec1cac547f4 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py @@ -89,6 +89,9 @@ def is_target(self, detail_type: str | None, source: str | None, resources: list return mapping[text] def match(self, event: dict[str, Any]) -> tuple[Callable, EventBridgeEvent] | None: + if not isinstance(event, dict): + return None + detail_type: str | None = event.get("detail-type") source: str | None = event.get("source") resources: list[str] | None = event.get("resources") @@ -106,6 +109,6 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, EventBridgeEvent] | No resources = None if self.is_target(detail_type, source, resources): - return self.func, EventBridgeEvent(**event) + return self.func, EventBridgeEvent(event) else: return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/s3.py b/aws_lambda_powertools/event_handler/async_execution/routes/s3.py index 230615c4c59..33801e38591 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/s3.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/s3.py @@ -115,6 +115,9 @@ def is_target(self, bucket: str | None, key: str | None, event_name: str | None) return mapping[text] def match(self, event: dict[str, Any]) -> tuple[Callable, S3Event] | None: + if not isinstance(event, dict): + return None + all_records: list[dict[str, Any]] = event.get("Records", []) if len(all_records) == 0: @@ -122,7 +125,7 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, S3Event] | None: record = all_records[0] event_name = record.get("eventName") - s3_data: dict[str, Any] = record.get("s3") + s3_data = record.get("s3") if not event_name or not s3_data: return None @@ -142,6 +145,6 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, S3Event] | None: key = None if self.is_target(bucket, key, event_name): - return self.func, S3Event(**event) + return self.func, S3Event(event) else: return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py b/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py index f0bc805e565..d8eaa06e261 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py @@ -22,16 +22,19 @@ def __init__(self, func: Callable, secret_id: str | None = None, secret_name_pre raise ValueError("secret_id, or secret_name_prefix must be not null") def match(self, event: dict[str, Any]) -> tuple[Callable, SecretsManagerEvent] | None: + if not isinstance(event, dict): + return None + secret_id: str | None = event.get("SecretId") if not secret_id: return None elif self.secret_id and self.secret_id == secret_id: - return self.func, SecretsManagerEvent(**event) + return self.func, SecretsManagerEvent(event) elif self.secret_name_prefix: part = secret_id.split(":") secret_name = part[-1] if secret_name.find(self.secret_name_prefix) == 0: - return self.func, SecretsManagerEvent(**event) + return self.func, SecretsManagerEvent(event) return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/ses.py b/aws_lambda_powertools/event_handler/async_execution/routes/ses.py index 73f4e9238c6..bb9456c04d9 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/ses.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/ses.py @@ -97,6 +97,9 @@ def is_target(self, mail_to: list[str] | None, mail_from: list[str] | None, mail return mapping[text] def match(self, event: dict[str, Any]) -> tuple[Callable, SESEvent] | None: + if not isinstance(event, dict): + return None + all_records: list[dict[str, Any]] = event.get("Records", []) if len(all_records) == 0: @@ -123,6 +126,6 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, SESEvent] | None: mail_subject = None if self.is_target(mail_to, mail_from, mail_subject): - return self.func, SESEvent(**event) + return self.func, SESEvent(event) else: return None diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/sns.py b/aws_lambda_powertools/event_handler/async_execution/routes/sns.py index 1dc5a8fa6a1..1ccdaecaccb 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/sns.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/sns.py @@ -45,8 +45,10 @@ def is_target_with_arn(self, arn: str | None) -> bool: name = part[-1] if self.name: return self.name == name - else: # if self.name_prefix + elif self.name_prefix: return name.find(self.name_prefix) == 0 + else: + return False def is_target_with_subject(self, subject: str | None) -> bool: if not subject: @@ -69,6 +71,9 @@ def is_target(self, arn: str | None, subject: str | None) -> bool: return False def match(self, event: dict[str, Any]) -> tuple[Callable, SNSEvent] | None: + if not isinstance(event, dict): + return None + all_records: list[dict[str, Any]] = event.get("Records", []) if len(all_records) == 0: @@ -89,6 +94,6 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, SNSEvent] | None: subject = None if self.is_target(arn, subject): - return self.func, SNSEvent(**event) + return self.func, SNSEvent(event) else: return None diff --git a/aws_lambda_powertools/event_handler/async_trigger.py b/aws_lambda_powertools/event_handler/async_trigger.py index 4e60fc9bce6..60fd00f59e8 100644 --- a/aws_lambda_powertools/event_handler/async_trigger.py +++ b/aws_lambda_powertools/event_handler/async_trigger.py @@ -11,7 +11,7 @@ class AsyncTriggerResolver(Router): current_event: Any - lambda_context: LambdaContext + lambda_context: LambdaContext | None raise_when_not_found: bool def __init__(self, raise_when_not_found: bool = True): diff --git a/tests/unit/event_handler/_async_execution/__init__.py b/tests/unit/event_handler/_async_execution/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/unit/event_handler/_async_execution/_routes/__init__.py b/tests/unit/event_handler/_async_execution/_routes/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py b/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py new file mode 100644 index 00000000000..7cd77697bd2 --- /dev/null +++ b/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py @@ -0,0 +1,282 @@ +import pytest + +from aws_lambda_powertools.event_handler.async_execution.router import ( + AwsConfigRuleRoute, +) +from aws_lambda_powertools.utilities.data_classes.aws_config_rule_event import AWSConfigRuleEvent +from tests.functional.utils import load_event + + +class TestAwsConfigRuleRoute: + def test_constructor_error(self): + with pytest.raises(ValueError): + AwsConfigRuleRoute(func=lambda _: None) + + @pytest.mark.parametrize( + "event_name, option_constructor", + [ + # other events + ("activeMQEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("albEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("albEventPathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("albMultiValueHeadersEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("albMultiValueQueryStringEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayAuthorizerRequestEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayAuthorizerTokenEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayAuthorizerV2Event.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyEventAnotherPath.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyEventNoOrigin.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyEventPathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyEventPrincipalId.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyEvent_noVersionAuth.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyOtherEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyV2Event.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyV2EventPathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyV2Event_GET.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyV2IamEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyV2LambdaAuthorizerEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyV2OtherGetEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apiGatewayProxyV2SchemaMiddlwareValidEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apigatewayeSchemaMiddlwareInvalidEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("apigatewayeSchemaMiddlwareValidEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("appSyncAuthorizerEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("appSyncAuthorizerResponse.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("appSyncBatchEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("appSyncDirectResolver.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("appSyncResolverEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("bedrockAgentEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("bedrockAgentEventWithPathParams.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("bedrockAgentPostEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cloudWatchAlarmEventCompositeMetric.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cloudWatchAlarmEventSingleMetric.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cloudWatchDashboardEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cloudWatchLogEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cloudWatchLogEventWithPolicyLevel.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cloudformationCustomResourceCreate.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cloudformationCustomResourceDelete.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cloudformationCustomResourceUpdate.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("codeDeployLifecycleHookEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("codePipelineEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("codePipelineEventData.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("codePipelineEventEmptyUserParameters.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("codePipelineEventWithEncryptionKey.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoCreateAuthChallengeEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoCustomEmailSenderEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoCustomMessageEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoCustomSMSSenderEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoDefineAuthChallengeEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoPostAuthenticationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoPostConfirmationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoPreAuthenticationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoPreSignUpEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoPreTokenGenerationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoPreTokenV2GenerationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoUserMigrationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("cognitoVerifyAuthChallengeResponseEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("connectContactFlowEventAll.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("connectContactFlowEventMin.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("dynamoStreamEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("eventBridgeEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("kafkaEventMsk.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("kafkaEventSelfManaged.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("kinesisFirehoseKinesisEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("kinesisFirehosePutEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("kinesisFirehoseSQSEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("kinesisStreamCloudWatchLogsEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("kinesisStreamEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("kinesisStreamEventOneRecord.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("lambdaFunctionUrlEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("lambdaFunctionUrlEventPathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("lambdaFunctionUrlEventWithHeaders.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("lambdaFunctionUrlIAMEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("rabbitMQEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3BatchOperationEventSchemaV1.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3BatchOperationEventSchemaV2.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3Event.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3EventBridgeNotificationObjectCreatedEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3EventBridgeNotificationObjectDeletedEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3EventBridgeNotificationObjectExpiredEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ( + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + {"func": None, "rule_id": "config-rule-i1y1j1"}, + ), + ("s3EventDecodedKey.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3EventDeleteObject.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3EventGlacier.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3ObjectEventIAMUser.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3ObjectEventTempCredentials.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("s3SqsEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("secretsManagerEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("sesEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("snsEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("snsSqsEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("snsSqsFifoEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("sqsDlqTriggerEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("sqsEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("vpcLatticeEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("vpcLatticeEventPathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("vpcLatticeEventV2PathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("vpcLatticeV2Event.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + ("vpcLatticeV2EventWithHeaders.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), + # aws_config_rule_event, not match arn, without rule_name, rule_name_prefix, or rule_id + ( + "awsConfigRuleConfigurationChanged.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i1y1j1"}, + ), + ( + "awsConfigRuleOversizedConfiguration.json", + { + "func": None, + "arn": "/".join( + [ + "arn:aws:config:us-east-2:123456789012:config-rule", + "config-rule-ec2-managed-instance-inventory-v2", + ], + ), + }, + ), + ( + "awsConfigRuleScheduled.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-pdmyw3"}, + ), + # awsConfigRuleConfigurationChanged.json, not match arn, with rule_name, rule_name_prefix, or rule_id + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i1y1j1", + "rule_name": "MyRule", + }, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i1y1j1", + "rule_name_prefix": "My", + }, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i1y1j1", + "rule_id": "config-rule-i9y8j9", + }, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": None, + "rule_name": "MyRuleV2", + "rule_name_prefix": "My", + "rule_id": "config-rule-i9y8j9", + }, + ), + # awsConfigRuleConfigurationChanged.json, not match rule_name, without rule_name_prefix, or rule_id + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": None, + "rule_name": "MyRuleV2", + }, + ), + # awsConfigRuleConfigurationChanged.json, not match rule_name, with rule_name_prefix, or rule_id + ( + "awsConfigRuleConfigurationChanged.json", + {"func": None, "rule_name": "MyRuleV2", "rule_name_prefix": "My"}, + ), + ( + "awsConfigRuleConfigurationChanged.json", + {"func": None, "rule_name": "MyRuleV2", "rule_id": "config-rule-i9y8j9"}, + ), + ( + "awsConfigRuleConfigurationChanged.json", + {"func": None, "rule_name": "MyRuleV2", "rule_name_prefix": "My", "rule_id": "config-rule-i9y8j9"}, + ), + # awsConfigRuleConfigurationChanged.json, not match rule_name_prefix, without rule_id + ( + "awsConfigRuleConfigurationChanged.json", + {"func": None, "rule_name_prefix": "Me"}, + ), + # awsConfigRuleConfigurationChanged.json, not match rule_name_prefix, with rule_id + ( + "awsConfigRuleConfigurationChanged.json", + {"func": None, "rule_name_prefix": "Me", "rule_id": "config-rule-i9y8j9"}, + ), + # awsConfigRuleConfigurationChanged.json, not match rule_id + ( + "awsConfigRuleConfigurationChanged.json", + {"func": None, "rule_id": "config-rule-i1y1j1"}, + ), + ], + ) + def test_match_false(self, event_name, option_constructor): + route = AwsConfigRuleRoute(**option_constructor) + event = load_event(file_name=event_name) + actual = route.match(event=event) + assert actual is None + + @pytest.mark.parametrize( + "event_name, option_constructor", + [ + # awsConfigRuleConfigurationChanged.json, match arn + ( + "awsConfigRuleConfigurationChanged.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + ), + # awsConfigRuleConfigurationChanged.json, match rule_name + ("awsConfigRuleConfigurationChanged.json", {"func": None, "rule_name": "MyRule"}), + # awsConfigRuleConfigurationChanged.json, match rule_name_prefix + ("awsConfigRuleConfigurationChanged.json", {"func": None, "rule_name_prefix": "MyR"}), + # awsConfigRuleConfigurationChanged.json, match rule_id + ("awsConfigRuleConfigurationChanged.json", {"func": None, "rule_id": "config-rule-i9y8j9"}), + # awsConfigRuleOversizedConfiguration.json, match arn + ( + "awsConfigRuleOversizedConfiguration.json", + { + "func": None, + "arn": "/".join( + [ + "arn:aws:config:us-east-2:123456789012:config-rule", + "config-rule-ec2-managed-instance-inventory", + ], + ), + }, + ), + # awsConfigRuleOversizedConfiguration.json, match rule_name + ( + "awsConfigRuleOversizedConfiguration.json", + {"func": None, "rule_name": "change-triggered-config-rule"}, + ), + # awsConfigRuleOversizedConfiguration.json, match rule_name_prefix + ( + "awsConfigRuleOversizedConfiguration.json", + {"func": None, "rule_name_prefix": "change-t"}, + ), + # awsConfigRuleOversizedConfiguration.json, match rule_id + ( + "awsConfigRuleOversizedConfiguration.json", + {"func": None, "rule_id": "config-rule-0123456"}, + ), + # awsConfigRuleScheduled.json, match arn + ( + "awsConfigRuleScheduled.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-pdmyw1"}, + ), + # awsConfigRuleScheduled.json, match rule_name + ("awsConfigRuleScheduled.json", {"func": None, "rule_name": "rule-ec2-test"}), + # awsConfigRuleScheduled.json, match rule_name_prefix + ("awsConfigRuleScheduled.json", {"func": None, "rule_name_prefix": "rule-e"}), + # awsConfigRuleScheduled.json, match rule_id + ("awsConfigRuleScheduled.json", {"func": None, "rule_id": "config-rule-pdmyw1"}), + ], + ) + def test_match_true(self, event_name, option_constructor): + route = AwsConfigRuleRoute(**option_constructor) + event = load_event(file_name=event_name) + expect = (route.func, AWSConfigRuleEvent(event)) + actual = route.match(event=event) + assert actual == expect From d47600866e163ad2a131de6a0e89131a4cbd899b Mon Sep 17 00:00:00 2001 From: sinofseven Date: Sun, 5 Jan 2025 16:36:45 +0900 Subject: [PATCH 003/139] fix SonarCloud Code Analysis on sns.py --- .../event_handler/async_execution/routes/sns.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/sns.py b/aws_lambda_powertools/event_handler/async_execution/routes/sns.py index 1ccdaecaccb..ae44f638e05 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/sns.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/sns.py @@ -38,8 +38,6 @@ def is_target_with_arn(self, arn: str | None) -> bool: return False elif self.arn: return self.arn == arn - elif not self.name and not self.name_prefix: - return False part = arn.split(":") name = part[-1] From 996babd17e27db176a7b7de2be5fbb3ffdebe3b2 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Mon, 6 Jan 2025 16:12:02 +0900 Subject: [PATCH 004/139] fix import order --- .../_async_execution/_routes/test_aws_config_rule.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py b/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py index 7cd77697bd2..ed28a6517d1 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py @@ -3,7 +3,9 @@ from aws_lambda_powertools.event_handler.async_execution.router import ( AwsConfigRuleRoute, ) -from aws_lambda_powertools.utilities.data_classes.aws_config_rule_event import AWSConfigRuleEvent +from aws_lambda_powertools.utilities.data_classes.aws_config_rule_event import ( + AWSConfigRuleEvent, +) from tests.functional.utils import load_event From 202146c3b4eaa6f7dde13fcc2c54cc248280c4c9 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Mon, 6 Jan 2025 16:12:42 +0900 Subject: [PATCH 005/139] add test for cloud_watch_alarm.py --- .../routes/cloud_watch_alarm.py | 21 +- .../_routes/test_cloud_watch_alarm.py | 296 ++++++++++++++++++ 2 files changed, 309 insertions(+), 8 deletions(-) create mode 100644 tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py index 080be4e23ea..605df8b92a4 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py @@ -32,13 +32,18 @@ def __init__( def match(self, event: dict[str, Any]) -> tuple[Callable, CloudWatchAlarmEvent] | None: if not isinstance(event, dict): return None - elif self.arn and event.get("alarmArn") == self.arn: - return self.func, CloudWatchAlarmEvent(event) + elif self.arn: + if event.get("alarmArn") == self.arn: + return self.func, CloudWatchAlarmEvent(event) + else: + return None alarm_name = event.get("alarmData", {}).get("alarmName", "") - if self.alarm_name and alarm_name == self.alarm_name: - return self.func, CloudWatchAlarmEvent(event) - elif self.alarm_name_prefix and alarm_name.find(self.alarm_name_prefix) == 0: - return self.func, CloudWatchAlarmEvent(event) - else: - return None + if self.alarm_name: + if alarm_name == self.alarm_name: + return self.func, CloudWatchAlarmEvent(event) + elif self.alarm_name_prefix: + if alarm_name.find(self.alarm_name_prefix) == 0: + return self.func, CloudWatchAlarmEvent(event) + + return None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py new file mode 100644 index 00000000000..79df0678870 --- /dev/null +++ b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py @@ -0,0 +1,296 @@ +import pytest + +from aws_lambda_powertools.event_handler.async_execution.routes.cloud_watch_alarm import ( + CloudWatchAlarmRoute, +) +from aws_lambda_powertools.utilities.data_classes.cloud_watch_alarm_event import ( + CloudWatchAlarmEvent, +) +from tests.functional.utils import load_event + + +class TestCloudWatchAlarmRoute: + def test_constructor_error(self): + with pytest.raises(ValueError): + CloudWatchAlarmRoute(func=None) + + @pytest.mark.parametrize( + "event_name, option_constructor", + [ + # cloudWatchAlarmEventCompositeMetric.json, match arn, without alarm_name and alarm_name_prefix + ( + "cloudWatchAlarmEventCompositeMetric.json", + {"func": lambda _: None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main"}, + ), + # cloudWatchAlarmEventCompositeMetric.json, match arn, with alarm_name or alarm_name_prefix + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": lambda _: None, + "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", + "alarm_name": "CompositeDemo.MainV2", + }, + ), + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": lambda _: None, + "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", + "alarm_name_prefix": "CompositeDD", + }, + ), + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": lambda _: None, + "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", + "alarm_name": "CompositeDemo.MainV2", + "alarm_name_prefix": "CompositeDD", + }, + ), + # cloudWatchAlarmEventCompositeMetric.json, match alarm_name, without alarm_name_prefix + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": lambda _: None, + "alarm_name": "CompositeDemo.Main", + }, + ), + # cloudWatchAlarmEventCompositeMetric.json, match alarm_name, with alarm_name_prefix + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": lambda _: None, + "alarm_name": "CompositeDemo.Main", + "alarm_name_prefix": "CompositeDD", + }, + ), + # cloudWatchAlarmEventCompositeMetric.json, match alarm_name_prefix + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": lambda _: None, + "alarm_name_prefix": "CompositeD", + }, + ), + # cloudWatchAlarmEventSingleMetric.json, match arn, without alarm_name and alarm_name_prefix + ( + "cloudWatchAlarmEventSingleMetric.json", + { + "func": lambda _: None, + "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", + }, + ), + # cloudWatchAlarmEventSingleMetric.json, match arn, with alarm_name or alarm_name_prefix + ( + "cloudWatchAlarmEventSingleMetric.json", + { + "func": lambda _: None, + "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", + "alarm_name": "Test alertV2", + }, + ), + ( + "cloudWatchAlarmEventSingleMetric.json", + { + "func": lambda _: None, + "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", + "alarm_name_prefix": "Test-a", + }, + ), + ( + "cloudWatchAlarmEventSingleMetric.json", + { + "func": lambda _: None, + "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", + "alarm_name": "Test alertV2", + "alarm_name_prefix": "Test-a", + }, + ), + # cloudWatchAlarmEventSingleMetric.json, match alarm_name, without alarm_name_prefix + ("cloudWatchAlarmEventSingleMetric.json", {"func": lambda _: None, "alarm_name": "Test alert"}), + # cloudWatchAlarmEventSingleMetric.json, match alarm_name, with alarm_name_prefix + ( + "cloudWatchAlarmEventSingleMetric.json", + {"func": lambda _: None, "alarm_name": "Test alert", "alarm_name_prefix": "Test-a"}, + ), + # cloudWatchAlarmEventSingleMetric.json, match alarm_name_prefix + ("cloudWatchAlarmEventSingleMetric.json", {"func": lambda _: None, "alarm_name_prefix": "Test a"}), + ], + ) + def test_match_true(self, event_name, option_constructor): + event = load_event(file_name=event_name) + route = CloudWatchAlarmRoute(**option_constructor) + expected = (route.func, CloudWatchAlarmEvent(event)) + actual = route.match(event=event) + assert actual == expected + + @pytest.mark.parametrize( + "event_name, option_constructor", + [ + # other events + ("activeMQEvent.json", {"func": None, "arn": "test"}), + ("albEvent.json", {"func": None, "arn": "test"}), + ("albEventPathTrailingSlash.json", {"func": None, "arn": "test"}), + ("albMultiValueHeadersEvent.json", {"func": None, "arn": "test"}), + ("albMultiValueQueryStringEvent.json", {"func": None, "arn": "test"}), + ("apiGatewayAuthorizerRequestEvent.json", {"func": None, "arn": "test"}), + ("apiGatewayAuthorizerTokenEvent.json", {"func": None, "arn": "test"}), + ("apiGatewayAuthorizerV2Event.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyEvent.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyEventAnotherPath.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyEventNoOrigin.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyEventPathTrailingSlash.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyEventPrincipalId.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyEvent_noVersionAuth.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyOtherEvent.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyV2Event.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyV2EventPathTrailingSlash.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyV2Event_GET.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyV2IamEvent.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyV2LambdaAuthorizerEvent.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyV2OtherGetEvent.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", {"func": None, "arn": "test"}), + ("apiGatewayProxyV2SchemaMiddlwareValidEvent.json", {"func": None, "arn": "test"}), + ("apigatewayeSchemaMiddlwareInvalidEvent.json", {"func": None, "arn": "test"}), + ("apigatewayeSchemaMiddlwareValidEvent.json", {"func": None, "arn": "test"}), + ("appSyncAuthorizerEvent.json", {"func": None, "arn": "test"}), + ("appSyncAuthorizerResponse.json", {"func": None, "arn": "test"}), + ("appSyncBatchEvent.json", {"func": None, "arn": "test"}), + ("appSyncDirectResolver.json", {"func": None, "arn": "test"}), + ("appSyncResolverEvent.json", {"func": None, "arn": "test"}), + ("awsConfigRuleConfigurationChanged.json", {"func": None, "arn": "test"}), + ("awsConfigRuleOversizedConfiguration.json", {"func": None, "arn": "test"}), + ("awsConfigRuleScheduled.json", {"func": None, "arn": "test"}), + ("bedrockAgentEvent.json", {"func": None, "arn": "test"}), + ("bedrockAgentEventWithPathParams.json", {"func": None, "arn": "test"}), + ("bedrockAgentPostEvent.json", {"func": None, "arn": "test"}), + ("cloudWatchDashboardEvent.json", {"func": None, "arn": "test"}), + ("cloudWatchLogEvent.json", {"func": None, "arn": "test"}), + ("cloudWatchLogEventWithPolicyLevel.json", {"func": None, "arn": "test"}), + ("cloudformationCustomResourceCreate.json", {"func": None, "arn": "test"}), + ("cloudformationCustomResourceDelete.json", {"func": None, "arn": "test"}), + ("cloudformationCustomResourceUpdate.json", {"func": None, "arn": "test"}), + ("codeDeployLifecycleHookEvent.json", {"func": None, "arn": "test"}), + ("codePipelineEvent.json", {"func": None, "arn": "test"}), + ("codePipelineEventData.json", {"func": None, "arn": "test"}), + ("codePipelineEventEmptyUserParameters.json", {"func": None, "arn": "test"}), + ("codePipelineEventWithEncryptionKey.json", {"func": None, "arn": "test"}), + ("cognitoCreateAuthChallengeEvent.json", {"func": None, "arn": "test"}), + ("cognitoCustomEmailSenderEvent.json", {"func": None, "arn": "test"}), + ("cognitoCustomMessageEvent.json", {"func": None, "arn": "test"}), + ("cognitoCustomSMSSenderEvent.json", {"func": None, "arn": "test"}), + ("cognitoDefineAuthChallengeEvent.json", {"func": None, "arn": "test"}), + ("cognitoPostAuthenticationEvent.json", {"func": None, "arn": "test"}), + ("cognitoPostConfirmationEvent.json", {"func": None, "arn": "test"}), + ("cognitoPreAuthenticationEvent.json", {"func": None, "arn": "test"}), + ("cognitoPreSignUpEvent.json", {"func": None, "arn": "test"}), + ("cognitoPreTokenGenerationEvent.json", {"func": None, "arn": "test"}), + ("cognitoPreTokenV2GenerationEvent.json", {"func": None, "arn": "test"}), + ("cognitoUserMigrationEvent.json", {"func": None, "arn": "test"}), + ("cognitoVerifyAuthChallengeResponseEvent.json", {"func": None, "arn": "test"}), + ("connectContactFlowEventAll.json", {"func": None, "arn": "test"}), + ("connectContactFlowEventMin.json", {"func": None, "arn": "test"}), + ("dynamoStreamEvent.json", {"func": None, "arn": "test"}), + ("eventBridgeEvent.json", {"func": None, "arn": "test"}), + ("kafkaEventMsk.json", {"func": None, "arn": "test"}), + ("kafkaEventSelfManaged.json", {"func": None, "arn": "test"}), + ("kinesisFirehoseKinesisEvent.json", {"func": None, "arn": "test"}), + ("kinesisFirehosePutEvent.json", {"func": None, "arn": "test"}), + ("kinesisFirehoseSQSEvent.json", {"func": None, "arn": "test"}), + ("kinesisStreamCloudWatchLogsEvent.json", {"func": None, "arn": "test"}), + ("kinesisStreamEvent.json", {"func": None, "arn": "test"}), + ("kinesisStreamEventOneRecord.json", {"func": None, "arn": "test"}), + ("lambdaFunctionUrlEvent.json", {"func": None, "arn": "test"}), + ("lambdaFunctionUrlEventPathTrailingSlash.json", {"func": None, "arn": "test"}), + ("lambdaFunctionUrlEventWithHeaders.json", {"func": None, "arn": "test"}), + ("lambdaFunctionUrlIAMEvent.json", {"func": None, "arn": "test"}), + ("rabbitMQEvent.json", {"func": None, "arn": "test"}), + ("s3BatchOperationEventSchemaV1.json", {"func": None, "arn": "test"}), + ("s3BatchOperationEventSchemaV2.json", {"func": None, "arn": "test"}), + ("s3Event.json", {"func": None, "arn": "test"}), + ("s3EventBridgeNotificationObjectCreatedEvent.json", {"func": None, "arn": "test"}), + ("s3EventBridgeNotificationObjectDeletedEvent.json", {"func": None, "arn": "test"}), + ("s3EventBridgeNotificationObjectExpiredEvent.json", {"func": None, "arn": "test"}), + ("s3EventBridgeNotificationObjectRestoreCompletedEvent.json", {"func": None, "arn": "test"}), + ("s3EventDecodedKey.json", {"func": None, "arn": "test"}), + ("s3EventDeleteObject.json", {"func": None, "arn": "test"}), + ("s3EventGlacier.json", {"func": None, "arn": "test"}), + ("s3ObjectEventIAMUser.json", {"func": None, "arn": "test"}), + ("s3ObjectEventTempCredentials.json", {"func": None, "arn": "test"}), + ("s3SqsEvent.json", {"func": None, "arn": "test"}), + ("secretsManagerEvent.json", {"func": None, "arn": "test"}), + ("sesEvent.json", {"func": None, "arn": "test"}), + ("snsEvent.json", {"func": None, "arn": "test"}), + ("snsSqsEvent.json", {"func": None, "arn": "test"}), + ("snsSqsFifoEvent.json", {"func": None, "arn": "test"}), + ("sqsDlqTriggerEvent.json", {"func": None, "arn": "test"}), + ("sqsEvent.json", {"func": None, "arn": "test"}), + ("vpcLatticeEvent.json", {"func": None, "arn": "test"}), + ("vpcLatticeEventPathTrailingSlash.json", {"func": None, "arn": "test"}), + ("vpcLatticeEventV2PathTrailingSlash.json", {"func": None, "arn": "test"}), + ("vpcLatticeV2Event.json", {"func": None, "arn": "test"}), + ("vpcLatticeV2EventWithHeaders.json", {"func": None, "arn": "test"}), + # cloudWatchAlarmEventCompositeMetric.json, not match arn, without alarm_name and alarm_name_prefix + ( + "cloudWatchAlarmEventCompositeMetric.json", + {"func": None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.MainV2"}, + ), + # cloudWatchAlarmEventCompositeMetric.json, not match arn, with alarm_name or alarm_name_prefix + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": None, + "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.MainV2", + "alarm_name": "CompositeDemo.Main", + }, + ), + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": None, + "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.MainV2", + "alarm_name_prefix": "CompositeD", + }, + ), + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": None, + "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.MainV2", + "alarm_name": "CompositeDemo.Main", + "alarm_name_prefix": "CompositeD", + }, + ), + # cloudWatchAlarmEventCompositeMetric.json, not match alarm_name, without alarm_name_prefix + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": None, + "alarm_name": "CompositeDemo.MainV2", + }, + ), + # cloudWatchAlarmEventCompositeMetric.json, not match alarm_name, with alarm_name_prefix + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": None, + "alarm_name": "CompositeDemo.MainV2", + "alarm_name_prefix": "CompositeD", + }, + ), + # cloudWatchAlarmEventCompositeMetric.json, not match alarm_name_prefix + ( + "cloudWatchAlarmEventCompositeMetric.json", + { + "func": None, + "alarm_name_prefix": "CompositeDD", + }, + ), + ], + ) + def test_match_false(self, event_name, option_constructor): + event = load_event(file_name=event_name) + route = CloudWatchAlarmRoute(**option_constructor) + actual = route.match(event=event) + assert actual is None From 898d849ed3b148188e0e960c8617fabd4c7da4a0 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Mon, 6 Jan 2025 22:01:12 +0900 Subject: [PATCH 006/139] add test for cloud watch logs --- .../routes/cloud_watch_logs.py | 14 +- .../_routes/test_cloud_watch_logs.py | 914 ++++++++++++++++++ 2 files changed, 921 insertions(+), 7 deletions(-) create mode 100644 tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py index 6872a51e0d1..aaa2bbd739d 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py @@ -14,7 +14,7 @@ class CloudWatchLogsRoute(BaseRoute): log_group_prefix: str | None log_stream: str | None log_stream_prefix: str | None - subscribe_filters: list[str] | None + subscription_filters: list[str] | None def __init__( self, @@ -32,16 +32,16 @@ def __init__( self.log_stream_prefix = log_stream_prefix if isinstance(subscription_filters, str): - self.subscribe_filters = [subscription_filters] + self.subscription_filters = [subscription_filters] else: - self.subscribe_filters = subscription_filters + self.subscription_filters = subscription_filters if ( not self.log_group and not self.log_group_prefix and not self.log_stream and not self.log_stream_prefix - and not self.subscribe_filters + and not self.subscription_filters ): raise ValueError( "log_group, log_group_prefix, log_stream, log_stream_prefix, or subscription_filters must be not null", @@ -70,10 +70,10 @@ def is_target_with_log_stream(self, log_stream: str | None) -> bool: def is_target_with_subscription_filters(self, subscription_filters: list[str] | None) -> bool: if not subscription_filters: return False - elif not self.subscribe_filters: + elif not self.subscription_filters: return False - for name in self.subscribe_filters: + for name in self.subscription_filters: if name in subscription_filters: return True @@ -138,7 +138,7 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, CloudWatchLogsEvent] | else: log_stream = None - if self.subscribe_filters: + if self.subscription_filters: subscription_filters = decoded.subscription_filters else: subscription_filters = None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py new file mode 100644 index 00000000000..4f71a5f8e6c --- /dev/null +++ b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py @@ -0,0 +1,914 @@ +import pytest + +from aws_lambda_powertools.event_handler.async_execution.routes.cloud_watch_logs import ( + CloudWatchLogsRoute, +) +from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import ( + CloudWatchLogsEvent, +) +from tests.functional.utils import load_event + + +class TestCloudWatchLogsRoute: + def test_constructor_error(self): + with pytest.raises(ValueError): + CloudWatchLogsRoute(func=None) + + @pytest.mark.parametrize( + "option, expected", + [ + ( + {"func": None, "log_group": "test"}, + { + "func": None, + "log_group": "test", + "log_group_prefix": None, + "log_stream": None, + "log_stream_prefix": None, + "subscription_filters": None, + }, + ), + ( + {"func": None, "log_group_prefix": "test"}, + { + "func": None, + "log_group": None, + "log_group_prefix": "test", + "log_stream": None, + "log_stream_prefix": None, + "subscription_filters": None, + }, + ), + ( + {"func": None, "log_stream": "test"}, + { + "func": None, + "log_group": None, + "log_group_prefix": None, + "log_stream": "test", + "log_stream_prefix": None, + "subscription_filters": None, + }, + ), + ( + {"func": None, "log_stream_prefix": "test"}, + { + "func": None, + "log_group": None, + "log_group_prefix": None, + "log_stream": None, + "log_stream_prefix": "test", + "subscription_filters": None, + }, + ), + ( + {"func": None, "subscription_filters": "test"}, + { + "func": None, + "log_group": None, + "log_group_prefix": None, + "log_stream": None, + "log_stream_prefix": None, + "subscription_filters": ["test"], + }, + ), + ( + {"func": None, "subscription_filters": ["test", "name"]}, + { + "func": None, + "log_group": None, + "log_group_prefix": None, + "log_stream": None, + "log_stream_prefix": None, + "subscription_filters": ["test", "name"], + }, + ), + ], + ) + def test_constructor_normal(self, option, expected): + route = CloudWatchLogsRoute(**option) + assert route.__dict__ == expected + + @pytest.mark.parametrize( + "option_constructor, option, expected", + [ + ({"func": None, "log_group": "test-log-group"}, {"log_group": None}, False), + ({"func": None, "log_group": "test-log-group"}, {"log_group": "test-log-group-v2"}, False), + ({"func": None, "log_group": "test-log-group"}, {"log_group": "test-log-group"}, True), + ({"func": None, "log_group_prefix": "test-ll"}, {"log_group": "test-log-group"}, False), + ({"func": None, "log_group_prefix": "est-l"}, {"log_group": "test-log-group"}, False), + ({"func": None, "log_group_prefix": "test-l"}, {"log_group": "test-log-group"}, True), + ({"func": None, "log_stream": "test-log-group"}, {"log_group": None}, False), + ], + ) + def test_is_target_with_log_group(self, option_constructor, option, expected): + route = CloudWatchLogsRoute(**option_constructor) + actual = route.is_target_with_log_group(**option) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option, expected", + [ + ({"func": None, "log_stream": "test-log-stream"}, {"log_stream": None}, False), + ({"func": None, "log_stream": "test-log-stream-v2"}, {"log_stream": "test-log-stream"}, False), + ({"func": None, "log_stream": "test-log-stream"}, {"log_stream": "test-log-stream"}, True), + ({"func": None, "log_stream_prefix": "test-ll"}, {"log_stream": "test-log-stream"}, False), + ({"func": None, "log_stream_prefix": "est-l"}, {"log_stream": "test-log-stream"}, False), + ({"func": None, "log_stream_prefix": "test-l"}, {"log_stream": "test-log-stream"}, True), + ({"func": None, "log_group": "test-l"}, {"log_stream": "test-log-stream"}, False), + ], + ) + def test_is_target_with_log_stream(self, option_constructor, option, expected): + route = CloudWatchLogsRoute(**option_constructor) + actual = route.is_target_with_log_stream(**option) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option, expected", + [ + ({"func": None, "subscription_filters": ["test"]}, {"subscription_filters": None}, False), + ({"func": None, "log_group": "test"}, {"subscription_filters": ["test"]}, False), + ({"func": None, "subscription_filters": ["test"]}, {"subscription_filters": ["test"]}, True), + ({"func": None, "subscription_filters": ["test", "name"]}, {"subscription_filters": ["test"]}, True), + ({"func": None, "subscription_filters": ["test"]}, {"subscription_filters": ["test", "name"]}, True), + ({"func": None, "subscription_filters": ["test"]}, {"subscription_filters": ["name"]}, False), + ], + ) + def test_is_target_with_subscription_filters(self, option_constructor, option, expected): + route = CloudWatchLogsRoute(**option_constructor) + actual = route.is_target_with_subscription_filters(**option) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option, expected", + [ + ( + { + "func": None, + "log_group": "test-log-group", + "log_stream": "test-log-stream", + "subscription_filters": ["test"], + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + True, + ), + ( + { + "func": None, + "log_group": "test-log-group-v2", + "log_stream": "test-log-stream", + "subscription_filters": ["test"], + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + False, + ), + ( + { + "func": None, + "log_group": "test-log-group", + "log_stream": "test-log-stream-v2", + "subscription_filters": ["test"], + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + False, + ), + ( + { + "func": None, + "log_group": "test-log-group", + "log_stream": "test-log-stream", + "subscription_filters": ["name"], + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + False, + ), + ( + { + "func": None, + "log_group": "test-log-group-v2", + "log_stream": "test-log-stream-v2", + "subscription_filters": ["test"], + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + False, + ), + ( + { + "func": None, + "log_group": "test-log-group-v2", + "log_stream": "test-log-stream", + "subscription_filters": ["name"], + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + False, + ), + ( + { + "func": None, + "log_group": "test-log-group", + "log_stream": "test-log-stream-v2", + "subscription_filters": ["name"], + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + False, + ), + ( + { + "func": None, + "log_group": "test-log-group-v2", + "log_stream": "test-log-stream-v2", + "subscription_filters": ["name"], + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + False, + ), + ( + { + "func": None, + "log_group": "test-log-group", + "log_stream": "test-log-stream", + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": None}, + True, + ), + ( + { + "func": None, + "log_group": "test-log-group-v2", + "log_stream": "test-log-stream", + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": None}, + False, + ), + ( + { + "func": None, + "log_group": "test-log-group", + "log_stream": "test-log-stream-v2", + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": None}, + False, + ), + ( + { + "func": None, + "log_group": "test-log-group-v2", + "log_stream": "test-log-stream-v2", + }, + {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": None}, + False, + ), + ( + {"func": None, "log_group": "test-log-group", "subscription_filters": ["test"]}, + {"log_group": "test-log-group", "log_stream": None, "subscription_filters": ["test"]}, + True, + ), + ( + {"func": None, "log_group": "test-log-group-v2", "subscription_filters": ["test"]}, + {"log_group": "test-log-group", "log_stream": None, "subscription_filters": ["test"]}, + False, + ), + ( + {"func": None, "log_group": "test-log-group", "subscription_filters": ["name"]}, + {"log_group": "test-log-group", "log_stream": None, "subscription_filters": ["test"]}, + False, + ), + ( + {"func": None, "log_group": "test-log-group-v2", "subscription_filters": ["name"]}, + {"log_group": "test-log-group", "log_stream": None, "subscription_filters": ["test"]}, + False, + ), + ( + {"func": None, "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + True, + ), + ( + {"func": None, "log_stream": "test-log-stream-v2", "subscription_filters": ["test"]}, + {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + False, + ), + ( + {"func": None, "log_stream": "test-log-stream", "subscription_filters": ["name"]}, + {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + False, + ), + ( + {"func": None, "log_stream": "test-log-stream-v2", "subscription_filters": ["name"]}, + {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": ["test"]}, + False, + ), + ( + {"func": None, "log_group": "test-log-group"}, + {"log_group": "test-log-group", "log_stream": None, "subscription_filters": None}, + True, + ), + ( + {"func": None, "log_group": "test-log-group-v2"}, + {"log_group": "test-log-group", "log_stream": None, "subscription_filters": None}, + False, + ), + ( + {"func": None, "log_stream": "test-log-stream"}, + {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": None}, + True, + ), + ( + {"func": None, "log_stream": "test-log-stream-v2"}, + {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": None}, + False, + ), + ( + {"func": None, "subscription_filters": ["test"]}, + {"log_group": None, "log_stream": None, "subscription_filters": ["test"]}, + True, + ), + ( + {"func": None, "subscription_filters": ["name"]}, + {"log_group": None, "log_stream": None, "subscription_filters": ["test"]}, + False, + ), + ( + {"func": None, "subscription_filters": ["name"]}, + {"log_group": None, "log_stream": None, "subscription_filters": None}, + False, + ), + ], + ) + def test_is_target(self, option_constructor, option, expected): + route = CloudWatchLogsRoute(**option_constructor) + actual = route.is_target(**option) + assert actual == expected + + @pytest.mark.parametrize( + "event_name, option_constructor", + [ + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_group": "testLogGroup", + "log_stream": "testLogStream", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_group_prefix": "testLogG", + "log_stream": "testLogStream", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_group": "testLogGroup", + "log_stream_prefix": "testLogS", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_group_prefix": "testLogG", + "log_stream_prefix": "testLogS", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_group": "testLogGroup", + "log_stream": "testLogStream", + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_group_prefix": "testLogG", + "log_stream": "testLogStream", + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_group": "testLogGroup", + "log_stream_prefix": "testLogS", + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_group_prefix": "testLogG", + "log_stream_prefix": "testLogS", + }, + ), + ( + "cloudWatchLogEvent.json", + {"func": lambda *_: None, "log_group": "testLogGroup", "subscription_filters": ["testFilter"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": lambda *_: None, "log_group_prefix": "testLogG", "subscription_filters": ["testFilter"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": lambda *_: None, "log_stream": "testLogStream", "subscription_filters": ["testFilter"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": lambda *_: None, "log_stream_prefix": "testLogS", "subscription_filters": ["testFilter"]}, + ), + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_group": "testLogGroup", + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_group_prefix": "testLogG", + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": lambda *_: None, + "log_stream": "testLogStream", + }, + ), + ("cloudWatchLogEvent.json", {"func": lambda *_: None, "subscription_filters": ["testFilter"]}), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_group": "testLogGroup", + "log_stream": "testLogStream", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_group_prefix": "testLogG", + "log_stream": "testLogStream", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_group": "testLogGroup", + "log_stream_prefix": "testLogS", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_group_prefix": "testLogG", + "log_stream_prefix": "testLogS", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_group": "testLogGroup", + "log_stream": "testLogStream", + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_group_prefix": "testLogG", + "log_stream": "testLogStream", + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_group": "testLogGroup", + "log_stream_prefix": "testLogS", + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_group_prefix": "testLogG", + "log_stream_prefix": "testLogS", + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_group": "testLogGroup", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_group_prefix": "testLogG", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_stream": "testLogStream", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + { + "func": lambda *_: None, + "log_stream_prefix": "testLogS", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + {"func": lambda *_: None, "log_group": "testLogGroup"}, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + {"func": lambda *_: None, "log_group_prefix": "testLogG"}, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + {"func": lambda *_: None, "log_stream": "testLogStream"}, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + {"func": lambda *_: None, "log_stream_prefix": "testLogS"}, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + {"func": lambda *_: None, "subscription_filters": ["testFilter"]}, + ), + ], + ) + def test_match_true(self, event_name, option_constructor): + event = load_event(file_name=event_name) + route = CloudWatchLogsRoute(**option_constructor) + expected = (route.func, CloudWatchLogsEvent(event)) + actual = route.match(event=event) + assert actual == expected + + @pytest.mark.parametrize( + "event_name, option_constructor", + [ + ("activeMQEvent.json", {"func": None, "log_group": "test"}), + ("albEvent.json", {"func": None, "log_group": "test"}), + ("albEventPathTrailingSlash.json", {"func": None, "log_group": "test"}), + ("albMultiValueHeadersEvent.json", {"func": None, "log_group": "test"}), + ("albMultiValueQueryStringEvent.json", {"func": None, "log_group": "test"}), + ("apiGatewayAuthorizerRequestEvent.json", {"func": None, "log_group": "test"}), + ("apiGatewayAuthorizerTokenEvent.json", {"func": None, "log_group": "test"}), + ("apiGatewayAuthorizerV2Event.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyEvent.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyEventAnotherPath.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyEventNoOrigin.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyEventPathTrailingSlash.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyEventPrincipalId.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyEvent_noVersionAuth.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyOtherEvent.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyV2Event.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyV2EventPathTrailingSlash.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyV2Event_GET.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyV2IamEvent.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyV2LambdaAuthorizerEvent.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyV2OtherGetEvent.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", {"func": None, "log_group": "test"}), + ("apiGatewayProxyV2SchemaMiddlwareValidEvent.json", {"func": None, "log_group": "test"}), + ("apigatewayeSchemaMiddlwareInvalidEvent.json", {"func": None, "log_group": "test"}), + ("apigatewayeSchemaMiddlwareValidEvent.json", {"func": None, "log_group": "test"}), + ("appSyncAuthorizerEvent.json", {"func": None, "log_group": "test"}), + ("appSyncAuthorizerResponse.json", {"func": None, "log_group": "test"}), + ("appSyncBatchEvent.json", {"func": None, "log_group": "test"}), + ("appSyncDirectResolver.json", {"func": None, "log_group": "test"}), + ("appSyncResolverEvent.json", {"func": None, "log_group": "test"}), + ("awsConfigRuleConfigurationChanged.json", {"func": None, "log_group": "test"}), + ("awsConfigRuleOversizedConfiguration.json", {"func": None, "log_group": "test"}), + ("awsConfigRuleScheduled.json", {"func": None, "log_group": "test"}), + ("bedrockAgentEvent.json", {"func": None, "log_group": "test"}), + ("bedrockAgentEventWithPathParams.json", {"func": None, "log_group": "test"}), + ("bedrockAgentPostEvent.json", {"func": None, "log_group": "test"}), + ("cloudWatchAlarmEventCompositeMetric.json", {"func": None, "log_group": "test"}), + ("cloudWatchAlarmEventSingleMetric.json", {"func": None, "log_group": "test"}), + ("cloudWatchDashboardEvent.json", {"func": None, "log_group": "test"}), + ("cloudformationCustomResourceCreate.json", {"func": None, "log_group": "test"}), + ("cloudformationCustomResourceDelete.json", {"func": None, "log_group": "test"}), + ("cloudformationCustomResourceUpdate.json", {"func": None, "log_group": "test"}), + ("codeDeployLifecycleHookEvent.json", {"func": None, "log_group": "test"}), + ("codePipelineEvent.json", {"func": None, "log_group": "test"}), + ("codePipelineEventData.json", {"func": None, "log_group": "test"}), + ("codePipelineEventEmptyUserParameters.json", {"func": None, "log_group": "test"}), + ("codePipelineEventWithEncryptionKey.json", {"func": None, "log_group": "test"}), + ("cognitoCreateAuthChallengeEvent.json", {"func": None, "log_group": "test"}), + ("cognitoCustomEmailSenderEvent.json", {"func": None, "log_group": "test"}), + ("cognitoCustomMessageEvent.json", {"func": None, "log_group": "test"}), + ("cognitoCustomSMSSenderEvent.json", {"func": None, "log_group": "test"}), + ("cognitoDefineAuthChallengeEvent.json", {"func": None, "log_group": "test"}), + ("cognitoPostAuthenticationEvent.json", {"func": None, "log_group": "test"}), + ("cognitoPostConfirmationEvent.json", {"func": None, "log_group": "test"}), + ("cognitoPreAuthenticationEvent.json", {"func": None, "log_group": "test"}), + ("cognitoPreSignUpEvent.json", {"func": None, "log_group": "test"}), + ("cognitoPreTokenGenerationEvent.json", {"func": None, "log_group": "test"}), + ("cognitoPreTokenV2GenerationEvent.json", {"func": None, "log_group": "test"}), + ("cognitoUserMigrationEvent.json", {"func": None, "log_group": "test"}), + ("cognitoVerifyAuthChallengeResponseEvent.json", {"func": None, "log_group": "test"}), + ("connectContactFlowEventAll.json", {"func": None, "log_group": "test"}), + ("connectContactFlowEventMin.json", {"func": None, "log_group": "test"}), + ("dynamoStreamEvent.json", {"func": None, "log_group": "test"}), + ("eventBridgeEvent.json", {"func": None, "log_group": "test"}), + ("kafkaEventMsk.json", {"func": None, "log_group": "test"}), + ("kafkaEventSelfManaged.json", {"func": None, "log_group": "test"}), + ("kinesisFirehoseKinesisEvent.json", {"func": None, "log_group": "test"}), + ("kinesisFirehosePutEvent.json", {"func": None, "log_group": "test"}), + ("kinesisFirehoseSQSEvent.json", {"func": None, "log_group": "test"}), + ("kinesisStreamCloudWatchLogsEvent.json", {"func": None, "log_group": "test"}), + ("kinesisStreamEvent.json", {"func": None, "log_group": "test"}), + ("kinesisStreamEventOneRecord.json", {"func": None, "log_group": "test"}), + ("lambdaFunctionUrlEvent.json", {"func": None, "log_group": "test"}), + ("lambdaFunctionUrlEventPathTrailingSlash.json", {"func": None, "log_group": "test"}), + ("lambdaFunctionUrlEventWithHeaders.json", {"func": None, "log_group": "test"}), + ("lambdaFunctionUrlIAMEvent.json", {"func": None, "log_group": "test"}), + ("rabbitMQEvent.json", {"func": None, "log_group": "test"}), + ("s3BatchOperationEventSchemaV1.json", {"func": None, "log_group": "test"}), + ("s3BatchOperationEventSchemaV2.json", {"func": None, "log_group": "test"}), + ("s3Event.json", {"func": None, "log_group": "test"}), + ("s3EventBridgeNotificationObjectCreatedEvent.json", {"func": None, "log_group": "test"}), + ("s3EventBridgeNotificationObjectDeletedEvent.json", {"func": None, "log_group": "test"}), + ("s3EventBridgeNotificationObjectExpiredEvent.json", {"func": None, "log_group": "test"}), + ("s3EventBridgeNotificationObjectRestoreCompletedEvent.json", {"func": None, "log_group": "test"}), + ("s3EventDecodedKey.json", {"func": None, "log_group": "test"}), + ("s3EventDeleteObject.json", {"func": None, "log_group": "test"}), + ("s3EventGlacier.json", {"func": None, "log_group": "test"}), + ("s3ObjectEventIAMUser.json", {"func": None, "log_group": "test"}), + ("s3ObjectEventTempCredentials.json", {"func": None, "log_group": "test"}), + ("s3SqsEvent.json", {"func": None, "log_group": "test"}), + ("secretsManagerEvent.json", {"func": None, "log_group": "test"}), + ("sesEvent.json", {"func": None, "log_group": "test"}), + ("snsEvent.json", {"func": None, "log_group": "test"}), + ("snsSqsEvent.json", {"func": None, "log_group": "test"}), + ("snsSqsFifoEvent.json", {"func": None, "log_group": "test"}), + ("sqsDlqTriggerEvent.json", {"func": None, "log_group": "test"}), + ("sqsEvent.json", {"func": None, "log_group": "test"}), + ("vpcLatticeEvent.json", {"func": None, "log_group": "test"}), + ("vpcLatticeEventPathTrailingSlash.json", {"func": None, "log_group": "test"}), + ("vpcLatticeEventV2PathTrailingSlash.json", {"func": None, "log_group": "test"}), + ("vpcLatticeV2Event.json", {"func": None, "log_group": "test"}), + ("vpcLatticeV2EventWithHeaders.json", {"func": None, "log_group": "test"}), + # cloudWatchLogEvent.json, not match (log group, log stream and subscription filters) + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroupV2", + "log_stream": "testLogStreamV2", + "subscription_filters": ["testFilterV2"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group_prefix": "testLogGG", + "log_stream": "testLogStreamV2", + "subscription_filters": ["testFilterV2"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroupV2", + "log_stream_prefix": "testLogSS", + "subscription_filters": ["testFilterV2"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group_prefix": "testLogGG", + "log_stream_prefix": "testLogSS", + "subscription_filters": ["testFilterV2"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroupV2", + "log_stream": "testLogStreamV2", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group_prefix": "testLogGG", + "log_stream": "testLogStreamV2", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroupV2", + "log_stream_prefix": "testLogSS", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group_prefix": "testLogGG", + "log_stream_prefix": "testLogSS", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroupV2", + "log_stream": "testLogStream", + "subscription_filters": ["testFilterV2"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group_prefix": "testLogGG", + "log_stream": "testLogStream", + "subscription_filters": ["testFilterV2"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroup", + "log_stream": "testLogStreamV2", + "subscription_filters": ["testFilterV2"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroup", + "log_stream_prefix": "testLogSS", + "subscription_filters": ["testFilterV2"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroupV2", + "log_stream": "testLogStream", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group_prefix": "testLogGG", + "log_stream": "testLogStream", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroup", + "log_stream": "testLogStreamV2", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroup", + "log_stream_prefix": "testLogSS", + "subscription_filters": ["testFilter"], + }, + ), + ( + "cloudWatchLogEvent.json", + { + "func": None, + "log_group": "testLogGroup", + "log_stream": "testLogStream", + "subscription_filters": ["testFilterV2"], + }, + ), + # cloudWatchLogEvent.json, not match (log group and log stream) + ("cloudWatchLogEvent.json", {"func": None, "log_group": "testLogGroupV2", "log_stream": "testLogStreamV2"}), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_group_prefix": "testLogGG", "log_stream": "testLogStreamV2"}, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_group": "testLogGroupV2", "log_stream_prefix": "testLogSS"}, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_group_prefix": "testLogGG", "log_stream_prefix": "testLogSS"}, + ), + ("cloudWatchLogEvent.json", {"func": None, "log_group": "testLogGroupV2", "log_stream": "testLogStream"}), + ("cloudWatchLogEvent.json", {"func": None, "log_group_prefix": "testLogGG", "log_stream": "testLogStream"}), + ("cloudWatchLogEvent.json", {"func": None, "log_group": "testLogGroup", "log_stream": "testLogStreamV2"}), + ("cloudWatchLogEvent.json", {"func": None, "log_group": "testLogGroup", "log_stream_prefix": "testLogSS"}), + # cloudWatchLogEvent.json, not match (log group and subscription filters) + ( + "cloudWatchLogEvent.json", + {"func": None, "log_group": "testLogGroupV2", "subscription_filters": ["testFilterV2"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_group_prefix": "testLogGG", "subscription_filters": ["testFilterV2"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_group": "testLogGroupV2", "subscription_filters": ["testFilter"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_group_prefix": "testLogGG", "subscription_filters": ["testFilter"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_group": "testLogGroup", "subscription_filters": ["testFilterV2"]}, + ), + # cloudWatchLogEvent.json, not match (log stream and subscription filters) + ( + "cloudWatchLogEvent.json", + {"func": None, "log_stream": "testLogStreamV2", "subscription_filters": ["testFilterV2"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_stream_prefix": "testLogSS", "subscription_filters": ["testFilterV2"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_stream": "testLogStreamV2", "subscription_filters": ["testFilter"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_stream_prefix": "testLogSS", "subscription_filters": ["testFilter"]}, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "log_stream": "testLogStream", "subscription_filters": ["testFilterV2"]}, + ), + # cloudWatchLogEvent.json, not match log_group + ("cloudWatchLogEvent.json", {"func": None, "log_group": "testLogGroupV2"}), + ("cloudWatchLogEvent.json", {"func": None, "log_group_prefix": "testLogGG"}), + # cloudWatchLogEvent.json, not match log_stream + ("cloudWatchLogEvent.json", {"func": None, "log_stream": "testLogStreamV2"}), + ("cloudWatchLogEvent.json", {"func": None, "log_stream_prefix": "testLogSS"}), + # cloudWatchLogEvent.json, not match subscription_filters + ("cloudWatchLogEvent.json", {"func": None, "subscription_filters": ["testFilterV2"]}), + ], + ) + def test_match_false(self, event_name, option_constructor): + event = load_event(file_name=event_name) + route = CloudWatchLogsRoute(**option_constructor) + actual = route.match(event=event) + assert actual is None From afb585b800f35d63872b9ae0e5be1edce9031f9b Mon Sep 17 00:00:00 2001 From: sinofseven Date: Wed, 8 Jan 2025 01:16:32 +0900 Subject: [PATCH 007/139] add test for code_deploy_lifecycle_hook.py --- .../test_code_deploy_lifecycle_hook.py | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py diff --git a/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py b/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py new file mode 100644 index 00000000000..ff994a64e66 --- /dev/null +++ b/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py @@ -0,0 +1,138 @@ +import pytest + +from aws_lambda_powertools.event_handler.async_execution.routes.code_deploy_lifecycle_hook import ( + CodeDeployLifecycleHookRoute, +) +from aws_lambda_powertools.utilities.data_classes.code_deploy_lifecycle_hook_event import ( + CodeDeployLifecycleHookEvent, +) +from tests.functional.utils import load_event + + +class TestCodeDeployLifecycleHookRoute: + @pytest.mark.parametrize( + "event_name, option_constructor", + [ + ("codeDeployLifecycleHookEvent.json", {"func": None}), + ], + ) + def test_match_true(self, event_name, option_constructor): + event = load_event(file_name=event_name) + route = CodeDeployLifecycleHookRoute(**option_constructor) + expected = (route.func, CodeDeployLifecycleHookEvent(event)) + actual = route.match(event=event) + assert actual == expected + + @pytest.mark.parametrize( + "event_name, option_constructor", + [ + ("activeMQEvent.json", {"func": None}), + ("albEvent.json", {"func": None}), + ("albEventPathTrailingSlash.json", {"func": None}), + ("albMultiValueHeadersEvent.json", {"func": None}), + ("albMultiValueQueryStringEvent.json", {"func": None}), + ("apiGatewayAuthorizerRequestEvent.json", {"func": None}), + ("apiGatewayAuthorizerTokenEvent.json", {"func": None}), + ("apiGatewayAuthorizerV2Event.json", {"func": None}), + ("apiGatewayProxyEvent.json", {"func": None}), + ("apiGatewayProxyEventAnotherPath.json", {"func": None}), + ("apiGatewayProxyEventNoOrigin.json", {"func": None}), + ("apiGatewayProxyEventPathTrailingSlash.json", {"func": None}), + ("apiGatewayProxyEventPrincipalId.json", {"func": None}), + ("apiGatewayProxyEvent_noVersionAuth.json", {"func": None}), + ("apiGatewayProxyOtherEvent.json", {"func": None}), + ("apiGatewayProxyV2Event.json", {"func": None}), + ("apiGatewayProxyV2EventPathTrailingSlash.json", {"func": None}), + ("apiGatewayProxyV2Event_GET.json", {"func": None}), + ("apiGatewayProxyV2IamEvent.json", {"func": None}), + ("apiGatewayProxyV2LambdaAuthorizerEvent.json", {"func": None}), + ("apiGatewayProxyV2OtherGetEvent.json", {"func": None}), + ("apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", {"func": None}), + ("apiGatewayProxyV2SchemaMiddlwareValidEvent.json", {"func": None}), + ("apigatewayeSchemaMiddlwareInvalidEvent.json", {"func": None}), + ("apigatewayeSchemaMiddlwareValidEvent.json", {"func": None}), + ("appSyncAuthorizerEvent.json", {"func": None}), + ("appSyncAuthorizerResponse.json", {"func": None}), + ("appSyncBatchEvent.json", {"func": None}), + ("appSyncDirectResolver.json", {"func": None}), + ("appSyncResolverEvent.json", {"func": None}), + ("awsConfigRuleConfigurationChanged.json", {"func": None}), + ("awsConfigRuleOversizedConfiguration.json", {"func": None}), + ("awsConfigRuleScheduled.json", {"func": None}), + ("bedrockAgentEvent.json", {"func": None}), + ("bedrockAgentEventWithPathParams.json", {"func": None}), + ("bedrockAgentPostEvent.json", {"func": None}), + ("cloudWatchAlarmEventCompositeMetric.json", {"func": None}), + ("cloudWatchAlarmEventSingleMetric.json", {"func": None}), + ("cloudWatchDashboardEvent.json", {"func": None}), + ("cloudWatchLogEvent.json", {"func": None}), + ("cloudWatchLogEventWithPolicyLevel.json", {"func": None}), + ("cloudformationCustomResourceCreate.json", {"func": None}), + ("cloudformationCustomResourceDelete.json", {"func": None}), + ("cloudformationCustomResourceUpdate.json", {"func": None}), + ("codePipelineEvent.json", {"func": None}), + ("codePipelineEventData.json", {"func": None}), + ("codePipelineEventEmptyUserParameters.json", {"func": None}), + ("codePipelineEventWithEncryptionKey.json", {"func": None}), + ("cognitoCreateAuthChallengeEvent.json", {"func": None}), + ("cognitoCustomEmailSenderEvent.json", {"func": None}), + ("cognitoCustomMessageEvent.json", {"func": None}), + ("cognitoCustomSMSSenderEvent.json", {"func": None}), + ("cognitoDefineAuthChallengeEvent.json", {"func": None}), + ("cognitoPostAuthenticationEvent.json", {"func": None}), + ("cognitoPostConfirmationEvent.json", {"func": None}), + ("cognitoPreAuthenticationEvent.json", {"func": None}), + ("cognitoPreSignUpEvent.json", {"func": None}), + ("cognitoPreTokenGenerationEvent.json", {"func": None}), + ("cognitoPreTokenV2GenerationEvent.json", {"func": None}), + ("cognitoUserMigrationEvent.json", {"func": None}), + ("cognitoVerifyAuthChallengeResponseEvent.json", {"func": None}), + ("connectContactFlowEventAll.json", {"func": None}), + ("connectContactFlowEventMin.json", {"func": None}), + ("dynamoStreamEvent.json", {"func": None}), + ("eventBridgeEvent.json", {"func": None}), + ("kafkaEventMsk.json", {"func": None}), + ("kafkaEventSelfManaged.json", {"func": None}), + ("kinesisFirehoseKinesisEvent.json", {"func": None}), + ("kinesisFirehosePutEvent.json", {"func": None}), + ("kinesisFirehoseSQSEvent.json", {"func": None}), + ("kinesisStreamCloudWatchLogsEvent.json", {"func": None}), + ("kinesisStreamEvent.json", {"func": None}), + ("kinesisStreamEventOneRecord.json", {"func": None}), + ("lambdaFunctionUrlEvent.json", {"func": None}), + ("lambdaFunctionUrlEventPathTrailingSlash.json", {"func": None}), + ("lambdaFunctionUrlEventWithHeaders.json", {"func": None}), + ("lambdaFunctionUrlIAMEvent.json", {"func": None}), + ("rabbitMQEvent.json", {"func": None}), + ("s3BatchOperationEventSchemaV1.json", {"func": None}), + ("s3BatchOperationEventSchemaV2.json", {"func": None}), + ("s3Event.json", {"func": None}), + ("s3EventBridgeNotificationObjectCreatedEvent.json", {"func": None}), + ("s3EventBridgeNotificationObjectDeletedEvent.json", {"func": None}), + ("s3EventBridgeNotificationObjectExpiredEvent.json", {"func": None}), + ("s3EventBridgeNotificationObjectRestoreCompletedEvent.json", {"func": None}), + ("s3EventDecodedKey.json", {"func": None}), + ("s3EventDeleteObject.json", {"func": None}), + ("s3EventGlacier.json", {"func": None}), + ("s3ObjectEventIAMUser.json", {"func": None}), + ("s3ObjectEventTempCredentials.json", {"func": None}), + ("s3SqsEvent.json", {"func": None}), + ("secretsManagerEvent.json", {"func": None}), + ("sesEvent.json", {"func": None}), + ("snsEvent.json", {"func": None}), + ("snsSqsEvent.json", {"func": None}), + ("snsSqsFifoEvent.json", {"func": None}), + ("sqsDlqTriggerEvent.json", {"func": None}), + ("sqsEvent.json", {"func": None}), + ("vpcLatticeEvent.json", {"func": None}), + ("vpcLatticeEventPathTrailingSlash.json", {"func": None}), + ("vpcLatticeEventV2PathTrailingSlash.json", {"func": None}), + ("vpcLatticeV2Event.json", {"func": None}), + ("vpcLatticeV2EventWithHeaders.json", {"func": None}), + ], + ) + def test_match_false(self, event_name, option_constructor): + event = load_event(file_name=event_name) + route = CodeDeployLifecycleHookRoute(**option_constructor) + actual = route.match(event=event) + assert actual is None From fbf1c6bf379d0d061bd0888e88a7d1a2c4e2029b Mon Sep 17 00:00:00 2001 From: sinofseven Date: Wed, 8 Jan 2025 18:48:46 +0900 Subject: [PATCH 008/139] add test for event_bridge.py --- .../async_execution/routes/event_bridge.py | 6 +- .../_routes/test_event_bridge.py | 782 ++++++++++++++++++ 2 files changed, 785 insertions(+), 3 deletions(-) create mode 100644 tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py b/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py index ec1cac547f4..f50a0f965d4 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py @@ -99,13 +99,13 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, EventBridgeEvent] | No if not detail_type and not source and not resources: return None - if self.detail_type: + if not self.detail_type: detail_type = None - if self.source: + if not self.source: source = None - if self.resources: + if not self.resources: resources = None if self.is_target(detail_type, source, resources): diff --git a/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py b/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py new file mode 100644 index 00000000000..568eb2e8374 --- /dev/null +++ b/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py @@ -0,0 +1,782 @@ +import pytest + +from aws_lambda_powertools.event_handler.async_execution.routes.event_bridge import ( + EventBridgeRoute, +) +from aws_lambda_powertools.utilities.data_classes.event_bridge_event import ( + EventBridgeEvent, +) +from tests.functional.utils import load_event + + +class TestEventBridgeRoute: + def test_constructor_error(self): + with pytest.raises(ValueError): + EventBridgeRoute(func=lambda *_: None) + + @pytest.mark.parametrize( + "option_constructor, expected", + [ + ( + {"func": None, "resources": "test"}, + {"func": None, "detail_type": None, "source": None, "resources": ["test"]}, + ), + ( + {"func": None, "resources": ["test"]}, + {"func": None, "detail_type": None, "source": None, "resources": ["test"]}, + ), + ( + {"func": None, "resources": ["test", "name"]}, + {"func": None, "detail_type": None, "source": None, "resources": ["test", "name"]}, + ), + ], + ) + def test_constructor_normal(self, option_constructor, expected): + route = EventBridgeRoute(**option_constructor) + assert route.__dict__ == expected + + @pytest.mark.parametrize( + "option_constructor, option, expected", + [ + ({"func": None, "detail_type": "test type"}, {"detail_type": None}, False), + ({"func": None, "detail_type": "test type"}, {"detail_type": "test type 2"}, False), + ({"func": None, "detail_type": "test type"}, {"detail_type": "test type"}, True), + ], + ) + def test_is_target_with_detail_type(self, option_constructor, option, expected): + route = EventBridgeRoute(**option_constructor) + actual = route.is_target_with_detail_type(**option) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option, expected", + [ + ({"func": None, "source": "aws.ec2"}, {"source": None}, False), + ({"func": None, "source": "aws.ec2"}, {"source": "aws.lambda"}, False), + ({"func": None, "source": "aws.ec2"}, {"source": "aws.ec2"}, True), + ], + ) + def test_is_target_with_source(self, option_constructor, option, expected): + route = EventBridgeRoute(**option_constructor) + actual = route.is_target_with_source(**option) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option, expected", + [ + ( + {"func": None, "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"]}, + {"resources": None}, + False, + ), + ( + {"func": None, "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"]}, + {"resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"]}, + False, + ), + ( + {"func": None, "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"]}, + {"resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"]}, + True, + ), + ( + { + "func": None, + "resources": [ + "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0", + "arn:aws:ec2:us-west-1:123456789012:instance/i-2222222222abcdef2", + ], + }, + {"resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"]}, + True, + ), + ( + { + "func": None, + "resources": [ + "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0", + ], + }, + { + "resources": [ + "arn:aws:ec2:us-west-1:123456789012:instance/i-2222222222abcdef2", + "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0", + ], + }, + True, + ), + ( + { + "func": None, + "resources": [ + "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0", + "arn:aws:ec2:us-west-1:123456789012:instance/i-3333333333abcdef3", + ], + }, + { + "resources": [ + "arn:aws:ec2:us-west-1:123456789012:instance/i-2222222222abcdef2", + "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0", + ], + }, + True, + ), + ], + ) + def test_is_target_with_resources(self, option_constructor, option, expected): + route = EventBridgeRoute(**option_constructor) + actual = route.is_target_with_resources(**option) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option, expected", + [ + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + True, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + }, + {"detail_type": "EC2 Instance State-change Notification", "source": "aws.ec2", "resources": None}, + True, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.lambda", + }, + {"detail_type": "EC2 Instance State-change Notification", "source": "aws.ec2", "resources": None}, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.ec2", + }, + {"detail_type": "EC2 Instance State-change Notification", "source": "aws.ec2", "resources": None}, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.lambda", + }, + {"detail_type": "EC2 Instance State-change Notification", "source": "aws.ec2", "resources": None}, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": None, + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + True, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": None, + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": None, + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + { + "detail_type": "EC2 Instance State-change Notification", + "source": None, + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + { + "detail_type": None, + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + True, + ), + ( + { + "func": None, + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + { + "detail_type": None, + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + { + "detail_type": None, + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + { + "detail_type": None, + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + }, + {"detail_type": "EC2 Instance State-change Notification", "source": None, "resources": None}, + True, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + }, + {"detail_type": "EC2 Instance State-change Notification", "source": None, "resources": None}, + False, + ), + ( + { + "func": None, + "source": "aws.ec2", + }, + {"detail_type": None, "source": "aws.ec2", "resources": None}, + True, + ), + ( + { + "func": None, + "source": "aws.lambda", + }, + {"detail_type": None, "source": "aws.ec2", "resources": None}, + False, + ), + ( + {"func": None, "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"]}, + { + "detail_type": None, + "source": None, + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + True, + ), + ( + {"func": None, "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"]}, + { + "detail_type": None, + "source": None, + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + False, + ), + ( + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + {"detail_type": None, "source": None, "resources": None}, + False, + ), + ], + ) + def test_is_target(self, option_constructor, option, expected): + route = EventBridgeRoute(**option_constructor) + actual = route.is_target(**option) + assert actual == expected + + @pytest.mark.parametrize( + "event_name, option_constructor", + [ + ( + "eventBridgeEvent.json", + { + "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + }, + ), + ( + "eventBridgeEvent.json", + { + "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": lambda *_: None, + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification", + }, + ), + ( + "eventBridgeEvent.json", + { + "func": lambda *_: None, + "source": "aws.ec2", + }, + ), + ( + "eventBridgeEvent.json", + { + "func": lambda *_: None, + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + ), + ], + ) + def test_match_true(self, event_name, option_constructor): + event = load_event(file_name=event_name) + route = EventBridgeRoute(**option_constructor) + expected = (route.func, EventBridgeEvent(event)) + actual = route.match(event=event) + assert actual == expected + + @pytest.mark.parametrize( + "event_name, option_constructor", + [ + ("activeMQEvent.json", {"func": None, "detail_type": "test"}), + ("albEvent.json", {"func": None, "detail_type": "test"}), + ("albEventPathTrailingSlash.json", {"func": None, "detail_type": "test"}), + ("albMultiValueHeadersEvent.json", {"func": None, "detail_type": "test"}), + ("albMultiValueQueryStringEvent.json", {"func": None, "detail_type": "test"}), + ("apiGatewayAuthorizerRequestEvent.json", {"func": None, "detail_type": "test"}), + ("apiGatewayAuthorizerTokenEvent.json", {"func": None, "detail_type": "test"}), + ("apiGatewayAuthorizerV2Event.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyEvent.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyEventAnotherPath.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyEventNoOrigin.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyEventPathTrailingSlash.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyEventPrincipalId.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyEvent_noVersionAuth.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyOtherEvent.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyV2Event.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyV2EventPathTrailingSlash.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyV2Event_GET.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyV2IamEvent.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyV2LambdaAuthorizerEvent.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyV2OtherGetEvent.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", {"func": None, "detail_type": "test"}), + ("apiGatewayProxyV2SchemaMiddlwareValidEvent.json", {"func": None, "detail_type": "test"}), + ("apigatewayeSchemaMiddlwareInvalidEvent.json", {"func": None, "detail_type": "test"}), + ("apigatewayeSchemaMiddlwareValidEvent.json", {"func": None, "detail_type": "test"}), + ("appSyncAuthorizerEvent.json", {"func": None, "detail_type": "test"}), + ("appSyncAuthorizerResponse.json", {"func": None, "detail_type": "test"}), + ("appSyncBatchEvent.json", {"func": None, "detail_type": "test"}), + ("appSyncDirectResolver.json", {"func": None, "detail_type": "test"}), + ("appSyncResolverEvent.json", {"func": None, "detail_type": "test"}), + ("awsConfigRuleConfigurationChanged.json", {"func": None, "detail_type": "test"}), + ("awsConfigRuleOversizedConfiguration.json", {"func": None, "detail_type": "test"}), + ("awsConfigRuleScheduled.json", {"func": None, "detail_type": "test"}), + ("bedrockAgentEvent.json", {"func": None, "detail_type": "test"}), + ("bedrockAgentEventWithPathParams.json", {"func": None, "detail_type": "test"}), + ("bedrockAgentPostEvent.json", {"func": None, "detail_type": "test"}), + ("cloudWatchAlarmEventCompositeMetric.json", {"func": None, "detail_type": "test"}), + ("cloudWatchAlarmEventSingleMetric.json", {"func": None, "detail_type": "test"}), + ("cloudWatchDashboardEvent.json", {"func": None, "detail_type": "test"}), + ("cloudWatchLogEvent.json", {"func": None, "detail_type": "test"}), + ("cloudWatchLogEventWithPolicyLevel.json", {"func": None, "detail_type": "test"}), + ("cloudformationCustomResourceCreate.json", {"func": None, "detail_type": "test"}), + ("cloudformationCustomResourceDelete.json", {"func": None, "detail_type": "test"}), + ("cloudformationCustomResourceUpdate.json", {"func": None, "detail_type": "test"}), + ("codeDeployLifecycleHookEvent.json", {"func": None, "detail_type": "test"}), + ("codePipelineEvent.json", {"func": None, "detail_type": "test"}), + ("codePipelineEventData.json", {"func": None, "detail_type": "test"}), + ("codePipelineEventEmptyUserParameters.json", {"func": None, "detail_type": "test"}), + ("codePipelineEventWithEncryptionKey.json", {"func": None, "detail_type": "test"}), + ("cognitoCreateAuthChallengeEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoCustomEmailSenderEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoCustomMessageEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoCustomSMSSenderEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoDefineAuthChallengeEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoPostAuthenticationEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoPostConfirmationEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoPreAuthenticationEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoPreSignUpEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoPreTokenGenerationEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoPreTokenV2GenerationEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoUserMigrationEvent.json", {"func": None, "detail_type": "test"}), + ("cognitoVerifyAuthChallengeResponseEvent.json", {"func": None, "detail_type": "test"}), + ("connectContactFlowEventAll.json", {"func": None, "detail_type": "test"}), + ("connectContactFlowEventMin.json", {"func": None, "detail_type": "test"}), + ("dynamoStreamEvent.json", {"func": None, "detail_type": "test"}), + ("kafkaEventMsk.json", {"func": None, "detail_type": "test"}), + ("kafkaEventSelfManaged.json", {"func": None, "detail_type": "test"}), + ("kinesisFirehoseKinesisEvent.json", {"func": None, "detail_type": "test"}), + ("kinesisFirehosePutEvent.json", {"func": None, "detail_type": "test"}), + ("kinesisFirehoseSQSEvent.json", {"func": None, "detail_type": "test"}), + ("kinesisStreamCloudWatchLogsEvent.json", {"func": None, "detail_type": "test"}), + ("kinesisStreamEvent.json", {"func": None, "detail_type": "test"}), + ("kinesisStreamEventOneRecord.json", {"func": None, "detail_type": "test"}), + ("lambdaFunctionUrlEvent.json", {"func": None, "detail_type": "test"}), + ("lambdaFunctionUrlEventPathTrailingSlash.json", {"func": None, "detail_type": "test"}), + ("lambdaFunctionUrlEventWithHeaders.json", {"func": None, "detail_type": "test"}), + ("lambdaFunctionUrlIAMEvent.json", {"func": None, "detail_type": "test"}), + ("rabbitMQEvent.json", {"func": None, "detail_type": "test"}), + ("s3BatchOperationEventSchemaV1.json", {"func": None, "detail_type": "test"}), + ("s3BatchOperationEventSchemaV2.json", {"func": None, "detail_type": "test"}), + ("s3Event.json", {"func": None, "detail_type": "test"}), + ("s3EventBridgeNotificationObjectCreatedEvent.json", {"func": None, "detail_type": "test"}), + ("s3EventBridgeNotificationObjectDeletedEvent.json", {"func": None, "detail_type": "test"}), + ("s3EventBridgeNotificationObjectExpiredEvent.json", {"func": None, "detail_type": "test"}), + ("s3EventBridgeNotificationObjectRestoreCompletedEvent.json", {"func": None, "detail_type": "test"}), + ("s3EventDecodedKey.json", {"func": None, "detail_type": "test"}), + ("s3EventDeleteObject.json", {"func": None, "detail_type": "test"}), + ("s3EventGlacier.json", {"func": None, "detail_type": "test"}), + ("s3ObjectEventIAMUser.json", {"func": None, "detail_type": "test"}), + ("s3ObjectEventTempCredentials.json", {"func": None, "detail_type": "test"}), + ("s3SqsEvent.json", {"func": None, "detail_type": "test"}), + ("secretsManagerEvent.json", {"func": None, "detail_type": "test"}), + ("sesEvent.json", {"func": None, "detail_type": "test"}), + ("snsEvent.json", {"func": None, "detail_type": "test"}), + ("snsSqsEvent.json", {"func": None, "detail_type": "test"}), + ("snsSqsFifoEvent.json", {"func": None, "detail_type": "test"}), + ("sqsDlqTriggerEvent.json", {"func": None, "detail_type": "test"}), + ("sqsEvent.json", {"func": None, "detail_type": "test"}), + ("vpcLatticeEvent.json", {"func": None, "detail_type": "test"}), + ("vpcLatticeEventPathTrailingSlash.json", {"func": None, "detail_type": "test"}), + ("vpcLatticeEventV2PathTrailingSlash.json", {"func": None, "detail_type": "test"}), + ("vpcLatticeV2Event.json", {"func": None, "detail_type": "test"}), + ("vpcLatticeV2EventWithHeaders.json", {"func": None, "detail_type": "test"}), + # eventBridgeEvent.json, not match (detail type, source, and resources) + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + ), + # eventBridgeEvent.json, not match (detail type and source) + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.lambda", + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.ec2", + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.lambda", + }, + ), + # eventBridgeEvent.json, not match (detail type and resources) + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification V2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "detail_type": "EC2 Instance State-change Notification", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + ), + # eventBridgeEvent.json, not match (source and resources arguments) + ( + "eventBridgeEvent.json", + { + "func": None, + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + }, + ), + ( + "eventBridgeEvent.json", + { + "func": None, + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + ), + # eventBridgeEvent.json, not match detail_type + ("eventBridgeEvent.json", {"func": None, "detail_type": "EC2 Instance State-change Notification V2"}), + # eventBridgeEvent.json, not match source + ("eventBridgeEvent.json", {"func": None, "source": "aws.lambda"}), + # eventBridgeEvent.json, not match resources + ( + "eventBridgeEvent.json", + { + "func": None, + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + }, + ), + ], + ) + def test_match_false(self, event_name, option_constructor): + event = load_event(file_name=event_name) + route = EventBridgeRoute(**option_constructor) + actual = route.match(event=event) + assert actual is None From 5d6222fd1830b41e170c78a7d26bb477b3c552af Mon Sep 17 00:00:00 2001 From: sinofseven Date: Fri, 10 Jan 2025 04:02:40 +0900 Subject: [PATCH 009/139] fix S3Route --- .../async_execution/routes/s3.py | 109 +++++++++++++----- 1 file changed, 78 insertions(+), 31 deletions(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/s3.py b/aws_lambda_powertools/event_handler/async_execution/routes/s3.py index 33801e38591..61fed9e3bad 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/s3.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/s3.py @@ -14,6 +14,9 @@ class S3Route(BaseRoute): key_prefix: str | None key_suffix: str | None event_name: str | None + event_name_prefix: str | None + configuration_id: str | None + configuration_id_prefix: str | None def __init__( self, @@ -24,6 +27,9 @@ def __init__( key_prefix: str | None = None, key_suffix: str | None = None, event_name: str | None = None, + event_name_prefix: str | None = None, + configuration_id: str | None = None, + configuration_id_prefix: str | None = None, ): self.func = func self.bucket = bucket @@ -32,6 +38,9 @@ def __init__( self.key_prefix = key_prefix self.key_suffix = key_suffix self.event_name = event_name + self.event_name_prefix = event_name_prefix + self.configuration_id = configuration_id + self.configuration_id_prefix = configuration_id_prefix if ( not self.bucket @@ -40,8 +49,16 @@ def __init__( and not self.key_prefix and not self.key_suffix and not self.event_name + and not self.event_name_prefix + and not self.configuration_id + and not self.configuration_id_prefix ): - raise ValueError("bucket, bucket_prefix, key, key_prefix, key_suffix, or event_name must be not null") + raise ValueError( + ( + "bucket, bucket_prefix, key, key_prefix, key_suffix, event_name, event_name_prefix, " + "configuration_id, or configuration_id_prefix must be not null" + ), + ) def is_target_with_bucket(self, bucket: str | None) -> bool: if not bucket: @@ -76,40 +93,66 @@ def is_target_with_event_name(self, event_name: str | None) -> bool: return False elif self.event_name: return self.event_name == event_name + elif self.event_name_prefix: + return event_name.find(self.event_name_prefix) == 0 else: return False - def is_target(self, bucket: str | None, key: str | None, event_name: str | None) -> bool: + def is_target_with_configuration_id(self, configuration_id: str | None) -> bool: + if not configuration_id: + return False + elif self.configuration_id: + return self.configuration_id == configuration_id + elif self.configuration_id_prefix: + return configuration_id.find(self.configuration_id_prefix) == 0 + else: + return False + + def is_target( + self, + bucket: str | None, + key: str | None, + event_name: str | None, + configuration_id: str | None, + ) -> bool: flag_bucket = self.is_target_with_bucket(bucket=bucket) flag_key = self.is_target_with_key(key=key) flag_event_name = self.is_target_with_event_name(event_name=event_name) + flag_configuration_id = self.is_target_with_configuration_id(configuration_id=configuration_id) - if bucket and key and event_name: - text = "bucket, key, event_name" - elif bucket and key and not event_name: - text = "bucket, key" - elif bucket and not key and event_name: - text = "bucket, event_name" - elif not bucket and key and event_name: - text = "key, event_name" - elif bucket and not key and not event_name: - text = "bucket" - elif not bucket and key and not event_name: - text = "key" - elif not bucket and not key and event_name: - text = "event_name" - else: # not bucket and not key and not event_name - text = "" + text = ", ".join( + [ + "bucket: x" if bucket is None else "bucket: o", + "key: x" if key is None else "key: o", + "event_name: x" if event_name is None else "event_name: o", + "configuration_id: x" if configuration_id is None else "configuration_id: o", + ], + ) mapping = { - "bucket, key, event_name": flag_bucket and flag_key and flag_event_name, - "bucket, key": flag_bucket and flag_key, - "bucket, event_name": flag_bucket and flag_event_name, - "key, event_name": flag_key and flag_event_name, - "bucket": flag_bucket, - "key": flag_key, - "event_name": flag_event_name, - "": False, + "bucket: o, key: o, event_name: o, configuration_id: o": flag_bucket + and flag_key + and flag_event_name + and flag_configuration_id, + "bucket: o, key: o, event_name: o, configuration_id: x": flag_bucket and flag_key and flag_event_name, + "bucket: o, key: o, event_name: x, configuration_id: o": flag_bucket and flag_key and flag_configuration_id, + "bucket: o, key: x, event_name: o, configuration_id: o": flag_bucket + and flag_event_name + and flag_configuration_id, + "bucket: x, key: o, event_name: o, configuration_id: o": flag_key + and flag_event_name + and flag_configuration_id, + "bucket: o, key: o, event_name: x, configuration_id: x": flag_bucket and flag_key, + "bucket: o, key: x, event_name: o, configuration_id: x": flag_bucket and flag_event_name, + "bucket: x, key: o, event_name: o, configuration_id: x": flag_key and flag_event_name, + "bucket: o, key: x, event_name: x, configuration_id: o": flag_bucket and flag_configuration_id, + "bucket: x, key: o, event_name: x, configuration_id: o": flag_key and flag_configuration_id, + "bucket: x, key: x, event_name: o, configuration_id: o": flag_event_name and flag_configuration_id, + "bucket: o, key: x, event_name: x, configuration_id: x": flag_bucket, + "bucket: x, key: o, event_name: x, configuration_id: x": flag_key, + "bucket: x, key: x, event_name: o, configuration_id: x": flag_event_name, + "bucket: x, key: x, event_name: x, configuration_id: o": flag_configuration_id, + "bucket: x, key: x, event_name: x, configuration_id: x": False, } return mapping[text] @@ -131,20 +174,24 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, S3Event] | None: bucket: str | None = s3_data.get("bucket", {}).get("name") key: str | None = s3_data.get("object", {}).get("key") + configuration_id: str | None = s3_data.get("configurationId") - if not bucket and not key: + if not bucket and not key and not configuration_id: return None - if not self.event_name: - event_name = None - if not self.bucket and not self.bucket_prefix: bucket = None if not self.key and not self.key_prefix and not self.key_suffix: key = None - if self.is_target(bucket, key, event_name): + if not self.event_name and not self.event_name_prefix: + event_name = None + + if not self.configuration_id and not self.configuration_id_prefix: + configuration_id = None + + if self.is_target(bucket, key, event_name, configuration_id): return self.func, S3Event(event) else: return None From fbb521f3cb282e676a15180a6a4cdde0c1390a6a Mon Sep 17 00:00:00 2001 From: sinofseven Date: Tue, 14 Jan 2025 18:45:01 +0900 Subject: [PATCH 010/139] fix unit test for aws_config_fule.py --- .../async_execution/routes/aws_config_rule.py | 80 +- .../_routes/test_aws_config_rule.py | 1085 ++++++++++++++--- 2 files changed, 951 insertions(+), 214 deletions(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py b/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py index 1db76be9b75..e96959f26da 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/aws_config_rule.py @@ -32,20 +32,76 @@ def __init__( if not self.arn and not self.rule_name and not self.rule_name_prefix and not self.rule_id: raise ValueError("arn, rule_name, rule_name_prefix, or rule_id must be not null") - def match(self, event: dict[str, Any]) -> tuple[Callable, AWSConfigRuleEvent] | None: - if not isinstance(event, dict): - return None + def is_target_with_arn(self, arn: str | None) -> bool: + if not arn: + return False elif self.arn: - if event.get("configRuleArn") == self.arn: - return self.func, AWSConfigRuleEvent(event) + return self.arn == arn + else: + return False + + def is_target_with_rule_name(self, rule_name: str | None) -> bool: + if not rule_name: + return False elif self.rule_name: - if event.get("configRuleName") == self.rule_name: - return self.func, AWSConfigRuleEvent(event) + return self.rule_name == rule_name elif self.rule_name_prefix: - if event.get("configRuleName", "").find(self.rule_name_prefix) == 0: - return self.func, AWSConfigRuleEvent(event) + return rule_name.find(self.rule_name_prefix) == 0 + else: + return False + + def is_target_with_rule_id(self, rule_id: str | None) -> bool: + if not rule_id: + return False elif self.rule_id: - if event.get("configRuleId") == self.rule_id: - return self.func, AWSConfigRuleEvent(event) + return self.rule_id == rule_id + else: + return False + + def match(self, event: dict[str, Any]) -> tuple[Callable, AWSConfigRuleEvent] | None: + if not isinstance(event, dict): + return None + + arn = event.get("configRuleArn") + rule_name = event.get("configRuleName") + rule_id = event.get("configRuleId") - return None + if not arn and not rule_name and not rule_id: + return None + + if not self.arn: + arn = None + + if not self.rule_name and not self.rule_name_prefix: + rule_name = None + + if not self.rule_id: + rule_id = None + + flag_arn = self.is_target_with_arn(arn=arn) + flag_rule_name = self.is_target_with_rule_name(rule_name=rule_name) + flag_rule_id = self.is_target_with_rule_id(rule_id=rule_id) + + text = ", ".join( + [ + "arn: x" if arn is None else "arn: o", + "rule_name: x" if rule_name is None else "rule_name: o", + "rule_id: x" if rule_id is None else "rule_id: o", + ], + ) + + mapping = { + "arn: o, rule_name: o, rule_id: o": flag_arn and flag_rule_name and flag_rule_id, + "arn: o, rule_name: o, rule_id: x": flag_arn and flag_rule_name, + "arn: o, rule_name: x, rule_id: o": flag_arn and flag_rule_id, + "arn: x, rule_name: o, rule_id: o": flag_rule_name and flag_rule_id, + "arn: o, rule_name: x, rule_id: x": flag_arn, + "arn: x, rule_name: o, rule_id: x": flag_rule_name, + "arn: x, rule_name: x, rule_id: o": flag_rule_id, + "arn: x, rule_name: x, rule_id: x": False, + } + + if mapping[text]: + return self.func, AWSConfigRuleEvent(event) + else: + return None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py b/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py index ed28a6517d1..10aab8ff99c 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py @@ -15,270 +15,951 @@ def test_constructor_error(self): AwsConfigRuleRoute(func=lambda _: None) @pytest.mark.parametrize( - "event_name, option_constructor", + "option_constructor, option_func, expected", [ - # other events - ("activeMQEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("albEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("albEventPathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("albMultiValueHeadersEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("albMultiValueQueryStringEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayAuthorizerRequestEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayAuthorizerTokenEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayAuthorizerV2Event.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyEventAnotherPath.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyEventNoOrigin.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyEventPathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyEventPrincipalId.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyEvent_noVersionAuth.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyOtherEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyV2Event.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyV2EventPathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyV2Event_GET.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyV2IamEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyV2LambdaAuthorizerEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyV2OtherGetEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apiGatewayProxyV2SchemaMiddlwareValidEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apigatewayeSchemaMiddlwareInvalidEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("apigatewayeSchemaMiddlwareValidEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("appSyncAuthorizerEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("appSyncAuthorizerResponse.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("appSyncBatchEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("appSyncDirectResolver.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("appSyncResolverEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("bedrockAgentEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("bedrockAgentEventWithPathParams.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("bedrockAgentPostEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cloudWatchAlarmEventCompositeMetric.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cloudWatchAlarmEventSingleMetric.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cloudWatchDashboardEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cloudWatchLogEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cloudWatchLogEventWithPolicyLevel.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cloudformationCustomResourceCreate.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cloudformationCustomResourceDelete.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cloudformationCustomResourceUpdate.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("codeDeployLifecycleHookEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("codePipelineEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("codePipelineEventData.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("codePipelineEventEmptyUserParameters.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("codePipelineEventWithEncryptionKey.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoCreateAuthChallengeEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoCustomEmailSenderEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoCustomMessageEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoCustomSMSSenderEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoDefineAuthChallengeEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoPostAuthenticationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoPostConfirmationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoPreAuthenticationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoPreSignUpEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoPreTokenGenerationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoPreTokenV2GenerationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoUserMigrationEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("cognitoVerifyAuthChallengeResponseEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("connectContactFlowEventAll.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("connectContactFlowEventMin.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("dynamoStreamEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("eventBridgeEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("kafkaEventMsk.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("kafkaEventSelfManaged.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("kinesisFirehoseKinesisEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("kinesisFirehosePutEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("kinesisFirehoseSQSEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("kinesisStreamCloudWatchLogsEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("kinesisStreamEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("kinesisStreamEventOneRecord.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("lambdaFunctionUrlEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("lambdaFunctionUrlEventPathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("lambdaFunctionUrlEventWithHeaders.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("lambdaFunctionUrlIAMEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("rabbitMQEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3BatchOperationEventSchemaV1.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3BatchOperationEventSchemaV2.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3Event.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3EventBridgeNotificationObjectCreatedEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3EventBridgeNotificationObjectDeletedEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3EventBridgeNotificationObjectExpiredEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ( - "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", - {"func": None, "rule_id": "config-rule-i1y1j1"}, - ), - ("s3EventDecodedKey.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3EventDeleteObject.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3EventGlacier.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3ObjectEventIAMUser.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3ObjectEventTempCredentials.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("s3SqsEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("secretsManagerEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("sesEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("snsEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("snsSqsEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("snsSqsFifoEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("sqsDlqTriggerEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("sqsEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("vpcLatticeEvent.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("vpcLatticeEventPathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("vpcLatticeEventV2PathTrailingSlash.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("vpcLatticeV2Event.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - ("vpcLatticeV2EventWithHeaders.json", {"func": None, "rule_id": "config-rule-i1y1j1"}), - # aws_config_rule_event, not match arn, without rule_name, rule_name_prefix, or rule_id - ( - "awsConfigRuleConfigurationChanged.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i1y1j1"}, - ), - ( - "awsConfigRuleOversizedConfiguration.json", - { - "func": None, - "arn": "/".join( - [ - "arn:aws:config:us-east-2:123456789012:config-rule", - "config-rule-ec2-managed-instance-inventory-v2", - ], - ), - }, - ), - ( - "awsConfigRuleScheduled.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-pdmyw3"}, - ), - # awsConfigRuleConfigurationChanged.json, not match arn, with rule_name, rule_name_prefix, or rule_id - ( - "awsConfigRuleConfigurationChanged.json", - { - "func": None, - "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i1y1j1", + ({"func": None, "arn": "test-arn"}, {"arn": None}, False), + ({"func": None, "arn": "test-arn"}, {"arn": "test-arn"}, True), + ({"func": None, "arn": "test-arn-v2"}, {"arn": "test-arn"}, False), + ({"func": None, "rule_name": "test-rule"}, {"arn": "test-arn"}, False), + ], + ) + def test_is_target_with_arn(self, option_constructor, option_func, expected): + route = AwsConfigRuleRoute(**option_constructor) + actual = route.is_target_with_arn(**option_func) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option_func, expected", + [ + ({"func": None, "rule_name": "test-rule"}, {"rule_name": None}, False), + ({"func": None, "rule_name": "test-rule"}, {"rule_name": "test-rule"}, True), + ({"func": None, "rule_name": "test-rule-v2"}, {"rule_name": "test-rule"}, False), + ({"func": None, "rule_name_prefix": "test-r"}, {"rule_name": "test-rule"}, True), + ({"func": None, "rule_name_prefix": "test-rr"}, {"rule_name": "test-rule"}, False), + ({"func": None, "rule_name": "test-rule", "rule_name_prefix": "test-r"}, {"rule_name": "test-rule"}, True), + ({"func": None, "rule_name": "test-rule", "rule_name_prefix": "test-rr"}, {"rule_name": "test-rule"}, True), + ( + {"func": None, "rule_name": "test-rule-v2", "rule_name_prefix": "test-r"}, + {"rule_name": "test-rule"}, + False, + ), + ( + {"func": None, "rule_name": "test-rule-v2", "rule_name_prefix": "test-r"}, + {"rule_name": "test-rule"}, + False, + ), + ({"func": None, "arn": "test-arn"}, {"rule_name": "test-rule"}, False), + ], + ) + def test_is_target_with_rule_name(self, option_constructor, option_func, expected): + route = AwsConfigRuleRoute(**option_constructor) + actual = route.is_target_with_rule_name(**option_func) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option_func, expected", + [ + ({"func": None, "rule_id": "test-id"}, {"rule_id": None}, False), + ({"func": None, "rule_id": "test-id"}, {"rule_id": "test-id"}, True), + ({"func": None, "rule_id": "test-id-v2"}, {"rule_id": "test-id"}, False), + ({"func": None, "arn": "test-arn"}, {"rule_id": "test-id"}, False), + ], + ) + def test_is_target_with_rule_id(self, option_constructor, option_func, expected): + route = AwsConfigRuleRoute(**option_constructor) + actual = route.is_target_with_rule_id(**option_func) + assert actual == expected + + @pytest.mark.parametrize( + "event_name, option_constructor, expected_true", + [ + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, rule_name_prefix, and rule_id + # match all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRule", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-i9y8j9", + }, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, rule_name_prefix, and rule_id + # match 3, unmatch 1 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRule", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-000000", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRule", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-i9y8j9", + }, + True, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-i9y8j9", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRule", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-i9y8j9", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, rule_name_prefix, and rule_id + # match 2, unmatch 2 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", "rule_name": "MyRule", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-000000", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-000000", }, + False, ), ( "awsConfigRuleConfigurationChanged.json", { - "func": None, - "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i1y1j1", - "rule_name_prefix": "My", + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRule", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-000000", }, + False, ), ( "awsConfigRuleConfigurationChanged.json", { - "func": None, - "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i1y1j1", + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyRR", "rule_id": "config-rule-i9y8j9", }, + False, ), ( "awsConfigRuleConfigurationChanged.json", { - "func": None, + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRule", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-i9y8j9", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", "rule_name": "MyRuleV2", - "rule_name_prefix": "My", + "rule_name_prefix": "MyR", "rule_id": "config-rule-i9y8j9", }, + False, ), - # awsConfigRuleConfigurationChanged.json, not match rule_name, without rule_name_prefix, or rule_id + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, rule_name_prefix, and rule_id + # match 1, unmatch 3 ( "awsConfigRuleConfigurationChanged.json", { - "func": None, + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", "rule_name": "MyRuleV2", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-000000", }, + False, ), - # awsConfigRuleConfigurationChanged.json, not match rule_name, with rule_name_prefix, or rule_id ( "awsConfigRuleConfigurationChanged.json", - {"func": None, "rule_name": "MyRuleV2", "rule_name_prefix": "My"}, + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRule", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-000000", + }, + False, ), ( "awsConfigRuleConfigurationChanged.json", - {"func": None, "rule_name": "MyRuleV2", "rule_id": "config-rule-i9y8j9"}, + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-000000", + }, + False, ), ( "awsConfigRuleConfigurationChanged.json", - {"func": None, "rule_name": "MyRuleV2", "rule_name_prefix": "My", "rule_id": "config-rule-i9y8j9"}, + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-i9y8j9", + }, + False, ), - # awsConfigRuleConfigurationChanged.json, not match rule_name_prefix, without rule_id + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, rule_name_prefix, and rule_id + # unmatch all ( "awsConfigRuleConfigurationChanged.json", - {"func": None, "rule_name_prefix": "Me"}, + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-000000", + }, + False, ), - # awsConfigRuleConfigurationChanged.json, not match rule_name_prefix, with rule_id + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, and rule_name_prefix + # match all ( "awsConfigRuleConfigurationChanged.json", - {"func": None, "rule_name_prefix": "Me", "rule_id": "config-rule-i9y8j9"}, + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRule", + "rule_name_prefix": "MyR", + }, + True, ), - # awsConfigRuleConfigurationChanged.json, not match rule_id + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, and rule_name_prefix + # match 2, unmatch 1 ( "awsConfigRuleConfigurationChanged.json", - {"func": None, "rule_id": "config-rule-i1y1j1"}, + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRule", + "rule_name_prefix": "MyRR", + }, + True, ), - ], - ) - def test_match_false(self, event_name, option_constructor): - route = AwsConfigRuleRoute(**option_constructor) - event = load_event(file_name=event_name) - actual = route.match(event=event) - assert actual is None - - @pytest.mark.parametrize( - "event_name, option_constructor", - [ - # awsConfigRuleConfigurationChanged.json, match arn ( "awsConfigRuleConfigurationChanged.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyR", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRule", + "rule_name_prefix": "MyR", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, and rule_name_prefix + # match 1, unmatch 2 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyRR", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRule", + "rule_name_prefix": "MyRR", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyR", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, and rule_name_prefix + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyRR", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, and rule_id + # match all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRule", + "rule_id": "config-rule-i9y8j9", + }, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, and rule_id + # match 2, unmatch 1 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRule", + "rule_id": "config-rule-000000", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRuleV2", + "rule_id": "config-rule-i9y8j9", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRule", + "rule_id": "config-rule-i9y8j9", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, and rule_id + # match 1, unmatch 2 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRuleV2", + "rule_id": "config-rule-000000", + }, + False, ), - # awsConfigRuleConfigurationChanged.json, match rule_name - ("awsConfigRuleConfigurationChanged.json", {"func": None, "rule_name": "MyRule"}), - # awsConfigRuleConfigurationChanged.json, match rule_name_prefix - ("awsConfigRuleConfigurationChanged.json", {"func": None, "rule_name_prefix": "MyR"}), - # awsConfigRuleConfigurationChanged.json, match rule_id - ("awsConfigRuleConfigurationChanged.json", {"func": None, "rule_id": "config-rule-i9y8j9"}), - # awsConfigRuleOversizedConfiguration.json, match arn ( - "awsConfigRuleOversizedConfiguration.json", + "awsConfigRuleConfigurationChanged.json", { - "func": None, - "arn": "/".join( - [ - "arn:aws:config:us-east-2:123456789012:config-rule", - "config-rule-ec2-managed-instance-inventory", - ], - ), + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRule", + "rule_id": "config-rule-000000", }, + False, ), - # awsConfigRuleOversizedConfiguration.json, match rule_name ( - "awsConfigRuleOversizedConfiguration.json", - {"func": None, "rule_name": "change-triggered-config-rule"}, + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRuleV2", + "rule_id": "config-rule-i9y8j9", + }, + False, ), - # awsConfigRuleOversizedConfiguration.json, match rule_name_prefix + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name, and rule_id + # unmatch all ( - "awsConfigRuleOversizedConfiguration.json", - {"func": None, "rule_name_prefix": "change-t"}, + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRuleV2", + "rule_id": "config-rule-000000", + }, + False, ), - # awsConfigRuleOversizedConfiguration.json, match rule_id + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name_prefix, and rule_id + # match all ( - "awsConfigRuleOversizedConfiguration.json", - {"func": None, "rule_id": "config-rule-0123456"}, + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-i9y8j9", + }, + True, ), - # awsConfigRuleScheduled.json, match arn + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name_prefix, and rule_id + # match 2, unmatch 1 ( - "awsConfigRuleScheduled.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-pdmyw1"}, + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-000000", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-i9y8j9", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-000000", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name_prefix, and rule_id + # match 1, unmatch 2 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-000000", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-000000", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-i9y8j9", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn, rule_name_prefix, and rule_id + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-000000", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name, rule_name_prefix, and rule_id + # match all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRule", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-i9y8j9", + }, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name, rule_name_prefix, and rule_id + # match 2, unmatch 1 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRule", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-000000", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRule", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-i9y8j9", + }, + True, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-i9y8j9", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name, rule_name_prefix, and rule_id + # match 1, unmatch 2 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRule", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-000000", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyR", + "rule_id": "config-rule-000000", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-i9y8j9", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name, rule_name_prefix, and rule_id + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyRR", + "rule_id": "config-rule-000000", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn and rule_name + # match all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRule", + }, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with arn and rule_name + # match 1, unmatch 1 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name": "MyRuleV2", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRule", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn and rule_name + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name": "MyRuleV2", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn and rule_name_prefix + # match all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name_prefix": "MyR", + }, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with arn and rule_name_prefix + # match 1, unmatch 1 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_name_prefix": "MyRR", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name_prefix": "MyR", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn and rule_name_prefix + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_name_prefix": "MyRR", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn and rule_id + # match all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_id": "config-rule-i9y8j9", + }, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with arn and rule_id + # match 1, unmatch 1 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + "rule_id": "config-rule-000000", + }, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_id": "config-rule-i9y8j9", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn and rule_id + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + "rule_id": "config-rule-000000", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name and rule_name_prefix + # match all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRule", + "rule_name_prefix": "MyR", + }, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name and rule_name_prefix + # match 1, unmatch 1 + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRule", + "rule_name_prefix": "MyRR", + }, + True, + ), + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyR", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name and rule_name_prefix + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRuleV2", + "rule_name_prefix": "MyRR", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name and rule_id + # match all + ( + "awsConfigRuleConfigurationChanged.json", + {"func": lambda *_: None, "rule_name": "MyRule", "rule_id": "config-rule-i9y8j9"}, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name and rule_id + # match 1, unmatch 1 + ( + "awsConfigRuleConfigurationChanged.json", + {"func": lambda *_: None, "rule_name": "MyRule", "rule_id": "config-rule-000000"}, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + {"func": lambda *_: None, "rule_name": "MyRuleV2", "rule_id": "config-rule-i9y8j9"}, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name and rule_id + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + {"func": lambda *_: None, "rule_name": "MyRuleV2", "rule_id": "config-rule-000000"}, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name_prefix and rule_id + # match all + ( + "awsConfigRuleConfigurationChanged.json", + {"func": lambda *_: None, "rule_name_prefix": "MyR", "rule_id": "config-rule-i9y8j9"}, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name_prefix and rule_id + # match 1, unmatch 1 + ( + "awsConfigRuleConfigurationChanged.json", + {"func": lambda *_: None, "rule_name_prefix": "MyR", "rule_id": "config-rule-000000"}, + False, + ), + ( + "awsConfigRuleConfigurationChanged.json", + {"func": lambda *_: None, "rule_name_prefix": "MyRR", "rule_id": "config-rule-i9y8j9"}, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name_prefix and rule_id + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + {"func": lambda *_: None, "rule_name_prefix": "MyRR", "rule_id": "config-rule-000000"}, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with arn + # match all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + }, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with arn + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-000000", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name + # match all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRule", + }, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name": "MyRuleV2", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name_prefix + # match all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name_prefix": "MyR", + }, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_name_prefix + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + { + "func": lambda *_: None, + "rule_name_prefix": "MyRR", + }, + False, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_id + # match all + ( + "awsConfigRuleConfigurationChanged.json", + {"func": lambda *_: None, "rule_id": "config-rule-i9y8j9"}, + True, + ), + # awsConfigRuleConfigurationChanged.json + # with rule_id + # unmatch all + ( + "awsConfigRuleConfigurationChanged.json", + {"func": lambda *_: None, "rule_id": "config-rule-000000"}, + False, ), - # awsConfigRuleScheduled.json, match rule_name - ("awsConfigRuleScheduled.json", {"func": None, "rule_name": "rule-ec2-test"}), - # awsConfigRuleScheduled.json, match rule_name_prefix - ("awsConfigRuleScheduled.json", {"func": None, "rule_name_prefix": "rule-e"}), - # awsConfigRuleScheduled.json, match rule_id - ("awsConfigRuleScheduled.json", {"func": None, "rule_id": "config-rule-pdmyw1"}), ], ) - def test_match_true(self, event_name, option_constructor): - route = AwsConfigRuleRoute(**option_constructor) + def test_match(self, event_name, option_constructor, expected_true): event = load_event(file_name=event_name) - expect = (route.func, AWSConfigRuleEvent(event)) + route = AwsConfigRuleRoute(**option_constructor) + expected_return = (route.func, AWSConfigRuleEvent(event)) actual = route.match(event=event) - assert actual == expect + if expected_true: + assert actual == expected_return + else: + assert actual is None From e94d3eb11e1b1395ab69ecbb898f84aca2ed8986 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Wed, 15 Jan 2025 00:40:40 +0900 Subject: [PATCH 011/139] fix implement for cloud_watch_alarm.py --- .../routes/cloud_watch_alarm.py | 56 ++++++++++++++----- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py index 605df8b92a4..6d6b5698040 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py @@ -29,21 +29,49 @@ def __init__( if not self.arn and not self.alarm_name and not self.alarm_name_prefix: raise ValueError("arn, alarm_name, or alarm_name_prefix must be not null") + def is_target_with_arn(self, arn: str | None) -> bool: + if not arn: + return False + elif self.arn: + return self.arn == arn + else: + return False + + def is_target_with_alarm_name(self, alarm_name: str | None) -> bool: + if not alarm_name: + return False + elif self.alarm_name: + return self.alarm_name == alarm_name + elif self.alarm_name_prefix: + return alarm_name.find(self.alarm_name_prefix) == 0 + else: + return False + def match(self, event: dict[str, Any]) -> tuple[Callable, CloudWatchAlarmEvent] | None: if not isinstance(event, dict): return None - elif self.arn: - if event.get("alarmArn") == self.arn: - return self.func, CloudWatchAlarmEvent(event) - else: - return None - - alarm_name = event.get("alarmData", {}).get("alarmName", "") - if self.alarm_name: - if alarm_name == self.alarm_name: - return self.func, CloudWatchAlarmEvent(event) - elif self.alarm_name_prefix: - if alarm_name.find(self.alarm_name_prefix) == 0: - return self.func, CloudWatchAlarmEvent(event) - return None + arn: str | None = event.get("alarmArn") + alarm_name: str | None = event.get("alarmData", {}).get("alarmName") + + if not arn and not alarm_name: + return None + + flag_arn = self.is_target_with_arn(arn=arn) + flag_alarm_name = self.is_target_with_alarm_name(alarm_name=alarm_name) + + text = ", ".join( + ["arn: x" if arn is None else "arn: o", "alarm_name: x" if alarm_name is None else "alarm_name: o"], + ) + + mapping = { + "arn: o, alarm_name: o": flag_arn and flag_alarm_name, + "arn: o, alarm_name: x": flag_arn, + "arn: x, alarm_name: o": flag_alarm_name, + "arn: x, alarm_name: x": False, + } + + if mapping[text]: + return self.func, CloudWatchAlarmEvent(event) + else: + return None From 507770445297f359bd8dc1678ecb5a6144bacd8a Mon Sep 17 00:00:00 2001 From: sinofseven Date: Wed, 15 Jan 2025 00:41:11 +0900 Subject: [PATCH 012/139] fix implement for cloud_watch_logs.py --- .../routes/cloud_watch_logs.py | 68 +++--- .../_routes/test_cloud_watch_logs.py | 201 ------------------ 2 files changed, 28 insertions(+), 241 deletions(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py index aaa2bbd739d..c8d598c7512 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_logs.py @@ -79,50 +79,13 @@ def is_target_with_subscription_filters(self, subscription_filters: list[str] | return False - def is_target(self, log_group: str | None, log_stream: str | None, subscription_filters: list[str] | None) -> bool: - flag_log_group = self.is_target_with_log_group(log_group=log_group) - flag_log_stream = self.is_target_with_log_stream(log_stream=log_stream) - flag_subscription_filters = self.is_target_with_subscription_filters(subscription_filters=subscription_filters) - - if log_group and log_stream and subscription_filters: - text = "log_group, log_stream, subscription_filters" - elif log_group and log_stream and not subscription_filters: - text = "log_group, log_stream" - elif log_group and not log_stream and subscription_filters: - text = "log_group, subscription_filters" - elif not log_group and log_stream and subscription_filters: - text = "log_stream, subscription_filters" - elif log_group and not log_stream and not subscription_filters: - text = "log_group" - elif not log_group and log_stream and not subscription_filters: - text = "log_stream" - elif not log_group and not log_stream and subscription_filters: - text = "subscription_filters" - else: # not log_group and not log_stream and not subscription_filters - text = "" - - mapping = { - "log_group, log_stream, subscription_filters": flag_log_group - and flag_log_stream - and flag_subscription_filters, - "log_group, log_stream": flag_log_group and flag_log_stream, - "log_group, subscription_filters": flag_log_group and flag_subscription_filters, - "log_stream, subscription_filters": flag_log_stream and flag_subscription_filters, - "log_group": flag_log_group, - "log_stream": flag_log_stream, - "subscription_filters": flag_subscription_filters, - "": False, - } - - return mapping[text] - def match(self, event: dict[str, Any]) -> tuple[Callable, CloudWatchLogsEvent] | None: if not isinstance(event, dict): return None - text = event.get("awslogs", {}).get("data") + raw_text = event.get("awslogs", {}).get("data") - if not isinstance(text, str): + if not isinstance(raw_text, str): return None data = CloudWatchLogsEvent(event) @@ -143,7 +106,32 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, CloudWatchLogsEvent] | else: subscription_filters = None - if self.is_target(log_group, log_stream, subscription_filters): + flag_log_group = self.is_target_with_log_group(log_group=log_group) + flag_log_stream = self.is_target_with_log_stream(log_stream=log_stream) + flag_subscription_filters = self.is_target_with_subscription_filters(subscription_filters=subscription_filters) + + text = ", ".join( + [ + "log_group: x" if log_group is None else "log_group: o", + "log_stream: x" if log_stream is None else "log_stream: o", + "subscription_filters: x" if subscription_filters is None else "subscription_filters: o", + ], + ) + + mapping = { + "log_group: o, log_stream: o, subscription_filters: o": flag_log_group + and flag_log_stream + and flag_subscription_filters, + "log_group: o, log_stream: o, subscription_filters: x": flag_log_group and flag_log_stream, + "log_group: o, log_stream: x, subscription_filters: o": flag_log_group and flag_subscription_filters, + "log_group: x, log_stream: o, subscription_filters: o": flag_log_stream and flag_subscription_filters, + "log_group: o, log_stream: x, subscription_filters: x": flag_log_group, + "log_group: x, log_stream: o, subscription_filters: x": flag_log_stream, + "log_group: x, log_stream: x, subscription_filters: o": flag_subscription_filters, + "log_group: x, log_stream: x, subscription_filters: x": False, + } + + if mapping[text]: return self.func, data else: return None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py index 4f71a5f8e6c..cbe3a5189ee 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py @@ -139,207 +139,6 @@ def test_is_target_with_subscription_filters(self, option_constructor, option, e actual = route.is_target_with_subscription_filters(**option) assert actual == expected - @pytest.mark.parametrize( - "option_constructor, option, expected", - [ - ( - { - "func": None, - "log_group": "test-log-group", - "log_stream": "test-log-stream", - "subscription_filters": ["test"], - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - True, - ), - ( - { - "func": None, - "log_group": "test-log-group-v2", - "log_stream": "test-log-stream", - "subscription_filters": ["test"], - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - False, - ), - ( - { - "func": None, - "log_group": "test-log-group", - "log_stream": "test-log-stream-v2", - "subscription_filters": ["test"], - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - False, - ), - ( - { - "func": None, - "log_group": "test-log-group", - "log_stream": "test-log-stream", - "subscription_filters": ["name"], - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - False, - ), - ( - { - "func": None, - "log_group": "test-log-group-v2", - "log_stream": "test-log-stream-v2", - "subscription_filters": ["test"], - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - False, - ), - ( - { - "func": None, - "log_group": "test-log-group-v2", - "log_stream": "test-log-stream", - "subscription_filters": ["name"], - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - False, - ), - ( - { - "func": None, - "log_group": "test-log-group", - "log_stream": "test-log-stream-v2", - "subscription_filters": ["name"], - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - False, - ), - ( - { - "func": None, - "log_group": "test-log-group-v2", - "log_stream": "test-log-stream-v2", - "subscription_filters": ["name"], - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - False, - ), - ( - { - "func": None, - "log_group": "test-log-group", - "log_stream": "test-log-stream", - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": None}, - True, - ), - ( - { - "func": None, - "log_group": "test-log-group-v2", - "log_stream": "test-log-stream", - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": None}, - False, - ), - ( - { - "func": None, - "log_group": "test-log-group", - "log_stream": "test-log-stream-v2", - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": None}, - False, - ), - ( - { - "func": None, - "log_group": "test-log-group-v2", - "log_stream": "test-log-stream-v2", - }, - {"log_group": "test-log-group", "log_stream": "test-log-stream", "subscription_filters": None}, - False, - ), - ( - {"func": None, "log_group": "test-log-group", "subscription_filters": ["test"]}, - {"log_group": "test-log-group", "log_stream": None, "subscription_filters": ["test"]}, - True, - ), - ( - {"func": None, "log_group": "test-log-group-v2", "subscription_filters": ["test"]}, - {"log_group": "test-log-group", "log_stream": None, "subscription_filters": ["test"]}, - False, - ), - ( - {"func": None, "log_group": "test-log-group", "subscription_filters": ["name"]}, - {"log_group": "test-log-group", "log_stream": None, "subscription_filters": ["test"]}, - False, - ), - ( - {"func": None, "log_group": "test-log-group-v2", "subscription_filters": ["name"]}, - {"log_group": "test-log-group", "log_stream": None, "subscription_filters": ["test"]}, - False, - ), - ( - {"func": None, "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - True, - ), - ( - {"func": None, "log_stream": "test-log-stream-v2", "subscription_filters": ["test"]}, - {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - False, - ), - ( - {"func": None, "log_stream": "test-log-stream", "subscription_filters": ["name"]}, - {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - False, - ), - ( - {"func": None, "log_stream": "test-log-stream-v2", "subscription_filters": ["name"]}, - {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": ["test"]}, - False, - ), - ( - {"func": None, "log_group": "test-log-group"}, - {"log_group": "test-log-group", "log_stream": None, "subscription_filters": None}, - True, - ), - ( - {"func": None, "log_group": "test-log-group-v2"}, - {"log_group": "test-log-group", "log_stream": None, "subscription_filters": None}, - False, - ), - ( - {"func": None, "log_stream": "test-log-stream"}, - {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": None}, - True, - ), - ( - {"func": None, "log_stream": "test-log-stream-v2"}, - {"log_group": None, "log_stream": "test-log-stream", "subscription_filters": None}, - False, - ), - ( - {"func": None, "subscription_filters": ["test"]}, - {"log_group": None, "log_stream": None, "subscription_filters": ["test"]}, - True, - ), - ( - {"func": None, "subscription_filters": ["name"]}, - {"log_group": None, "log_stream": None, "subscription_filters": ["test"]}, - False, - ), - ( - {"func": None, "subscription_filters": ["name"]}, - {"log_group": None, "log_stream": None, "subscription_filters": None}, - False, - ), - ], - ) - def test_is_target(self, option_constructor, option, expected): - route = CloudWatchLogsRoute(**option_constructor) - actual = route.is_target(**option) - assert actual == expected - @pytest.mark.parametrize( "event_name, option_constructor", [ From 0e567ccc1c20b05750c1b9fb152d72280ed23956 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Wed, 15 Jan 2025 00:41:28 +0900 Subject: [PATCH 013/139] fix implement for event_bridge.py --- .../async_execution/routes/event_bridge.py | 60 ++-- .../_routes/test_event_bridge.py | 322 ------------------ 2 files changed, 24 insertions(+), 358 deletions(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py b/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py index f50a0f965d4..9c82c1780c5 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/event_bridge.py @@ -53,41 +53,6 @@ def is_target_with_resources(self, resources: list[str] | None) -> bool: return False - def is_target(self, detail_type: str | None, source: str | None, resources: list[str] | None) -> bool: - flag_detail_type = self.is_target_with_detail_type(detail_type=detail_type) - flag_source = self.is_target_with_source(source=source) - flag_resources = self.is_target_with_resources(resources=resources) - - if detail_type and source and resources: - text = "detail_type, source, resources" - elif detail_type and source and not resources: - text = "detail_type, source" - elif detail_type and not source and resources: - text = "detail_type, resources" - elif not detail_type and source and resources: - text = "source, resources" - elif detail_type and not source and not resources: - text = "detail_type" - elif not detail_type and source and not resources: - text = "source" - elif not detail_type and not source and resources: - text = "resources" - else: # not detail_type and not source and not resources - text = "" - - mapping = { - "detail_type, source, resources": flag_detail_type and flag_source and flag_resources, - "detail_type, source": flag_detail_type and flag_source, - "detail_type, resources": flag_detail_type and flag_resources, - "source, resources": flag_source and flag_resources, - "detail_type": flag_detail_type, - "source": flag_source, - "resources": flag_resources, - "": False, - } - - return mapping[text] - def match(self, event: dict[str, Any]) -> tuple[Callable, EventBridgeEvent] | None: if not isinstance(event, dict): return None @@ -108,7 +73,30 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, EventBridgeEvent] | No if not self.resources: resources = None - if self.is_target(detail_type, source, resources): + flag_detail_type = self.is_target_with_detail_type(detail_type=detail_type) + flag_source = self.is_target_with_source(source=source) + flag_resources = self.is_target_with_resources(resources=resources) + + text = ", ".join( + [ + "detail_type: x" if detail_type is None else "detail_type: o", + "source: x" if source is None else "source: o", + "resources: x" if resources is None else "resources: o", + ], + ) + + mapping = { + "detail_type: o, source: o, resources: o": flag_detail_type and flag_source and flag_resources, + "detail_type: o, source: o, resources: x": flag_detail_type and flag_source, + "detail_type: o, source: x, resources: o": flag_detail_type and flag_resources, + "detail_type: x, source: o, resources: o": flag_source and flag_resources, + "detail_type: o, source: x, resources: x": flag_detail_type, + "detail_type: x, source: o, resources: x": flag_source, + "detail_type: x, source: x, resources: o": flag_resources, + "detail_type: x, source: x, resources: x": False, + } + + if mapping[text]: return self.func, EventBridgeEvent(event) else: return None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py b/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py index 568eb2e8374..42eb30ece21 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py @@ -128,328 +128,6 @@ def test_is_target_with_resources(self, option_constructor, option, expected): actual = route.is_target_with_resources(**option) assert actual == expected - @pytest.mark.parametrize( - "option_constructor, option, expected", - [ - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - True, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - }, - {"detail_type": "EC2 Instance State-change Notification", "source": "aws.ec2", "resources": None}, - True, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "source": "aws.lambda", - }, - {"detail_type": "EC2 Instance State-change Notification", "source": "aws.ec2", "resources": None}, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "source": "aws.ec2", - }, - {"detail_type": "EC2 Instance State-change Notification", "source": "aws.ec2", "resources": None}, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.lambda", - }, - {"detail_type": "EC2 Instance State-change Notification", "source": "aws.ec2", "resources": None}, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": None, - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - True, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": None, - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": None, - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], - }, - { - "detail_type": "EC2 Instance State-change Notification", - "source": None, - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - { - "detail_type": None, - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - True, - ), - ( - { - "func": None, - "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], - }, - { - "detail_type": None, - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - { - "detail_type": None, - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], - }, - { - "detail_type": None, - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - }, - {"detail_type": "EC2 Instance State-change Notification", "source": None, "resources": None}, - True, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - }, - {"detail_type": "EC2 Instance State-change Notification", "source": None, "resources": None}, - False, - ), - ( - { - "func": None, - "source": "aws.ec2", - }, - {"detail_type": None, "source": "aws.ec2", "resources": None}, - True, - ), - ( - { - "func": None, - "source": "aws.lambda", - }, - {"detail_type": None, "source": "aws.ec2", "resources": None}, - False, - ), - ( - {"func": None, "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"]}, - { - "detail_type": None, - "source": None, - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - True, - ), - ( - {"func": None, "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"]}, - { - "detail_type": None, - "source": None, - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - False, - ), - ( - { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], - }, - {"detail_type": None, "source": None, "resources": None}, - False, - ), - ], - ) - def test_is_target(self, option_constructor, option, expected): - route = EventBridgeRoute(**option_constructor) - actual = route.is_target(**option) - assert actual == expected - @pytest.mark.parametrize( "event_name, option_constructor", [ From 8589ff0e9644dda93293700f97b7936f80cbbb7c Mon Sep 17 00:00:00 2001 From: sinofseven Date: Wed, 15 Jan 2025 00:41:39 +0900 Subject: [PATCH 014/139] fix implement for ses.py --- .../async_execution/routes/ses.py | 188 ++++++++++++------ 1 file changed, 132 insertions(+), 56 deletions(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/ses.py b/aws_lambda_powertools/event_handler/async_execution/routes/ses.py index bb9456c04d9..ba367ff8723 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/ses.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/ses.py @@ -7,17 +7,56 @@ from .base import BaseRoute +def match_prefix(all_address: list[str], all_prefix: list[str]) -> bool: + for address in all_address: + for prefix in all_prefix: + if address.find(prefix) == 0: + return True + return False + + +def match_suffix(all_address: list[str], all_suffix: list[str]) -> bool: + for address in all_address: + for suffix in all_suffix: + length_suffix = len(suffix) + address_suffix = address[-length_suffix:] + if address_suffix == suffix: + return True + return False + + +def match_prefix_and_suffix(all_address: list[str], all_prefix: list[str], all_suffix: list[str]) -> bool: + for address in all_address: + for prefix in all_prefix: + for suffix in all_suffix: + length_suffix = len(suffix) + address_suffix = address[-length_suffix:] + if address.find(prefix) == 0 and address_suffix == suffix: + return True + return False + + class SESRoute(BaseRoute): mail_to: list[str] | None + mail_to_prefix: list[str] | None + mail_to_suffix: list[str] | None mail_from: list[str] | None + mail_from_prefix: list[str] | None + mail_from_suffix: list[str] | None mail_subject: str | None + mail_subject_prefix: str | None def __init__( self, func: Callable, mail_to: str | list[str] | None = None, + mail_to_prefix: str | list[str] | None = None, + mail_to_suffix: str | list[str] | None = None, mail_from: str | list[str] | None = None, + mail_from_prefix: str | list[str] | None = None, + mail_from_suffix: str | list[str] | None = None, mail_subject: str | None = None, + mail_subject_prefix: str | None = None, ): self.func = func @@ -26,76 +65,92 @@ def __init__( else: self.mail_to = mail_to + if isinstance(mail_to_prefix, str): + self.mail_to_prefix = [mail_to_prefix] + else: + self.mail_to_prefix = mail_to_prefix + + if isinstance(mail_to_suffix, str): + self.mail_to_suffix = [mail_to_suffix] + else: + self.mail_to_suffix = mail_to_suffix + if isinstance(mail_from, str): self.mail_from = [mail_from] else: self.mail_from = mail_from + if isinstance(mail_from_prefix, str): + self.mail_from_prefix = [mail_from_prefix] + else: + self.mail_from_prefix = mail_from_prefix + + if isinstance(mail_from_suffix, str): + self.mail_from_suffix = [mail_from_suffix] + else: + self.mail_from_suffix = mail_from_suffix + self.mail_subject = mail_subject + self.mail_subject_prefix = mail_subject_prefix if not self.mail_to and not self.mail_from and not self.mail_subject: - raise ValueError("mail_to, mail_from, or mail_subject must be not null") + raise ValueError( + ( + "mail_to, mail_to_prefix, mail_to_suffix, mail_from, mail_from_prefix, mail_from_suffix, " + "mail_subject, or mail_subject_prefix must be not null" + ), + ) def is_target_with_mail_to(self, mail_to: list[str] | None) -> bool: - if not mail_to or not self.mail_to: + if not mail_to: return False - - for address in self.mail_to: - if address in mail_to: - return True + elif self.mail_to: + for address in mail_to: + if address in self.mail_to: + return True + elif self.mail_to_prefix and self.mail_to_suffix: + return match_prefix_and_suffix( + all_address=mail_to, + all_prefix=self.mail_to_prefix, + all_suffix=self.mail_to_suffix, + ) + elif self.mail_to_prefix: + return match_prefix(all_address=mail_to, all_prefix=self.mail_to_prefix) + elif self.mail_to_suffix: + return match_suffix(all_address=mail_to, all_suffix=self.mail_to_suffix) return False def is_target_with_mail_from(self, mail_from: list[str] | None) -> bool: - if not mail_from or not self.mail_from: + if not mail_from: return False - - for address in self.mail_from: - if address in mail_from: - return True + elif self.mail_from: + for address in mail_from: + if address in self.mail_from: + return True + elif self.mail_from_prefix and self.mail_from_suffix: + return match_prefix_and_suffix( + all_address=mail_from, + all_prefix=self.mail_from_prefix, + all_suffix=self.mail_from_suffix, + ) + elif self.mail_from_prefix: + return match_prefix(all_address=mail_from, all_prefix=self.mail_from_prefix) + elif self.mail_from_suffix: + return match_suffix(all_address=mail_from, all_suffix=self.mail_from_suffix) return False def is_target_with_mail_subject(self, mail_subject: str | None) -> bool: - if mail_subject and self.mail_subject: + if not mail_subject: + return False + elif self.mail_subject: return self.mail_subject == mail_subject + elif self.mail_subject_prefix: + return mail_subject.find(self.mail_subject_prefix) == 0 else: return False - def is_target(self, mail_to: list[str] | None, mail_from: list[str] | None, mail_subject: str | None) -> bool: - flag_mail_to = self.is_target_with_mail_to(mail_to=mail_to) - flag_mail_from = self.is_target_with_mail_from(mail_from=mail_from) - flag_mail_subject = self.is_target_with_mail_subject(mail_subject=mail_subject) - - if mail_to and mail_from and mail_subject: - text = "mail_to, mail_from, mail_subject" - elif mail_to and mail_from and not mail_subject: - text = "mail_to, mail_from" - elif mail_to and not mail_from and mail_subject: - text = "mail_to, mail_subject" - elif not mail_to and mail_from and mail_subject: - text = "mail_from, mail_subject" - elif mail_to and not mail_from and not mail_subject: - text = "mail_to" - elif not mail_to and mail_from and not mail_subject: - text = "mail_from" - elif not mail_to and not mail_from and mail_subject: - text = "mail_subject" - else: # not mail_to and not mail_from and not mail_subject - text = "" - - mapping = { - "mail_to, mail_from, mail_subject": flag_mail_to and flag_mail_from and flag_mail_subject, - "mail_to, mail_from": flag_mail_to and flag_mail_from, - "mail_to, mail_subject": flag_mail_to and flag_mail_subject, - "mail_from, mail_subject": flag_mail_from and flag_mail_subject, - "mail_to": flag_mail_to, - "mail_from": flag_mail_from, - "mail_subject": flag_mail_subject, - "": False, - } - return mapping[text] - def match(self, event: dict[str, Any]) -> tuple[Callable, SESEvent] | None: if not isinstance(event, dict): return None @@ -110,22 +165,43 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, SESEvent] | None: if common_header is None: return None - if self.mail_to: - mail_to = common_header.get("to") - else: + mail_to = common_header.get("to") + mail_from = common_header.get("from") + mail_subject = common_header.get("subject") + + if not self.mail_to and not self.mail_to_prefix and not self.mail_to_suffix: mail_to = None - if self.mail_from: - mail_from = common_header.get("from") - else: + if not self.mail_from and not self.mail_from_prefix and not self.mail_from_suffix: mail_from = None - if self.mail_subject: - mail_subject = common_header.get("subject") - else: + if not self.mail_subject and not self.mail_subject_prefix: mail_subject = None - if self.is_target(mail_to, mail_from, mail_subject): + flag_mail_to = self.is_target_with_mail_to(mail_to=mail_to) + flag_mail_from = self.is_target_with_mail_from(mail_from=mail_from) + flag_mail_subject = self.is_target_with_mail_subject(mail_subject=mail_subject) + + text = ", ".join( + [ + "mail_to: x" if mail_to is None else "mail_to: o", + "mail_from: x" if mail_from is None else "mail_from: o", + "mail_subject: x" if mail_subject is None else "mail_subject: o", + ], + ) + + mapping = { + "mail_to: o, mail_from: o, mail_subject: o": flag_mail_to and flag_mail_from and flag_mail_subject, + "mail_to: o, mail_from: o, mail_subject: x": flag_mail_to and flag_mail_from, + "mail_to: o, mail_from: x, mail_subject: o": flag_mail_to and flag_mail_subject, + "mail_to: x, mail_from: o, mail_subject: o": flag_mail_from and flag_mail_subject, + "mail_to: o, mail_from: x, mail_subject: x": flag_mail_to, + "mail_to: x, mail_from: o, mail_subject: x": flag_mail_from, + "mail_to: x, mail_from: x, mail_subject: o": flag_mail_subject, + "mail_to: x, mail_from: x, mail_subject: x": False, + } + + if mapping[text]: return self.func, SESEvent(event) else: return None From 3ebac85de85a92154c5f8af0f329b6373d82c075 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Wed, 15 Jan 2025 01:24:20 +0900 Subject: [PATCH 015/139] fix test for cloud_watch_alarm.py --- .../async_execution/routes/cloud_watch_alarm.py | 6 ++++++ .../_routes/test_cloud_watch_alarm.py | 16 ++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py index 6d6b5698040..a6735bd201e 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/cloud_watch_alarm.py @@ -57,6 +57,12 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, CloudWatchAlarmEvent] if not arn and not alarm_name: return None + if not self.arn: + arn = None + + if not self.alarm_name and not self.alarm_name_prefix: + alarm_name = None + flag_arn = self.is_target_with_arn(arn=arn) flag_alarm_name = self.is_target_with_alarm_name(alarm_name=alarm_name) diff --git a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py index 79df0678870..2d4c53a77e5 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py @@ -28,7 +28,7 @@ def test_constructor_error(self): { "func": lambda _: None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", - "alarm_name": "CompositeDemo.MainV2", + "alarm_name": "CompositeDemo.Main", }, ), ( @@ -36,7 +36,7 @@ def test_constructor_error(self): { "func": lambda _: None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", - "alarm_name_prefix": "CompositeDD", + "alarm_name_prefix": "CompositeD", }, ), ( @@ -44,8 +44,8 @@ def test_constructor_error(self): { "func": lambda _: None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", - "alarm_name": "CompositeDemo.MainV2", - "alarm_name_prefix": "CompositeDD", + "alarm_name": "CompositeDemo.Main", + "alarm_name_prefix": "CompositeD", }, ), # cloudWatchAlarmEventCompositeMetric.json, match alarm_name, without alarm_name_prefix @@ -87,7 +87,7 @@ def test_constructor_error(self): { "func": lambda _: None, "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", - "alarm_name": "Test alertV2", + "alarm_name": "Test alert", }, ), ( @@ -95,7 +95,7 @@ def test_constructor_error(self): { "func": lambda _: None, "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", - "alarm_name_prefix": "Test-a", + "alarm_name_prefix": "Test a", }, ), ( @@ -103,8 +103,8 @@ def test_constructor_error(self): { "func": lambda _: None, "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", - "alarm_name": "Test alertV2", - "alarm_name_prefix": "Test-a", + "alarm_name": "Test alert", + "alarm_name_prefix": "Test a", }, ), # cloudWatchAlarmEventSingleMetric.json, match alarm_name, without alarm_name_prefix From 21548125802b94fdfd7418852bcc58c8199a05b0 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Wed, 15 Jan 2025 01:24:38 +0900 Subject: [PATCH 016/139] fix test for aws_config_rule.py --- .../_routes/test_aws_config_rule.py | 506 ++++++++++++++++++ 1 file changed, 506 insertions(+) diff --git a/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py b/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py index 10aab8ff99c..2f3a1875152 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py @@ -952,6 +952,512 @@ def test_is_target_with_rule_id(self, option_constructor, option_func, expected) {"func": lambda *_: None, "rule_id": "config-rule-000000"}, False, ), + # Other events + ( + "activeMQEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "albEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "albEventPathTrailingSlash.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "albMultiValueHeadersEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "albMultiValueQueryStringEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayAuthorizerRequestEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayAuthorizerTokenEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayAuthorizerV2Event.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyEventAnotherPath.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyEventNoOrigin.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyEventPathTrailingSlash.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyEventPrincipalId.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyEvent_noVersionAuth.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyOtherEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyV2Event.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyV2EventPathTrailingSlash.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyV2Event_GET.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyV2IamEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyV2LambdaAuthorizerEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyV2OtherGetEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apigatewayeSchemaMiddlwareInvalidEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "apigatewayeSchemaMiddlwareValidEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "appSyncAuthorizerEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "appSyncAuthorizerResponse.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "appSyncBatchEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "appSyncDirectResolver.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "appSyncResolverEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "bedrockAgentEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "bedrockAgentEventWithPathParams.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "bedrockAgentPostEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cloudWatchAlarmEventCompositeMetric.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cloudWatchAlarmEventSingleMetric.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cloudWatchDashboardEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cloudWatchLogEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cloudWatchLogEventWithPolicyLevel.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cloudformationCustomResourceCreate.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cloudformationCustomResourceDelete.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cloudformationCustomResourceUpdate.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "codeDeployLifecycleHookEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "codePipelineEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "codePipelineEventData.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "codePipelineEventEmptyUserParameters.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "codePipelineEventWithEncryptionKey.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoCreateAuthChallengeEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoCustomEmailSenderEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoCustomMessageEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoCustomSMSSenderEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoDefineAuthChallengeEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoPostAuthenticationEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoPostConfirmationEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoPreAuthenticationEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoPreSignUpEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoPreTokenGenerationEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoPreTokenV2GenerationEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoUserMigrationEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "cognitoVerifyAuthChallengeResponseEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "connectContactFlowEventAll.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "connectContactFlowEventMin.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "dynamoStreamEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "eventBridgeEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "kafkaEventMsk.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "kafkaEventSelfManaged.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "kinesisFirehoseKinesisEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "kinesisFirehosePutEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "kinesisFirehoseSQSEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "kinesisStreamCloudWatchLogsEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "kinesisStreamEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "kinesisStreamEventOneRecord.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "lambdaFunctionUrlEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "lambdaFunctionUrlEventPathTrailingSlash.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "lambdaFunctionUrlEventWithHeaders.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "lambdaFunctionUrlIAMEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "rabbitMQEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3BatchOperationEventSchemaV1.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3BatchOperationEventSchemaV2.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3Event.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3EventBridgeNotificationObjectCreatedEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3EventBridgeNotificationObjectDeletedEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3EventBridgeNotificationObjectExpiredEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3EventDecodedKey.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3EventDeleteObject.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3EventGlacier.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3ObjectEventIAMUser.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3ObjectEventTempCredentials.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "s3SqsEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "secretsManagerEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "sesEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "snsEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "snsSqsEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "snsSqsFifoEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "sqsDlqTriggerEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "sqsEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "vpcLatticeEvent.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "vpcLatticeEventPathTrailingSlash.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "vpcLatticeEventV2PathTrailingSlash.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "vpcLatticeV2Event.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), + ( + "vpcLatticeV2EventWithHeaders.json", + {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, + False, + ), ], ) def test_match(self, event_name, option_constructor, expected_true): From e7a91b04ed7b9ca1dd564f4967024e1a8ec1d2b3 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Thu, 16 Jan 2025 21:07:30 +0900 Subject: [PATCH 017/139] fix implement for sns.py --- .../event_handler/async_execution/routes/sns.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/sns.py b/aws_lambda_powertools/event_handler/async_execution/routes/sns.py index ae44f638e05..f0c15baed0a 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/sns.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/sns.py @@ -91,7 +91,19 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, SNSEvent] | None: else: subject = None - if self.is_target(arn, subject): + flag_arn = self.is_target_with_arn(arn=arn) + flag_subject = self.is_target_with_subject(subject=subject) + + text = ", ".join(["arn: x" if arn is None else "arn: o", "subject: x" if subject is None else "subject: o"]) + + mapping = { + "arn: o, subject: o": flag_arn and flag_subject, + "arn: o, subject: x": flag_arn, + "arn: x, subject: o": flag_subject, + "arn: x, subject: x": False, + } + + if mapping[text]: return self.func, SNSEvent(event) else: return None From 5424c7864e65c813556917b131a407c8f317d0c1 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Thu, 16 Jan 2025 21:58:37 +0900 Subject: [PATCH 018/139] add test for cloud_watch_alarm.py --- .../_routes/test_cloud_watch_alarm.py | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py index 2d4c53a77e5..2865c9d154c 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py @@ -14,6 +14,56 @@ def test_constructor_error(self): with pytest.raises(ValueError): CloudWatchAlarmRoute(func=None) + @pytest.mark.parametrize( + "option_constructor, option_func, expected", + [ + ( + {"func": None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main"}, + {"arn": None}, + False, + ), + ( + {"func": None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main"}, + {"arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main"}, + True, + ), + ( + {"func": None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.MainV2"}, + {"arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main"}, + False, + ), + ( + {"func": None, "alarm_name": "SuppressionDemo.Main"}, + {"arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main"}, + False, + ), + ], + ) + def test_is_target_with_arn(self, option_constructor, option_func, expected): + route = CloudWatchAlarmRoute(**option_constructor) + actual = route.is_target_with_arn(**option_func) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option_func, expected", + [ + ({"func": None, "alarm_name": "CompositeDemo.Main"}, {"alarm_name": None}, False), + ({"func": None, "alarm_name": "CompositeDemo.Main"}, {"alarm_name": "CompositeDemo.Main"}, True), + ({"func": None, "alarm_name": "CompositeDemo.MainV2"}, {"alarm_name": "CompositeDemo.Main"}, False), + ({"func": None, "alarm_name_prefix": "CompositeDemo.M"}, {"alarm_name": "CompositeDemo.Main"}, True), + ({"func": None, "alarm_name_prefix": "Main"}, {"alarm_name": "CompositeDemo.Main"}, False), + ( + {"func": None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main"}, + {"alarm_name": "CompositeDemo.Main"}, + False, + ), + ], + ) + def test_is_target_with_alarm_name(self, option_constructor, option_func, expected): + route = CloudWatchAlarmRoute(**option_constructor) + actual = route.is_target_with_alarm_name(**option_func) + assert actual == expected + @pytest.mark.parametrize( "event_name, option_constructor", [ From fe8b0cf5ce7b07b725efddb190d49bd0c5e2076e Mon Sep 17 00:00:00 2001 From: sinofseven Date: Fri, 24 Jan 2025 14:16:13 +0900 Subject: [PATCH 019/139] add test for other event file --- .../_routes/test_aws_config_rule.py | 623 ++++-------------- .../_routes/test_cloud_watch_alarm.py | 116 ++++ .../_routes/test_cloud_watch_logs.py | 113 ++++ .../test_code_deploy_lifecycle_hook.py | 114 ++++ .../_routes/test_event_bridge.py | 114 ++++ .../_async_execution/_routes/test_s3.py | 117 ++++ .../_routes/test_secrets_manager.py | 123 ++++ .../_async_execution/_routes/test_ses.py | 120 ++++ .../_async_execution/_routes/test_sns.py | 120 ++++ 9 files changed, 1053 insertions(+), 507 deletions(-) create mode 100644 tests/unit/event_handler/_async_execution/_routes/test_s3.py create mode 100644 tests/unit/event_handler/_async_execution/_routes/test_secrets_manager.py create mode 100644 tests/unit/event_handler/_async_execution/_routes/test_ses.py create mode 100644 tests/unit/event_handler/_async_execution/_routes/test_sns.py diff --git a/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py b/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py index 2f3a1875152..b17065b8d59 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_aws_config_rule.py @@ -952,515 +952,9 @@ def test_is_target_with_rule_id(self, option_constructor, option_func, expected) {"func": lambda *_: None, "rule_id": "config-rule-000000"}, False, ), - # Other events - ( - "activeMQEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "albEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "albEventPathTrailingSlash.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "albMultiValueHeadersEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "albMultiValueQueryStringEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayAuthorizerRequestEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayAuthorizerTokenEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayAuthorizerV2Event.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyEventAnotherPath.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyEventNoOrigin.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyEventPathTrailingSlash.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyEventPrincipalId.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyEvent_noVersionAuth.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyOtherEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyV2Event.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyV2EventPathTrailingSlash.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyV2Event_GET.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyV2IamEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyV2LambdaAuthorizerEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyV2OtherGetEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apigatewayeSchemaMiddlwareInvalidEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "apigatewayeSchemaMiddlwareValidEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "appSyncAuthorizerEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "appSyncAuthorizerResponse.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "appSyncBatchEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "appSyncDirectResolver.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "appSyncResolverEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "bedrockAgentEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "bedrockAgentEventWithPathParams.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "bedrockAgentPostEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cloudWatchAlarmEventCompositeMetric.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cloudWatchAlarmEventSingleMetric.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cloudWatchDashboardEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cloudWatchLogEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cloudformationCustomResourceCreate.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cloudformationCustomResourceDelete.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cloudformationCustomResourceUpdate.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "codeDeployLifecycleHookEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "codePipelineEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "codePipelineEventData.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "codePipelineEventEmptyUserParameters.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "codePipelineEventWithEncryptionKey.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoCreateAuthChallengeEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoCustomEmailSenderEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoCustomMessageEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoCustomSMSSenderEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoDefineAuthChallengeEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoPostAuthenticationEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoPostConfirmationEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoPreAuthenticationEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoPreSignUpEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoPreTokenGenerationEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoPreTokenV2GenerationEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoUserMigrationEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "cognitoVerifyAuthChallengeResponseEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "connectContactFlowEventAll.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "connectContactFlowEventMin.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "dynamoStreamEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "eventBridgeEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "kafkaEventMsk.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "kafkaEventSelfManaged.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "kinesisFirehoseKinesisEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "kinesisFirehosePutEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "kinesisFirehoseSQSEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "kinesisStreamCloudWatchLogsEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "kinesisStreamEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "kinesisStreamEventOneRecord.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "lambdaFunctionUrlEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "lambdaFunctionUrlEventPathTrailingSlash.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "lambdaFunctionUrlEventWithHeaders.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "lambdaFunctionUrlIAMEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "rabbitMQEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3BatchOperationEventSchemaV1.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3BatchOperationEventSchemaV2.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3Event.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3EventBridgeNotificationObjectCreatedEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3EventBridgeNotificationObjectDeletedEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3EventBridgeNotificationObjectExpiredEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3EventDecodedKey.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3EventDeleteObject.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3EventGlacier.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3ObjectEventIAMUser.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3ObjectEventTempCredentials.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "s3SqsEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "secretsManagerEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "sesEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "snsEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "snsSqsEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "snsSqsFifoEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "sqsDlqTriggerEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "sqsEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "vpcLatticeEvent.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "vpcLatticeEventPathTrailingSlash.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "vpcLatticeEventV2PathTrailingSlash.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "vpcLatticeV2Event.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), - ( - "vpcLatticeV2EventWithHeaders.json", - {"func": None, "arn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9"}, - False, - ), ], ) - def test_match(self, event_name, option_constructor, expected_true): + def test_match_with_aws_config_rule_event(self, event_name, option_constructor, expected_true): event = load_event(file_name=event_name) route = AwsConfigRuleRoute(**option_constructor) expected_return = (route.func, AWSConfigRuleEvent(event)) @@ -1469,3 +963,118 @@ def test_match(self, event_name, option_constructor, expected_true): assert actual == expected_return else: assert actual is None + + @pytest.mark.parametrize( + "event_name", + [ + "activeMQEvent.json", + "albEvent.json", + "albEventPathTrailingSlash.json", + "albMultiValueHeadersEvent.json", + "albMultiValueQueryStringEvent.json", + "apiGatewayAuthorizerRequestEvent.json", + "apiGatewayAuthorizerTokenEvent.json", + "apiGatewayAuthorizerV2Event.json", + "apiGatewayProxyEvent.json", + "apiGatewayProxyEventAnotherPath.json", + "apiGatewayProxyEventNoOrigin.json", + "apiGatewayProxyEventPathTrailingSlash.json", + "apiGatewayProxyEventPrincipalId.json", + "apiGatewayProxyEvent_noVersionAuth.json", + "apiGatewayProxyOtherEvent.json", + "apiGatewayProxyV2Event.json", + "apiGatewayProxyV2EventPathTrailingSlash.json", + "apiGatewayProxyV2Event_GET.json", + "apiGatewayProxyV2IamEvent.json", + "apiGatewayProxyV2LambdaAuthorizerEvent.json", + "apiGatewayProxyV2OtherGetEvent.json", + "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", + "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", + "apigatewayeSchemaMiddlwareInvalidEvent.json", + "apigatewayeSchemaMiddlwareValidEvent.json", + "appSyncAuthorizerEvent.json", + "appSyncAuthorizerResponse.json", + "appSyncBatchEvent.json", + "appSyncDirectResolver.json", + "appSyncResolverEvent.json", + "bedrockAgentEvent.json", + "bedrockAgentEventWithPathParams.json", + "bedrockAgentPostEvent.json", + "cloudWatchAlarmEventCompositeMetric.json", + "cloudWatchAlarmEventSingleMetric.json", + "cloudWatchDashboardEvent.json", + "cloudWatchLogEvent.json", + "cloudWatchLogEventWithPolicyLevel.json", + "cloudformationCustomResourceCreate.json", + "cloudformationCustomResourceDelete.json", + "cloudformationCustomResourceUpdate.json", + "codeDeployLifecycleHookEvent.json", + "codePipelineEvent.json", + "codePipelineEventData.json", + "codePipelineEventEmptyUserParameters.json", + "codePipelineEventWithEncryptionKey.json", + "cognitoCreateAuthChallengeEvent.json", + "cognitoCustomEmailSenderEvent.json", + "cognitoCustomMessageEvent.json", + "cognitoCustomSMSSenderEvent.json", + "cognitoDefineAuthChallengeEvent.json", + "cognitoPostAuthenticationEvent.json", + "cognitoPostConfirmationEvent.json", + "cognitoPreAuthenticationEvent.json", + "cognitoPreSignUpEvent.json", + "cognitoPreTokenGenerationEvent.json", + "cognitoPreTokenV2GenerationEvent.json", + "cognitoUserMigrationEvent.json", + "cognitoVerifyAuthChallengeResponseEvent.json", + "connectContactFlowEventAll.json", + "connectContactFlowEventMin.json", + "dynamoStreamEvent.json", + "eventBridgeEvent.json", + "kafkaEventMsk.json", + "kafkaEventSelfManaged.json", + "kinesisFirehoseKinesisEvent.json", + "kinesisFirehosePutEvent.json", + "kinesisFirehoseSQSEvent.json", + "kinesisStreamCloudWatchLogsEvent.json", + "kinesisStreamEvent.json", + "kinesisStreamEventOneRecord.json", + "lambdaFunctionUrlEvent.json", + "lambdaFunctionUrlEventPathTrailingSlash.json", + "lambdaFunctionUrlEventWithHeaders.json", + "lambdaFunctionUrlIAMEvent.json", + "rabbitMQEvent.json", + "s3BatchOperationEventSchemaV1.json", + "s3BatchOperationEventSchemaV2.json", + "s3Event.json", + "s3EventBridgeNotificationObjectCreatedEvent.json", + "s3EventBridgeNotificationObjectDeletedEvent.json", + "s3EventBridgeNotificationObjectExpiredEvent.json", + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + "s3EventDecodedKey.json", + "s3EventDeleteObject.json", + "s3EventGlacier.json", + "s3ObjectEventIAMUser.json", + "s3ObjectEventTempCredentials.json", + "s3SqsEvent.json", + "secretsManagerEvent.json", + "sesEvent.json", + "snsEvent.json", + "snsSqsEvent.json", + "snsSqsFifoEvent.json", + "sqsDlqTriggerEvent.json", + "sqsEvent.json", + "vpcLatticeEvent.json", + "vpcLatticeEventPathTrailingSlash.json", + "vpcLatticeEventV2PathTrailingSlash.json", + "vpcLatticeV2Event.json", + "vpcLatticeV2EventWithHeaders.json", + ], + ) + def test_match_for_not_aws_config_rule_event(self, event_name): + event = load_event(file_name=event_name) + route = AwsConfigRuleRoute( + func=None, + arn="arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", + ) + actual = route.match(event=event) + assert actual is None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py index 2865c9d154c..b1fe75f06e4 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py @@ -344,3 +344,119 @@ def test_match_false(self, event_name, option_constructor): route = CloudWatchAlarmRoute(**option_constructor) actual = route.match(event=event) assert actual is None + + @pytest.mark.parametrize( + "event_name", + [ + "activeMQEvent.json", + "albEvent.json", + "albEventPathTrailingSlash.json", + "albMultiValueHeadersEvent.json", + "albMultiValueQueryStringEvent.json", + "apiGatewayAuthorizerRequestEvent.json", + "apiGatewayAuthorizerTokenEvent.json", + "apiGatewayAuthorizerV2Event.json", + "apiGatewayProxyEvent.json", + "apiGatewayProxyEventAnotherPath.json", + "apiGatewayProxyEventNoOrigin.json", + "apiGatewayProxyEventPathTrailingSlash.json", + "apiGatewayProxyEventPrincipalId.json", + "apiGatewayProxyEvent_noVersionAuth.json", + "apiGatewayProxyOtherEvent.json", + "apiGatewayProxyV2Event.json", + "apiGatewayProxyV2EventPathTrailingSlash.json", + "apiGatewayProxyV2Event_GET.json", + "apiGatewayProxyV2IamEvent.json", + "apiGatewayProxyV2LambdaAuthorizerEvent.json", + "apiGatewayProxyV2OtherGetEvent.json", + "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", + "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", + "apigatewayeSchemaMiddlwareInvalidEvent.json", + "apigatewayeSchemaMiddlwareValidEvent.json", + "appSyncAuthorizerEvent.json", + "appSyncAuthorizerResponse.json", + "appSyncBatchEvent.json", + "appSyncDirectResolver.json", + "appSyncResolverEvent.json", + "awsConfigRuleConfigurationChanged.json", + "awsConfigRuleOversizedConfiguration.json", + "awsConfigRuleScheduled.json", + "bedrockAgentEvent.json", + "bedrockAgentEventWithPathParams.json", + "bedrockAgentPostEvent.json", + "cloudWatchDashboardEvent.json", + "cloudWatchLogEvent.json", + "cloudWatchLogEventWithPolicyLevel.json", + "cloudformationCustomResourceCreate.json", + "cloudformationCustomResourceDelete.json", + "cloudformationCustomResourceUpdate.json", + "codeDeployLifecycleHookEvent.json", + "codePipelineEvent.json", + "codePipelineEventData.json", + "codePipelineEventEmptyUserParameters.json", + "codePipelineEventWithEncryptionKey.json", + "cognitoCreateAuthChallengeEvent.json", + "cognitoCustomEmailSenderEvent.json", + "cognitoCustomMessageEvent.json", + "cognitoCustomSMSSenderEvent.json", + "cognitoDefineAuthChallengeEvent.json", + "cognitoPostAuthenticationEvent.json", + "cognitoPostConfirmationEvent.json", + "cognitoPreAuthenticationEvent.json", + "cognitoPreSignUpEvent.json", + "cognitoPreTokenGenerationEvent.json", + "cognitoPreTokenV2GenerationEvent.json", + "cognitoUserMigrationEvent.json", + "cognitoVerifyAuthChallengeResponseEvent.json", + "connectContactFlowEventAll.json", + "connectContactFlowEventMin.json", + "dynamoStreamEvent.json", + "eventBridgeEvent.json", + "kafkaEventMsk.json", + "kafkaEventSelfManaged.json", + "kinesisFirehoseKinesisEvent.json", + "kinesisFirehosePutEvent.json", + "kinesisFirehoseSQSEvent.json", + "kinesisStreamCloudWatchLogsEvent.json", + "kinesisStreamEvent.json", + "kinesisStreamEventOneRecord.json", + "lambdaFunctionUrlEvent.json", + "lambdaFunctionUrlEventPathTrailingSlash.json", + "lambdaFunctionUrlEventWithHeaders.json", + "lambdaFunctionUrlIAMEvent.json", + "rabbitMQEvent.json", + "s3BatchOperationEventSchemaV1.json", + "s3BatchOperationEventSchemaV2.json", + "s3Event.json", + "s3EventBridgeNotificationObjectCreatedEvent.json", + "s3EventBridgeNotificationObjectDeletedEvent.json", + "s3EventBridgeNotificationObjectExpiredEvent.json", + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + "s3EventDecodedKey.json", + "s3EventDeleteObject.json", + "s3EventGlacier.json", + "s3ObjectEventIAMUser.json", + "s3ObjectEventTempCredentials.json", + "s3SqsEvent.json", + "secretsManagerEvent.json", + "sesEvent.json", + "snsEvent.json", + "snsSqsEvent.json", + "snsSqsFifoEvent.json", + "sqsDlqTriggerEvent.json", + "sqsEvent.json", + "vpcLatticeEvent.json", + "vpcLatticeEventPathTrailingSlash.json", + "vpcLatticeEventV2PathTrailingSlash.json", + "vpcLatticeV2Event.json", + "vpcLatticeV2EventWithHeaders.json", + ], + ) + def test_match_for_not_cloud_watch_alarm_event(self, event_name): + event = load_event(file_name=event_name) + route = CloudWatchAlarmRoute( + func=None, + arn="arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", + ) + actual = route.match(event=event) + assert actual is None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py index cbe3a5189ee..dda17258bff 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py @@ -711,3 +711,116 @@ def test_match_false(self, event_name, option_constructor): route = CloudWatchLogsRoute(**option_constructor) actual = route.match(event=event) assert actual is None + + @pytest.mark.parametrize( + "event_name", + [ + "activeMQEvent.json", + "albEvent.json", + "albEventPathTrailingSlash.json", + "albMultiValueHeadersEvent.json", + "albMultiValueQueryStringEvent.json", + "apiGatewayAuthorizerRequestEvent.json", + "apiGatewayAuthorizerTokenEvent.json", + "apiGatewayAuthorizerV2Event.json", + "apiGatewayProxyEvent.json", + "apiGatewayProxyEventAnotherPath.json", + "apiGatewayProxyEventNoOrigin.json", + "apiGatewayProxyEventPathTrailingSlash.json", + "apiGatewayProxyEventPrincipalId.json", + "apiGatewayProxyEvent_noVersionAuth.json", + "apiGatewayProxyOtherEvent.json", + "apiGatewayProxyV2Event.json", + "apiGatewayProxyV2EventPathTrailingSlash.json", + "apiGatewayProxyV2Event_GET.json", + "apiGatewayProxyV2IamEvent.json", + "apiGatewayProxyV2LambdaAuthorizerEvent.json", + "apiGatewayProxyV2OtherGetEvent.json", + "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", + "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", + "apigatewayeSchemaMiddlwareInvalidEvent.json", + "apigatewayeSchemaMiddlwareValidEvent.json", + "appSyncAuthorizerEvent.json", + "appSyncAuthorizerResponse.json", + "appSyncBatchEvent.json", + "appSyncDirectResolver.json", + "appSyncResolverEvent.json", + "awsConfigRuleConfigurationChanged.json", + "awsConfigRuleOversizedConfiguration.json", + "awsConfigRuleScheduled.json", + "bedrockAgentEvent.json", + "bedrockAgentEventWithPathParams.json", + "bedrockAgentPostEvent.json", + "cloudWatchAlarmEventCompositeMetric.json", + "cloudWatchAlarmEventSingleMetric.json", + "cloudWatchDashboardEvent.json", + "cloudformationCustomResourceCreate.json", + "cloudformationCustomResourceDelete.json", + "cloudformationCustomResourceUpdate.json", + "codeDeployLifecycleHookEvent.json", + "codePipelineEvent.json", + "codePipelineEventData.json", + "codePipelineEventEmptyUserParameters.json", + "codePipelineEventWithEncryptionKey.json", + "cognitoCreateAuthChallengeEvent.json", + "cognitoCustomEmailSenderEvent.json", + "cognitoCustomMessageEvent.json", + "cognitoCustomSMSSenderEvent.json", + "cognitoDefineAuthChallengeEvent.json", + "cognitoPostAuthenticationEvent.json", + "cognitoPostConfirmationEvent.json", + "cognitoPreAuthenticationEvent.json", + "cognitoPreSignUpEvent.json", + "cognitoPreTokenGenerationEvent.json", + "cognitoPreTokenV2GenerationEvent.json", + "cognitoUserMigrationEvent.json", + "cognitoVerifyAuthChallengeResponseEvent.json", + "connectContactFlowEventAll.json", + "connectContactFlowEventMin.json", + "dynamoStreamEvent.json", + "eventBridgeEvent.json", + "kafkaEventMsk.json", + "kafkaEventSelfManaged.json", + "kinesisFirehoseKinesisEvent.json", + "kinesisFirehosePutEvent.json", + "kinesisFirehoseSQSEvent.json", + "kinesisStreamCloudWatchLogsEvent.json", + "kinesisStreamEvent.json", + "kinesisStreamEventOneRecord.json", + "lambdaFunctionUrlEvent.json", + "lambdaFunctionUrlEventPathTrailingSlash.json", + "lambdaFunctionUrlEventWithHeaders.json", + "lambdaFunctionUrlIAMEvent.json", + "rabbitMQEvent.json", + "s3BatchOperationEventSchemaV1.json", + "s3BatchOperationEventSchemaV2.json", + "s3Event.json", + "s3EventBridgeNotificationObjectCreatedEvent.json", + "s3EventBridgeNotificationObjectDeletedEvent.json", + "s3EventBridgeNotificationObjectExpiredEvent.json", + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + "s3EventDecodedKey.json", + "s3EventDeleteObject.json", + "s3EventGlacier.json", + "s3ObjectEventIAMUser.json", + "s3ObjectEventTempCredentials.json", + "s3SqsEvent.json", + "secretsManagerEvent.json", + "sesEvent.json", + "snsEvent.json", + "snsSqsEvent.json", + "snsSqsFifoEvent.json", + "sqsDlqTriggerEvent.json", + "sqsEvent.json", + "vpcLatticeEvent.json", + "vpcLatticeEventPathTrailingSlash.json", + "vpcLatticeEventV2PathTrailingSlash.json", + "vpcLatticeV2Event.json", + "vpcLatticeV2EventWithHeaders.json", + ], + ) + def test_match_for_not_cloud_watch_logs_event(self, event_name): + event = load_event(file_name=event_name) + route = CloudWatchLogsRoute(func=None, log_group="testLogGroup") + actual = route.match(event=event) + assert actual is None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py b/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py index ff994a64e66..1e83ffe0daf 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py @@ -136,3 +136,117 @@ def test_match_false(self, event_name, option_constructor): route = CodeDeployLifecycleHookRoute(**option_constructor) actual = route.match(event=event) assert actual is None + + @pytest.mark.parametrize( + "event_name", + [ + "activeMQEvent.json", + "albEvent.json", + "albEventPathTrailingSlash.json", + "albMultiValueHeadersEvent.json", + "albMultiValueQueryStringEvent.json", + "apiGatewayAuthorizerRequestEvent.json", + "apiGatewayAuthorizerTokenEvent.json", + "apiGatewayAuthorizerV2Event.json", + "apiGatewayProxyEvent.json", + "apiGatewayProxyEventAnotherPath.json", + "apiGatewayProxyEventNoOrigin.json", + "apiGatewayProxyEventPathTrailingSlash.json", + "apiGatewayProxyEventPrincipalId.json", + "apiGatewayProxyEvent_noVersionAuth.json", + "apiGatewayProxyOtherEvent.json", + "apiGatewayProxyV2Event.json", + "apiGatewayProxyV2EventPathTrailingSlash.json", + "apiGatewayProxyV2Event_GET.json", + "apiGatewayProxyV2IamEvent.json", + "apiGatewayProxyV2LambdaAuthorizerEvent.json", + "apiGatewayProxyV2OtherGetEvent.json", + "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", + "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", + "apigatewayeSchemaMiddlwareInvalidEvent.json", + "apigatewayeSchemaMiddlwareValidEvent.json", + "appSyncAuthorizerEvent.json", + "appSyncAuthorizerResponse.json", + "appSyncBatchEvent.json", + "appSyncDirectResolver.json", + "appSyncResolverEvent.json", + "awsConfigRuleConfigurationChanged.json", + "awsConfigRuleOversizedConfiguration.json", + "awsConfigRuleScheduled.json", + "bedrockAgentEvent.json", + "bedrockAgentEventWithPathParams.json", + "bedrockAgentPostEvent.json", + "cloudWatchAlarmEventCompositeMetric.json", + "cloudWatchAlarmEventSingleMetric.json", + "cloudWatchDashboardEvent.json", + "cloudWatchLogEvent.json", + "cloudWatchLogEventWithPolicyLevel.json", + "cloudformationCustomResourceCreate.json", + "cloudformationCustomResourceDelete.json", + "cloudformationCustomResourceUpdate.json", + "codePipelineEvent.json", + "codePipelineEventData.json", + "codePipelineEventEmptyUserParameters.json", + "codePipelineEventWithEncryptionKey.json", + "cognitoCreateAuthChallengeEvent.json", + "cognitoCustomEmailSenderEvent.json", + "cognitoCustomMessageEvent.json", + "cognitoCustomSMSSenderEvent.json", + "cognitoDefineAuthChallengeEvent.json", + "cognitoPostAuthenticationEvent.json", + "cognitoPostConfirmationEvent.json", + "cognitoPreAuthenticationEvent.json", + "cognitoPreSignUpEvent.json", + "cognitoPreTokenGenerationEvent.json", + "cognitoPreTokenV2GenerationEvent.json", + "cognitoUserMigrationEvent.json", + "cognitoVerifyAuthChallengeResponseEvent.json", + "connectContactFlowEventAll.json", + "connectContactFlowEventMin.json", + "dynamoStreamEvent.json", + "eventBridgeEvent.json", + "kafkaEventMsk.json", + "kafkaEventSelfManaged.json", + "kinesisFirehoseKinesisEvent.json", + "kinesisFirehosePutEvent.json", + "kinesisFirehoseSQSEvent.json", + "kinesisStreamCloudWatchLogsEvent.json", + "kinesisStreamEvent.json", + "kinesisStreamEventOneRecord.json", + "lambdaFunctionUrlEvent.json", + "lambdaFunctionUrlEventPathTrailingSlash.json", + "lambdaFunctionUrlEventWithHeaders.json", + "lambdaFunctionUrlIAMEvent.json", + "rabbitMQEvent.json", + "s3BatchOperationEventSchemaV1.json", + "s3BatchOperationEventSchemaV2.json", + "s3Event.json", + "s3EventBridgeNotificationObjectCreatedEvent.json", + "s3EventBridgeNotificationObjectDeletedEvent.json", + "s3EventBridgeNotificationObjectExpiredEvent.json", + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + "s3EventDecodedKey.json", + "s3EventDeleteObject.json", + "s3EventGlacier.json", + "s3ObjectEventIAMUser.json", + "s3ObjectEventTempCredentials.json", + "s3SqsEvent.json", + "secretsManagerEvent.json", + "sesEvent.json", + "snsEvent.json", + "snsSqsEvent.json", + "snsSqsFifoEvent.json", + "sqsDlqTriggerEvent.json", + "sqsEvent.json", + "vpcLatticeEvent.json", + "vpcLatticeEventPathTrailingSlash.json", + "vpcLatticeEventV2PathTrailingSlash.json", + "vpcLatticeV2Event.json", + "vpcLatticeV2EventWithHeaders.json", + ], + ) + def test_match_for_not_code_deploy_lifecycle_hook_event(self, event_name): + event = load_event(file_name=event_name) + route = CodeDeployLifecycleHookRoute(func=None) + actual = route.match(event=event) + assert actual is None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py b/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py index 42eb30ece21..fdd4885052b 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py @@ -458,3 +458,117 @@ def test_match_false(self, event_name, option_constructor): route = EventBridgeRoute(**option_constructor) actual = route.match(event=event) assert actual is None + + @pytest.mark.parametrize( + "event_name", + [ + "activeMQEvent.json", + "albEvent.json", + "albEventPathTrailingSlash.json", + "albMultiValueHeadersEvent.json", + "albMultiValueQueryStringEvent.json", + "apiGatewayAuthorizerRequestEvent.json", + "apiGatewayAuthorizerTokenEvent.json", + "apiGatewayAuthorizerV2Event.json", + "apiGatewayProxyEvent.json", + "apiGatewayProxyEventAnotherPath.json", + "apiGatewayProxyEventNoOrigin.json", + "apiGatewayProxyEventPathTrailingSlash.json", + "apiGatewayProxyEventPrincipalId.json", + "apiGatewayProxyEvent_noVersionAuth.json", + "apiGatewayProxyOtherEvent.json", + "apiGatewayProxyV2Event.json", + "apiGatewayProxyV2EventPathTrailingSlash.json", + "apiGatewayProxyV2Event_GET.json", + "apiGatewayProxyV2IamEvent.json", + "apiGatewayProxyV2LambdaAuthorizerEvent.json", + "apiGatewayProxyV2OtherGetEvent.json", + "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", + "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", + "apigatewayeSchemaMiddlwareInvalidEvent.json", + "apigatewayeSchemaMiddlwareValidEvent.json", + "appSyncAuthorizerEvent.json", + "appSyncAuthorizerResponse.json", + "appSyncBatchEvent.json", + "appSyncDirectResolver.json", + "appSyncResolverEvent.json", + "awsConfigRuleConfigurationChanged.json", + "awsConfigRuleOversizedConfiguration.json", + "awsConfigRuleScheduled.json", + "bedrockAgentEvent.json", + "bedrockAgentEventWithPathParams.json", + "bedrockAgentPostEvent.json", + "cloudWatchAlarmEventCompositeMetric.json", + "cloudWatchAlarmEventSingleMetric.json", + "cloudWatchDashboardEvent.json", + "cloudWatchLogEvent.json", + "cloudWatchLogEventWithPolicyLevel.json", + "cloudformationCustomResourceCreate.json", + "cloudformationCustomResourceDelete.json", + "cloudformationCustomResourceUpdate.json", + "codeDeployLifecycleHookEvent.json", + "codePipelineEvent.json", + "codePipelineEventData.json", + "codePipelineEventEmptyUserParameters.json", + "codePipelineEventWithEncryptionKey.json", + "cognitoCreateAuthChallengeEvent.json", + "cognitoCustomEmailSenderEvent.json", + "cognitoCustomMessageEvent.json", + "cognitoCustomSMSSenderEvent.json", + "cognitoDefineAuthChallengeEvent.json", + "cognitoPostAuthenticationEvent.json", + "cognitoPostConfirmationEvent.json", + "cognitoPreAuthenticationEvent.json", + "cognitoPreSignUpEvent.json", + "cognitoPreTokenGenerationEvent.json", + "cognitoPreTokenV2GenerationEvent.json", + "cognitoUserMigrationEvent.json", + "cognitoVerifyAuthChallengeResponseEvent.json", + "connectContactFlowEventAll.json", + "connectContactFlowEventMin.json", + "dynamoStreamEvent.json", + "kafkaEventMsk.json", + "kafkaEventSelfManaged.json", + "kinesisFirehoseKinesisEvent.json", + "kinesisFirehosePutEvent.json", + "kinesisFirehoseSQSEvent.json", + "kinesisStreamCloudWatchLogsEvent.json", + "kinesisStreamEvent.json", + "kinesisStreamEventOneRecord.json", + "lambdaFunctionUrlEvent.json", + "lambdaFunctionUrlEventPathTrailingSlash.json", + "lambdaFunctionUrlEventWithHeaders.json", + "lambdaFunctionUrlIAMEvent.json", + "rabbitMQEvent.json", + "s3BatchOperationEventSchemaV1.json", + "s3BatchOperationEventSchemaV2.json", + "s3Event.json", + "s3EventBridgeNotificationObjectCreatedEvent.json", + "s3EventBridgeNotificationObjectDeletedEvent.json", + "s3EventBridgeNotificationObjectExpiredEvent.json", + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + "s3EventDecodedKey.json", + "s3EventDeleteObject.json", + "s3EventGlacier.json", + "s3ObjectEventIAMUser.json", + "s3ObjectEventTempCredentials.json", + "s3SqsEvent.json", + "secretsManagerEvent.json", + "sesEvent.json", + "snsEvent.json", + "snsSqsEvent.json", + "snsSqsFifoEvent.json", + "sqsDlqTriggerEvent.json", + "sqsEvent.json", + "vpcLatticeEvent.json", + "vpcLatticeEventPathTrailingSlash.json", + "vpcLatticeEventV2PathTrailingSlash.json", + "vpcLatticeV2Event.json", + "vpcLatticeV2EventWithHeaders.json", + ], + ) + def test_match_for_not_event_bridge_event(self, event_name): + event = load_event(file_name=event_name) + route = EventBridgeRoute(func=None, detail_type="EC2 Instance State-change Notification") + actual = route.match(event=event) + assert actual is None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_s3.py b/tests/unit/event_handler/_async_execution/_routes/test_s3.py new file mode 100644 index 00000000000..b5b50e40505 --- /dev/null +++ b/tests/unit/event_handler/_async_execution/_routes/test_s3.py @@ -0,0 +1,117 @@ +import pytest + +from aws_lambda_powertools.event_handler.async_execution.routes.s3 import S3Route +from tests.functional.utils import load_event + + +class TestS3Route: + @pytest.mark.parametrize( + "event_name", + [ + "activeMQEvent.json", + "albEvent.json", + "albEventPathTrailingSlash.json", + "albMultiValueHeadersEvent.json", + "albMultiValueQueryStringEvent.json", + "apiGatewayAuthorizerRequestEvent.json", + "apiGatewayAuthorizerTokenEvent.json", + "apiGatewayAuthorizerV2Event.json", + "apiGatewayProxyEvent.json", + "apiGatewayProxyEventAnotherPath.json", + "apiGatewayProxyEventNoOrigin.json", + "apiGatewayProxyEventPathTrailingSlash.json", + "apiGatewayProxyEventPrincipalId.json", + "apiGatewayProxyEvent_noVersionAuth.json", + "apiGatewayProxyOtherEvent.json", + "apiGatewayProxyV2Event.json", + "apiGatewayProxyV2EventPathTrailingSlash.json", + "apiGatewayProxyV2Event_GET.json", + "apiGatewayProxyV2IamEvent.json", + "apiGatewayProxyV2LambdaAuthorizerEvent.json", + "apiGatewayProxyV2OtherGetEvent.json", + "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", + "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", + "apigatewayeSchemaMiddlwareInvalidEvent.json", + "apigatewayeSchemaMiddlwareValidEvent.json", + "appSyncAuthorizerEvent.json", + "appSyncAuthorizerResponse.json", + "appSyncBatchEvent.json", + "appSyncDirectResolver.json", + "appSyncResolverEvent.json", + "awsConfigRuleConfigurationChanged.json", + "awsConfigRuleOversizedConfiguration.json", + "awsConfigRuleScheduled.json", + "bedrockAgentEvent.json", + "bedrockAgentEventWithPathParams.json", + "bedrockAgentPostEvent.json", + "cloudWatchAlarmEventCompositeMetric.json", + "cloudWatchAlarmEventSingleMetric.json", + "cloudWatchDashboardEvent.json", + "cloudWatchLogEvent.json", + "cloudWatchLogEventWithPolicyLevel.json", + "cloudformationCustomResourceCreate.json", + "cloudformationCustomResourceDelete.json", + "cloudformationCustomResourceUpdate.json", + "codeDeployLifecycleHookEvent.json", + "codePipelineEvent.json", + "codePipelineEventData.json", + "codePipelineEventEmptyUserParameters.json", + "codePipelineEventWithEncryptionKey.json", + "cognitoCreateAuthChallengeEvent.json", + "cognitoCustomEmailSenderEvent.json", + "cognitoCustomMessageEvent.json", + "cognitoCustomSMSSenderEvent.json", + "cognitoDefineAuthChallengeEvent.json", + "cognitoPostAuthenticationEvent.json", + "cognitoPostConfirmationEvent.json", + "cognitoPreAuthenticationEvent.json", + "cognitoPreSignUpEvent.json", + "cognitoPreTokenGenerationEvent.json", + "cognitoPreTokenV2GenerationEvent.json", + "cognitoUserMigrationEvent.json", + "cognitoVerifyAuthChallengeResponseEvent.json", + "connectContactFlowEventAll.json", + "connectContactFlowEventMin.json", + "dynamoStreamEvent.json", + "eventBridgeEvent.json", + "kafkaEventMsk.json", + "kafkaEventSelfManaged.json", + "kinesisFirehoseKinesisEvent.json", + "kinesisFirehosePutEvent.json", + "kinesisFirehoseSQSEvent.json", + "kinesisStreamCloudWatchLogsEvent.json", + "kinesisStreamEvent.json", + "kinesisStreamEventOneRecord.json", + "lambdaFunctionUrlEvent.json", + "lambdaFunctionUrlEventPathTrailingSlash.json", + "lambdaFunctionUrlEventWithHeaders.json", + "lambdaFunctionUrlIAMEvent.json", + "rabbitMQEvent.json", + "s3BatchOperationEventSchemaV1.json", + "s3BatchOperationEventSchemaV2.json", + "s3EventBridgeNotificationObjectCreatedEvent.json", + "s3EventBridgeNotificationObjectDeletedEvent.json", + "s3EventBridgeNotificationObjectExpiredEvent.json", + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + "s3ObjectEventIAMUser.json", + "s3ObjectEventTempCredentials.json", + "s3SqsEvent.json", + "secretsManagerEvent.json", + "sesEvent.json", + "snsEvent.json", + "snsSqsEvent.json", + "snsSqsFifoEvent.json", + "sqsDlqTriggerEvent.json", + "sqsEvent.json", + "vpcLatticeEvent.json", + "vpcLatticeEventPathTrailingSlash.json", + "vpcLatticeEventV2PathTrailingSlash.json", + "vpcLatticeV2Event.json", + "vpcLatticeV2EventWithHeaders.json", + ], + ) + def test_match_for_not_s3_event(self, event_name): + event = load_event(file_name=event_name) + route = S3Route(func=None, bucket="lambda-artifacts-deafc19498e3f2df") + actual = route.match(event=event) + assert actual is None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_secrets_manager.py b/tests/unit/event_handler/_async_execution/_routes/test_secrets_manager.py new file mode 100644 index 00000000000..5eb47eec2f2 --- /dev/null +++ b/tests/unit/event_handler/_async_execution/_routes/test_secrets_manager.py @@ -0,0 +1,123 @@ +import pytest + +from aws_lambda_powertools.event_handler.async_execution.routes.secrets_manager import SecretsManagerRoute +from tests.functional.utils import load_event + + +class TestSecretsManagerRoute: + @pytest.mark.parametrize( + "event_name", + [ + "activeMQEvent.json", + "albEvent.json", + "albEventPathTrailingSlash.json", + "albMultiValueHeadersEvent.json", + "albMultiValueQueryStringEvent.json", + "apiGatewayAuthorizerRequestEvent.json", + "apiGatewayAuthorizerTokenEvent.json", + "apiGatewayAuthorizerV2Event.json", + "apiGatewayProxyEvent.json", + "apiGatewayProxyEventAnotherPath.json", + "apiGatewayProxyEventNoOrigin.json", + "apiGatewayProxyEventPathTrailingSlash.json", + "apiGatewayProxyEventPrincipalId.json", + "apiGatewayProxyEvent_noVersionAuth.json", + "apiGatewayProxyOtherEvent.json", + "apiGatewayProxyV2Event.json", + "apiGatewayProxyV2EventPathTrailingSlash.json", + "apiGatewayProxyV2Event_GET.json", + "apiGatewayProxyV2IamEvent.json", + "apiGatewayProxyV2LambdaAuthorizerEvent.json", + "apiGatewayProxyV2OtherGetEvent.json", + "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", + "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", + "apigatewayeSchemaMiddlwareInvalidEvent.json", + "apigatewayeSchemaMiddlwareValidEvent.json", + "appSyncAuthorizerEvent.json", + "appSyncAuthorizerResponse.json", + "appSyncBatchEvent.json", + "appSyncDirectResolver.json", + "appSyncResolverEvent.json", + "awsConfigRuleConfigurationChanged.json", + "awsConfigRuleOversizedConfiguration.json", + "awsConfigRuleScheduled.json", + "bedrockAgentEvent.json", + "bedrockAgentEventWithPathParams.json", + "bedrockAgentPostEvent.json", + "cloudWatchAlarmEventCompositeMetric.json", + "cloudWatchAlarmEventSingleMetric.json", + "cloudWatchDashboardEvent.json", + "cloudWatchLogEvent.json", + "cloudWatchLogEventWithPolicyLevel.json", + "cloudformationCustomResourceCreate.json", + "cloudformationCustomResourceDelete.json", + "cloudformationCustomResourceUpdate.json", + "codeDeployLifecycleHookEvent.json", + "codePipelineEvent.json", + "codePipelineEventData.json", + "codePipelineEventEmptyUserParameters.json", + "codePipelineEventWithEncryptionKey.json", + "cognitoCreateAuthChallengeEvent.json", + "cognitoCustomEmailSenderEvent.json", + "cognitoCustomMessageEvent.json", + "cognitoCustomSMSSenderEvent.json", + "cognitoDefineAuthChallengeEvent.json", + "cognitoPostAuthenticationEvent.json", + "cognitoPostConfirmationEvent.json", + "cognitoPreAuthenticationEvent.json", + "cognitoPreSignUpEvent.json", + "cognitoPreTokenGenerationEvent.json", + "cognitoPreTokenV2GenerationEvent.json", + "cognitoUserMigrationEvent.json", + "cognitoVerifyAuthChallengeResponseEvent.json", + "connectContactFlowEventAll.json", + "connectContactFlowEventMin.json", + "dynamoStreamEvent.json", + "eventBridgeEvent.json", + "kafkaEventMsk.json", + "kafkaEventSelfManaged.json", + "kinesisFirehoseKinesisEvent.json", + "kinesisFirehosePutEvent.json", + "kinesisFirehoseSQSEvent.json", + "kinesisStreamCloudWatchLogsEvent.json", + "kinesisStreamEvent.json", + "kinesisStreamEventOneRecord.json", + "lambdaFunctionUrlEvent.json", + "lambdaFunctionUrlEventPathTrailingSlash.json", + "lambdaFunctionUrlEventWithHeaders.json", + "lambdaFunctionUrlIAMEvent.json", + "rabbitMQEvent.json", + "s3BatchOperationEventSchemaV1.json", + "s3BatchOperationEventSchemaV2.json", + "s3Event.json", + "s3EventBridgeNotificationObjectCreatedEvent.json", + "s3EventBridgeNotificationObjectDeletedEvent.json", + "s3EventBridgeNotificationObjectExpiredEvent.json", + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + "s3EventDecodedKey.json", + "s3EventDeleteObject.json", + "s3EventGlacier.json", + "s3ObjectEventIAMUser.json", + "s3ObjectEventTempCredentials.json", + "s3SqsEvent.json", + "sesEvent.json", + "snsEvent.json", + "snsSqsEvent.json", + "snsSqsFifoEvent.json", + "sqsDlqTriggerEvent.json", + "sqsEvent.json", + "vpcLatticeEvent.json", + "vpcLatticeEventPathTrailingSlash.json", + "vpcLatticeEventV2PathTrailingSlash.json", + "vpcLatticeV2Event.json", + "vpcLatticeV2EventWithHeaders.json", + ], + ) + def test_match_for_not_secrets_manager_event(self, event_name): + event = load_event(file_name=event_name) + route = SecretsManagerRoute( + func=None, + secret_id="arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3", + ) + actual = route.match(event=event) + assert actual is None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_ses.py b/tests/unit/event_handler/_async_execution/_routes/test_ses.py new file mode 100644 index 00000000000..ebe4b4441fe --- /dev/null +++ b/tests/unit/event_handler/_async_execution/_routes/test_ses.py @@ -0,0 +1,120 @@ +import pytest + +from aws_lambda_powertools.event_handler.async_execution.routes.ses import SESRoute +from tests.functional.utils import load_event + + +class TestSESRoute: + @pytest.mark.parametrize( + "event_name", + [ + "activeMQEvent.json", + "albEvent.json", + "albEventPathTrailingSlash.json", + "albMultiValueHeadersEvent.json", + "albMultiValueQueryStringEvent.json", + "apiGatewayAuthorizerRequestEvent.json", + "apiGatewayAuthorizerTokenEvent.json", + "apiGatewayAuthorizerV2Event.json", + "apiGatewayProxyEvent.json", + "apiGatewayProxyEventAnotherPath.json", + "apiGatewayProxyEventNoOrigin.json", + "apiGatewayProxyEventPathTrailingSlash.json", + "apiGatewayProxyEventPrincipalId.json", + "apiGatewayProxyEvent_noVersionAuth.json", + "apiGatewayProxyOtherEvent.json", + "apiGatewayProxyV2Event.json", + "apiGatewayProxyV2EventPathTrailingSlash.json", + "apiGatewayProxyV2Event_GET.json", + "apiGatewayProxyV2IamEvent.json", + "apiGatewayProxyV2LambdaAuthorizerEvent.json", + "apiGatewayProxyV2OtherGetEvent.json", + "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", + "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", + "apigatewayeSchemaMiddlwareInvalidEvent.json", + "apigatewayeSchemaMiddlwareValidEvent.json", + "appSyncAuthorizerEvent.json", + "appSyncAuthorizerResponse.json", + "appSyncBatchEvent.json", + "appSyncDirectResolver.json", + "appSyncResolverEvent.json", + "awsConfigRuleConfigurationChanged.json", + "awsConfigRuleOversizedConfiguration.json", + "awsConfigRuleScheduled.json", + "bedrockAgentEvent.json", + "bedrockAgentEventWithPathParams.json", + "bedrockAgentPostEvent.json", + "cloudWatchAlarmEventCompositeMetric.json", + "cloudWatchAlarmEventSingleMetric.json", + "cloudWatchDashboardEvent.json", + "cloudWatchLogEvent.json", + "cloudWatchLogEventWithPolicyLevel.json", + "cloudformationCustomResourceCreate.json", + "cloudformationCustomResourceDelete.json", + "cloudformationCustomResourceUpdate.json", + "codeDeployLifecycleHookEvent.json", + "codePipelineEvent.json", + "codePipelineEventData.json", + "codePipelineEventEmptyUserParameters.json", + "codePipelineEventWithEncryptionKey.json", + "cognitoCreateAuthChallengeEvent.json", + "cognitoCustomEmailSenderEvent.json", + "cognitoCustomMessageEvent.json", + "cognitoCustomSMSSenderEvent.json", + "cognitoDefineAuthChallengeEvent.json", + "cognitoPostAuthenticationEvent.json", + "cognitoPostConfirmationEvent.json", + "cognitoPreAuthenticationEvent.json", + "cognitoPreSignUpEvent.json", + "cognitoPreTokenGenerationEvent.json", + "cognitoPreTokenV2GenerationEvent.json", + "cognitoUserMigrationEvent.json", + "cognitoVerifyAuthChallengeResponseEvent.json", + "connectContactFlowEventAll.json", + "connectContactFlowEventMin.json", + "dynamoStreamEvent.json", + "eventBridgeEvent.json", + "kafkaEventMsk.json", + "kafkaEventSelfManaged.json", + "kinesisFirehoseKinesisEvent.json", + "kinesisFirehosePutEvent.json", + "kinesisFirehoseSQSEvent.json", + "kinesisStreamCloudWatchLogsEvent.json", + "kinesisStreamEvent.json", + "kinesisStreamEventOneRecord.json", + "lambdaFunctionUrlEvent.json", + "lambdaFunctionUrlEventPathTrailingSlash.json", + "lambdaFunctionUrlEventWithHeaders.json", + "lambdaFunctionUrlIAMEvent.json", + "rabbitMQEvent.json", + "s3BatchOperationEventSchemaV1.json", + "s3BatchOperationEventSchemaV2.json", + "s3Event.json", + "s3EventBridgeNotificationObjectCreatedEvent.json", + "s3EventBridgeNotificationObjectDeletedEvent.json", + "s3EventBridgeNotificationObjectExpiredEvent.json", + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + "s3EventDecodedKey.json", + "s3EventDeleteObject.json", + "s3EventGlacier.json", + "s3ObjectEventIAMUser.json", + "s3ObjectEventTempCredentials.json", + "s3SqsEvent.json", + "secretsManagerEvent.json", + "snsEvent.json", + "snsSqsEvent.json", + "snsSqsFifoEvent.json", + "sqsDlqTriggerEvent.json", + "sqsEvent.json", + "vpcLatticeEvent.json", + "vpcLatticeEventPathTrailingSlash.json", + "vpcLatticeEventV2PathTrailingSlash.json", + "vpcLatticeV2Event.json", + "vpcLatticeV2EventWithHeaders.json", + ], + ) + def test_match_for_not_ses_event(self, event_name): + event = load_event(file_name=event_name) + route = SESRoute(func=None, mail_to=["johndoe@example.com"]) + actual = route.match(event=event) + assert actual is None diff --git a/tests/unit/event_handler/_async_execution/_routes/test_sns.py b/tests/unit/event_handler/_async_execution/_routes/test_sns.py new file mode 100644 index 00000000000..e4dbb952e95 --- /dev/null +++ b/tests/unit/event_handler/_async_execution/_routes/test_sns.py @@ -0,0 +1,120 @@ +import pytest + +from aws_lambda_powertools.event_handler.async_execution.routes.sns import SNSRoute +from tests.functional.utils import load_event + + +class TestSNSRoute: + @pytest.mark.parametrize( + "event_name", + [ + "activeMQEvent.json", + "albEvent.json", + "albEventPathTrailingSlash.json", + "albMultiValueHeadersEvent.json", + "albMultiValueQueryStringEvent.json", + "apiGatewayAuthorizerRequestEvent.json", + "apiGatewayAuthorizerTokenEvent.json", + "apiGatewayAuthorizerV2Event.json", + "apiGatewayProxyEvent.json", + "apiGatewayProxyEventAnotherPath.json", + "apiGatewayProxyEventNoOrigin.json", + "apiGatewayProxyEventPathTrailingSlash.json", + "apiGatewayProxyEventPrincipalId.json", + "apiGatewayProxyEvent_noVersionAuth.json", + "apiGatewayProxyOtherEvent.json", + "apiGatewayProxyV2Event.json", + "apiGatewayProxyV2EventPathTrailingSlash.json", + "apiGatewayProxyV2Event_GET.json", + "apiGatewayProxyV2IamEvent.json", + "apiGatewayProxyV2LambdaAuthorizerEvent.json", + "apiGatewayProxyV2OtherGetEvent.json", + "apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", + "apiGatewayProxyV2SchemaMiddlwareValidEvent.json", + "apigatewayeSchemaMiddlwareInvalidEvent.json", + "apigatewayeSchemaMiddlwareValidEvent.json", + "appSyncAuthorizerEvent.json", + "appSyncAuthorizerResponse.json", + "appSyncBatchEvent.json", + "appSyncDirectResolver.json", + "appSyncResolverEvent.json", + "awsConfigRuleConfigurationChanged.json", + "awsConfigRuleOversizedConfiguration.json", + "awsConfigRuleScheduled.json", + "bedrockAgentEvent.json", + "bedrockAgentEventWithPathParams.json", + "bedrockAgentPostEvent.json", + "cloudWatchAlarmEventCompositeMetric.json", + "cloudWatchAlarmEventSingleMetric.json", + "cloudWatchDashboardEvent.json", + "cloudWatchLogEvent.json", + "cloudWatchLogEventWithPolicyLevel.json", + "cloudformationCustomResourceCreate.json", + "cloudformationCustomResourceDelete.json", + "cloudformationCustomResourceUpdate.json", + "codeDeployLifecycleHookEvent.json", + "codePipelineEvent.json", + "codePipelineEventData.json", + "codePipelineEventEmptyUserParameters.json", + "codePipelineEventWithEncryptionKey.json", + "cognitoCreateAuthChallengeEvent.json", + "cognitoCustomEmailSenderEvent.json", + "cognitoCustomMessageEvent.json", + "cognitoCustomSMSSenderEvent.json", + "cognitoDefineAuthChallengeEvent.json", + "cognitoPostAuthenticationEvent.json", + "cognitoPostConfirmationEvent.json", + "cognitoPreAuthenticationEvent.json", + "cognitoPreSignUpEvent.json", + "cognitoPreTokenGenerationEvent.json", + "cognitoPreTokenV2GenerationEvent.json", + "cognitoUserMigrationEvent.json", + "cognitoVerifyAuthChallengeResponseEvent.json", + "connectContactFlowEventAll.json", + "connectContactFlowEventMin.json", + "dynamoStreamEvent.json", + "eventBridgeEvent.json", + "kafkaEventMsk.json", + "kafkaEventSelfManaged.json", + "kinesisFirehoseKinesisEvent.json", + "kinesisFirehosePutEvent.json", + "kinesisFirehoseSQSEvent.json", + "kinesisStreamCloudWatchLogsEvent.json", + "kinesisStreamEvent.json", + "kinesisStreamEventOneRecord.json", + "lambdaFunctionUrlEvent.json", + "lambdaFunctionUrlEventPathTrailingSlash.json", + "lambdaFunctionUrlEventWithHeaders.json", + "lambdaFunctionUrlIAMEvent.json", + "rabbitMQEvent.json", + "s3BatchOperationEventSchemaV1.json", + "s3BatchOperationEventSchemaV2.json", + "s3Event.json", + "s3EventBridgeNotificationObjectCreatedEvent.json", + "s3EventBridgeNotificationObjectDeletedEvent.json", + "s3EventBridgeNotificationObjectExpiredEvent.json", + "s3EventBridgeNotificationObjectRestoreCompletedEvent.json", + "s3EventDecodedKey.json", + "s3EventDeleteObject.json", + "s3EventGlacier.json", + "s3ObjectEventIAMUser.json", + "s3ObjectEventTempCredentials.json", + "s3SqsEvent.json", + "secretsManagerEvent.json", + "sesEvent.json", + "snsSqsEvent.json", + "snsSqsFifoEvent.json", + "sqsDlqTriggerEvent.json", + "sqsEvent.json", + "vpcLatticeEvent.json", + "vpcLatticeEventPathTrailingSlash.json", + "vpcLatticeEventV2PathTrailingSlash.json", + "vpcLatticeV2Event.json", + "vpcLatticeV2EventWithHeaders.json", + ], + ) + def test_match_for_not_sns_event(self, event_name): + event = load_event(file_name=event_name) + route = SNSRoute(func=None, arn="arn:aws:sns:us-east-2:123456789012:sns-lambda") + actual = route.match(event=event) + assert actual is None From 2563d7eba6651fc7aa3b0fc6ce28d04fa01b7ad5 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Fri, 24 Jan 2025 15:36:28 +0900 Subject: [PATCH 020/139] fix test for cloud_watch_alarm.py --- .../_routes/test_cloud_watch_alarm.py | 310 +++++------------- 1 file changed, 79 insertions(+), 231 deletions(-) diff --git a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py index b1fe75f06e4..af6e44a9032 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_alarm.py @@ -47,303 +47,151 @@ def test_is_target_with_arn(self, option_constructor, option_func, expected): @pytest.mark.parametrize( "option_constructor, option_func, expected", [ - ({"func": None, "alarm_name": "CompositeDemo.Main"}, {"alarm_name": None}, False), - ({"func": None, "alarm_name": "CompositeDemo.Main"}, {"alarm_name": "CompositeDemo.Main"}, True), - ({"func": None, "alarm_name": "CompositeDemo.MainV2"}, {"alarm_name": "CompositeDemo.Main"}, False), - ({"func": None, "alarm_name_prefix": "CompositeDemo.M"}, {"alarm_name": "CompositeDemo.Main"}, True), - ({"func": None, "alarm_name_prefix": "Main"}, {"alarm_name": "CompositeDemo.Main"}, False), + # with alarm_name and alarm_name_prefix + # match all ( - {"func": None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main"}, + {"func": None, "alarm_name": "CompositeDemo.Main", "alarm_name_prefix": "CompositeDemo.M"}, {"alarm_name": "CompositeDemo.Main"}, - False, - ), - ], - ) - def test_is_target_with_alarm_name(self, option_constructor, option_func, expected): - route = CloudWatchAlarmRoute(**option_constructor) - actual = route.is_target_with_alarm_name(**option_func) - assert actual == expected - - @pytest.mark.parametrize( - "event_name, option_constructor", - [ - # cloudWatchAlarmEventCompositeMetric.json, match arn, without alarm_name and alarm_name_prefix - ( - "cloudWatchAlarmEventCompositeMetric.json", - {"func": lambda _: None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main"}, - ), - # cloudWatchAlarmEventCompositeMetric.json, match arn, with alarm_name or alarm_name_prefix - ( - "cloudWatchAlarmEventCompositeMetric.json", - { - "func": lambda _: None, - "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", - "alarm_name": "CompositeDemo.Main", - }, + True, ), + # with alarm_name and alarm_name_prefix + # match 1, unmatch 1 ( - "cloudWatchAlarmEventCompositeMetric.json", - { - "func": lambda _: None, - "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", - "alarm_name_prefix": "CompositeD", - }, + {"func": None, "alarm_name": "CompositeDemo.Main", "alarm_name_prefix": "ompositeDemo.M"}, + {"alarm_name": "CompositeDemo.Main"}, + True, ), ( - "cloudWatchAlarmEventCompositeMetric.json", - { - "func": lambda _: None, - "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", - "alarm_name": "CompositeDemo.Main", - "alarm_name_prefix": "CompositeD", - }, + {"func": None, "alarm_name": "CompositeDemo.MainV2", "alarm_name_prefix": "CompositeDemo.M"}, + {"alarm_name": "CompositeDemo.Main"}, + False, ), - # cloudWatchAlarmEventCompositeMetric.json, match alarm_name, without alarm_name_prefix + # with alarm_name and alarm_name_prefix + # unmatch all ( - "cloudWatchAlarmEventCompositeMetric.json", - { - "func": lambda _: None, - "alarm_name": "CompositeDemo.Main", - }, + {"func": None, "alarm_name": "CompositeDemo.MainV2", "alarm_name_prefix": "ompositeDemo.M"}, + {"alarm_name": "CompositeDemo.Main"}, + False, ), - # cloudWatchAlarmEventCompositeMetric.json, match alarm_name, with alarm_name_prefix + # with alarm_name ( - "cloudWatchAlarmEventCompositeMetric.json", { - "func": lambda _: None, + "func": None, "alarm_name": "CompositeDemo.Main", - "alarm_name_prefix": "CompositeDD", - }, - ), - # cloudWatchAlarmEventCompositeMetric.json, match alarm_name_prefix - ( - "cloudWatchAlarmEventCompositeMetric.json", - { - "func": lambda _: None, - "alarm_name_prefix": "CompositeD", - }, - ), - # cloudWatchAlarmEventSingleMetric.json, match arn, without alarm_name and alarm_name_prefix - ( - "cloudWatchAlarmEventSingleMetric.json", - { - "func": lambda _: None, - "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", - }, - ), - # cloudWatchAlarmEventSingleMetric.json, match arn, with alarm_name or alarm_name_prefix - ( - "cloudWatchAlarmEventSingleMetric.json", - { - "func": lambda _: None, - "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", - "alarm_name": "Test alert", - }, - ), - ( - "cloudWatchAlarmEventSingleMetric.json", - { - "func": lambda _: None, - "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", - "alarm_name_prefix": "Test a", }, + {"alarm_name": "CompositeDemo.Main"}, + True, ), ( - "cloudWatchAlarmEventSingleMetric.json", { - "func": lambda _: None, - "arn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", - "alarm_name": "Test alert", - "alarm_name_prefix": "Test a", + "func": None, + "alarm_name": "CompositeDemo.MainV2", }, + {"alarm_name": "CompositeDemo.Main"}, + False, ), - # cloudWatchAlarmEventSingleMetric.json, match alarm_name, without alarm_name_prefix - ("cloudWatchAlarmEventSingleMetric.json", {"func": lambda _: None, "alarm_name": "Test alert"}), - # cloudWatchAlarmEventSingleMetric.json, match alarm_name, with alarm_name_prefix + # with alarm_name_prefix + ({"func": None, "alarm_name_prefix": "CompositeDemo.M"}, {"alarm_name": "CompositeDemo.Main"}, True), + ({"func": None, "alarm_name_prefix": "ompositeDemo.M"}, {"alarm_name": "CompositeDemo.Main"}, False), + # without alarm_name and alarm_name_prefix ( - "cloudWatchAlarmEventSingleMetric.json", - {"func": lambda _: None, "alarm_name": "Test alert", "alarm_name_prefix": "Test-a"}, + {"func": None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main"}, + {"alarm_name": "CompositeDemo.Main"}, + False, ), - # cloudWatchAlarmEventSingleMetric.json, match alarm_name_prefix - ("cloudWatchAlarmEventSingleMetric.json", {"func": lambda _: None, "alarm_name_prefix": "Test a"}), + # without alarm_name at option_func + ({"func": None, "alarm_name_prefix": "ompositeDemo.M"}, {"alarm_name": None}, False), ], ) - def test_match_true(self, event_name, option_constructor): - event = load_event(file_name=event_name) + def test_is_target_with_alarm_name(self, option_constructor, option_func, expected): route = CloudWatchAlarmRoute(**option_constructor) - expected = (route.func, CloudWatchAlarmEvent(event)) - actual = route.match(event=event) + actual = route.is_target_with_alarm_name(**option_func) assert actual == expected @pytest.mark.parametrize( - "event_name, option_constructor", + "event_name, option_constructor, is_match", [ - # other events - ("activeMQEvent.json", {"func": None, "arn": "test"}), - ("albEvent.json", {"func": None, "arn": "test"}), - ("albEventPathTrailingSlash.json", {"func": None, "arn": "test"}), - ("albMultiValueHeadersEvent.json", {"func": None, "arn": "test"}), - ("albMultiValueQueryStringEvent.json", {"func": None, "arn": "test"}), - ("apiGatewayAuthorizerRequestEvent.json", {"func": None, "arn": "test"}), - ("apiGatewayAuthorizerTokenEvent.json", {"func": None, "arn": "test"}), - ("apiGatewayAuthorizerV2Event.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyEvent.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyEventAnotherPath.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyEventNoOrigin.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyEventPathTrailingSlash.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyEventPrincipalId.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyEvent_noVersionAuth.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyOtherEvent.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyV2Event.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyV2EventPathTrailingSlash.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyV2Event_GET.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyV2IamEvent.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyV2LambdaAuthorizerEvent.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyV2OtherGetEvent.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", {"func": None, "arn": "test"}), - ("apiGatewayProxyV2SchemaMiddlwareValidEvent.json", {"func": None, "arn": "test"}), - ("apigatewayeSchemaMiddlwareInvalidEvent.json", {"func": None, "arn": "test"}), - ("apigatewayeSchemaMiddlwareValidEvent.json", {"func": None, "arn": "test"}), - ("appSyncAuthorizerEvent.json", {"func": None, "arn": "test"}), - ("appSyncAuthorizerResponse.json", {"func": None, "arn": "test"}), - ("appSyncBatchEvent.json", {"func": None, "arn": "test"}), - ("appSyncDirectResolver.json", {"func": None, "arn": "test"}), - ("appSyncResolverEvent.json", {"func": None, "arn": "test"}), - ("awsConfigRuleConfigurationChanged.json", {"func": None, "arn": "test"}), - ("awsConfigRuleOversizedConfiguration.json", {"func": None, "arn": "test"}), - ("awsConfigRuleScheduled.json", {"func": None, "arn": "test"}), - ("bedrockAgentEvent.json", {"func": None, "arn": "test"}), - ("bedrockAgentEventWithPathParams.json", {"func": None, "arn": "test"}), - ("bedrockAgentPostEvent.json", {"func": None, "arn": "test"}), - ("cloudWatchDashboardEvent.json", {"func": None, "arn": "test"}), - ("cloudWatchLogEvent.json", {"func": None, "arn": "test"}), - ("cloudWatchLogEventWithPolicyLevel.json", {"func": None, "arn": "test"}), - ("cloudformationCustomResourceCreate.json", {"func": None, "arn": "test"}), - ("cloudformationCustomResourceDelete.json", {"func": None, "arn": "test"}), - ("cloudformationCustomResourceUpdate.json", {"func": None, "arn": "test"}), - ("codeDeployLifecycleHookEvent.json", {"func": None, "arn": "test"}), - ("codePipelineEvent.json", {"func": None, "arn": "test"}), - ("codePipelineEventData.json", {"func": None, "arn": "test"}), - ("codePipelineEventEmptyUserParameters.json", {"func": None, "arn": "test"}), - ("codePipelineEventWithEncryptionKey.json", {"func": None, "arn": "test"}), - ("cognitoCreateAuthChallengeEvent.json", {"func": None, "arn": "test"}), - ("cognitoCustomEmailSenderEvent.json", {"func": None, "arn": "test"}), - ("cognitoCustomMessageEvent.json", {"func": None, "arn": "test"}), - ("cognitoCustomSMSSenderEvent.json", {"func": None, "arn": "test"}), - ("cognitoDefineAuthChallengeEvent.json", {"func": None, "arn": "test"}), - ("cognitoPostAuthenticationEvent.json", {"func": None, "arn": "test"}), - ("cognitoPostConfirmationEvent.json", {"func": None, "arn": "test"}), - ("cognitoPreAuthenticationEvent.json", {"func": None, "arn": "test"}), - ("cognitoPreSignUpEvent.json", {"func": None, "arn": "test"}), - ("cognitoPreTokenGenerationEvent.json", {"func": None, "arn": "test"}), - ("cognitoPreTokenV2GenerationEvent.json", {"func": None, "arn": "test"}), - ("cognitoUserMigrationEvent.json", {"func": None, "arn": "test"}), - ("cognitoVerifyAuthChallengeResponseEvent.json", {"func": None, "arn": "test"}), - ("connectContactFlowEventAll.json", {"func": None, "arn": "test"}), - ("connectContactFlowEventMin.json", {"func": None, "arn": "test"}), - ("dynamoStreamEvent.json", {"func": None, "arn": "test"}), - ("eventBridgeEvent.json", {"func": None, "arn": "test"}), - ("kafkaEventMsk.json", {"func": None, "arn": "test"}), - ("kafkaEventSelfManaged.json", {"func": None, "arn": "test"}), - ("kinesisFirehoseKinesisEvent.json", {"func": None, "arn": "test"}), - ("kinesisFirehosePutEvent.json", {"func": None, "arn": "test"}), - ("kinesisFirehoseSQSEvent.json", {"func": None, "arn": "test"}), - ("kinesisStreamCloudWatchLogsEvent.json", {"func": None, "arn": "test"}), - ("kinesisStreamEvent.json", {"func": None, "arn": "test"}), - ("kinesisStreamEventOneRecord.json", {"func": None, "arn": "test"}), - ("lambdaFunctionUrlEvent.json", {"func": None, "arn": "test"}), - ("lambdaFunctionUrlEventPathTrailingSlash.json", {"func": None, "arn": "test"}), - ("lambdaFunctionUrlEventWithHeaders.json", {"func": None, "arn": "test"}), - ("lambdaFunctionUrlIAMEvent.json", {"func": None, "arn": "test"}), - ("rabbitMQEvent.json", {"func": None, "arn": "test"}), - ("s3BatchOperationEventSchemaV1.json", {"func": None, "arn": "test"}), - ("s3BatchOperationEventSchemaV2.json", {"func": None, "arn": "test"}), - ("s3Event.json", {"func": None, "arn": "test"}), - ("s3EventBridgeNotificationObjectCreatedEvent.json", {"func": None, "arn": "test"}), - ("s3EventBridgeNotificationObjectDeletedEvent.json", {"func": None, "arn": "test"}), - ("s3EventBridgeNotificationObjectExpiredEvent.json", {"func": None, "arn": "test"}), - ("s3EventBridgeNotificationObjectRestoreCompletedEvent.json", {"func": None, "arn": "test"}), - ("s3EventDecodedKey.json", {"func": None, "arn": "test"}), - ("s3EventDeleteObject.json", {"func": None, "arn": "test"}), - ("s3EventGlacier.json", {"func": None, "arn": "test"}), - ("s3ObjectEventIAMUser.json", {"func": None, "arn": "test"}), - ("s3ObjectEventTempCredentials.json", {"func": None, "arn": "test"}), - ("s3SqsEvent.json", {"func": None, "arn": "test"}), - ("secretsManagerEvent.json", {"func": None, "arn": "test"}), - ("sesEvent.json", {"func": None, "arn": "test"}), - ("snsEvent.json", {"func": None, "arn": "test"}), - ("snsSqsEvent.json", {"func": None, "arn": "test"}), - ("snsSqsFifoEvent.json", {"func": None, "arn": "test"}), - ("sqsDlqTriggerEvent.json", {"func": None, "arn": "test"}), - ("sqsEvent.json", {"func": None, "arn": "test"}), - ("vpcLatticeEvent.json", {"func": None, "arn": "test"}), - ("vpcLatticeEventPathTrailingSlash.json", {"func": None, "arn": "test"}), - ("vpcLatticeEventV2PathTrailingSlash.json", {"func": None, "arn": "test"}), - ("vpcLatticeV2Event.json", {"func": None, "arn": "test"}), - ("vpcLatticeV2EventWithHeaders.json", {"func": None, "arn": "test"}), - # cloudWatchAlarmEventCompositeMetric.json, not match arn, without alarm_name and alarm_name_prefix + # with arn and alarm_name + # match all ( "cloudWatchAlarmEventCompositeMetric.json", - {"func": None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.MainV2"}, + { + "func": lambda *_: None, + "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", + "alarm_name": "CompositeDemo.Main", + }, + True, ), - # cloudWatchAlarmEventCompositeMetric.json, not match arn, with alarm_name or alarm_name_prefix + # with arn and alarm_name + # match 1, unmatch 1 ( "cloudWatchAlarmEventCompositeMetric.json", { - "func": None, + "func": lambda *_: None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.MainV2", "alarm_name": "CompositeDemo.Main", }, + False, ), ( "cloudWatchAlarmEventCompositeMetric.json", { - "func": None, - "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.MainV2", - "alarm_name_prefix": "CompositeD", + "func": lambda *_: None, + "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", + "alarm_name": "CompositeDemo.MainV2", }, + False, ), + # with arn and alarm_name + # unmatch all ( "cloudWatchAlarmEventCompositeMetric.json", { - "func": None, + "func": lambda *_: None, "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.MainV2", - "alarm_name": "CompositeDemo.Main", - "alarm_name_prefix": "CompositeD", + "alarm_name": "CompositeDemo.MainV2", }, + False, ), - # cloudWatchAlarmEventCompositeMetric.json, not match alarm_name, without alarm_name_prefix + # with arn ( "cloudWatchAlarmEventCompositeMetric.json", { - "func": None, - "alarm_name": "CompositeDemo.MainV2", + "func": lambda *_: None, + "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main", }, + True, ), - # cloudWatchAlarmEventCompositeMetric.json, not match alarm_name, with alarm_name_prefix ( "cloudWatchAlarmEventCompositeMetric.json", { - "func": None, - "alarm_name": "CompositeDemo.MainV2", - "alarm_name_prefix": "CompositeD", + "func": lambda *_: None, + "arn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.MainV2", }, + False, ), - # cloudWatchAlarmEventCompositeMetric.json, not match alarm_name_prefix + # with alarm_name ( "cloudWatchAlarmEventCompositeMetric.json", - { - "func": None, - "alarm_name_prefix": "CompositeDD", - }, + {"func": lambda *_: None, "alarm_name": "CompositeDemo.Main"}, + True, + ), + ( + "cloudWatchAlarmEventCompositeMetric.json", + {"func": lambda *_: None, "alarm_name": "CompositeDemo.MainV2"}, + False, ), ], ) - def test_match_false(self, event_name, option_constructor): + def test_match_for_cloud_watch_alarm_event(self, event_name, option_constructor, is_match): event = load_event(file_name=event_name) route = CloudWatchAlarmRoute(**option_constructor) actual = route.match(event=event) - assert actual is None + if is_match: + expected = route.func, CloudWatchAlarmEvent(event) + assert actual == expected + else: + assert actual is None @pytest.mark.parametrize( "event_name", From 9357d6932cc34f018270342594cec55ab7734a61 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Fri, 24 Jan 2025 16:14:38 +0900 Subject: [PATCH 021/139] fix test for cloud_watch_logs --- .../_routes/test_cloud_watch_logs.py | 659 +++++------------- 1 file changed, 192 insertions(+), 467 deletions(-) diff --git a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py index dda17258bff..54a7cecf07a 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_cloud_watch_logs.py @@ -92,13 +92,56 @@ def test_constructor_normal(self, option, expected): @pytest.mark.parametrize( "option_constructor, option, expected", [ - ({"func": None, "log_group": "test-log-group"}, {"log_group": None}, False), - ({"func": None, "log_group": "test-log-group"}, {"log_group": "test-log-group-v2"}, False), - ({"func": None, "log_group": "test-log-group"}, {"log_group": "test-log-group"}, True), - ({"func": None, "log_group_prefix": "test-ll"}, {"log_group": "test-log-group"}, False), - ({"func": None, "log_group_prefix": "est-l"}, {"log_group": "test-log-group"}, False), - ({"func": None, "log_group_prefix": "test-l"}, {"log_group": "test-log-group"}, True), - ({"func": None, "log_stream": "test-log-group"}, {"log_group": None}, False), + # with log_group and log_group_prefix + # match all + ( + {"func": None, "log_group": "testLogGroup", "log_group_prefix": "testL"}, + {"log_group": "testLogGroup"}, + True, + ), + # with log_group and log_group_prefix + # match 1, unmatch 1 + ( + {"func": None, "log_group": "testLogGroup", "log_group_prefix": "estL"}, + {"log_group": "testLogGroup"}, + True, + ), + ( + {"func": None, "log_group": "testLogGroupV2", "log_group_prefix": "testL"}, + {"log_group": "testLogGroup"}, + False, + ), + # with log_group and log_group_prefix + # unmatch all + ( + {"func": None, "log_group": "testLogGroupV2", "log_group_prefix": "estL"}, + {"log_group": "testLogGroup"}, + False, + ), + # with log_group + ( + { + "func": None, + "log_group": "testLogGroup", + }, + {"log_group": "testLogGroup"}, + True, + ), + ( + { + "func": None, + "log_group": "testLogGroupV2", + }, + {"log_group": "testLogGroup"}, + False, + ), + # with log_group_prefix + ({"func": None, "log_group_prefix": "testL"}, {"log_group": "testLogGroup"}, True), + ({"func": None, "log_group_prefix": "estL"}, {"log_group": "testLogGroup"}, False), + # without log_group and log_group_prefix + ({"func": None, "log_stream": "testLogStream"}, {"log_group": "testLogGroup"}, False), + # without log_group at option_func + ({"func": None, "log_group": "testLogGroup"}, {"log_group": None}, False), ], ) def test_is_target_with_log_group(self, option_constructor, option, expected): @@ -109,13 +152,56 @@ def test_is_target_with_log_group(self, option_constructor, option, expected): @pytest.mark.parametrize( "option_constructor, option, expected", [ - ({"func": None, "log_stream": "test-log-stream"}, {"log_stream": None}, False), - ({"func": None, "log_stream": "test-log-stream-v2"}, {"log_stream": "test-log-stream"}, False), - ({"func": None, "log_stream": "test-log-stream"}, {"log_stream": "test-log-stream"}, True), - ({"func": None, "log_stream_prefix": "test-ll"}, {"log_stream": "test-log-stream"}, False), - ({"func": None, "log_stream_prefix": "est-l"}, {"log_stream": "test-log-stream"}, False), - ({"func": None, "log_stream_prefix": "test-l"}, {"log_stream": "test-log-stream"}, True), - ({"func": None, "log_group": "test-l"}, {"log_stream": "test-log-stream"}, False), + # with log_stream and log_stream_prefix + # match all + ( + {"func": None, "log_stream": "testLogStream", "log_stream_prefix": "testL"}, + {"log_stream": "testLogStream"}, + True, + ), + # with log_stream and log_stream_prefix + # match 1, unmatch 1 + ( + {"func": None, "log_stream": "testLogStream", "log_stream_prefix": "estL"}, + {"log_stream": "testLogStream"}, + True, + ), + ( + {"func": None, "log_stream": "testLogStreamV2", "log_stream_prefix": "testL"}, + {"log_stream": "testLogStream"}, + False, + ), + # with log_stream and log_stream_prefix + # unmatch all + ( + {"func": None, "log_stream": "testLogStreamV2", "log_stream_prefix": "estL"}, + {"log_stream": "testLogStream"}, + False, + ), + # with log_stream + ( + { + "func": None, + "log_stream": "testLogStream", + }, + {"log_stream": "testLogStream"}, + True, + ), + ( + { + "func": None, + "log_stream": "testLogStreamV2", + }, + {"log_stream": "testLogStream"}, + False, + ), + # with log_stream_prefix + ({"func": None, "log_stream_prefix": "testL"}, {"log_stream": "testLogStream"}, True), + ({"func": None, "log_stream_prefix": "estL"}, {"log_stream": "testLogStream"}, False), + # without log_stream and log_stream_prefix + ({"func": None, "log_group": "testLogGroup"}, {"log_stream": "testLogStream"}, False), + # without log_stream at option_func + ({"func": None, "log_stream_prefix": "testL"}, {"log_stream": None}, False), ], ) def test_is_target_with_log_stream(self, option_constructor, option, expected): @@ -126,11 +212,17 @@ def test_is_target_with_log_stream(self, option_constructor, option, expected): @pytest.mark.parametrize( "option_constructor, option, expected", [ + # without subscription_filters at option_func ({"func": None, "subscription_filters": ["test"]}, {"subscription_filters": None}, False), + # without subscription_filters ({"func": None, "log_group": "test"}, {"subscription_filters": ["test"]}, False), + # with subscription_filters + # match ({"func": None, "subscription_filters": ["test"]}, {"subscription_filters": ["test"]}, True), ({"func": None, "subscription_filters": ["test", "name"]}, {"subscription_filters": ["test"]}, True), ({"func": None, "subscription_filters": ["test"]}, {"subscription_filters": ["test", "name"]}, True), + # with subscription_filters + # unmatch ({"func": None, "subscription_filters": ["test"]}, {"subscription_filters": ["name"]}, False), ], ) @@ -140,8 +232,10 @@ def test_is_target_with_subscription_filters(self, option_constructor, option, e assert actual == expected @pytest.mark.parametrize( - "event_name, option_constructor", + "event_name, option_constructor, is_match", [ + # with log_group, log_stream, and subscription_filters + # match all ( "cloudWatchLogEvent.json", { @@ -150,567 +244,198 @@ def test_is_target_with_subscription_filters(self, option_constructor, option, e "log_stream": "testLogStream", "subscription_filters": ["testFilter"], }, + True, ), - ( - "cloudWatchLogEvent.json", - { - "func": lambda *_: None, - "log_group_prefix": "testLogG", - "log_stream": "testLogStream", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": lambda *_: None, - "log_group": "testLogGroup", - "log_stream_prefix": "testLogS", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": lambda *_: None, - "log_group_prefix": "testLogG", - "log_stream_prefix": "testLogS", - "subscription_filters": ["testFilter"], - }, - ), + # with log_group, log_stream, and subscription_filters + # match 2, unmatch 1 ( "cloudWatchLogEvent.json", { "func": lambda *_: None, "log_group": "testLogGroup", "log_stream": "testLogStream", + "subscription_filters": ["testFilterV2"], }, + False, ), ( "cloudWatchLogEvent.json", - { - "func": lambda *_: None, - "log_group_prefix": "testLogG", - "log_stream": "testLogStream", - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": lambda *_: None, - "log_group": "testLogGroup", - "log_stream_prefix": "testLogS", - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": lambda *_: None, - "log_group_prefix": "testLogG", - "log_stream_prefix": "testLogS", - }, - ), - ( - "cloudWatchLogEvent.json", - {"func": lambda *_: None, "log_group": "testLogGroup", "subscription_filters": ["testFilter"]}, - ), - ( - "cloudWatchLogEvent.json", - {"func": lambda *_: None, "log_group_prefix": "testLogG", "subscription_filters": ["testFilter"]}, - ), - ( - "cloudWatchLogEvent.json", - {"func": lambda *_: None, "log_stream": "testLogStream", "subscription_filters": ["testFilter"]}, - ), - ( - "cloudWatchLogEvent.json", - {"func": lambda *_: None, "log_stream_prefix": "testLogS", "subscription_filters": ["testFilter"]}, - ), - ( - "cloudWatchLogEvent.json", - { - "func": lambda *_: None, - "log_group": "testLogGroup", - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": lambda *_: None, - "log_group_prefix": "testLogG", - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": lambda *_: None, - "log_stream": "testLogStream", - }, - ), - ("cloudWatchLogEvent.json", {"func": lambda *_: None, "subscription_filters": ["testFilter"]}), - ( - "cloudWatchLogEventWithPolicyLevel.json", { "func": lambda *_: None, "log_group": "testLogGroup", - "log_stream": "testLogStream", + "log_stream": "testLogStreamV2", "subscription_filters": ["testFilter"], }, + False, ), ( - "cloudWatchLogEventWithPolicyLevel.json", + "cloudWatchLogEvent.json", { "func": lambda *_: None, - "log_group_prefix": "testLogG", + "log_group": "testLogGroupV2", "log_stream": "testLogStream", "subscription_filters": ["testFilter"], }, + False, ), + # with log_group, log_stream, and subscription_filters + # match 1, unmatch 2 ( - "cloudWatchLogEventWithPolicyLevel.json", - { - "func": lambda *_: None, - "log_group": "testLogGroup", - "log_stream_prefix": "testLogS", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - { - "func": lambda *_: None, - "log_group_prefix": "testLogG", - "log_stream_prefix": "testLogS", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - { - "func": lambda *_: None, - "log_group": "testLogGroup", - "log_stream": "testLogStream", - }, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - { - "func": lambda *_: None, - "log_group_prefix": "testLogG", - "log_stream": "testLogStream", - }, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - { - "func": lambda *_: None, - "log_group": "testLogGroup", - "log_stream_prefix": "testLogS", - }, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - { - "func": lambda *_: None, - "log_group_prefix": "testLogG", - "log_stream_prefix": "testLogS", - }, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", + "cloudWatchLogEvent.json", { "func": lambda *_: None, "log_group": "testLogGroup", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - { - "func": lambda *_: None, - "log_group_prefix": "testLogG", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - { - "func": lambda *_: None, - "log_stream": "testLogStream", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - { - "func": lambda *_: None, - "log_stream_prefix": "testLogS", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - {"func": lambda *_: None, "log_group": "testLogGroup"}, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - {"func": lambda *_: None, "log_group_prefix": "testLogG"}, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - {"func": lambda *_: None, "log_stream": "testLogStream"}, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - {"func": lambda *_: None, "log_stream_prefix": "testLogS"}, - ), - ( - "cloudWatchLogEventWithPolicyLevel.json", - {"func": lambda *_: None, "subscription_filters": ["testFilter"]}, - ), - ], - ) - def test_match_true(self, event_name, option_constructor): - event = load_event(file_name=event_name) - route = CloudWatchLogsRoute(**option_constructor) - expected = (route.func, CloudWatchLogsEvent(event)) - actual = route.match(event=event) - assert actual == expected - - @pytest.mark.parametrize( - "event_name, option_constructor", - [ - ("activeMQEvent.json", {"func": None, "log_group": "test"}), - ("albEvent.json", {"func": None, "log_group": "test"}), - ("albEventPathTrailingSlash.json", {"func": None, "log_group": "test"}), - ("albMultiValueHeadersEvent.json", {"func": None, "log_group": "test"}), - ("albMultiValueQueryStringEvent.json", {"func": None, "log_group": "test"}), - ("apiGatewayAuthorizerRequestEvent.json", {"func": None, "log_group": "test"}), - ("apiGatewayAuthorizerTokenEvent.json", {"func": None, "log_group": "test"}), - ("apiGatewayAuthorizerV2Event.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyEvent.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyEventAnotherPath.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyEventNoOrigin.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyEventPathTrailingSlash.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyEventPrincipalId.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyEvent_noVersionAuth.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyOtherEvent.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyV2Event.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyV2EventPathTrailingSlash.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyV2Event_GET.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyV2IamEvent.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyV2LambdaAuthorizerEvent.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyV2OtherGetEvent.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", {"func": None, "log_group": "test"}), - ("apiGatewayProxyV2SchemaMiddlwareValidEvent.json", {"func": None, "log_group": "test"}), - ("apigatewayeSchemaMiddlwareInvalidEvent.json", {"func": None, "log_group": "test"}), - ("apigatewayeSchemaMiddlwareValidEvent.json", {"func": None, "log_group": "test"}), - ("appSyncAuthorizerEvent.json", {"func": None, "log_group": "test"}), - ("appSyncAuthorizerResponse.json", {"func": None, "log_group": "test"}), - ("appSyncBatchEvent.json", {"func": None, "log_group": "test"}), - ("appSyncDirectResolver.json", {"func": None, "log_group": "test"}), - ("appSyncResolverEvent.json", {"func": None, "log_group": "test"}), - ("awsConfigRuleConfigurationChanged.json", {"func": None, "log_group": "test"}), - ("awsConfigRuleOversizedConfiguration.json", {"func": None, "log_group": "test"}), - ("awsConfigRuleScheduled.json", {"func": None, "log_group": "test"}), - ("bedrockAgentEvent.json", {"func": None, "log_group": "test"}), - ("bedrockAgentEventWithPathParams.json", {"func": None, "log_group": "test"}), - ("bedrockAgentPostEvent.json", {"func": None, "log_group": "test"}), - ("cloudWatchAlarmEventCompositeMetric.json", {"func": None, "log_group": "test"}), - ("cloudWatchAlarmEventSingleMetric.json", {"func": None, "log_group": "test"}), - ("cloudWatchDashboardEvent.json", {"func": None, "log_group": "test"}), - ("cloudformationCustomResourceCreate.json", {"func": None, "log_group": "test"}), - ("cloudformationCustomResourceDelete.json", {"func": None, "log_group": "test"}), - ("cloudformationCustomResourceUpdate.json", {"func": None, "log_group": "test"}), - ("codeDeployLifecycleHookEvent.json", {"func": None, "log_group": "test"}), - ("codePipelineEvent.json", {"func": None, "log_group": "test"}), - ("codePipelineEventData.json", {"func": None, "log_group": "test"}), - ("codePipelineEventEmptyUserParameters.json", {"func": None, "log_group": "test"}), - ("codePipelineEventWithEncryptionKey.json", {"func": None, "log_group": "test"}), - ("cognitoCreateAuthChallengeEvent.json", {"func": None, "log_group": "test"}), - ("cognitoCustomEmailSenderEvent.json", {"func": None, "log_group": "test"}), - ("cognitoCustomMessageEvent.json", {"func": None, "log_group": "test"}), - ("cognitoCustomSMSSenderEvent.json", {"func": None, "log_group": "test"}), - ("cognitoDefineAuthChallengeEvent.json", {"func": None, "log_group": "test"}), - ("cognitoPostAuthenticationEvent.json", {"func": None, "log_group": "test"}), - ("cognitoPostConfirmationEvent.json", {"func": None, "log_group": "test"}), - ("cognitoPreAuthenticationEvent.json", {"func": None, "log_group": "test"}), - ("cognitoPreSignUpEvent.json", {"func": None, "log_group": "test"}), - ("cognitoPreTokenGenerationEvent.json", {"func": None, "log_group": "test"}), - ("cognitoPreTokenV2GenerationEvent.json", {"func": None, "log_group": "test"}), - ("cognitoUserMigrationEvent.json", {"func": None, "log_group": "test"}), - ("cognitoVerifyAuthChallengeResponseEvent.json", {"func": None, "log_group": "test"}), - ("connectContactFlowEventAll.json", {"func": None, "log_group": "test"}), - ("connectContactFlowEventMin.json", {"func": None, "log_group": "test"}), - ("dynamoStreamEvent.json", {"func": None, "log_group": "test"}), - ("eventBridgeEvent.json", {"func": None, "log_group": "test"}), - ("kafkaEventMsk.json", {"func": None, "log_group": "test"}), - ("kafkaEventSelfManaged.json", {"func": None, "log_group": "test"}), - ("kinesisFirehoseKinesisEvent.json", {"func": None, "log_group": "test"}), - ("kinesisFirehosePutEvent.json", {"func": None, "log_group": "test"}), - ("kinesisFirehoseSQSEvent.json", {"func": None, "log_group": "test"}), - ("kinesisStreamCloudWatchLogsEvent.json", {"func": None, "log_group": "test"}), - ("kinesisStreamEvent.json", {"func": None, "log_group": "test"}), - ("kinesisStreamEventOneRecord.json", {"func": None, "log_group": "test"}), - ("lambdaFunctionUrlEvent.json", {"func": None, "log_group": "test"}), - ("lambdaFunctionUrlEventPathTrailingSlash.json", {"func": None, "log_group": "test"}), - ("lambdaFunctionUrlEventWithHeaders.json", {"func": None, "log_group": "test"}), - ("lambdaFunctionUrlIAMEvent.json", {"func": None, "log_group": "test"}), - ("rabbitMQEvent.json", {"func": None, "log_group": "test"}), - ("s3BatchOperationEventSchemaV1.json", {"func": None, "log_group": "test"}), - ("s3BatchOperationEventSchemaV2.json", {"func": None, "log_group": "test"}), - ("s3Event.json", {"func": None, "log_group": "test"}), - ("s3EventBridgeNotificationObjectCreatedEvent.json", {"func": None, "log_group": "test"}), - ("s3EventBridgeNotificationObjectDeletedEvent.json", {"func": None, "log_group": "test"}), - ("s3EventBridgeNotificationObjectExpiredEvent.json", {"func": None, "log_group": "test"}), - ("s3EventBridgeNotificationObjectRestoreCompletedEvent.json", {"func": None, "log_group": "test"}), - ("s3EventDecodedKey.json", {"func": None, "log_group": "test"}), - ("s3EventDeleteObject.json", {"func": None, "log_group": "test"}), - ("s3EventGlacier.json", {"func": None, "log_group": "test"}), - ("s3ObjectEventIAMUser.json", {"func": None, "log_group": "test"}), - ("s3ObjectEventTempCredentials.json", {"func": None, "log_group": "test"}), - ("s3SqsEvent.json", {"func": None, "log_group": "test"}), - ("secretsManagerEvent.json", {"func": None, "log_group": "test"}), - ("sesEvent.json", {"func": None, "log_group": "test"}), - ("snsEvent.json", {"func": None, "log_group": "test"}), - ("snsSqsEvent.json", {"func": None, "log_group": "test"}), - ("snsSqsFifoEvent.json", {"func": None, "log_group": "test"}), - ("sqsDlqTriggerEvent.json", {"func": None, "log_group": "test"}), - ("sqsEvent.json", {"func": None, "log_group": "test"}), - ("vpcLatticeEvent.json", {"func": None, "log_group": "test"}), - ("vpcLatticeEventPathTrailingSlash.json", {"func": None, "log_group": "test"}), - ("vpcLatticeEventV2PathTrailingSlash.json", {"func": None, "log_group": "test"}), - ("vpcLatticeV2Event.json", {"func": None, "log_group": "test"}), - ("vpcLatticeV2EventWithHeaders.json", {"func": None, "log_group": "test"}), - # cloudWatchLogEvent.json, not match (log group, log stream and subscription filters) - ( - "cloudWatchLogEvent.json", - { - "func": None, - "log_group": "testLogGroupV2", - "log_stream": "testLogStreamV2", - "subscription_filters": ["testFilterV2"], - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": None, - "log_group_prefix": "testLogGG", "log_stream": "testLogStreamV2", "subscription_filters": ["testFilterV2"], }, + False, ), ( "cloudWatchLogEvent.json", { - "func": None, + "func": lambda *_: None, "log_group": "testLogGroupV2", - "log_stream_prefix": "testLogSS", - "subscription_filters": ["testFilterV2"], - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": None, - "log_group_prefix": "testLogGG", - "log_stream_prefix": "testLogSS", + "log_stream": "testLogStream", "subscription_filters": ["testFilterV2"], }, + False, ), ( "cloudWatchLogEvent.json", { - "func": None, + "func": lambda *_: None, "log_group": "testLogGroupV2", "log_stream": "testLogStreamV2", "subscription_filters": ["testFilter"], }, + False, ), + # with log_group, log_stream, and subscription_filters + # unmatch all ( "cloudWatchLogEvent.json", { - "func": None, - "log_group_prefix": "testLogGG", - "log_stream": "testLogStreamV2", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": None, - "log_group": "testLogGroupV2", - "log_stream_prefix": "testLogSS", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": None, - "log_group_prefix": "testLogGG", - "log_stream_prefix": "testLogSS", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": None, + "func": lambda *_: None, "log_group": "testLogGroupV2", - "log_stream": "testLogStream", + "log_stream": "testLogStreamV2", "subscription_filters": ["testFilterV2"], }, + False, ), + # with log_group and log_stream + # match all ( "cloudWatchLogEvent.json", { - "func": None, - "log_group_prefix": "testLogGG", + "func": lambda *_: None, + "log_group": "testLogGroup", "log_stream": "testLogStream", - "subscription_filters": ["testFilterV2"], }, + True, ), + # with log_group and log_stream + # match 1, unmatch 1 ( "cloudWatchLogEvent.json", { - "func": None, + "func": lambda *_: None, "log_group": "testLogGroup", "log_stream": "testLogStreamV2", - "subscription_filters": ["testFilterV2"], - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": None, - "log_group": "testLogGroup", - "log_stream_prefix": "testLogSS", - "subscription_filters": ["testFilterV2"], }, + False, ), ( "cloudWatchLogEvent.json", { - "func": None, + "func": lambda *_: None, "log_group": "testLogGroupV2", "log_stream": "testLogStream", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": None, - "log_group_prefix": "testLogGG", - "log_stream": "testLogStream", - "subscription_filters": ["testFilter"], }, + False, ), + # with log_group and log_stream + # unmatch all ( "cloudWatchLogEvent.json", { - "func": None, - "log_group": "testLogGroup", + "func": lambda *_: None, + "log_group": "testLogGroupV2", "log_stream": "testLogStreamV2", - "subscription_filters": ["testFilter"], - }, - ), - ( - "cloudWatchLogEvent.json", - { - "func": None, - "log_group": "testLogGroup", - "log_stream_prefix": "testLogSS", - "subscription_filters": ["testFilter"], }, + False, ), + # with log_group and subscription_filters + # match all ( "cloudWatchLogEvent.json", - { - "func": None, - "log_group": "testLogGroup", - "log_stream": "testLogStream", - "subscription_filters": ["testFilterV2"], - }, - ), - # cloudWatchLogEvent.json, not match (log group and log stream) - ("cloudWatchLogEvent.json", {"func": None, "log_group": "testLogGroupV2", "log_stream": "testLogStreamV2"}), - ( - "cloudWatchLogEvent.json", - {"func": None, "log_group_prefix": "testLogGG", "log_stream": "testLogStreamV2"}, - ), - ( - "cloudWatchLogEvent.json", - {"func": None, "log_group": "testLogGroupV2", "log_stream_prefix": "testLogSS"}, - ), - ( - "cloudWatchLogEvent.json", - {"func": None, "log_group_prefix": "testLogGG", "log_stream_prefix": "testLogSS"}, - ), - ("cloudWatchLogEvent.json", {"func": None, "log_group": "testLogGroupV2", "log_stream": "testLogStream"}), - ("cloudWatchLogEvent.json", {"func": None, "log_group_prefix": "testLogGG", "log_stream": "testLogStream"}), - ("cloudWatchLogEvent.json", {"func": None, "log_group": "testLogGroup", "log_stream": "testLogStreamV2"}), - ("cloudWatchLogEvent.json", {"func": None, "log_group": "testLogGroup", "log_stream_prefix": "testLogSS"}), - # cloudWatchLogEvent.json, not match (log group and subscription filters) - ( - "cloudWatchLogEvent.json", - {"func": None, "log_group": "testLogGroupV2", "subscription_filters": ["testFilterV2"]}, - ), - ( - "cloudWatchLogEvent.json", - {"func": None, "log_group_prefix": "testLogGG", "subscription_filters": ["testFilterV2"]}, + {"func": lambda *_: None, "log_group": "testLogGroup", "subscription_filters": ["testFilter"]}, + True, ), + # with log_group and subscription_filters + # match 1, unmatch 1 ( "cloudWatchLogEvent.json", - {"func": None, "log_group": "testLogGroupV2", "subscription_filters": ["testFilter"]}, + {"func": lambda *_: None, "log_group": "testLogGroupV2", "subscription_filters": ["testFilter"]}, + False, ), ( "cloudWatchLogEvent.json", - {"func": None, "log_group_prefix": "testLogGG", "subscription_filters": ["testFilter"]}, + {"func": lambda *_: None, "log_group": "testLogGroup", "subscription_filters": ["testFilterV2"]}, + False, ), + # with log_group and subscription_filters + # unmatch all ( "cloudWatchLogEvent.json", - {"func": None, "log_group": "testLogGroup", "subscription_filters": ["testFilterV2"]}, + {"func": lambda *_: None, "log_group": "testLogGroupV2", "subscription_filters": ["testFilterV2"]}, + False, ), - # cloudWatchLogEvent.json, not match (log stream and subscription filters) + # with log_stream and subscription_filters + # match all ( "cloudWatchLogEvent.json", - {"func": None, "log_stream": "testLogStreamV2", "subscription_filters": ["testFilterV2"]}, + {"func": lambda *_: None, "log_stream": "testLogStream", "subscription_filters": ["testFilter"]}, + True, ), + # with log_stream and subscription_filters + # match 1, unmatch 1 ( "cloudWatchLogEvent.json", - {"func": None, "log_stream_prefix": "testLogSS", "subscription_filters": ["testFilterV2"]}, + {"func": lambda *_: None, "log_stream": "testLogStream", "subscription_filters": ["testFilterV2"]}, + False, ), ( "cloudWatchLogEvent.json", - {"func": None, "log_stream": "testLogStreamV2", "subscription_filters": ["testFilter"]}, + {"func": lambda *_: None, "log_stream": "testLogStreamV2", "subscription_filters": ["testFilter"]}, + False, ), + # with log_stream and subscription_filters + # unmatch all ( "cloudWatchLogEvent.json", - {"func": None, "log_stream_prefix": "testLogSS", "subscription_filters": ["testFilter"]}, + {"func": lambda *_: None, "log_stream": "testLogStreamV2", "subscription_filters": ["testFilter"]}, + False, ), - ( - "cloudWatchLogEvent.json", - {"func": None, "log_stream": "testLogStream", "subscription_filters": ["testFilterV2"]}, - ), - # cloudWatchLogEvent.json, not match log_group - ("cloudWatchLogEvent.json", {"func": None, "log_group": "testLogGroupV2"}), - ("cloudWatchLogEvent.json", {"func": None, "log_group_prefix": "testLogGG"}), - # cloudWatchLogEvent.json, not match log_stream - ("cloudWatchLogEvent.json", {"func": None, "log_stream": "testLogStreamV2"}), - ("cloudWatchLogEvent.json", {"func": None, "log_stream_prefix": "testLogSS"}), - # cloudWatchLogEvent.json, not match subscription_filters - ("cloudWatchLogEvent.json", {"func": None, "subscription_filters": ["testFilterV2"]}), + # with log_group + ("cloudWatchLogEvent.json", {"func": lambda *_: None, "log_group": "testLogGroup"}, True), + ("cloudWatchLogEvent.json", {"func": lambda *_: None, "log_group": "testLogGroupV2"}, False), + # with log_stream + ("cloudWatchLogEvent.json", {"func": lambda *_: None, "log_stream": "testLogStream"}, True), + ("cloudWatchLogEvent.json", {"func": lambda *_: None, "log_stream": "testLogStreamV2"}, False), + # with subscription_filters + ("cloudWatchLogEvent.json", {"func": lambda *_: None, "subscription_filters": ["testFilter"]}, True), + ("cloudWatchLogEvent.json", {"func": lambda *_: None, "subscription_filters": ["testFilterV2"]}, False), ], ) - def test_match_false(self, event_name, option_constructor): + def test_match_for_cloud_watch_logs_event(self, event_name, option_constructor, is_match): event = load_event(file_name=event_name) route = CloudWatchLogsRoute(**option_constructor) actual = route.match(event=event) - assert actual is None + if is_match: + expected = route.func, CloudWatchLogsEvent(event) + assert actual == expected + else: + assert actual is None @pytest.mark.parametrize( "event_name", From 2fdeba64ddc3a78b75ade1148ff999c30894b109 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Fri, 24 Jan 2025 16:34:45 +0900 Subject: [PATCH 022/139] fix test for code_deploy_lifecycle_hook.py --- .../test_code_deploy_lifecycle_hook.py | 114 ------------------ 1 file changed, 114 deletions(-) diff --git a/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py b/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py index 1e83ffe0daf..9b561e4bd4f 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_code_deploy_lifecycle_hook.py @@ -23,120 +23,6 @@ def test_match_true(self, event_name, option_constructor): actual = route.match(event=event) assert actual == expected - @pytest.mark.parametrize( - "event_name, option_constructor", - [ - ("activeMQEvent.json", {"func": None}), - ("albEvent.json", {"func": None}), - ("albEventPathTrailingSlash.json", {"func": None}), - ("albMultiValueHeadersEvent.json", {"func": None}), - ("albMultiValueQueryStringEvent.json", {"func": None}), - ("apiGatewayAuthorizerRequestEvent.json", {"func": None}), - ("apiGatewayAuthorizerTokenEvent.json", {"func": None}), - ("apiGatewayAuthorizerV2Event.json", {"func": None}), - ("apiGatewayProxyEvent.json", {"func": None}), - ("apiGatewayProxyEventAnotherPath.json", {"func": None}), - ("apiGatewayProxyEventNoOrigin.json", {"func": None}), - ("apiGatewayProxyEventPathTrailingSlash.json", {"func": None}), - ("apiGatewayProxyEventPrincipalId.json", {"func": None}), - ("apiGatewayProxyEvent_noVersionAuth.json", {"func": None}), - ("apiGatewayProxyOtherEvent.json", {"func": None}), - ("apiGatewayProxyV2Event.json", {"func": None}), - ("apiGatewayProxyV2EventPathTrailingSlash.json", {"func": None}), - ("apiGatewayProxyV2Event_GET.json", {"func": None}), - ("apiGatewayProxyV2IamEvent.json", {"func": None}), - ("apiGatewayProxyV2LambdaAuthorizerEvent.json", {"func": None}), - ("apiGatewayProxyV2OtherGetEvent.json", {"func": None}), - ("apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", {"func": None}), - ("apiGatewayProxyV2SchemaMiddlwareValidEvent.json", {"func": None}), - ("apigatewayeSchemaMiddlwareInvalidEvent.json", {"func": None}), - ("apigatewayeSchemaMiddlwareValidEvent.json", {"func": None}), - ("appSyncAuthorizerEvent.json", {"func": None}), - ("appSyncAuthorizerResponse.json", {"func": None}), - ("appSyncBatchEvent.json", {"func": None}), - ("appSyncDirectResolver.json", {"func": None}), - ("appSyncResolverEvent.json", {"func": None}), - ("awsConfigRuleConfigurationChanged.json", {"func": None}), - ("awsConfigRuleOversizedConfiguration.json", {"func": None}), - ("awsConfigRuleScheduled.json", {"func": None}), - ("bedrockAgentEvent.json", {"func": None}), - ("bedrockAgentEventWithPathParams.json", {"func": None}), - ("bedrockAgentPostEvent.json", {"func": None}), - ("cloudWatchAlarmEventCompositeMetric.json", {"func": None}), - ("cloudWatchAlarmEventSingleMetric.json", {"func": None}), - ("cloudWatchDashboardEvent.json", {"func": None}), - ("cloudWatchLogEvent.json", {"func": None}), - ("cloudWatchLogEventWithPolicyLevel.json", {"func": None}), - ("cloudformationCustomResourceCreate.json", {"func": None}), - ("cloudformationCustomResourceDelete.json", {"func": None}), - ("cloudformationCustomResourceUpdate.json", {"func": None}), - ("codePipelineEvent.json", {"func": None}), - ("codePipelineEventData.json", {"func": None}), - ("codePipelineEventEmptyUserParameters.json", {"func": None}), - ("codePipelineEventWithEncryptionKey.json", {"func": None}), - ("cognitoCreateAuthChallengeEvent.json", {"func": None}), - ("cognitoCustomEmailSenderEvent.json", {"func": None}), - ("cognitoCustomMessageEvent.json", {"func": None}), - ("cognitoCustomSMSSenderEvent.json", {"func": None}), - ("cognitoDefineAuthChallengeEvent.json", {"func": None}), - ("cognitoPostAuthenticationEvent.json", {"func": None}), - ("cognitoPostConfirmationEvent.json", {"func": None}), - ("cognitoPreAuthenticationEvent.json", {"func": None}), - ("cognitoPreSignUpEvent.json", {"func": None}), - ("cognitoPreTokenGenerationEvent.json", {"func": None}), - ("cognitoPreTokenV2GenerationEvent.json", {"func": None}), - ("cognitoUserMigrationEvent.json", {"func": None}), - ("cognitoVerifyAuthChallengeResponseEvent.json", {"func": None}), - ("connectContactFlowEventAll.json", {"func": None}), - ("connectContactFlowEventMin.json", {"func": None}), - ("dynamoStreamEvent.json", {"func": None}), - ("eventBridgeEvent.json", {"func": None}), - ("kafkaEventMsk.json", {"func": None}), - ("kafkaEventSelfManaged.json", {"func": None}), - ("kinesisFirehoseKinesisEvent.json", {"func": None}), - ("kinesisFirehosePutEvent.json", {"func": None}), - ("kinesisFirehoseSQSEvent.json", {"func": None}), - ("kinesisStreamCloudWatchLogsEvent.json", {"func": None}), - ("kinesisStreamEvent.json", {"func": None}), - ("kinesisStreamEventOneRecord.json", {"func": None}), - ("lambdaFunctionUrlEvent.json", {"func": None}), - ("lambdaFunctionUrlEventPathTrailingSlash.json", {"func": None}), - ("lambdaFunctionUrlEventWithHeaders.json", {"func": None}), - ("lambdaFunctionUrlIAMEvent.json", {"func": None}), - ("rabbitMQEvent.json", {"func": None}), - ("s3BatchOperationEventSchemaV1.json", {"func": None}), - ("s3BatchOperationEventSchemaV2.json", {"func": None}), - ("s3Event.json", {"func": None}), - ("s3EventBridgeNotificationObjectCreatedEvent.json", {"func": None}), - ("s3EventBridgeNotificationObjectDeletedEvent.json", {"func": None}), - ("s3EventBridgeNotificationObjectExpiredEvent.json", {"func": None}), - ("s3EventBridgeNotificationObjectRestoreCompletedEvent.json", {"func": None}), - ("s3EventDecodedKey.json", {"func": None}), - ("s3EventDeleteObject.json", {"func": None}), - ("s3EventGlacier.json", {"func": None}), - ("s3ObjectEventIAMUser.json", {"func": None}), - ("s3ObjectEventTempCredentials.json", {"func": None}), - ("s3SqsEvent.json", {"func": None}), - ("secretsManagerEvent.json", {"func": None}), - ("sesEvent.json", {"func": None}), - ("snsEvent.json", {"func": None}), - ("snsSqsEvent.json", {"func": None}), - ("snsSqsFifoEvent.json", {"func": None}), - ("sqsDlqTriggerEvent.json", {"func": None}), - ("sqsEvent.json", {"func": None}), - ("vpcLatticeEvent.json", {"func": None}), - ("vpcLatticeEventPathTrailingSlash.json", {"func": None}), - ("vpcLatticeEventV2PathTrailingSlash.json", {"func": None}), - ("vpcLatticeV2Event.json", {"func": None}), - ("vpcLatticeV2EventWithHeaders.json", {"func": None}), - ], - ) - def test_match_false(self, event_name, option_constructor): - event = load_event(file_name=event_name) - route = CodeDeployLifecycleHookRoute(**option_constructor) - actual = route.match(event=event) - assert actual is None - @pytest.mark.parametrize( "event_name", [ From d1e7cb8f88f3e8a24cb3d238121b13526c1058a1 Mon Sep 17 00:00:00 2001 From: sinofseven Date: Fri, 24 Jan 2025 17:02:16 +0900 Subject: [PATCH 023/139] fix test for event_bridge.py --- .../_routes/test_event_bridge.py | 327 ++++++++---------- 1 file changed, 146 insertions(+), 181 deletions(-) diff --git a/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py b/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py index fdd4885052b..a396f174d82 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_event_bridge.py @@ -36,39 +36,55 @@ def test_constructor_normal(self, option_constructor, expected): assert route.__dict__ == expected @pytest.mark.parametrize( - "option_constructor, option, expected", + "option_constructor, option_func, expected", [ + # without detail_type at option_func ({"func": None, "detail_type": "test type"}, {"detail_type": None}, False), + # without detail_type + ({"func": None, "source": "aws.ec2"}, {"detail_type": "test type"}, False), + # with detail_type ({"func": None, "detail_type": "test type"}, {"detail_type": "test type 2"}, False), ({"func": None, "detail_type": "test type"}, {"detail_type": "test type"}, True), ], ) - def test_is_target_with_detail_type(self, option_constructor, option, expected): + def test_is_target_with_detail_type(self, option_constructor, option_func, expected): route = EventBridgeRoute(**option_constructor) - actual = route.is_target_with_detail_type(**option) + actual = route.is_target_with_detail_type(**option_func) assert actual == expected @pytest.mark.parametrize( - "option_constructor, option, expected", + "option_constructor, option_func, expected", [ + # without source at option_func ({"func": None, "source": "aws.ec2"}, {"source": None}, False), + # without source + ({"func": None, "detail_type": "test type"}, {"source": "aws.ec2"}, False), + # with source ({"func": None, "source": "aws.ec2"}, {"source": "aws.lambda"}, False), ({"func": None, "source": "aws.ec2"}, {"source": "aws.ec2"}, True), ], ) - def test_is_target_with_source(self, option_constructor, option, expected): + def test_is_target_with_source(self, option_constructor, option_func, expected): route = EventBridgeRoute(**option_constructor) - actual = route.is_target_with_source(**option) + actual = route.is_target_with_source(**option_func) assert actual == expected @pytest.mark.parametrize( - "option_constructor, option, expected", + "option_constructor, option_func, expected", [ + # without resources at option_func ( {"func": None, "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"]}, {"resources": None}, False, ), + # without resources + ( + {"func": None, "source": "aws.ec2"}, + {"resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"]}, + False, + ), + # with resources ( {"func": None, "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"]}, {"resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"]}, @@ -123,14 +139,16 @@ def test_is_target_with_source(self, option_constructor, option, expected): ), ], ) - def test_is_target_with_resources(self, option_constructor, option, expected): + def test_is_target_with_resources(self, option_constructor, option_func, expected): route = EventBridgeRoute(**option_constructor) - actual = route.is_target_with_resources(**option) + actual = route.is_target_with_resources(**option_func) assert actual == expected @pytest.mark.parametrize( - "event_name, option_constructor", + "event_name, option_constructor, is_match", [ + # with detail_type, source, resources + # match all ( "eventBridgeEvent.json", { @@ -139,325 +157,272 @@ def test_is_target_with_resources(self, option_constructor, option, expected): "source": "aws.ec2", "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + True, ), + # with detail_type, source, resources + # match 2, unmatch 1 ( "eventBridgeEvent.json", { "func": lambda *_: None, "detail_type": "EC2 Instance State-change Notification", "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-99999999999999999"], }, + False, ), ( "eventBridgeEvent.json", { "func": lambda *_: None, "detail_type": "EC2 Instance State-change Notification", + "source": "aws.lambda", "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + False, ), ( "eventBridgeEvent.json", { "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification V2", "source": "aws.ec2", "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + False, ), + # with detail_type, source, resources + # match 1, unmatch 2 ( "eventBridgeEvent.json", { "func": lambda *_: None, "detail_type": "EC2 Instance State-change Notification", + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-99999999999999999"], }, + False, ), ( "eventBridgeEvent.json", { "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification V2", "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-99999999999999999"], }, + False, ), ( "eventBridgeEvent.json", { "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification V2", + "source": "aws.lambda", "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + False, ), - ], - ) - def test_match_true(self, event_name, option_constructor): - event = load_event(file_name=event_name) - route = EventBridgeRoute(**option_constructor) - expected = (route.func, EventBridgeEvent(event)) - actual = route.match(event=event) - assert actual == expected - - @pytest.mark.parametrize( - "event_name, option_constructor", - [ - ("activeMQEvent.json", {"func": None, "detail_type": "test"}), - ("albEvent.json", {"func": None, "detail_type": "test"}), - ("albEventPathTrailingSlash.json", {"func": None, "detail_type": "test"}), - ("albMultiValueHeadersEvent.json", {"func": None, "detail_type": "test"}), - ("albMultiValueQueryStringEvent.json", {"func": None, "detail_type": "test"}), - ("apiGatewayAuthorizerRequestEvent.json", {"func": None, "detail_type": "test"}), - ("apiGatewayAuthorizerTokenEvent.json", {"func": None, "detail_type": "test"}), - ("apiGatewayAuthorizerV2Event.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyEvent.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyEventAnotherPath.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyEventNoOrigin.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyEventPathTrailingSlash.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyEventPrincipalId.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyEvent_noVersionAuth.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyOtherEvent.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyV2Event.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyV2EventPathTrailingSlash.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyV2Event_GET.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyV2IamEvent.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyV2LambdaAuthorizerEvent.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyV2OtherGetEvent.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyV2SchemaMiddlwareInvalidEvent.json", {"func": None, "detail_type": "test"}), - ("apiGatewayProxyV2SchemaMiddlwareValidEvent.json", {"func": None, "detail_type": "test"}), - ("apigatewayeSchemaMiddlwareInvalidEvent.json", {"func": None, "detail_type": "test"}), - ("apigatewayeSchemaMiddlwareValidEvent.json", {"func": None, "detail_type": "test"}), - ("appSyncAuthorizerEvent.json", {"func": None, "detail_type": "test"}), - ("appSyncAuthorizerResponse.json", {"func": None, "detail_type": "test"}), - ("appSyncBatchEvent.json", {"func": None, "detail_type": "test"}), - ("appSyncDirectResolver.json", {"func": None, "detail_type": "test"}), - ("appSyncResolverEvent.json", {"func": None, "detail_type": "test"}), - ("awsConfigRuleConfigurationChanged.json", {"func": None, "detail_type": "test"}), - ("awsConfigRuleOversizedConfiguration.json", {"func": None, "detail_type": "test"}), - ("awsConfigRuleScheduled.json", {"func": None, "detail_type": "test"}), - ("bedrockAgentEvent.json", {"func": None, "detail_type": "test"}), - ("bedrockAgentEventWithPathParams.json", {"func": None, "detail_type": "test"}), - ("bedrockAgentPostEvent.json", {"func": None, "detail_type": "test"}), - ("cloudWatchAlarmEventCompositeMetric.json", {"func": None, "detail_type": "test"}), - ("cloudWatchAlarmEventSingleMetric.json", {"func": None, "detail_type": "test"}), - ("cloudWatchDashboardEvent.json", {"func": None, "detail_type": "test"}), - ("cloudWatchLogEvent.json", {"func": None, "detail_type": "test"}), - ("cloudWatchLogEventWithPolicyLevel.json", {"func": None, "detail_type": "test"}), - ("cloudformationCustomResourceCreate.json", {"func": None, "detail_type": "test"}), - ("cloudformationCustomResourceDelete.json", {"func": None, "detail_type": "test"}), - ("cloudformationCustomResourceUpdate.json", {"func": None, "detail_type": "test"}), - ("codeDeployLifecycleHookEvent.json", {"func": None, "detail_type": "test"}), - ("codePipelineEvent.json", {"func": None, "detail_type": "test"}), - ("codePipelineEventData.json", {"func": None, "detail_type": "test"}), - ("codePipelineEventEmptyUserParameters.json", {"func": None, "detail_type": "test"}), - ("codePipelineEventWithEncryptionKey.json", {"func": None, "detail_type": "test"}), - ("cognitoCreateAuthChallengeEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoCustomEmailSenderEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoCustomMessageEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoCustomSMSSenderEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoDefineAuthChallengeEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoPostAuthenticationEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoPostConfirmationEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoPreAuthenticationEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoPreSignUpEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoPreTokenGenerationEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoPreTokenV2GenerationEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoUserMigrationEvent.json", {"func": None, "detail_type": "test"}), - ("cognitoVerifyAuthChallengeResponseEvent.json", {"func": None, "detail_type": "test"}), - ("connectContactFlowEventAll.json", {"func": None, "detail_type": "test"}), - ("connectContactFlowEventMin.json", {"func": None, "detail_type": "test"}), - ("dynamoStreamEvent.json", {"func": None, "detail_type": "test"}), - ("kafkaEventMsk.json", {"func": None, "detail_type": "test"}), - ("kafkaEventSelfManaged.json", {"func": None, "detail_type": "test"}), - ("kinesisFirehoseKinesisEvent.json", {"func": None, "detail_type": "test"}), - ("kinesisFirehosePutEvent.json", {"func": None, "detail_type": "test"}), - ("kinesisFirehoseSQSEvent.json", {"func": None, "detail_type": "test"}), - ("kinesisStreamCloudWatchLogsEvent.json", {"func": None, "detail_type": "test"}), - ("kinesisStreamEvent.json", {"func": None, "detail_type": "test"}), - ("kinesisStreamEventOneRecord.json", {"func": None, "detail_type": "test"}), - ("lambdaFunctionUrlEvent.json", {"func": None, "detail_type": "test"}), - ("lambdaFunctionUrlEventPathTrailingSlash.json", {"func": None, "detail_type": "test"}), - ("lambdaFunctionUrlEventWithHeaders.json", {"func": None, "detail_type": "test"}), - ("lambdaFunctionUrlIAMEvent.json", {"func": None, "detail_type": "test"}), - ("rabbitMQEvent.json", {"func": None, "detail_type": "test"}), - ("s3BatchOperationEventSchemaV1.json", {"func": None, "detail_type": "test"}), - ("s3BatchOperationEventSchemaV2.json", {"func": None, "detail_type": "test"}), - ("s3Event.json", {"func": None, "detail_type": "test"}), - ("s3EventBridgeNotificationObjectCreatedEvent.json", {"func": None, "detail_type": "test"}), - ("s3EventBridgeNotificationObjectDeletedEvent.json", {"func": None, "detail_type": "test"}), - ("s3EventBridgeNotificationObjectExpiredEvent.json", {"func": None, "detail_type": "test"}), - ("s3EventBridgeNotificationObjectRestoreCompletedEvent.json", {"func": None, "detail_type": "test"}), - ("s3EventDecodedKey.json", {"func": None, "detail_type": "test"}), - ("s3EventDeleteObject.json", {"func": None, "detail_type": "test"}), - ("s3EventGlacier.json", {"func": None, "detail_type": "test"}), - ("s3ObjectEventIAMUser.json", {"func": None, "detail_type": "test"}), - ("s3ObjectEventTempCredentials.json", {"func": None, "detail_type": "test"}), - ("s3SqsEvent.json", {"func": None, "detail_type": "test"}), - ("secretsManagerEvent.json", {"func": None, "detail_type": "test"}), - ("sesEvent.json", {"func": None, "detail_type": "test"}), - ("snsEvent.json", {"func": None, "detail_type": "test"}), - ("snsSqsEvent.json", {"func": None, "detail_type": "test"}), - ("snsSqsFifoEvent.json", {"func": None, "detail_type": "test"}), - ("sqsDlqTriggerEvent.json", {"func": None, "detail_type": "test"}), - ("sqsEvent.json", {"func": None, "detail_type": "test"}), - ("vpcLatticeEvent.json", {"func": None, "detail_type": "test"}), - ("vpcLatticeEventPathTrailingSlash.json", {"func": None, "detail_type": "test"}), - ("vpcLatticeEventV2PathTrailingSlash.json", {"func": None, "detail_type": "test"}), - ("vpcLatticeV2Event.json", {"func": None, "detail_type": "test"}), - ("vpcLatticeV2EventWithHeaders.json", {"func": None, "detail_type": "test"}), - # eventBridgeEvent.json, not match (detail type, source, and resources) + # with detail_type, source, resources + # unmatch all ( "eventBridgeEvent.json", { - "func": None, + "func": lambda *_: None, "detail_type": "EC2 Instance State-change Notification V2", "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-99999999999999999"], }, + False, ), + # with detail_type and source + # match all ( "eventBridgeEvent.json", { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", + "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + }, + True, + ), + # with detail_type and source + # match 1, unmatch 1 + ( + "eventBridgeEvent.json", + { + "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification", "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + False, ), ( "eventBridgeEvent.json", { - "func": None, + "func": lambda *_: None, "detail_type": "EC2 Instance State-change Notification V2", "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], }, + False, ), + # with detail_type and source + # unmatch all ( "eventBridgeEvent.json", { - "func": None, - "detail_type": "EC2 Instance State-change Notification", + "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification V2", "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], }, + False, ), + # with detail_type and resources + # match all ( "eventBridgeEvent.json", { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "source": "aws.ec2", + "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification", "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + True, ), + # with detail_type and resources + # match 1, unmatch 1 ( "eventBridgeEvent.json", { - "func": None, + "func": lambda *_: None, "detail_type": "EC2 Instance State-change Notification", - "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-99999999999999999"], }, + False, ), ( "eventBridgeEvent.json", { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification V2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + False, ), - # eventBridgeEvent.json, not match (detail type and source) + # with detail_type and resources + # unmatch all ( "eventBridgeEvent.json", { - "func": None, + "func": lambda *_: None, "detail_type": "EC2 Instance State-change Notification V2", - "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-99999999999999999"], }, + False, ), + # with source and resources + # match all ( "eventBridgeEvent.json", { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", + "func": lambda *_: None, "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + True, ), + # with source and resources + # match 1, unmatch 1 ( "eventBridgeEvent.json", { - "func": None, - "detail_type": "EC2 Instance State-change Notification", - "source": "aws.lambda", + "func": lambda *_: None, + "source": "aws.ec2", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-99999999999999999"], }, + False, ), - # eventBridgeEvent.json, not match (detail type and resources) ( "eventBridgeEvent.json", { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + "func": lambda *_: None, + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + False, ), + # with source and resources + # unmatch all ( "eventBridgeEvent.json", { - "func": None, - "detail_type": "EC2 Instance State-change Notification V2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], + "func": lambda *_: None, + "source": "aws.lambda", + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-99999999999999999"], }, + False, ), + # with detail_type ( "eventBridgeEvent.json", { - "func": None, + "func": lambda *_: None, "detail_type": "EC2 Instance State-change Notification", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], }, + True, ), - # eventBridgeEvent.json, not match (source and resources arguments) ( "eventBridgeEvent.json", { - "func": None, - "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + "func": lambda *_: None, + "detail_type": "EC2 Instance State-change Notification V2", }, + False, ), + # with source ( "eventBridgeEvent.json", { - "func": None, + "func": lambda *_: None, + "source": "aws.ec2", + }, + True, + ), + ( + "eventBridgeEvent.json", + { + "func": lambda *_: None, "source": "aws.lambda", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + False, ), + # with resources ( "eventBridgeEvent.json", { - "func": None, - "source": "aws.ec2", - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + "func": lambda *_: None, + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"], }, + True, ), - # eventBridgeEvent.json, not match detail_type - ("eventBridgeEvent.json", {"func": None, "detail_type": "EC2 Instance State-change Notification V2"}), - # eventBridgeEvent.json, not match source - ("eventBridgeEvent.json", {"func": None, "source": "aws.lambda"}), - # eventBridgeEvent.json, not match resources ( "eventBridgeEvent.json", { - "func": None, - "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-9999999999abcdef9"], + "func": lambda *_: None, + "resources": ["arn:aws:ec2:us-west-1:123456789012:instance/i-99999999999999999"], }, + False, ), ], ) - def test_match_false(self, event_name, option_constructor): + def test_match_for_event_bridge_event(self, event_name, option_constructor, is_match): event = load_event(file_name=event_name) route = EventBridgeRoute(**option_constructor) actual = route.match(event=event) - assert actual is None + if is_match: + expected = route.func, EventBridgeEvent(event) + assert actual == expected + else: + assert actual is None @pytest.mark.parametrize( "event_name", From 31b9dafe1bf6c6634eee3947cde8ac704ea9a52d Mon Sep 17 00:00:00 2001 From: sinofseven Date: Thu, 13 Feb 2025 23:18:10 +0900 Subject: [PATCH 024/139] add test for s3.py --- .../async_execution/routes/s3.py | 8 +- .../_async_execution/_routes/test_s3.py | 1397 +++++++++++++++++ 2 files changed, 1401 insertions(+), 4 deletions(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/s3.py b/aws_lambda_powertools/event_handler/async_execution/routes/s3.py index 61fed9e3bad..836fd6bdb13 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/s3.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/s3.py @@ -63,10 +63,10 @@ def __init__( def is_target_with_bucket(self, bucket: str | None) -> bool: if not bucket: return False - elif self.bucket and self.bucket == bucket: - return True - elif self.bucket_prefix and bucket.find(self.bucket_prefix) == 0: - return True + elif self.bucket: + return self.bucket == bucket + elif self.bucket_prefix: + return bucket.find(self.bucket_prefix) == 0 else: return False diff --git a/tests/unit/event_handler/_async_execution/_routes/test_s3.py b/tests/unit/event_handler/_async_execution/_routes/test_s3.py index b5b50e40505..0ad7c8062b5 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_s3.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_s3.py @@ -1,10 +1,1407 @@ import pytest from aws_lambda_powertools.event_handler.async_execution.routes.s3 import S3Route +from aws_lambda_powertools.utilities.data_classes.s3_event import S3Event from tests.functional.utils import load_event class TestS3Route: + def test_constructor_error(self): + with pytest.raises(ValueError): + S3Route(func=None) + + @pytest.mark.parametrize( + "option_constructor, option_func, expected", + [ + # without bucket at option_func + ( + {"func": None, "bucket": "lambda-artifacts-deafc19498e3f2df", "bucket_prefix": "lambda-artifacts-d"}, + {"bucket": None}, + False, + ), + # with bucket and bucket_prefix + # match all + ( + {"func": None, "bucket": "lambda-artifacts-deafc19498e3f2df", "bucket_prefix": "lambda-artifacts-d"}, + {"bucket": "lambda-artifacts-deafc19498e3f2df"}, + True, + ), + # with bucket and bucket_prefix + # match 1, unmatch 1 + ( + {"func": None, "bucket": "lambda-artifacts-deafc19498e3f2df", "bucket_prefix": "ambda-artifacts-d"}, + {"bucket": "lambda-artifacts-deafc19498e3f2df"}, + True, + ), + ( + {"func": None, "bucket": "lambda-artifacts-9999999999999999", "bucket_prefix": "lambda-artifacts-d"}, + {"bucket": "lambda-artifacts-deafc19498e3f2df"}, + False, + ), + # with bucket and bucket_prefix + # unmatch all + ( + {"func": None, "bucket": "lambda-artifacts-9999999999999999", "bucket_prefix": "ambda-artifacts-d"}, + {"bucket": "lambda-artifacts-deafc19498e3f2df"}, + False, + ), + # with bucket + ( + { + "func": None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + }, + {"bucket": "lambda-artifacts-deafc19498e3f2df"}, + True, + ), + ( + { + "func": None, + "bucket": "lambda-artifacts-9999999999999999", + }, + {"bucket": "lambda-artifacts-deafc19498e3f2df"}, + False, + ), + # with bucket_prefix + ( + { + "func": None, + "bucket_prefix": "lambda-a", + }, + {"bucket": "lambda-artifacts-deafc19498e3f2df"}, + True, + ), + ( + { + "func": None, + "bucket_prefix": "ambda-a", + }, + {"bucket": "lambda-artifacts-deafc19498e3f2df"}, + False, + ), + # without bucket and bucket_prefix + ( + {"func": None, "key": "b21b84d653bb07b05b1e6b33684dc11b"}, + {"bucket": "lambda-artifacts-deafc19498e3f2df"}, + False, + ), + ], + ) + def test_is_target_with_bucket(self, option_constructor, option_func, expected): + route = S3Route(**option_constructor) + actual = route.is_target_with_bucket(**option_func) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option_func, expected", + [ + # without key at option_func + ( + {"func": None, "key": "b21b84d653bb07b05b1e6b33684dc11b", "key_prefix": "b21b", "key_suffix": "c11b"}, + {"key": None}, + False, + ), + # without key, key_prefix, and key_suffix + ( + {"func": None, "bucket": "lambda-artifacts-deafc19498e3f2df"}, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key, key_prefix, and key_suffix + # match all + ( + {"func": None, "key": "b21b84d653bb07b05b1e6b33684dc11b", "key_prefix": "b21b", "key_suffix": "c11b"}, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + # with key, key_prefix, and key_suffix + # match 2, unmatch 1 + ( + {"func": None, "key": "b21b84d653bb07b05b1e6b33684dc11b", "key_prefix": "b21b", "key_suffix": "9999"}, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + ( + {"func": None, "key": "b21b84d653bb07b05b1e6b33684dc11b", "key_prefix": "9999", "key_suffix": "c11b"}, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + ( + {"func": None, "key": "99999999999999999999999999999999", "key_prefix": "b21b", "key_suffix": "c11b"}, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key, key_prefix, and key_suffix + # match 1, unmatch 2 + ( + {"func": None, "key": "b21b84d653bb07b05b1e6b33684dc11b", "key_prefix": "9999", "key_suffix": "9999"}, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + ( + {"func": None, "key": "99999999999999999999999999999999", "key_prefix": "b21b", "key_suffix": "9999"}, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + ( + {"func": None, "key": "99999999999999999999999999999999", "key_prefix": "9999", "key_suffix": "c11b"}, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key, key_prefix, and key_suffix + # unmatch all + ( + {"func": None, "key": "99999999999999999999999999999999", "key_prefix": "9999", "key_suffix": "9999"}, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key, key_prefix + # match all + ( + { + "func": None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "key_prefix": "b21b", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + # with key, key_prefix + # match 1, unmatch 1 + ( + { + "func": None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "key_prefix": "9999", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + ( + { + "func": None, + "key": "99999999999999999999999999999999", + "key_prefix": "b21b", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key, key_prefix + # unmatch all + ( + { + "func": None, + "key": "99999999999999999999999999999999", + "key_prefix": "9999", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key, key_suffix + # match all + ( + { + "func": None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "key_suffix": "c11b", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + # with key, key_suffix + # match 1, unmatch 1 + ( + { + "func": None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "key_suffix": "9999", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + ( + { + "func": None, + "key": "99999999999999999999999999999999", + "key_suffix": "c11b", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key, key_suffix + # unmatch all + ( + { + "func": None, + "key": "99999999999999999999999999999999", + "key_suffix": "9999", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key_prefix, key_suffix + # match all + ( + { + "func": None, + "key_prefix": "b21b", + "key_suffix": "c11b", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + # with key_prefix, key_suffix + # match 1, unmatch 1 + ( + { + "func": None, + "key_prefix": "b21b", + "key_suffix": "9999", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + ( + { + "func": None, + "key_prefix": "9999", + "key_suffix": "c11b", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key_prefix, key_suffix + # unmatch all + ( + { + "func": None, + "key_prefix": "9999", + "key_suffix": "9999", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key + ( + { + "func": None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + ( + { + "func": None, + "key": "99999999999999999999999999999999", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with key_prefix + ( + { + "func": None, + "key_prefix": "b21b", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + ( + { + "func": None, + "key_prefix": "9999", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + # with_key_suffix + ( + { + "func": None, + "key_suffix": "c11b", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + True, + ), + ( + { + "func": None, + "key_suffix": "9999", + }, + {"key": "b21b84d653bb07b05b1e6b33684dc11b"}, + False, + ), + ], + ) + def test_is_target_with_key(self, option_constructor, option_func, expected): + route = S3Route(**option_constructor) + actual = route.is_target_with_key(**option_func) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option_func, expected", + [ + # without event_name and event_name_prefix + ({"func": None, "bucket": "lambda-artifacts-deafc19498e3f2df"}, {"event_name": "ObjectCreated:Put"}, False), + # without event_name at option_func + ( + {"func": None, "event_name": "ObjectCreated:Put", "event_name_prefix": "ObjectCreated:"}, + {"event_name": None}, + False, + ), + # with event_name and event_name_prefix + # match all + ( + {"func": None, "event_name": "ObjectCreated:Put", "event_name_prefix": "ObjectCreated:"}, + {"event_name": "ObjectCreated:Put"}, + True, + ), + # with event_name and event_name_prefix + # match 1, unmatch 1 + ( + {"func": None, "event_name": "ObjectCreated:Put", "event_name_prefix": "bjectCreated:"}, + {"event_name": "ObjectCreated:Put"}, + True, + ), + ( + {"func": None, "event_name": "ObjectCreated:PutV2", "event_name_prefix": "ObjectCreated:"}, + {"event_name": "ObjectCreated:Put"}, + False, + ), + # with event_name and event_name_prefix + # unmatch all + ( + {"func": None, "event_name": "ObjectCreated:PutV2", "event_name_prefix": "bjectCreated:"}, + {"event_name": "ObjectCreated:Put"}, + False, + ), + # with event_name + ( + { + "func": None, + "event_name": "ObjectCreated:Put", + }, + {"event_name": "ObjectCreated:Put"}, + True, + ), + ( + { + "func": None, + "event_name": "ObjectCreated:PutV2", + }, + {"event_name": "ObjectCreated:Put"}, + False, + ), + # with event_name_prefix + ( + { + "func": None, + "event_name_prefix": "ObjectCreated:", + }, + {"event_name": "ObjectCreated:Put"}, + True, + ), + ( + { + "func": None, + "event_name_prefix": "bjectCreated:", + }, + {"event_name": "ObjectCreated:Put"}, + False, + ), + ], + ) + def test_is_target_with_event_name(self, option_constructor, option_func, expected): + route = S3Route(**option_constructor) + actual = route.is_target_with_event_name(**option_func) + assert actual == expected + + @pytest.mark.parametrize( + "option_constructor, option_func, expected", + [ + # without configuration_id and configuration_id_prefix + ( + {"func": None, "bucket": "lambda-artifacts-deafc19498e3f2df"}, + {"configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1"}, + False, + ), + # without configuration_id at option_func + ( + { + "func": None, + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + "configuration_id_prefix": "828aa6fc-f", + }, + {"configuration_id": None}, + False, + ), + # with configuration_id and configuration_id_prefix + # match all + ( + { + "func": None, + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + "configuration_id_prefix": "828aa6fc-f", + }, + { + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + # with configuration_id and configuration_id_prefix + # match 1, unmatch 1 + ( + { + "func": None, + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + "configuration_id_prefix": "28aa6fc-f", + }, + { + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + ( + { + "func": None, + "configuration_id": "99999999-9999-9999-9999-999999999999", + "configuration_id_prefix": "828aa6fc-f", + }, + { + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with configuration_id and configuration_id_prefix + # unmatch all + ( + { + "func": None, + "configuration_id": "99999999-9999-9999-9999-999999999999", + "configuration_id_prefix": "28aa6fc-f", + }, + { + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with configuration_id + ( + { + "func": None, + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + { + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + ( + { + "func": None, + "configuration_id": "99999999-9999-9999-9999-999999999999", + }, + { + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with configuration_id_prefix + ( + { + "func": None, + "configuration_id_prefix": "828aa6fc-f", + }, + { + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + ( + { + "func": None, + "configuration_id_prefix": "28aa6fc-f", + }, + { + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + ], + ) + def test_is_target_with_configuration_id(self, option_constructor, option_func, expected): + route = S3Route(**option_constructor) + actual = route.is_target_with_configuration_id(**option_func) + assert actual == expected + + @pytest.mark.parametrize( + "event_name, option_constructor, is_match", + [ + # with bucket, key, event_name, and configuration_id + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + # with bucket, key, event_name, and configuration_id + # match 3, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with bucket, key, event_name, and configuration_id + # match 2, unmatch 2 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with bucket, key, event_name, and configuration_id + # match 1, unmatch 3 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with bucket, key, event_name, and configuration_id + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + # with bucket, key, and event_name + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:Put", + }, + True, + ), + # with bucket, key, and event_name + # match 2, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:PutV2", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:Put", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:Put", + }, + False, + ), + # with bucket, key, and event_name + # match 1, unmatch 2 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:PutV2", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:PutV2", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:Put", + }, + False, + ), + # with bucket, key, and event_name + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:PutV2", + }, + False, + ), + # with bucket, key, and configuration_id + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + # with bucket, key, and configuration_id + # match 2, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "99999999999999999999999999999999", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with bucket, key, and configuration_id + # match 1, unmatch 2 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "99999999999999999999999999999999", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "99999999999999999999999999999999", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + # with bucket, key, and configuration_id + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "99999999999999999999999999999999", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + # with bucket, event_name, and configuration_id + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + # with bucket, event_name, and configuration_id + # match 2, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with bucket, event_name, and configuration_id + # match 1, unmatch 2 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with bucket, event_name, and configuration_id + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + # with key, event_name, configuration_id + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + # with key, event_name, configuration_id + # match 2, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with key, event_name, configuration_id + # match 1, unmatch 2 + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with key, event_name, and configuration_id + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + # with bucket and key + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + }, + True, + ), + # with bucket and key + # match 1, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "key": "99999999999999999999999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "b21b84d653bb07b05b1e6b33684dc11b", + }, + False, + ), + # with bucket and key + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "key": "99999999999999999999999999999999", + }, + False, + ), + # with bucket and event_name + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "event_name": "ObjectCreated:Put", + }, + True, + ), + # with bucket and event_name + # match 1, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "event_name": "ObjectCreated:PutV2", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "event_name": "ObjectCreated:Put", + }, + False, + ), + # with bucket and event_name + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "event_name": "ObjectCreated:PutV2", + }, + False, + ), + # with bucket and configuration_id + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + # with bucket and configuration_id + # match 1, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with bucket and configuration_id + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + # with key and event_name + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:Put", + }, + True, + ), + # with key and event_name + # match 1, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "event_name": "ObjectCreated:PutV2", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:Put", + }, + False, + ), + # with key and event_name + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "99999999999999999999999999999999", + "event_name": "ObjectCreated:PutV2", + }, + False, + ), + # with key and configuration_id + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + # with key and configuration_id + # match 1, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "99999999999999999999999999999999", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with key and configuration_id + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "99999999999999999999999999999999", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + # with event_name and configuration_id + # match all + ( + "s3Event.json", + { + "func": lambda *_: None, + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + True, + ), + # with event_name and configuration_id + # match 1, unmatch 1 + ( + "s3Event.json", + { + "func": lambda *_: None, + "event_name": "ObjectCreated:Put", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1", + }, + False, + ), + # with event_name and configuration_id + # unmatch all + ( + "s3Event.json", + { + "func": lambda *_: None, + "event_name": "ObjectCreated:PutV2", + "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999", + }, + False, + ), + # with bucket + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-deafc19498e3f2df", + }, + True, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "bucket": "lambda-artifacts-9999999999999999", + }, + False, + ), + # with key + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "b21b84d653bb07b05b1e6b33684dc11b", + }, + True, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "key": "99999999999999999999999999999999", + }, + False, + ), + # with event_name + ( + "s3Event.json", + { + "func": lambda *_: None, + "event_name": "ObjectCreated:Put", + }, + True, + ), + ( + "s3Event.json", + { + "func": lambda *_: None, + "event_name": "ObjectCreated:PutV2", + }, + False, + ), + # with configuration_id + ( + "s3Event.json", + {"func": lambda *_: None, "configuration_id": "828aa6fc-f7b5-4305-8584-487c791949c1"}, + True, + ), + ( + "s3Event.json", + {"func": lambda *_: None, "configuration_id": "828aa6fc-f7b5-4305-8584-999999999999"}, + False, + ), + ], + ) + def test_match_for_s3_event(self, event_name, option_constructor, is_match): + event = load_event(file_name=event_name) + route = S3Route(**option_constructor) + actual = route.match(event=event) + if is_match: + expected = route.func, S3Event(event) + assert actual == expected + else: + assert actual is None + @pytest.mark.parametrize( "event_name", [ From 0a59646ee43c5917d651f6cc74087a9a0b90ad04 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 28 Jan 2025 14:36:26 +0000 Subject: [PATCH 025/139] chore(ci): adding poetry export plugin to support v2 (#5941) Adding export plugin --- .github/workflows/publish_v3_layer.yml | 4 +++- .github/workflows/reusable_deploy_v3_layer_stack.yml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index a0bafe5c8c2..66cfd0b07c7 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -102,7 +102,9 @@ jobs: artifact_name: ${{ inputs.source_code_artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + run: | + pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + pipx inject poetry git+https://github.com/python-poetry/poetry-plugin-export@8c83d26603ca94f2e203bfded7b6d7f530960e06 # v1.8.0 - name: Setup Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml index 8aa7b5aa87e..27bab40f0db 100644 --- a/.github/workflows/reusable_deploy_v3_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml @@ -153,7 +153,9 @@ jobs: artifact_name: ${{ inputs.source_code_artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + run: | + pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + pipx inject poetry git+https://github.com/python-poetry/poetry-plugin-export@8c83d26603ca94f2e203bfded7b6d7f530960e06 # v1.8.0 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 with: From 67616a8e8fb5db02b1b473f9bd2605f223500c73 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 15:14:56 +0000 Subject: [PATCH 026/139] chore(ci): bump version to 3.5.0 (#5942) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index fedce557921..0dc016570a1 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.4.2a0" +VERSION = "3.5.0" diff --git a/pyproject.toml b/pyproject.toml index 26fa05c9273..66adab81eff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.4.2a0" +version = "3.5.0" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From bcd5108574fa83f275b60fafe74068fc524d8558 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Falc=C3=A3o?= Date: Tue, 28 Jan 2025 19:15:43 -0300 Subject: [PATCH 027/139] fix(docs): typo in a service name in Event Handler (#5944) --- docs/core/event_handler/api_gateway.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/core/event_handler/api_gateway.md b/docs/core/event_handler/api_gateway.md index 1f9618839f9..f2a60697740 100644 --- a/docs/core/event_handler/api_gateway.md +++ b/docs/core/event_handler/api_gateway.md @@ -3,11 +3,11 @@ title: REST API description: Core utility --- -Event handler for Amazon API Gateway REST and HTTP APIs, Application Loader Balancer (ALB), Lambda Function URLs, and VPC Lattice. +Event handler for Amazon API Gateway REST and HTTP APIs, Application Load Balancer (ALB), Lambda Function URLs, and VPC Lattice. ## Key Features -* Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB and Lambda Function URLs. +* Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB and Lambda Function URLs * Support for CORS, binary and Gzip compression, Decimals JSON encoding and bring your own JSON serializer * Built-in integration with [Event Source Data Classes utilities](../../utilities/data_classes.md){target="_blank"} for self-documented event schema * Works with micro function (one or a few routes) and monolithic functions (all routes) From fd5c54833e6696f30dd2e686f3e903559f108ffb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 09:32:29 +0000 Subject: [PATCH 028/139] chore(ci): new pre-release 3.5.1a0 (#5945) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.5.1a0/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.5.1a0/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index 0dc016570a1..f3d30c2f2c8 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.0" +VERSION = "3.5.1a0" diff --git a/provenance/3.5.1a0/multiple.intoto.jsonl b/provenance/3.5.1a0/multiple.intoto.jsonl new file mode 100644 index 00000000000..a9997a0d56c --- /dev/null +++ b/provenance/3.5.1a0/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWEwLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiNTFmNGRlNmI4MmIxMTc1ZTEyYTQzZTk2MzkxMTQ5NTNiN2U3OTg2NDc0YTVhZjA0ODVmNjBlZTU5NzU2NzVhNyJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWEwLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJiMmFmM2Q1MzNlNDgwYTk2MTg3YjYxMzBlZjczMDc0Nzc1MjAwMTlmYzc2ODdiZDY4YjdjNDYxMWY3MTZkMjA3In19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiYjZlYzZmMTkzZTRkZDMwZmIyY2NmMTEyOTU4MjM0Yzk2NTdlZDJiOSJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwNiwiZm9ya3NfY291bnQiOjQwNiwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo2Nywib3Blbl9pc3N1ZXNfY291bnQiOjY3LCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDEtMjhUMjI6MTY6NDVaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjY2MzQ0LCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5NzQsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDEtMjhUMjI6NTU6NTlaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5NzQsIndhdGNoZXJzX2NvdW50IjoyOTc0LCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzAyNjkyODE3MyIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTY0IiwiZ2l0aHViX3NoYTEiOiJiNmVjNmYxOTNlNGRkMzBmYjJjY2YxMTI5NTgyMzRjOTY1N2VkMmI5In19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMDI2OTI4MTczLTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiJiNmVjNmYxOTNlNGRkMzBmYjJjY2YxMTI5NTgyMzRjOTY1N2VkMmI5In19XX19","signatures":[{"keyid":"","sig":"MEUCIQCMg0LGVf4Zu1O5LjZ7Q1/+szZ1YccUjjnRZDx2nQVb/wIgSZh14aPbRN0zMaYNDMk4ZdCXd9E1CtHXCfLgw/6qnFo=","cert":"-----BEGIN CERTIFICATE-----\nMIIHZzCCBuygAwIBAgIUEKZOdzPXWqg4MsQ87g7UXfoC2/gwCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMTI5MDgwNzM1WhcNMjUwMTI5MDgxNzM1WjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAE+9PjDmRC4JqsGtX/4V2yxIWCCpmZYvyOcpxU\n2wJNwXY1ZRdNxJ7OHnnWvs5N26sT60hBOsFxvGdWcw1CfpQhraOCBgswggYHMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQULCxP\nvubmcuugMkxmyfldf6HtME4wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChiNmVj\nNmYxOTNlNGRkMzBmYjJjY2YxMTI5NTgyMzRjOTY1N2VkMmI5MBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDChiNmVjNmYxOTNlNGRkMzBmYjJjY2YxMTI5NTgyMzRjOTY1N2VkMmI5MCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoYjZl\nYzZmMTkzZTRkZDMwZmIyY2NmMTEyOTU4MjM0Yzk2NTdlZDJiOTAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMwMjY5MjgxNzMvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlLEZ9LAAAAQDAEcwRQIgJThr5prui9R+c3JmaIJN\nec0+525TvxZSRAiobcMJV9cCIQCW44ih+9wJwWz3Wid5lw+adewOC1MUBknLm37r\nVuZBYDAKBggqhkjOPQQDAwNpADBmAjEA7ogxP6H1wMLvnVr1ZXe+UMvWat95VJ1m\nQUqtX3uGLjCHZCb7HZliaXKLiTDhjf0jAjEAgLeaXm9ewmBqFJ6BOJmjvRCU7aMn\nv65stm8v4QxjA8PVQUpmTvloVdUBQKTqndLr\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 66adab81eff..47766e867d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.0" +version = "3.5.1a0" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From 9b9acb259baf76b6d958483c23c7ab83149b89bc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 12:05:31 +0000 Subject: [PATCH 029/139] chore(ci): changelog rebuild (#5946) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b64fd7bc13..22772264a1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,17 @@ ## Bug Fixes +* **docs:** typo in a service name in Event Handler ([#5944](https://github.com/aws-powertools/powertools-lambda-python/issues/5944)) + +## Maintenance + +* **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) + + + +## [v3.5.0] - 2025-01-28 +## Bug Fixes + * **event_handler:** fixes typo in variable name `fronzen_openapi_extensions` ([#5929](https://github.com/aws-powertools/powertools-lambda-python/issues/5929)) * **event_handler:** add tests for PEP 563 compatibility with OpenAPI ([#5886](https://github.com/aws-powertools/powertools-lambda-python/issues/5886)) * **event_handler:** fix forward references resolution in OpenAPI ([#5885](https://github.com/aws-powertools/powertools-lambda-python/issues/5885)) @@ -27,24 +38,29 @@ ## Maintenance +* version bump +* **ci:** adding poetry export plugin to support v2 ([#5941](https://github.com/aws-powertools/powertools-lambda-python/issues/5941)) +* **ci:** adding poetry export plugin to support v2 ([#5938](https://github.com/aws-powertools/powertools-lambda-python/issues/5938)) * **ci:** adjust token permission ([#5867](https://github.com/aws-powertools/powertools-lambda-python/issues/5867)) * **ci:** new pre-release 3.4.2a0 ([#5873](https://github.com/aws-powertools/powertools-lambda-python/issues/5873)) * **ci:** make `pyproject.toml` fully compatible with Poetryv2 ([#5902](https://github.com/aws-powertools/powertools-lambda-python/issues/5902)) -* **ci:** fix permissions for gh pages ([#5866](https://github.com/aws-powertools/powertools-lambda-python/issues/5866)) * **ci:** drop support for Python 3.8 ([#5896](https://github.com/aws-powertools/powertools-lambda-python/issues/5896)) -* **deps:** bump squidfunk/mkdocs-material from `ba73db5` to `41942f7` in /docs ([#5890](https://github.com/aws-powertools/powertools-lambda-python/issues/5890)) +* **ci:** update poetry version to v2 ([#5936](https://github.com/aws-powertools/powertools-lambda-python/issues/5936)) +* **ci:** fix permissions for gh pages ([#5866](https://github.com/aws-powertools/powertools-lambda-python/issues/5866)) * **deps:** bump pydantic from 2.10.5 to 2.10.6 ([#5918](https://github.com/aws-powertools/powertools-lambda-python/issues/5918)) -* **deps-dev:** bump cfn-lint from 1.22.5 to 1.22.6 ([#5900](https://github.com/aws-powertools/powertools-lambda-python/issues/5900)) +* **deps:** bump squidfunk/mkdocs-material from `ba73db5` to `41942f7` in /docs ([#5890](https://github.com/aws-powertools/powertools-lambda-python/issues/5890)) +* **deps-dev:** bump boto3-stubs from 1.36.4 to 1.36.5 ([#5919](https://github.com/aws-powertools/powertools-lambda-python/issues/5919)) +* **deps-dev:** bump boto3-stubs from 1.36.4 to 1.36.6 ([#5923](https://github.com/aws-powertools/powertools-lambda-python/issues/5923)) * **deps-dev:** bump cfn-lint from 1.22.6 to 1.22.7 ([#5910](https://github.com/aws-powertools/powertools-lambda-python/issues/5910)) * **deps-dev:** bump testcontainers from 3.7.1 to 4.9.1 ([#5907](https://github.com/aws-powertools/powertools-lambda-python/issues/5907)) * **deps-dev:** bump pytest-benchmark from 4.0.0 to 5.1.0 ([#5909](https://github.com/aws-powertools/powertools-lambda-python/issues/5909)) -* **deps-dev:** bump ruff from 0.9.2 to 0.9.3 ([#5911](https://github.com/aws-powertools/powertools-lambda-python/issues/5911)) +* **deps-dev:** bump aws-cdk from 2.176.0 to 2.177.0 ([#5930](https://github.com/aws-powertools/powertools-lambda-python/issues/5930)) * **deps-dev:** bump pytest-cov from 5.0.0 to 6.0.0 ([#5908](https://github.com/aws-powertools/powertools-lambda-python/issues/5908)) -* **deps-dev:** bump pytest-asyncio from 0.24.0 to 0.25.2 ([#5920](https://github.com/aws-powertools/powertools-lambda-python/issues/5920)) -* **deps-dev:** bump boto3-stubs from 1.36.4 to 1.36.5 ([#5919](https://github.com/aws-powertools/powertools-lambda-python/issues/5919)) -* **deps-dev:** bump boto3-stubs from 1.36.4 to 1.36.6 ([#5923](https://github.com/aws-powertools/powertools-lambda-python/issues/5923)) +* **deps-dev:** bump aws-cdk-lib from 2.176.0 to 2.177.0 ([#5931](https://github.com/aws-powertools/powertools-lambda-python/issues/5931)) +* **deps-dev:** bump cfn-lint from 1.22.5 to 1.22.6 ([#5900](https://github.com/aws-powertools/powertools-lambda-python/issues/5900)) +* **deps-dev:** bump boto3-stubs from 1.36.6 to 1.36.7 ([#5932](https://github.com/aws-powertools/powertools-lambda-python/issues/5932)) * **deps-dev:** bump boto3-stubs from 1.36.2 to 1.36.3 ([#5894](https://github.com/aws-powertools/powertools-lambda-python/issues/5894)) -* **deps-dev:** bump aws-cdk from 2.176.0 to 2.177.0 ([#5930](https://github.com/aws-powertools/powertools-lambda-python/issues/5930)) +* **deps-dev:** bump pytest-asyncio from 0.24.0 to 0.25.2 ([#5920](https://github.com/aws-powertools/powertools-lambda-python/issues/5920)) * **deps-dev:** bump mkdocs-material from 9.5.49 to 9.5.50 ([#5889](https://github.com/aws-powertools/powertools-lambda-python/issues/5889)) * **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.175.1a0 to 2.176.0a0 ([#5882](https://github.com/aws-powertools/powertools-lambda-python/issues/5882)) * **deps-dev:** bump boto3-stubs from 1.36.1 to 1.36.2 ([#5881](https://github.com/aws-powertools/powertools-lambda-python/issues/5881)) @@ -55,9 +71,9 @@ * **deps-dev:** bump sentry-sdk from 2.19.2 to 2.20.0 ([#5870](https://github.com/aws-powertools/powertools-lambda-python/issues/5870)) * **deps-dev:** bump boto3-stubs from 1.35.97 to 1.35.99 ([#5874](https://github.com/aws-powertools/powertools-lambda-python/issues/5874)) * **deps-dev:** bump cfn-lint from 1.22.4 to 1.22.5 ([#5872](https://github.com/aws-powertools/powertools-lambda-python/issues/5872)) -* **deps-dev:** bump aws-cdk-lib from 2.176.0 to 2.177.0 ([#5931](https://github.com/aws-powertools/powertools-lambda-python/issues/5931)) -* **deps-dev:** bump boto3-stubs from 1.36.6 to 1.36.7 ([#5932](https://github.com/aws-powertools/powertools-lambda-python/issues/5932)) * **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.176.0a0 to 2.177.0a0 ([#5933](https://github.com/aws-powertools/powertools-lambda-python/issues/5933)) +* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.289 to 0.1.290 ([#5917](https://github.com/aws-powertools/powertools-lambda-python/issues/5917)) +* **deps-dev:** bump ruff from 0.9.2 to 0.9.3 ([#5911](https://github.com/aws-powertools/powertools-lambda-python/issues/5911)) @@ -5933,7 +5949,8 @@ * Merge pull request [#5](https://github.com/aws-powertools/powertools-lambda-python/issues/5) from jfuss/feat/python38 -[Unreleased]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.4.1...HEAD +[Unreleased]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.5.0...HEAD +[v3.5.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.4.1...v3.5.0 [v3.4.1]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.4.0...v3.4.1 [v3.4.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.3.0...v3.4.0 [v3.3.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.2.0...v3.3.0 From 6539bd0ac80342c75bd9ef715a3579e0f5a24098 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 29 Jan 2025 22:44:05 +0000 Subject: [PATCH 030/139] fix(logger): child logger must respect log level (#5950) Child logger must respect log level --- aws_lambda_powertools/logging/logger.py | 6 +++++- .../logger/required_dependencies/test_logger.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index c242f5c9bd4..ab29b6af649 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -285,7 +285,11 @@ def _init_logger( # b) different sampling mechanisms # c) multiple messages from being logged as handlers can be duplicated is_logger_preconfigured = getattr(self._logger, LOGGER_ATTRIBUTE_PRECONFIGURED, False) - if self.child or is_logger_preconfigured: + if self.child: + self.setLevel(log_level) + return + + if is_logger_preconfigured: return self.setLevel(log_level) diff --git a/tests/functional/logger/required_dependencies/test_logger.py b/tests/functional/logger/required_dependencies/test_logger.py index 70f08f1bbdd..5c85677d73d 100644 --- a/tests/functional/logger/required_dependencies/test_logger.py +++ b/tests/functional/logger/required_dependencies/test_logger.py @@ -1217,3 +1217,18 @@ def remove_keys(self, keys: Iterable[str]) -> None: # THEN the context keys should not persist current_keys = logger.get_current_keys() assert current_keys == {} + + +def test_logger_change_level_child_logger(stdout, service_name): + # GIVEN a new Logger and child Logger + logger = Logger(service=service_name, stream=stdout) + child_logger = Logger(service=service_name, child=True, stream=stdout, level="DEBUG") + + # WHEN we emit logs for both in DEBUG level + logger.debug("PARENT") + child_logger.debug("CHILD") + + # THEN only child log must emit log due to level + logs = list(stdout.getvalue().strip().split("\n")) + assert len(logs) == 1 + assert "service" in logs[0] From 77fcd8e9c8ed755e7fe7be723ad0586c8ef8e241 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 29 Jan 2025 22:46:43 +0000 Subject: [PATCH 031/139] docs(layer): update layer version number - v3.5.0 (#5952) Updating layer version --- docs/includes/_layer_homepage_arm64.md | 290 ++++++++--------- docs/includes/_layer_homepage_x86.md | 300 +++++++++--------- docs/index.md | 16 +- examples/homepage/install/arm64/amplify.txt | 4 +- examples/homepage/install/arm64/cdk_arm64.py | 2 +- .../homepage/install/arm64/pulumi_arm64.py | 2 +- examples/homepage/install/arm64/sam.yaml | 2 +- .../homepage/install/arm64/serverless.yml | 2 +- examples/homepage/install/arm64/terraform.tf | 2 +- examples/homepage/install/x86_64/amplify.txt | 4 +- examples/homepage/install/x86_64/cdk_x86.py | 2 +- .../homepage/install/x86_64/pulumi_x86.py | 2 +- examples/homepage/install/x86_64/sam.yaml | 2 +- .../homepage/install/x86_64/serverless.yml | 2 +- examples/homepage/install/x86_64/terraform.tf | 2 +- examples/logger/sam/template.yaml | 2 +- examples/metrics/sam/template.yaml | 2 +- examples/metrics_datadog/sam/template.yaml | 2 +- examples/tracer/sam/template.yaml | 2 +- 19 files changed, 321 insertions(+), 321 deletions(-) diff --git a/docs/includes/_layer_homepage_arm64.md b/docs/includes/_layer_homepage_arm64.md index b92ff1c19be..b6d57fed27d 100644 --- a/docs/includes/_layer_homepage_arm64.md +++ b/docs/includes/_layer_homepage_arm64.md @@ -5,168 +5,168 @@ | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | === "Python 3.10" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | === "Python 3.11" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | === "Python 3.12" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | === "Python 3.13" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | diff --git a/docs/includes/_layer_homepage_x86.md b/docs/includes/_layer_homepage_x86.md index 6bcc0de4a5b..2fddfd4cbda 100644 --- a/docs/includes/_layer_homepage_x86.md +++ b/docs/includes/_layer_homepage_x86.md @@ -5,173 +5,173 @@ | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | === "Python 3.10" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | === "Python 3.11" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | === "Python 3.12" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | === "Python 3.13" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | diff --git a/docs/index.md b/docs/index.md index aff525011f7..f2155db96af 100644 --- a/docs/index.md +++ b/docs/index.md @@ -69,8 +69,8 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc | Architecture | Layer ARN | | ------------ | --------------------------------------------------------------------------------------------------------- | - | x86_64 | __arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:6__{: .copyMe}:clipboard: | - | ARM | __arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:6__{: .copyMe}:clipboard: | + | x86_64 | __arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:7__{: .copyMe}:clipboard: | + | ARM | __arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:7__{: .copyMe}:clipboard: | === "AWS Console" @@ -205,7 +205,7 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc You can use AWS CLI to generate a pre-signed URL to download the contents of our Lambda Layer. ```bash title="AWS CLI command to download Lambda Layer content" - aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 --region eu-west-1 + aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 --region eu-west-1 ``` You'll find the pre-signed URL under `Location` key as part of the CLI command output. @@ -220,15 +220,15 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc | Architecture | Layer ARN | | ------------ | --------------------------------------------------------------------------------------------------------- | - | x86_64 | __arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:6__{: .copyMe}:clipboard: | - | ARM | __arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:6__{: .copyMe}:clipboard: | + | x86_64 | __arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:7__{: .copyMe}:clipboard: | + | ARM | __arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:7__{: .copyMe}:clipboard: | **AWS GovCloud (us-gov-west-1)** | Architecture | Layer ARN | | ------------ | --------------------------------------------------------------------------------------------------------- | - | x86_64 | __arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:6__{: .copyMe}:clipboard: | - | ARM | __arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:6__{: .copyMe}:clipboard: | + | x86_64 | __arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:7__{: .copyMe}:clipboard: | + | ARM | __arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:7__{: .copyMe}:clipboard: | === "Serverless Application Repository (SAR)" @@ -319,7 +319,7 @@ In this context, `[aws-sdk]` is an alias to the `boto3` package. Due to dependen The pre-signed URL to download this Lambda Layer will be within `Location` key in the CLI output. The CLI output will also contain the Powertools for AWS Lambda version it contains. ```bash title="AWS CLI command to download Lambda Layer content" -aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 --region eu-west-1 +aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 --region eu-west-1 ``` #### SAR diff --git a/examples/homepage/install/arm64/amplify.txt b/examples/homepage/install/arm64/amplify.txt index 7621a2b88f7..58180d6debd 100644 --- a/examples/homepage/install/arm64/amplify.txt +++ b/examples/homepage/install/arm64/amplify.txt @@ -6,7 +6,7 @@ ? Do you want to configure advanced settings? Yes ... ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7 ❯ amplify push -y @@ -17,5 +17,5 @@ General information - Name: ? Which setting do you want to update? Lambda layers configuration ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7 ? Do you want to edit the local lambda function now? No diff --git a/examples/homepage/install/arm64/cdk_arm64.py b/examples/homepage/install/arm64/cdk_arm64.py index 2115eb70b54..933d8e9b709 100644 --- a/examples/homepage/install/arm64/cdk_arm64.py +++ b/examples/homepage/install/arm64/cdk_arm64.py @@ -10,7 +10,7 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: powertools_layer = aws_lambda.LayerVersion.from_layer_version_arn( self, id="lambda-powertools", - layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6", + layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7", ) aws_lambda.Function( self, diff --git a/examples/homepage/install/arm64/pulumi_arm64.py b/examples/homepage/install/arm64/pulumi_arm64.py index 401e64a19ec..69aa28b8ada 100644 --- a/examples/homepage/install/arm64/pulumi_arm64.py +++ b/examples/homepage/install/arm64/pulumi_arm64.py @@ -22,7 +22,7 @@ pulumi.Output.concat( "arn:aws:lambda:", aws.get_region_output().name, - ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6", + ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7", ), ], tracing_config={"mode": "Active"}, diff --git a/examples/homepage/install/arm64/sam.yaml b/examples/homepage/install/arm64/sam.yaml index 47596af46b9..8f66f7b2654 100644 --- a/examples/homepage/install/arm64/sam.yaml +++ b/examples/homepage/install/arm64/sam.yaml @@ -9,4 +9,4 @@ Resources: Runtime: python3.12 Handler: app.lambda_handler Layers: - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7 diff --git a/examples/homepage/install/arm64/serverless.yml b/examples/homepage/install/arm64/serverless.yml index 0f312201c51..41814b8953a 100644 --- a/examples/homepage/install/arm64/serverless.yml +++ b/examples/homepage/install/arm64/serverless.yml @@ -10,4 +10,4 @@ functions: handler: lambda_function.lambda_handler architecture: arm64 layers: - - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6 + - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7 diff --git a/examples/homepage/install/arm64/terraform.tf b/examples/homepage/install/arm64/terraform.tf index 504bad85045..938f1a7e0eb 100644 --- a/examples/homepage/install/arm64/terraform.tf +++ b/examples/homepage/install/arm64/terraform.tf @@ -34,7 +34,7 @@ resource "aws_lambda_function" "test_lambda" { role = aws_iam_role.iam_for_lambda.arn handler = "index.test" runtime = "python3.12" - layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6"] + layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7"] architectures = ["arm64"] source_code_hash = filebase64sha256("lambda_function_payload.zip") diff --git a/examples/homepage/install/x86_64/amplify.txt b/examples/homepage/install/x86_64/amplify.txt index 7e115842900..545cb731d19 100644 --- a/examples/homepage/install/x86_64/amplify.txt +++ b/examples/homepage/install/x86_64/amplify.txt @@ -6,7 +6,7 @@ ? Do you want to configure advanced settings? Yes ... ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 ❯ amplify push -y @@ -17,5 +17,5 @@ General information - Name: ? Which setting do you want to update? Lambda layers configuration ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 ? Do you want to edit the local lambda function now? No diff --git a/examples/homepage/install/x86_64/cdk_x86.py b/examples/homepage/install/x86_64/cdk_x86.py index cada7ccc549..c42687f00ca 100644 --- a/examples/homepage/install/x86_64/cdk_x86.py +++ b/examples/homepage/install/x86_64/cdk_x86.py @@ -10,7 +10,7 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: powertools_layer = aws_lambda.LayerVersion.from_layer_version_arn( self, id="lambda-powertools", - layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6", + layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7", ) aws_lambda.Function( self, diff --git a/examples/homepage/install/x86_64/pulumi_x86.py b/examples/homepage/install/x86_64/pulumi_x86.py index 4e71b4124ce..8093a4d067c 100644 --- a/examples/homepage/install/x86_64/pulumi_x86.py +++ b/examples/homepage/install/x86_64/pulumi_x86.py @@ -22,7 +22,7 @@ pulumi.Output.concat( "arn:aws:lambda:", aws.get_region_output().name, - ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6", + ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7", ), ], tracing_config={"mode": "Active"}, diff --git a/examples/homepage/install/x86_64/sam.yaml b/examples/homepage/install/x86_64/sam.yaml index 227cb925ba3..59bc71c2474 100644 --- a/examples/homepage/install/x86_64/sam.yaml +++ b/examples/homepage/install/x86_64/sam.yaml @@ -8,4 +8,4 @@ Resources: Runtime: python3.12 Handler: app.lambda_handler Layers: - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 diff --git a/examples/homepage/install/x86_64/serverless.yml b/examples/homepage/install/x86_64/serverless.yml index 377eb759288..850fcf36bac 100644 --- a/examples/homepage/install/x86_64/serverless.yml +++ b/examples/homepage/install/x86_64/serverless.yml @@ -10,4 +10,4 @@ functions: handler: lambda_function.lambda_handler architecture: arm64 layers: - - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 + - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 diff --git a/examples/homepage/install/x86_64/terraform.tf b/examples/homepage/install/x86_64/terraform.tf index 39ba18c9ac8..a1a37fb475a 100644 --- a/examples/homepage/install/x86_64/terraform.tf +++ b/examples/homepage/install/x86_64/terraform.tf @@ -34,7 +34,7 @@ resource "aws_lambda_function" "test_lambda" { role = aws_iam_role.iam_for_lambda.arn handler = "index.test" runtime = "python3.12" - layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6"] + layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } diff --git a/examples/logger/sam/template.yaml b/examples/logger/sam/template.yaml index f37909f5324..ede8c940ad8 100644 --- a/examples/logger/sam/template.yaml +++ b/examples/logger/sam/template.yaml @@ -14,7 +14,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 Resources: LoggerLambdaHandlerExample: diff --git a/examples/metrics/sam/template.yaml b/examples/metrics/sam/template.yaml index 77bdfa93782..2d57768fc88 100644 --- a/examples/metrics/sam/template.yaml +++ b/examples/metrics/sam/template.yaml @@ -15,7 +15,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 Resources: CaptureLambdaHandlerExample: diff --git a/examples/metrics_datadog/sam/template.yaml b/examples/metrics_datadog/sam/template.yaml index b34eccbd337..99d1fc35874 100644 --- a/examples/metrics_datadog/sam/template.yaml +++ b/examples/metrics_datadog/sam/template.yaml @@ -20,7 +20,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 # Find the latest Layer version in the Datadog official documentation # Datadog SDK diff --git a/examples/tracer/sam/template.yaml b/examples/tracer/sam/template.yaml index 9596c5307f5..8091369bb84 100644 --- a/examples/tracer/sam/template.yaml +++ b/examples/tracer/sam/template.yaml @@ -13,7 +13,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 Resources: CaptureLambdaHandlerExample: From 446c2ab28da8ed33a31c189a296d89c218271f93 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 08:50:56 +0000 Subject: [PATCH 032/139] chore(ci): new pre-release 3.5.1a1 (#5954) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.5.1a1/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.5.1a1/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index f3d30c2f2c8..e5f16482eba 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.1a0" +VERSION = "3.5.1a1" diff --git a/provenance/3.5.1a1/multiple.intoto.jsonl b/provenance/3.5.1a1/multiple.intoto.jsonl new file mode 100644 index 00000000000..2dd26095fa9 --- /dev/null +++ b/provenance/3.5.1a1/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWExLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiMDk2OGEyMzI2YjIxYTVhZWFhZWIwMGRlNjc3MzBkMmVhNTZiYjc3NWQxYjMxMDNiYjEwYTc0NTM1MjY0OTg5NiJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWExLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2NWQ0NGY4NmVhMGQ2YWM4YTI5OGU2NmMzYWM2MTBmNDljZmViOWI1MDk4MDQ2MDk1OGMzYTVjNDgwNTg2MDA2In19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiZTA5Njg5YTdhMjg4NjZhZDNkNDBjZTBhYjJlYzRjNTQyNzA1ZTE5ZSJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwNiwiZm9ya3NfY291bnQiOjQwNiwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo2NCwib3Blbl9pc3N1ZXNfY291bnQiOjY0LCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDEtMjlUMjI6NDk6MDdaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjY3MTQ1LCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5NzYsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDEtMzBUMDM6NDQ6MTRaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5NzYsIndhdGNoZXJzX2NvdW50IjoyOTc2LCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzA0Nzk3MzQwNiIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTY1IiwiZ2l0aHViX3NoYTEiOiJlMDk2ODlhN2EyODg2NmFkM2Q0MGNlMGFiMmVjNGM1NDI3MDVlMTllIn19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMDQ3OTczNDA2LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiJlMDk2ODlhN2EyODg2NmFkM2Q0MGNlMGFiMmVjNGM1NDI3MDVlMTllIn19XX19","signatures":[{"keyid":"","sig":"MEUCIQCBLSLpjdAzjXEI+uUgOIp9lbNSkIQ8i1GOph5wRlqbXgIgH+6TV2YFPMwtVweRyEDsEXTun6W+gSGlcCdiu9MAo5c=","cert":"-----BEGIN CERTIFICATE-----\nMIIHZjCCBuygAwIBAgIUSkDUoXdBfe9Fo1Q9YVMCzbnVY6AwCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMTMwMDgwNzM0WhcNMjUwMTMwMDgxNzM0WjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAE8P9Tc0P81VhGJ3zVYsBLxMS8R1Tm0Qe60x+D\nrERliHnUYwLNgr+QxSC9lbuWo6aBFiz4lw+M/6rLfYU4TslH/KOCBgswggYHMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUqoDE\nBFKyCsxPAk91/WVJCwYNrOIwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChlMDk2\nODlhN2EyODg2NmFkM2Q0MGNlMGFiMmVjNGM1NDI3MDVlMTllMBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDChlMDk2ODlhN2EyODg2NmFkM2Q0MGNlMGFiMmVjNGM1NDI3MDVlMTllMCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoZTA5\nNjg5YTdhMjg4NjZhZDNkNDBjZTBhYjJlYzRjNTQyNzA1ZTE5ZTAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMwNDc5NzM0MDYvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlLZASbsAAAQDAEcwRQIhALUOltioB1w4BsfPgRoe\nbuezMxCNMMyLfECBf76WunxlAiBwbmWEbl4s7Hd17l57epIvU2A29SVcWjnANMzl\nhWZJTjAKBggqhkjOPQQDAwNoADBlAjAK89ZnZ5nK7PX7kVJx4hQbSlTcPWmiDnMP\nPsfUK6B5cAfM9sA6Luxz9DpfYrJDSoMCMQC5hsRLnU1niiiw6b/ht9nWOBjLP+FD\nM4NmAGcpjxs+t5AUXyJR+YpOCYgnubmqOCA=\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 47766e867d0..368bd50a4a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.1a0" +version = "3.5.1a1" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From 79d35f3737b36c9562c2f9e3fcb8379dfe196ec4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 09:31:16 -0300 Subject: [PATCH 033/139] chore(ci): changelog rebuild (#5955) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22772264a1e..834edf15faf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,15 @@ ## Bug Fixes * **docs:** typo in a service name in Event Handler ([#5944](https://github.com/aws-powertools/powertools-lambda-python/issues/5944)) +* **logger:** child logger must respect log level ([#5950](https://github.com/aws-powertools/powertools-lambda-python/issues/5950)) + +## Documentation + +* **layer:** update layer version number - v3.5.0 ([#5952](https://github.com/aws-powertools/powertools-lambda-python/issues/5952)) ## Maintenance +* **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) From d9b802df07af88bae5101f7621cfcff1c827b989 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 20:01:25 -0300 Subject: [PATCH 034/139] chore(deps): bump actions/setup-python from 5.3.0 to 5.4.0 (#5960) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.3.0 to 5.4.0. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/0b93645e9fea7318ecaed2b359559ac225c90a2b...42375524e23c412d93fb67b49958b491fce71c38) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/pre-release.yml | 4 ++-- .github/workflows/publish_v2_layer.yml | 2 +- .github/workflows/publish_v3_layer.yml | 2 +- .github/workflows/quality_check.yml | 2 +- .github/workflows/quality_code_cdk_constructor.yml | 2 +- .github/workflows/release-v3.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- .github/workflows/reusable_deploy_v2_layer_stack.yml | 2 +- .github/workflows/reusable_deploy_v3_layer_stack.yml | 2 +- .github/workflows/reusable_publish_docs.yml | 2 +- .github/workflows/run-e2e-tests.yml | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index ea8d298ff5c..fac36206d43 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -126,7 +126,7 @@ jobs: - name: Install poetry run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" cache: "poetry" @@ -164,7 +164,7 @@ jobs: - name: Install poetry run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" cache: "poetry" diff --git a/.github/workflows/publish_v2_layer.yml b/.github/workflows/publish_v2_layer.yml index 59518cd0c54..2be35a29df2 100644 --- a/.github/workflows/publish_v2_layer.yml +++ b/.github/workflows/publish_v2_layer.yml @@ -105,7 +105,7 @@ jobs: with: node-version: "16.12" - name: Setup python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" cache: "pip" diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 66cfd0b07c7..976b10c6f28 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -110,7 +110,7 @@ jobs: with: node-version: "18.20.4" - name: Setup python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: ${{ matrix.python-version }} cache: "pip" diff --git a/.github/workflows/quality_check.yml b/.github/workflows/quality_check.yml index 4b6a7fa2c8c..a0577598456 100644 --- a/.github/workflows/quality_check.yml +++ b/.github/workflows/quality_check.yml @@ -56,7 +56,7 @@ jobs: - name: Install poetry run: pipx install poetry - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: ${{ matrix.python-version }} - name: Install dependencies diff --git a/.github/workflows/quality_code_cdk_constructor.yml b/.github/workflows/quality_code_cdk_constructor.yml index e4826ce8f52..181cd8b53a4 100644 --- a/.github/workflows/quality_code_cdk_constructor.yml +++ b/.github/workflows/quality_code_cdk_constructor.yml @@ -46,7 +46,7 @@ jobs: - name: Install poetry run: pipx install poetry - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: ${{ matrix.python-version }} cache: "poetry" diff --git a/.github/workflows/release-v3.yml b/.github/workflows/release-v3.yml index a7bbaeaf660..6a351b3262a 100644 --- a/.github/workflows/release-v3.yml +++ b/.github/workflows/release-v3.yml @@ -131,7 +131,7 @@ jobs: - name: Install poetry run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" cache: "poetry" @@ -169,7 +169,7 @@ jobs: - name: Install poetry run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" cache: "poetry" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7a4cdbe9bb6..b7b76d65ca8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -131,7 +131,7 @@ jobs: - name: Install poetry run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" cache: "poetry" @@ -169,7 +169,7 @@ jobs: - name: Install poetry run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" cache: "poetry" diff --git a/.github/workflows/reusable_deploy_v2_layer_stack.yml b/.github/workflows/reusable_deploy_v2_layer_stack.yml index 0ab175242cc..d98794d818f 100644 --- a/.github/workflows/reusable_deploy_v2_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v2_layer_stack.yml @@ -163,7 +163,7 @@ jobs: with: node-version: "16.12" - name: Setup python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" cache: "pip" diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml index 27bab40f0db..50b59813b07 100644 --- a/.github/workflows/reusable_deploy_v3_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml @@ -167,7 +167,7 @@ jobs: with: node-version: "18.20.4" - name: Setup python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: ${{ matrix.python-version }} cache: "pip" diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index 036ff89ef40..f8e411ea5ea 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -51,7 +51,7 @@ jobs: - name: Install poetry run: pipx install poetry - name: Set up Python - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" cache: "poetry" diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 361a6ac8eb4..f3c5eba055f 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -56,7 +56,7 @@ jobs: - name: Install poetry run: pipx install poetry - name: "Use Python" - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: ${{ matrix.version }} architecture: "x64" From e05ac9b9bed837928c0c5ab7be3e089325238142 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 30 Jan 2025 23:02:11 +0000 Subject: [PATCH 035/139] chore(ci): install & configure mkdocstrings plugin (#5959) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Installing and configuring mkdocstrings plugin * Installing and configuring mkdocstrings plugin --------- Co-authored-by: Ana Falcão --- mkdocs.yml | 36 +++++++++++ poetry.lock | 160 ++++++++++++++++++++++++++++++++++++------------- pyproject.toml | 4 +- 3 files changed, 156 insertions(+), 44 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index 13930db6133..f97d46ebc3e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -136,6 +136,42 @@ copyright: Copyright © 2023 Amazon Web Services plugins: - git-revision-date - search + - mkdocstrings: + default_handler: python + enable_inventory: true + handlers: + python: + import: + - https://docs.python.org/3/objects.inv + options: + # General + allow_inspection: true + show_source: true + show_bases: true + # Headings + heading_level: 2 + #show_root_heading: false + #show_root_toc_entry: true + #show_root_full_path: true + #show_root_members_full_path: false + #show_object_full_path: false + #show_category_heading: true + # Members + filters: ["!^_[^_]"] + group_by_category: true + show_submodules: false + # Docstrings + docstring_style: numpy + docstring_options: + ignore_init_summary: true + docstring_section_style: spacy + merge_init_into_class: true + show_if_no_docstring: false + # Signature + annotations_path: brief + show_signature: true + show_signature_annotations: true + separate_signature: true extra_css: - stylesheets/extra.css diff --git a/poetry.lock b/poetry.lock index 0cc1a03a5ae..05aaefe81be 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -235,14 +235,14 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "aws-cdk-cloud-assembly-schema" -version = "39.2.7" +version = "39.2.9" description = "Cloud Assembly Schema" optional = false python-versions = "~=3.8" groups = ["dev"] files = [ - {file = "aws_cdk.cloud_assembly_schema-39.2.7-py3-none-any.whl", hash = "sha256:80330f993605d65d00369f38cb8ac99ad757ef7158985656a77ac5b2712c565c"}, - {file = "aws_cdk_cloud_assembly_schema-39.2.7.tar.gz", hash = "sha256:980250fb7ef871ea12b58ebb91df5b83da10f69810917bdcd8e0c1d02411516c"}, + {file = "aws_cdk.cloud_assembly_schema-39.2.9-py3-none-any.whl", hash = "sha256:3d16bbe45a463e5327b3d618e1501a2f4ecc6a8764dea71b045e431976135bc8"}, + {file = "aws_cdk_cloud_assembly_schema-39.2.9.tar.gz", hash = "sha256:ed82fc47eee25888fedeb3f668d61e7fb22b0afa393d5ae5cc9e44e75113b85b"}, ] [package.dependencies] @@ -436,18 +436,18 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.36.7" +version = "1.36.10" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" groups = ["main", "dev"] files = [ - {file = "boto3-1.36.7-py3-none-any.whl", hash = "sha256:ab501f75557863e2d2c9fa731e4fe25c45f35e0d92ea0ee11a4eaa63929d3ede"}, - {file = "boto3-1.36.7.tar.gz", hash = "sha256:ae98634efa7b47ced1b0d7342e2940b32639eee913f33ab406590b8ed55ee94b"}, + {file = "boto3-1.36.10-py3-none-any.whl", hash = "sha256:5f8d5c2024a2d1411d3d67abb7357ec7d4c6162e3f1c396dc9b79d042cfd0a80"}, + {file = "boto3-1.36.10.tar.gz", hash = "sha256:d2f1010db699326b26fbd465d91c4b49177c9d995d7e72c0f31335f139efa0d2"}, ] [package.dependencies] -botocore = ">=1.36.7,<1.37.0" +botocore = ">=1.36.10,<1.37.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.11.0,<0.12.0" @@ -456,14 +456,14 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.7" -description = "Type annotations for boto3 1.36.7 generated with mypy-boto3-builder 8.8.0" +version = "1.36.10" +description = "Type annotations for boto3 1.36.10 generated with mypy-boto3-builder 8.9.0" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "boto3_stubs-1.36.7-py3-none-any.whl", hash = "sha256:d5d3f1f537c4d317f1f11b1cb4ce8f427822204936e29419b43c709ec54758ea"}, - {file = "boto3_stubs-1.36.7.tar.gz", hash = "sha256:197bdbacd3a9085c6310a06f21616f30f6103ed8be67705962620ac4587ba1fb"}, + {file = "boto3_stubs-1.36.10-py3-none-any.whl", hash = "sha256:fda0b92e50e0b30ac54807b9e10e06e9224f699ccce80be8ac426cdc63f09ff1"}, + {file = "boto3_stubs-1.36.10.tar.gz", hash = "sha256:fdf82fbe27c4b909df13080922fe27b2e565bf5b546bfec9805e66e983c1b5d9"}, ] [package.dependencies] @@ -530,7 +530,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.7)"] +boto3 = ["boto3 (==1.36.10)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] @@ -893,14 +893,14 @@ xray = ["mypy-boto3-xray (>=1.36.0,<1.37.0)"] [[package]] name = "botocore" -version = "1.36.7" +version = "1.36.10" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" groups = ["main", "dev"] files = [ - {file = "botocore-1.36.7-py3-none-any.whl", hash = "sha256:a6c6772d777af2957ac9975207fac1ccc4ce101408b85e9b5e3c5ba0bb949102"}, - {file = "botocore-1.36.7.tar.gz", hash = "sha256:9abc64bde5e7d8f814ea91d6fc0a8142511fc96427c19fe9209677c20a0c9e6e"}, + {file = "botocore-1.36.10-py3-none-any.whl", hash = "sha256:45c8a6e01dc18d44a13ba688f1d60ad562db8154b08c46b412387ea040a741c2"}, + {file = "botocore-1.36.10.tar.gz", hash = "sha256:d27bb73f0ea81395527a6298ac0a7ea5b2958094169f7cf7d48e3f4e4bc21b65"}, ] [package.dependencies] @@ -912,18 +912,18 @@ urllib3 = [ ] [package.extras] -crt = ["awscrt (==0.23.4)"] +crt = ["awscrt (==0.23.8)"] [[package]] name = "botocore-stubs" -version = "1.36.7" +version = "1.36.9" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "botocore_stubs-1.36.7-py3-none-any.whl", hash = "sha256:77052e3a86a3f77383c638db63379652bafac3a2b310954392e0cfb3dacd3dad"}, - {file = "botocore_stubs-1.36.7.tar.gz", hash = "sha256:51c51da5379d3e4c4cb7e3dbe8451f572ecbfe6a5ced3a76a6b958941ef72409"}, + {file = "botocore_stubs-1.36.9-py3-none-any.whl", hash = "sha256:76fc0651fc4e7d9a83de944d109f4d779a064265c5f243699718e1d06104efd9"}, + {file = "botocore_stubs-1.36.9.tar.gz", hash = "sha256:786857fc9f4e11f16b62e0383b8d60a3a03a9ac10fe23d57d1fa726e77626535"}, ] [package.dependencies] @@ -977,14 +977,14 @@ ujson = ["ujson (>=5.7.0)"] [[package]] name = "cdk-nag" -version = "2.35.2" +version = "2.35.4" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" groups = ["dev"] files = [ - {file = "cdk_nag-2.35.2-py3-none-any.whl", hash = "sha256:5348d4595622d67f841bbd7a490f28fa9fa3ae59193381e43b508780785b1004"}, - {file = "cdk_nag-2.35.2.tar.gz", hash = "sha256:af58a7ef38784c1398f856136f76057e68f74837fcd3bb655b78b4fba379ca60"}, + {file = "cdk_nag-2.35.4-py3-none-any.whl", hash = "sha256:f9d0f6ffbe79aecc082697d57810aa1ed2b62f2dc582c487f37dcbb2812274bf"}, + {file = "cdk_nag-2.35.4.tar.gz", hash = "sha256:5389ffd6689576708039edf9cc3a155de46e6950edaff27fb7db4a05bedafb26"}, ] [package.dependencies] @@ -1445,20 +1445,20 @@ requests = ">=2.6.0" [[package]] name = "datadog-lambda" -version = "6.104.0" +version = "6.105.0" description = "The Datadog AWS Lambda Library" optional = true python-versions = "<4,>=3.8.0" groups = ["main"] markers = "extra == \"datadog\"" files = [ - {file = "datadog_lambda-6.104.0-py3-none-any.whl", hash = "sha256:72092f9057764515ef1e2fdf1cf25f82bfa70296411af9121db896e4a35fdf6e"}, - {file = "datadog_lambda-6.104.0.tar.gz", hash = "sha256:eeb2ff0e4387812e7caf17e501d93fea3d85e3f9bb79581fb37556580d5a1c46"}, + {file = "datadog_lambda-6.105.0-py3-none-any.whl", hash = "sha256:447d13b6f4971da8aa1227e554a1c2f8985b62aaacbb182bc093a7e048cd1fc4"}, + {file = "datadog_lambda-6.105.0.tar.gz", hash = "sha256:59d7900b2136e14441dc29de4ff778301d2c8175cc26caf3819c648293357fbb"}, ] [package.dependencies] -datadog = ">=0.41.0,<1.0.0" -ddtrace = ">=2.17.0" +datadog = ">=0.51.0,<1.0.0" +ddtrace = ">=2.20.0" ujson = ">=5.9.0" wrapt = ">=1.11.2,<2.0.0" @@ -1683,7 +1683,7 @@ description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version < \"3.11.0\"" +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1792,6 +1792,21 @@ gitdb = ">=4.0.1,<5" doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] +[[package]] +name = "griffe" +version = "1.5.6" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "griffe-1.5.6-py3-none-any.whl", hash = "sha256:b2a3afe497c6c1f952e54a23095ecc09435016293e77af8478ed65df1022a394"}, + {file = "griffe-1.5.6.tar.gz", hash = "sha256:181f6666d5aceb6cd6e2da5a2b646cfb431e47a0da1fda283845734b67e10944"}, +] + +[package.dependencies] +colorama = ">=0.4" + [[package]] name = "h11" version = "0.14.0" @@ -2440,6 +2455,23 @@ watchdog = ">=2.0" i18n = ["babel (>=2.9.0)"] min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] +[[package]] +name = "mkdocs-autorefs" +version = "1.3.0" +description = "Automatically link across pages in MkDocs." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "mkdocs_autorefs-1.3.0-py3-none-any.whl", hash = "sha256:d180f9778a04e78b7134e31418f238bba56f56d6a8af97873946ff661befffb3"}, + {file = "mkdocs_autorefs-1.3.0.tar.gz", hash = "sha256:6867764c099ace9025d6ac24fd07b85a98335fbd30107ef01053697c8f46db61"}, +] + +[package.dependencies] +Markdown = ">=3.3" +markupsafe = ">=2.0.1" +mkdocs = ">=1.1" + [[package]] name = "mkdocs-get-deps" version = "0.2.0" @@ -2516,6 +2548,52 @@ files = [ {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] +[[package]] +name = "mkdocstrings" +version = "0.27.0" +description = "Automatic documentation from sources, for MkDocs." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "mkdocstrings-0.27.0-py3-none-any.whl", hash = "sha256:6ceaa7ea830770959b55a16203ac63da24badd71325b96af950e59fd37366332"}, + {file = "mkdocstrings-0.27.0.tar.gz", hash = "sha256:16adca6d6b0a1f9e0c07ff0b02ced8e16f228a9d65a37c063ec4c14d7b76a657"}, +] + +[package.dependencies] +click = ">=7.0" +importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} +Jinja2 = ">=2.11.1" +Markdown = ">=3.6" +MarkupSafe = ">=1.1" +mkdocs = ">=1.4" +mkdocs-autorefs = ">=1.2" +platformdirs = ">=2.2" +pymdown-extensions = ">=6.3" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""} + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "1.13.0" +description = "A Python handler for mkdocstrings." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "mkdocstrings_python-1.13.0-py3-none-any.whl", hash = "sha256:b88bbb207bab4086434743849f8e796788b373bd32e7bfefbf8560ac45d88f97"}, + {file = "mkdocstrings_python-1.13.0.tar.gz", hash = "sha256:2dbd5757e8375b9720e81db16f52f1856bf59905428fd7ef88005d1370e2f64c"}, +] + +[package.dependencies] +griffe = ">=0.49" +mkdocs-autorefs = ">=1.2" +mkdocstrings = ">=0.26" + [[package]] name = "mpmath" version = "1.3.0" @@ -2730,14 +2808,14 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-s3" -version = "1.36.0" -description = "Type annotations for boto3 S3 1.36.0 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.9" +description = "Type annotations for boto3 S3 1.36.9 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "mypy_boto3_s3-1.36.0-py3-none-any.whl", hash = "sha256:a65ccb6be7b7ebf907887268d44975e435b1fc1164fc0a25de310e2b832f7e91"}, - {file = "mypy_boto3_s3-1.36.0.tar.gz", hash = "sha256:80a881847b0e1fbc5edcad8b2870c110e31e7ef128db42402b70c159b7e93d5a"}, + {file = "mypy_boto3_s3-1.36.9-py3-none-any.whl", hash = "sha256:506edd56892452dff5b673e3c79a11b6f8935076ce4a9daaac4cda708a176201"}, + {file = "mypy_boto3_s3-1.36.9.tar.gz", hash = "sha256:368c963969eda65bb3a9df61e87510dd8b3247cce59f559c2ec6c43d5796bef5"}, ] [package.dependencies] @@ -3207,14 +3285,14 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.14.1" +version = "10.14.2" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "pymdown_extensions-10.14.1-py3-none-any.whl", hash = "sha256:637951cbfbe9874ba28134fb3ce4b8bcadd6aca89ac4998ec29dcbafd554ae08"}, - {file = "pymdown_extensions-10.14.1.tar.gz", hash = "sha256:b65801996a0cd4f42a3110810c306c45b7313c09b0610a6f773730f2a9e3c96b"}, + {file = "pymdown_extensions-10.14.2-py3-none-any.whl", hash = "sha256:f45bc5892410e54fd738ab8ccd736098b7ff0cb27fdb4bf24d0a0c6584bc90e1"}, + {file = "pymdown_extensions-10.14.2.tar.gz", hash = "sha256:7a77b8116dc04193f2c01143760a43387bd9dc4aa05efacb7d838885a7791253"}, ] [package.dependencies] @@ -3264,14 +3342,14 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pytest-asyncio" -version = "0.25.2" +version = "0.25.3" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"}, - {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"}, + {file = "pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3"}, + {file = "pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a"}, ] [package.dependencies] @@ -4113,7 +4191,7 @@ description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version < \"3.11.0\"" +markers = "python_full_version <= \"3.11.0a6\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -4637,4 +4715,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0.0" -content-hash = "d9f1328c56d8cbad3242d4f5f5f7ca04482270605a7505994dfc2872847dff05" +content-hash = "2bd6190fb26fceb1fa2b7efd2a3904b47130cbd38d2608c22091f1ec10495672" diff --git a/pyproject.toml b/pyproject.toml index 368bd50a4a3..cb9a50b3080 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -122,6 +122,7 @@ testcontainers = { extras = ["redis"], version = ">=3.7.1,<5.0.0" } multiprocess = "^0.70.16" boto3-stubs = {extras = ["appconfig", "appconfigdata", "cloudformation", "cloudwatch", "dynamodb", "lambda", "logs", "s3", "secretsmanager", "ssm", "xray"], version = "^1.34.139"} nox = "^2024.4.15" +mkdocstrings-python = "^1.13.0" [tool.coverage.run] source = ["aws_lambda_powertools"] @@ -134,9 +135,6 @@ omit = [ ] branch = true -[tool.poetry.requires-plugins] -poetry-plugin-export = "^1.9.0" - [tool.coverage.html] directory = "test_report" title = "Powertools for AWS Lambda (Python) Test Coverage" From 0080d20aaeb3a1ff3e1b46f041fe18ffccfe7516 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 20:04:15 -0300 Subject: [PATCH 036/139] chore(deps): bump docker/setup-qemu-action from 3.2.0 to 3.3.0 (#5961) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/49b3bc8e6bdd4a60e6116a5414239cba5943d3cf...53851d14592bedcffcf25ea515637cff71ef929a) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/publish_v2_layer.yml | 2 +- .github/workflows/publish_v3_layer.yml | 2 +- .github/workflows/quality_code_cdk_constructor.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish_v2_layer.yml b/.github/workflows/publish_v2_layer.yml index 2be35a29df2..ddadc2f5c32 100644 --- a/.github/workflows/publish_v2_layer.yml +++ b/.github/workflows/publish_v2_layer.yml @@ -117,7 +117,7 @@ jobs: pip install --require-hashes -r requirements.txt - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v2.0.0 + uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v2.0.0 with: platforms: arm64 # NOTE: we need QEMU to build Layer against a different architecture (e.g., ARM) diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 976b10c6f28..80f71004abe 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -122,7 +122,7 @@ jobs: pip install --require-hashes -r requirements.txt - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v2.0.0 + uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v2.0.0 with: platforms: arm64 # NOTE: we need QEMU to build Layer against a different architecture (e.g., ARM) diff --git a/.github/workflows/quality_code_cdk_constructor.yml b/.github/workflows/quality_code_cdk_constructor.yml index 181cd8b53a4..b2feec85810 100644 --- a/.github/workflows/quality_code_cdk_constructor.yml +++ b/.github/workflows/quality_code_cdk_constructor.yml @@ -51,7 +51,7 @@ jobs: python-version: ${{ matrix.python-version }} cache: "poetry" - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v2.0.0 + uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v2.0.0 with: platforms: arm64 # NOTE: we need QEMU to build Layer against a different architecture (e.g., ARM) From 0d064a90c6fd59a634a25bef488234de245d3eb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:32:09 +0000 Subject: [PATCH 037/139] chore(deps): bump codecov/codecov-action from 5.1.2 to 5.3.1 (#5964) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.1.2 to 5.3.1. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/1e68e06f1dbfde0e4cefc87efeba9e4643565303...13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/quality_check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/quality_check.yml b/.github/workflows/quality_check.yml index a0577598456..8ae08e8481b 100644 --- a/.github/workflows/quality_check.yml +++ b/.github/workflows/quality_check.yml @@ -74,7 +74,7 @@ jobs: - name: Complexity baseline run: make complexity-baseline - name: Upload coverage to Codecov - uses: codecov/codecov-action@1e68e06f1dbfde0e4cefc87efeba9e4643565303 # 5.1.2 + uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # 5.3.1 with: token: ${{ secrets.CODECOV_TOKEN }} file: ./coverage.xml From 8b7b5ad0dcf6fea67e24d52573452ee3f7c81851 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:33:57 +0000 Subject: [PATCH 038/139] chore(deps-dev): bump mkdocs-material from 9.5.50 to 9.6.1 (#5966) Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.50 to 9.6.1. - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.50...9.6.1) --- updated-dependencies: - dependency-name: mkdocs-material dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 229 +++------------------------------------------------- 1 file changed, 9 insertions(+), 220 deletions(-) diff --git a/poetry.lock b/poetry.lock index 05aaefe81be..75839815750 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,12 +6,10 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [[package]] name = "anyio" @@ -19,7 +17,6 @@ version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, @@ -42,7 +39,6 @@ version = "3.5.3" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "argcomplete-3.5.3-py3-none-any.whl", hash = "sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61"}, {file = "argcomplete-3.5.3.tar.gz", hash = "sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392"}, @@ -57,12 +53,10 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] -markers = {main = "extra == \"redis\" and python_full_version < \"3.11.3\"", dev = "python_full_version < \"3.11.3\""} [[package]] name = "attrs" @@ -70,12 +64,10 @@ version = "24.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] -markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] @@ -91,7 +83,6 @@ version = "2.2.221" description = "A library that contains the AWS CLI for use in Lambda Layers" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_awscli_v1-2.2.221-py3-none-any.whl", hash = "sha256:66a83e4116b6a7a0041f99f7bca7d0ea354c9ab2e17a938a3dcec50f7272f5d9"}, {file = "aws_cdk_asset_awscli_v1-2.2.221.tar.gz", hash = "sha256:7ea0366c8090dc396fed85baddbcf48ac4a088c1bf606cd776138e6526679108"}, @@ -108,7 +99,6 @@ version = "2.1.3" description = "A Lambda Layer that contains kubectl v1.20" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_kubectl_v20-2.1.3-py3-none-any.whl", hash = "sha256:d5612e5bd03c215a28ce53193b1144ecf4e93b3b6779563c046a8a74d83a3979"}, {file = "aws_cdk_asset_kubectl_v20-2.1.3.tar.gz", hash = "sha256:237cd8530d9e8be0bbc7159af927dbb6b7f91bf3f4099c8ef4d9a213b34264be"}, @@ -125,7 +115,6 @@ version = "2.1.0" description = "@aws-cdk/asset-node-proxy-agent-v6" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_node_proxy_agent_v6-2.1.0-py3-none-any.whl", hash = "sha256:24a388b69a44d03bae6dbf864c4e25ba650d4b61c008b4568b94ffbb9a69e40e"}, {file = "aws_cdk_asset_node_proxy_agent_v6-2.1.0.tar.gz", hash = "sha256:1f292c0631f86708ba4ee328b3a2b229f7e46ea1c79fbde567ee9eb119c2b0e2"}, @@ -142,7 +131,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-alpha-2.114.1a0.tar.gz", hash = "sha256:9e8c3131f4fa3e0926eb3d76aeacd578a6aa51f95b39c10a86112c991bb75864"}, {file = "aws_cdk.aws_apigatewayv2_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:a101ce56d846976ad1c8020054dfe73fd9f45afdbe71f2a297acc84c1a201403"}, @@ -161,7 +149,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-authorizers" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-authorizers-alpha-2.114.1a0.tar.gz", hash = "sha256:ee290e2ed0f1506dbbb12b3b8963f50b379121759077002c265977fbaf18fd9f"}, {file = "aws_cdk.aws_apigatewayv2_authorizers_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:2576e1ce06dab314020bff50f5d59b8715a7adf18106eac811028c22f61c9baa"}, @@ -181,7 +168,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-integrations" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-integrations-alpha-2.114.1a0.tar.gz", hash = "sha256:19e1824b577683e7d3c2b01fd58c176ebe4c7b8d1b4af4cfdc3893d3ffbac9af"}, {file = "aws_cdk.aws_apigatewayv2_integrations_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:1e440a70e6b4cbe077c95ffdd3fd0cfb3962f90762ea2e973eaa2ab7719ccb2c"}, @@ -201,7 +187,6 @@ version = "2.59.0a0" description = "The CDK Construct Library for AWS::AppSync" optional = false python-versions = "~=3.7" -groups = ["dev"] files = [ {file = "aws-cdk.aws-appsync-alpha-2.59.0a0.tar.gz", hash = "sha256:f5c7773b70b759efd576561dc3d71af5762a6f7cbc9ee9eef5e538c7ab3dccc7"}, {file = "aws_cdk.aws_appsync_alpha-2.59.0a0-py3-none-any.whl", hash = "sha256:ecc235f1f70d404c8d03cf250be0227becd14c468f8c43b6d9df334a1d60c8e2"}, @@ -220,7 +205,6 @@ version = "2.177.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.aws_lambda_python_alpha-2.177.0a0-py3-none-any.whl", hash = "sha256:5aacc26970e30909b372fd2e8b98ce7197b8074d78ec4f1d900a8ddd02bc5114"}, {file = "aws_cdk_aws_lambda_python_alpha-2.177.0a0.tar.gz", hash = "sha256:0137957603cd91b473de3a455bf4d95de4ba60c1ba9f25f62d3edeb965202c4e"}, @@ -239,7 +223,6 @@ version = "39.2.9" description = "Cloud Assembly Schema" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.cloud_assembly_schema-39.2.9-py3-none-any.whl", hash = "sha256:3d16bbe45a463e5327b3d618e1501a2f4ecc6a8764dea71b045e431976135bc8"}, {file = "aws_cdk_cloud_assembly_schema-39.2.9.tar.gz", hash = "sha256:ed82fc47eee25888fedeb3f668d61e7fb22b0afa393d5ae5cc9e44e75113b85b"}, @@ -256,7 +239,6 @@ version = "2.177.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk_lib-2.177.0-py3-none-any.whl", hash = "sha256:acdf06aaf52367a64b4bf88381e8272cb7b5961c242020ace822c79749e53cac"}, {file = "aws_cdk_lib-2.177.0.tar.gz", hash = "sha256:5e51c48da31555beb38243bb2882e98ee9fe1796466ba9f8d3088701b47965e5"}, @@ -278,8 +260,6 @@ version = "4.0.0" description = "AWS Encryption SDK implementation for Python" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "aws-encryption-sdk-4.0.0.tar.gz", hash = "sha256:57df8b5c1b9f18db4373c6e8e65563791063a71be93d0849950ed365272db354"}, {file = "aws_encryption_sdk-4.0.0-py2.py3-none-any.whl", hash = "sha256:a94483785dff2cd166ccb8f3a15cdfe5cba7a3717f6604543c816a3a32f7c412"}, @@ -300,7 +280,6 @@ version = "0.4.3" description = "AWS signature version 4 signing process for the python requests module" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "aws-requests-auth-0.4.3.tar.gz", hash = "sha256:33593372018b960a31dbbe236f89421678b885c35f0b6a7abfae35bb77e069b2"}, {file = "aws_requests_auth-0.4.3-py2.py3-none-any.whl", hash = "sha256:646bc37d62140ea1c709d20148f5d43197e6bd2d63909eb36fa4bb2345759977"}, @@ -315,7 +294,6 @@ version = "1.94.0" description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates" optional = false python-versions = "!=4.0,<=4.0,>=3.8" -groups = ["dev"] files = [ {file = "aws_sam_translator-1.94.0-py3-none-any.whl", hash = "sha256:100e33eeffcfa81f7c45cadeb0ee29596ce829f6b4d2745140f04fa19a41f539"}, {file = "aws_sam_translator-1.94.0.tar.gz", hash = "sha256:8ec258d9f7ece72ef91c81f4edb45a2db064c16844b6afac90c575893beaa391"}, @@ -336,8 +314,6 @@ version = "2.14.0" description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers to record and emit information from within their applications to the AWS X-Ray service." optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"tracer\" or extra == \"all\"" files = [ {file = "aws_xray_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:cfbe6feea3d26613a2a869d14c9246a844285c97087ad8f296f901633554ad94"}, {file = "aws_xray_sdk-2.14.0.tar.gz", hash = "sha256:aab843c331af9ab9ba5cefb3a303832a19db186140894a523edafc024cc0493c"}, @@ -353,7 +329,6 @@ version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, @@ -368,7 +343,6 @@ version = "1.8.2" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "bandit-1.8.2-py3-none-any.whl", hash = "sha256:df6146ad73dd30e8cbda4e29689ddda48364e36ff655dbfc86998401fcf1721f"}, {file = "bandit-1.8.2.tar.gz", hash = "sha256:e00ad5a6bc676c0954669fe13818024d66b70e42cf5adb971480cf3b671e835f"}, @@ -393,7 +367,6 @@ version = "24.10.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, @@ -440,7 +413,6 @@ version = "1.36.10" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "boto3-1.36.10-py3-none-any.whl", hash = "sha256:5f8d5c2024a2d1411d3d67abb7357ec7d4c6162e3f1c396dc9b79d042cfd0a80"}, {file = "boto3-1.36.10.tar.gz", hash = "sha256:d2f1010db699326b26fbd465d91c4b49177c9d995d7e72c0f31335f139efa0d2"}, @@ -460,7 +432,6 @@ version = "1.36.10" description = "Type annotations for boto3 1.36.10 generated with mypy-boto3-builder 8.9.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "boto3_stubs-1.36.10-py3-none-any.whl", hash = "sha256:fda0b92e50e0b30ac54807b9e10e06e9224f699ccce80be8ac426cdc63f09ff1"}, {file = "boto3_stubs-1.36.10.tar.gz", hash = "sha256:fdf82fbe27c4b909df13080922fe27b2e565bf5b546bfec9805e66e983c1b5d9"}, @@ -897,7 +868,6 @@ version = "1.36.10" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "botocore-1.36.10-py3-none-any.whl", hash = "sha256:45c8a6e01dc18d44a13ba688f1d60ad562db8154b08c46b412387ea040a741c2"}, {file = "botocore-1.36.10.tar.gz", hash = "sha256:d27bb73f0ea81395527a6298ac0a7ea5b2958094169f7cf7d48e3f4e4bc21b65"}, @@ -907,8 +877,8 @@ files = [ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, ] [package.extras] @@ -920,7 +890,6 @@ version = "1.36.9" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "botocore_stubs-1.36.9-py3-none-any.whl", hash = "sha256:76fc0651fc4e7d9a83de944d109f4d779a064265c5f243699718e1d06104efd9"}, {file = "botocore_stubs-1.36.9.tar.gz", hash = "sha256:786857fc9f4e11f16b62e0383b8d60a3a03a9ac10fe23d57d1fa726e77626535"}, @@ -938,8 +907,6 @@ version = "0.16.1" description = "Python module to generate and modify bytecode" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"}, {file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"}, @@ -954,7 +921,6 @@ version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -981,7 +947,6 @@ version = "2.35.4" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "cdk_nag-2.35.4-py3-none-any.whl", hash = "sha256:f9d0f6ffbe79aecc082697d57810aa1ed2b62f2dc582c487f37dcbb2812274bf"}, {file = "cdk_nag-2.35.4.tar.gz", hash = "sha256:5389ffd6689576708039edf9cc3a155de46e6950edaff27fb7db4a05bedafb26"}, @@ -1000,7 +965,6 @@ version = "0.1.290" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "cdklabs.generative_ai_cdk_constructs-0.1.290-py3-none-any.whl", hash = "sha256:3297a25ee2acbf6e70ee100a7e712023b076ea688820e53fa352b1c05a769cf0"}, {file = "cdklabs_generative_ai_cdk_constructs-0.1.290.tar.gz", hash = "sha256:693f732e8552d28100b5da918a17cb19fd19b25b81040faf11688a24afbe42c0"}, @@ -1020,7 +984,6 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -1032,7 +995,6 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -1102,7 +1064,6 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] -markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = "*" @@ -1113,7 +1074,6 @@ version = "1.22.7" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "cfn_lint-1.22.7-py3-none-any.whl", hash = "sha256:6ae732fd11cba6b01ce577fe4d985c407166010faf385eb5b30236916b02ad29"}, {file = "cfn_lint-1.22.7.tar.gz", hash = "sha256:0cd99a217c3f197939b15dd0badfa49e90142d315c78e644f07bb8d943dd1b3e"}, @@ -1140,7 +1100,6 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -1242,7 +1201,6 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -1257,7 +1215,6 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1269,7 +1226,6 @@ version = "6.9.0" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, @@ -1287,7 +1243,6 @@ version = "10.4.2" description = "A programming model for software-defined state" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "constructs-10.4.2-py3-none-any.whl", hash = "sha256:1f0f59b004edebfde0f826340698b8c34611f57848139b7954904c61645f13c1"}, {file = "constructs-10.4.2.tar.gz", hash = "sha256:ce54724360fffe10bab27d8a081844eb81f5ace7d7c62c84b719c49f164d5307"}, @@ -1304,7 +1259,6 @@ version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, @@ -1382,7 +1336,6 @@ version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1412,7 +1365,6 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] -markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1433,8 +1385,6 @@ version = "0.51.0" description = "The Datadog Python library" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "datadog-0.51.0-py2.py3-none-any.whl", hash = "sha256:a9764f091c96af4e0996d4400b168fc5fba380f911d6d672c9dcd4773e29ea3f"}, {file = "datadog-0.51.0.tar.gz", hash = "sha256:3279534f831ae0b4ae2d8ce42ef038b4ab38e667d7ed6ff7437982d7a0cf5250"}, @@ -1449,8 +1399,6 @@ version = "6.105.0" description = "The Datadog AWS Lambda Library" optional = true python-versions = "<4,>=3.8.0" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "datadog_lambda-6.105.0-py3-none-any.whl", hash = "sha256:447d13b6f4971da8aa1227e554a1c2f8985b62aaacbb182bc093a7e048cd1fc4"}, {file = "datadog_lambda-6.105.0.tar.gz", hash = "sha256:59d7900b2136e14441dc29de4ff778301d2c8175cc26caf3819c648293357fbb"}, @@ -1471,8 +1419,6 @@ version = "2.20.0" description = "Datadog APM client library" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e1dee099099b95acf7d0e552179925cfec58a52315cc914d153506367b195bc4"}, {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9d209bef14caafcd53be8c14e04741d86c08f76496c1bf755e2eaa38605ce3e0"}, @@ -1546,10 +1492,10 @@ files = [ [package.dependencies] bytecode = [ - {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, {version = ">=0.16.0", markers = "python_version >= \"3.13.0\""}, {version = ">=0.15.0", markers = "python_version ~= \"3.12.0\""}, {version = ">=0.14.0", markers = "python_version ~= \"3.11.0\""}, + {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, ] envier = ">=0.5,<1.0" legacy-cgi = {version = ">=2.0.0", markers = "python_version >= \"3.13.0\""} @@ -1569,7 +1515,6 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" -groups = ["dev"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -1581,8 +1526,6 @@ version = "1.2.18" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, @@ -1600,7 +1543,6 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -1616,7 +1558,6 @@ version = "0.5.0" description = "Python module and CLI for hashing of file system directories." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "dirhash-0.5.0-py3-none-any.whl", hash = "sha256:523dfd6b058c64f45b31604376926c6e2bd2ea301d0df23095d4055674e38b09"}, {file = "dirhash-0.5.0.tar.gz", hash = "sha256:e60760f0ab2e935d8cb088923ea2c6492398dca42cec785df778985fd4cd5386"}, @@ -1631,7 +1572,6 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -1643,7 +1583,6 @@ version = "7.1.0" description = "A Python library for the Docker Engine API." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, @@ -1666,8 +1605,6 @@ version = "0.6.1" description = "Python application configuration via the environment" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"}, {file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"}, @@ -1682,8 +1619,6 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1698,7 +1633,6 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1713,8 +1647,6 @@ version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"validation\" or extra == \"all\"" files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, @@ -1729,7 +1661,6 @@ version = "3.17.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, @@ -1746,7 +1677,6 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -1764,7 +1694,6 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1779,7 +1708,6 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1798,7 +1726,6 @@ version = "1.5.6" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "griffe-1.5.6-py3-none-any.whl", hash = "sha256:b2a3afe497c6c1f952e54a23095ecc09435016293e77af8478ed65df1022a394"}, {file = "griffe-1.5.6.tar.gz", hash = "sha256:181f6666d5aceb6cd6e2da5a2b646cfb431e47a0da1fda283845734b67e10944"}, @@ -1813,7 +1740,6 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1825,7 +1751,6 @@ version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -1847,7 +1772,6 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1872,7 +1796,6 @@ version = "2.3.0" description = "HashiCorp Vault API client" optional = false python-versions = "<4.0,>=3.8" -groups = ["dev"] files = [ {file = "hvac-2.3.0-py3-none-any.whl", hash = "sha256:a3afc5710760b6ee9b3571769df87a0333da45da05a5f9f963e1d3925a84be7d"}, {file = "hvac-2.3.0.tar.gz", hash = "sha256:1b85e3320e8642dd82f234db63253cda169a817589e823713dc5fca83119b1e2"}, @@ -1890,7 +1813,6 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1905,7 +1827,6 @@ version = "3.3.0" description = "Iterative JSON parser with standard Python iterator interfaces" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f7a5250599c366369fbf3bc4e176f5daa28eb6bc7d6130d02462ed335361675"}, {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f87a7e52f79059f9c58f6886c262061065eb6f7554a587be7ed3aa63e6b71b34"}, @@ -2009,7 +1930,6 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -2033,7 +1953,6 @@ version = "6.5.2" description = "Read resources from Python packages" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, @@ -2056,7 +1975,6 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -2068,7 +1986,6 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -2083,7 +2000,6 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -2101,7 +2017,6 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -2113,7 +2028,6 @@ version = "1.106.0" description = "Python client for jsii runtime" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "jsii-1.106.0-py3-none-any.whl", hash = "sha256:5a44d7c3a5a326fa3d9befdb3770b380057e0a61e3804e7c4907f70d76afaaa2"}, {file = "jsii-1.106.0.tar.gz", hash = "sha256:c79c47899f53a7c3c4b20f80d3cd306628fe9ed1852eee970324c71eba1d974e"}, @@ -2134,7 +2048,6 @@ version = "1.33" description = "Apply JSON-Patches (RFC 6902)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -groups = ["dev"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -2149,10 +2062,10 @@ version = "1.7.0" description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, + {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, + {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -2164,7 +2077,6 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -2176,7 +2088,6 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -2198,7 +2109,6 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -2213,8 +2123,6 @@ version = "2.6.2" description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"datadog\" and python_version >= \"3.13.0\"" files = [ {file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"}, {file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"}, @@ -2226,7 +2134,6 @@ version = "1.3.8" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "Mako-1.3.8-py3-none-any.whl", hash = "sha256:42f48953c7eb91332040ff567eb7eea69b22e7a4affbc5ba8e845e8f730f6627"}, {file = "mako-1.3.8.tar.gz", hash = "sha256:577b97e414580d3e088d47c2dbbe9594aa7a5146ed2875d4dfa9075af2dd3cc8"}, @@ -2246,7 +2153,6 @@ version = "0.7.1" description = "Create Python CLI apps with little to no effort at all!" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mando-0.7.1-py2.py3-none-any.whl", hash = "sha256:26ef1d70928b6057ee3ca12583d73c63e05c49de8972d620c278a7b206581a8a"}, {file = "mando-0.7.1.tar.gz", hash = "sha256:18baa999b4b613faefb00eac4efadcf14f510b59b924b66e08289aa1de8c3500"}, @@ -2264,7 +2170,6 @@ version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -2283,7 +2188,6 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -2308,7 +2212,6 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -2379,7 +2282,6 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -2391,7 +2293,6 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -2403,7 +2304,6 @@ version = "2.1.3" description = "Manage multiple versions of your MkDocs-powered documentation" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, @@ -2429,7 +2329,6 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -2461,7 +2360,6 @@ version = "1.3.0" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "mkdocs_autorefs-1.3.0-py3-none-any.whl", hash = "sha256:d180f9778a04e78b7134e31418f238bba56f56d6a8af97873946ff661befffb3"}, {file = "mkdocs_autorefs-1.3.0.tar.gz", hash = "sha256:6867764c099ace9025d6ac24fd07b85a98335fbd30107ef01053697c8f46db61"}, @@ -2478,7 +2376,6 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -2496,7 +2393,6 @@ version = "0.3.2" description = "MkDocs plugin for setting revision date from git per markdown file." optional = false python-versions = ">=3.4" -groups = ["dev"] files = [ {file = "mkdocs_git_revision_date_plugin-0.3.2-py3-none-any.whl", hash = "sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef"}, ] @@ -2508,14 +2404,13 @@ mkdocs = ">=0.17" [[package]] name = "mkdocs-material" -version = "9.5.50" +version = "9.6.1" description = "Documentation that simply works" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ - {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, - {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, + {file = "mkdocs_material-9.6.1-py3-none-any.whl", hash = "sha256:c1742d410be29811a9b7e863cb25a578b9e255fe6f04c69f8c6838863a58e141"}, + {file = "mkdocs_material-9.6.1.tar.gz", hash = "sha256:da37dba220d9fbfc5f1fc567fafc4028e3c3d7d828f2779ed09ab726ceca77dc"}, ] [package.dependencies] @@ -2542,7 +2437,6 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -2554,7 +2448,6 @@ version = "0.27.0" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "mkdocstrings-0.27.0-py3-none-any.whl", hash = "sha256:6ceaa7ea830770959b55a16203ac63da24badd71325b96af950e59fd37366332"}, {file = "mkdocstrings-0.27.0.tar.gz", hash = "sha256:16adca6d6b0a1f9e0c07ff0b02ced8e16f228a9d65a37c063ec4c14d7b76a657"}, @@ -2583,7 +2476,6 @@ version = "1.13.0" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "mkdocstrings_python-1.13.0-py3-none-any.whl", hash = "sha256:b88bbb207bab4086434743849f8e796788b373bd32e7bfefbf8560ac45d88f97"}, {file = "mkdocstrings_python-1.13.0.tar.gz", hash = "sha256:2dbd5757e8375b9720e81db16f52f1856bf59905428fd7ef88005d1370e2f64c"}, @@ -2600,7 +2492,6 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2618,7 +2509,6 @@ version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, @@ -2647,7 +2537,6 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -2707,7 +2596,6 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfig 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_appconfig-1.36.0-py3-none-any.whl", hash = "sha256:d627de43761a83991a0ab8cd10698d415f94dcc78a567433c7465fc8d1f5cc16"}, {file = "mypy_boto3_appconfig-1.36.0.tar.gz", hash = "sha256:3f38cbd2d7d359da88dc996eeeafa4c1174847909e31a327dd77263dfdfd5424"}, @@ -2722,7 +2610,6 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfigData 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_appconfigdata-1.36.0-py3-none-any.whl", hash = "sha256:68f02ce06ed9597b02154aff64655fc38c42919eda08fddb130ba17e9f70e9cb"}, {file = "mypy_boto3_appconfigdata-1.36.0.tar.gz", hash = "sha256:3436d149833ea69b4260a0f352aac19258d4676c7a21087625906f7da98624c7"}, @@ -2737,7 +2624,6 @@ version = "1.36.0" description = "Type annotations for boto3 CloudFormation 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_cloudformation-1.36.0-py3-none-any.whl", hash = "sha256:3f6cd81739aaf9634c4aa2b92579081038a76e4f2dec306d02eaaf558b332ce9"}, {file = "mypy_boto3_cloudformation-1.36.0.tar.gz", hash = "sha256:acc2c7ae8920f1167be097f6151685fe5aee99be2f890075edf93e05d298e8b0"}, @@ -2752,7 +2638,6 @@ version = "1.36.0" description = "Type annotations for boto3 CloudWatch 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_cloudwatch-1.36.0-py3-none-any.whl", hash = "sha256:2f6cb81c05a1b4be3510e0857b22913a241488bc08f55b0ad96e8b775c144891"}, {file = "mypy_boto3_cloudwatch-1.36.0.tar.gz", hash = "sha256:a370d61522121ab457c443c338a652d0d3e1c22102d9db9f197fd5dcb7e656a4"}, @@ -2767,7 +2652,6 @@ version = "1.36.0" description = "Type annotations for boto3 DynamoDB 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_dynamodb-1.36.0-py3-none-any.whl", hash = "sha256:b782a817ce8956f8d53ac94c85f969dfe51451fc99f16a3b62776f1e0ed3f1ba"}, {file = "mypy_boto3_dynamodb-1.36.0.tar.gz", hash = "sha256:1687e4689236a5391755126e86ec2596d408eb95408c31ac09a3d1eb289d516d"}, @@ -2782,7 +2666,6 @@ version = "1.36.0" description = "Type annotations for boto3 Lambda 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_lambda-1.36.0-py3-none-any.whl", hash = "sha256:8a6693be1352b51e232cee73f73ce36014d19b4777bdf6969c5e707aba424ca1"}, {file = "mypy_boto3_lambda-1.36.0.tar.gz", hash = "sha256:5e9f23702060529aad216a3ce2a2368391a112df07909fbd3aa80d573d84893c"}, @@ -2797,7 +2680,6 @@ version = "1.36.3" description = "Type annotations for boto3 CloudWatchLogs 1.36.3 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_logs-1.36.3-py3-none-any.whl", hash = "sha256:553cb31261eb4484394af9ac965fa33b0d414e927c47768021a0a6ec89625f64"}, {file = "mypy_boto3_logs-1.36.3.tar.gz", hash = "sha256:76d233632a36665094ac888a685fade150c10665ab4cad1b17265037fcadd098"}, @@ -2812,7 +2694,6 @@ version = "1.36.9" description = "Type annotations for boto3 S3 1.36.9 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_s3-1.36.9-py3-none-any.whl", hash = "sha256:506edd56892452dff5b673e3c79a11b6f8935076ce4a9daaac4cda708a176201"}, {file = "mypy_boto3_s3-1.36.9.tar.gz", hash = "sha256:368c963969eda65bb3a9df61e87510dd8b3247cce59f559c2ec6c43d5796bef5"}, @@ -2827,7 +2708,6 @@ version = "1.36.0" description = "Type annotations for boto3 SecretsManager 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_secretsmanager-1.36.0-py3-none-any.whl", hash = "sha256:d7fd56b08afed32ce26f2663ec57f9ea074e1e5149a4388eccb46653e3cb5a66"}, {file = "mypy_boto3_secretsmanager-1.36.0.tar.gz", hash = "sha256:6e1f91cd5b0c1f0533f8cfa91e4755855d39931475e7d1e23ee8dbb2e7163d18"}, @@ -2842,7 +2722,6 @@ version = "1.36.6" description = "Type annotations for boto3 SSM 1.36.6 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_ssm-1.36.6-py3-none-any.whl", hash = "sha256:7f255428d79a8eb0adfde6f21b1b996275295d993157ffe0a6585bfea711583b"}, {file = "mypy_boto3_ssm-1.36.6.tar.gz", hash = "sha256:edc819b7526ab35b105648603839d158b00146af5743fc7784db3227073e1973"}, @@ -2857,7 +2736,6 @@ version = "1.36.0" description = "Type annotations for boto3 XRay 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_xray-1.36.0-py3-none-any.whl", hash = "sha256:b92a06db10f623db4ec0641227f468b7a57c77f8e599846cfddace4b434f70a5"}, {file = "mypy_boto3_xray-1.36.0.tar.gz", hash = "sha256:5ae2b4c333bf2881870ffb96f1d99cd5e7ee1706d071b6923dcd6de6ceb3ac0c"}, @@ -2872,7 +2750,6 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" -groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2884,7 +2761,6 @@ version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, @@ -2903,7 +2779,6 @@ version = "2024.10.9" description = "Flexible test automation." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "nox-2024.10.9-py3-none-any.whl", hash = "sha256:1d36f309a0a2a853e9bccb76bbef6bb118ba92fa92674d15604ca99adeb29eab"}, {file = "nox-2024.10.9.tar.gz", hash = "sha256:7aa9dc8d1c27e9f45ab046ffd1c3b2c4f7c91755304769df231308849ebded95"}, @@ -2926,8 +2801,6 @@ version = "1.16.0" description = "OpenTelemetry Python API" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "opentelemetry_api-1.16.0-py3-none-any.whl", hash = "sha256:79e8f0cf88dbdd36b6abf175d2092af1efcaa2e71552d0d2b3b181a9707bf4bc"}, {file = "opentelemetry_api-1.16.0.tar.gz", hash = "sha256:4b0e895a3b1f5e1908043ebe492d33e33f9ccdbe6d02d3994c2f8721a63ddddb"}, @@ -2943,7 +2816,6 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -2955,7 +2827,6 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -2971,7 +2842,6 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -2983,7 +2853,6 @@ version = "6.1.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" -groups = ["dev"] files = [ {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, @@ -2995,7 +2864,6 @@ version = "0.11.5" description = "Auto-generate API documentation for Python projects." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pdoc3-0.11.5-py3-none-any.whl", hash = "sha256:b614436239716e1655e538f68a42c62a0bac566e70ddd86c58bc66d6a9ec90a0"}, {file = "pdoc3-0.11.5.tar.gz", hash = "sha256:fc40607e3f46860ba42c02d30075fe1a52c039b77ffa8e86c1cbc4a8078841b3"}, @@ -3011,7 +2879,6 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -3028,7 +2895,6 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -3044,8 +2910,6 @@ version = "3.11" description = "Python Lex & Yacc" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, @@ -3057,8 +2921,6 @@ version = "5.29.3" description = "" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, @@ -3079,7 +2941,6 @@ version = "0.0.3" description = "Publication helps you maintain public-api-friendly modules by preventing unintentional access to private implementation details via introspection." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "publication-0.0.3-py2.py3-none-any.whl", hash = "sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6"}, {file = "publication-0.0.3.tar.gz", hash = "sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4"}, @@ -3091,7 +2952,6 @@ version = "9.0.0" description = "Get CPU info with pure Python" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -3103,12 +2963,10 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -3116,12 +2974,10 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] annotated-types = ">=0.6.0" @@ -3138,7 +2994,6 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -3241,7 +3096,6 @@ files = [ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" @@ -3252,8 +3106,6 @@ version = "2.7.1" description = "Settings management using Pydantic" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"all\"" files = [ {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, @@ -3274,7 +3126,6 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -3289,7 +3140,6 @@ version = "10.14.2" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pymdown_extensions-10.14.2-py3-none-any.whl", hash = "sha256:f45bc5892410e54fd738ab8ccd736098b7ff0cb27fdb4bf24d0a0c6584bc90e1"}, {file = "pymdown_extensions-10.14.2.tar.gz", hash = "sha256:7a77b8116dc04193f2c01143760a43387bd9dc4aa05efacb7d838885a7791253"}, @@ -3308,7 +3158,6 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -3323,7 +3172,6 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -3346,7 +3194,6 @@ version = "0.25.3" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3"}, {file = "pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a"}, @@ -3365,7 +3212,6 @@ version = "5.1.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pytest-benchmark-5.1.0.tar.gz", hash = "sha256:9ea661cdc292e8231f7cd4c10b0319e56a2118e2c09d9f50e1b3d150d2aca105"}, {file = "pytest_benchmark-5.1.0-py3-none-any.whl", hash = "sha256:922de2dfa3033c227c96da942d1878191afa135a29485fb942e85dff1c592c89"}, @@ -3386,7 +3232,6 @@ version = "6.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, @@ -3405,7 +3250,6 @@ version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -3423,7 +3267,6 @@ version = "0.7.0" description = "Pytest Plugin to disable socket calls during tests" optional = false python-versions = ">=3.8,<4.0" -groups = ["dev"] files = [ {file = "pytest_socket-0.7.0-py3-none-any.whl", hash = "sha256:7e0f4642177d55d317bbd58fc68c6bd9048d6eadb2d46a89307fa9221336ce45"}, {file = "pytest_socket-0.7.0.tar.gz", hash = "sha256:71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3"}, @@ -3438,7 +3281,6 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -3459,7 +3301,6 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3474,12 +3315,10 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] -markers = {main = "extra == \"all\""} [package.extras] cli = ["click (>=5.0)"] @@ -3490,8 +3329,6 @@ version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" -groups = ["dev"] -markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -3519,7 +3356,6 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -3582,7 +3418,6 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -3597,7 +3432,6 @@ version = "6.0.1" description = "Code Metrics in Python" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "radon-6.0.1-py2.py3-none-any.whl", hash = "sha256:632cc032364a6f8bb1010a2f6a12d0f14bc7e5ede76585ef29dc0cecf4cd8859"}, {file = "radon-6.0.1.tar.gz", hash = "sha256:d1ac0053943a893878940fedc8b19ace70386fc9c9bf0a09229a44125ebf45b5"}, @@ -3616,12 +3450,10 @@ version = "5.2.1" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, ] -markers = {main = "extra == \"redis\""} [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} @@ -3636,7 +3468,6 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -3653,7 +3484,6 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -3757,7 +3587,6 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -3779,7 +3608,6 @@ version = "0.9.5" description = "Easy to use retry decorator." optional = false python-versions = ">=2.6" -groups = ["dev"] files = [ {file = "retry2-0.9.5-py2.py3-none-any.whl", hash = "sha256:f7fee13b1e15d0611c462910a6aa72a8919823988dd0412152bc3719c89a4e55"}, ] @@ -3793,7 +3621,6 @@ version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, @@ -3813,7 +3640,6 @@ version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, @@ -3926,7 +3752,6 @@ version = "0.9.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624"}, {file = "ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c"}, @@ -3954,7 +3779,6 @@ version = "0.11.2" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc"}, {file = "s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f"}, @@ -3972,7 +3796,6 @@ version = "0.0.4" description = "Flexible recursive directory iterator: scandir meets glob(\"**\", recursive=True)" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "scantree-0.0.4-py3-none-any.whl", hash = "sha256:7616ab65aa6b7f16fcf8e6fa1d9afaa99a27ab72bba05c61b691853b96763174"}, {file = "scantree-0.0.4.tar.gz", hash = "sha256:15bd5cb24483b04db2c70653604e8ea3522e98087db7e38ab8482f053984c0ac"}, @@ -3988,7 +3811,6 @@ version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, @@ -4044,8 +3866,6 @@ version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, @@ -4066,7 +3886,6 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -4078,7 +3897,6 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -4090,7 +3908,6 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -4102,7 +3919,6 @@ version = "5.4.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "stevedore-5.4.0-py3-none-any.whl", hash = "sha256:b0be3c4748b3ea7b854b265dcb4caa891015e442416422be16f8b31756107857"}, {file = "stevedore-5.4.0.tar.gz", hash = "sha256:79e92235ecb828fe952b6b8b0c6c87863248631922c8e8e0fa5b17b232c4514d"}, @@ -4117,7 +3933,6 @@ version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, @@ -4135,7 +3950,6 @@ version = "4.9.1" description = "Python library for throwaway instances of anything that can run in a Docker container" optional = false python-versions = "<4.0,>=3.9" -groups = ["dev"] files = [ {file = "testcontainers-4.9.1-py3-none-any.whl", hash = "sha256:315fb94b42a383872df530aa45319745278ef0cc18b9cfcdc231a75d14afa5a0"}, {file = "testcontainers-4.9.1.tar.gz", hash = "sha256:37fe9a222549ddb788463935965b16f91809e9a8d654f437d6a59eac9b77f76f"}, @@ -4190,8 +4004,6 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_full_version <= \"3.11.0a6\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -4233,7 +4045,6 @@ version = "2.13.3" description = "Run-time type checker for Python" optional = false python-versions = ">=3.5.3" -groups = ["dev"] files = [ {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, @@ -4249,7 +4060,6 @@ version = "0.23.8" description = "Type annotations and code completion for awscrt" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_awscrt-0.23.8-py3-none-any.whl", hash = "sha256:d66b3817565769f5311b7e171a3c48d3dbf8a8f9c22f02686c2f003b6559a2a5"}, {file = "types_awscrt-0.23.8.tar.gz", hash = "sha256:2141391a8f4d36cf098406c19d9060b34f13a558c22d4aadac250a0c57d12710"}, @@ -4261,7 +4071,6 @@ version = "1.16.0.20241221" description = "Typing stubs for cffi" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_cffi-1.16.0.20241221-py3-none-any.whl", hash = "sha256:e5b76b4211d7a9185f6ab8d06a106d56c7eb80af7cdb8bfcb4186ade10fb112f"}, {file = "types_cffi-1.16.0.20241221.tar.gz", hash = "sha256:1c96649618f4b6145f58231acb976e0b448be6b847f7ab733dabe62dfbff6591"}, @@ -4276,7 +4085,6 @@ version = "24.1.0.20240722" description = "Typing stubs for pyOpenSSL" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39"}, {file = "types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54"}, @@ -4292,7 +4100,6 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -4304,7 +4111,6 @@ version = "4.6.0.20241004" description = "Typing stubs for redis" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types-redis-4.6.0.20241004.tar.gz", hash = "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e"}, {file = "types_redis-4.6.0.20241004-py3-none-any.whl", hash = "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed"}, @@ -4320,7 +4126,6 @@ version = "2.31.0.6" description = "Typing stubs for requests" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, @@ -4335,7 +4140,6 @@ version = "0.11.2" description = "Type annotations and code completion for s3transfer" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:09c31cff8c79a433fcf703b840b66d1f694a6c70c410ef52015dd4fe07ee0ae2"}, {file = "types_s3transfer-0.11.2.tar.gz", hash = "sha256:3ccb8b90b14434af2fb0d6c08500596d93f3a83fb804a2bb843d9bf4f7c2ca60"}, @@ -4347,7 +4151,6 @@ version = "75.8.0.20250110" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480"}, {file = "types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271"}, @@ -4359,7 +4162,6 @@ version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -4371,7 +4173,6 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -4383,8 +4184,6 @@ version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -4472,7 +4271,6 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -4489,7 +4287,6 @@ version = "0.1.0" description = "Flexible version handling" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, @@ -4504,7 +4301,6 @@ version = "20.29.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"}, {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"}, @@ -4525,7 +4321,6 @@ version = "6.0.0" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, @@ -4568,7 +4363,6 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -4650,7 +4444,6 @@ files = [ {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] -markers = {main = "extra == \"tracer\" or extra == \"all\" or extra == \"datadog\" or extra == \"datamasking\""} [[package]] name = "xenon" @@ -4658,7 +4451,6 @@ version = "0.9.3" description = "Monitor code metrics for Python on your CI server" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "xenon-0.9.3-py2.py3-none-any.whl", hash = "sha256:6e2c2c251cc5e9d01fe984e623499b13b2140fcbf74d6c03a613fa43a9347097"}, {file = "xenon-0.9.3.tar.gz", hash = "sha256:4a7538d8ba08aa5d79055fb3e0b2393c0bd6d7d16a4ab0fcdef02ef1f10a43fa"}, @@ -4675,8 +4467,6 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -4688,7 +4478,6 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, @@ -4713,6 +4502,6 @@ tracer = ["aws-xray-sdk"] validation = ["fastjsonschema"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = ">=3.9,<4.0.0" content-hash = "2bd6190fb26fceb1fa2b7efd2a3904b47130cbd38d2608c22091f1ec10495672" From 9d903a89d982949f9415c4a7ae9c68cbe58961e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:35:14 +0000 Subject: [PATCH 039/139] chore(deps): bump actions/setup-node from 4.1.0 to 4.2.0 (#5963) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.1.0 to 4.2.0. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/39370e3970a6d050c480ffad4ff0ed4d3fdee5af...1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- .github/workflows/publish_v2_layer.yml | 2 +- .github/workflows/publish_v3_layer.yml | 2 +- .github/workflows/reusable_deploy_v2_layer_stack.yml | 2 +- .github/workflows/reusable_deploy_v2_sar.yml | 2 +- .github/workflows/reusable_deploy_v3_layer_stack.yml | 2 +- .github/workflows/reusable_deploy_v3_sar.yml | 2 +- .github/workflows/run-e2e-tests.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish_v2_layer.yml b/.github/workflows/publish_v2_layer.yml index ddadc2f5c32..b9fd1a0c750 100644 --- a/.github/workflows/publish_v2_layer.yml +++ b/.github/workflows/publish_v2_layer.yml @@ -101,7 +101,7 @@ jobs: - name: Install poetry run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Setup Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "16.12" - name: Setup python diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 80f71004abe..47e5e3d8038 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -106,7 +106,7 @@ jobs: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 pipx inject poetry git+https://github.com/python-poetry/poetry-plugin-export@8c83d26603ca94f2e203bfded7b6d7f530960e06 # v1.8.0 - name: Setup Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "18.20.4" - name: Setup python diff --git a/.github/workflows/reusable_deploy_v2_layer_stack.yml b/.github/workflows/reusable_deploy_v2_layer_stack.yml index d98794d818f..b5cfa481e45 100644 --- a/.github/workflows/reusable_deploy_v2_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v2_layer_stack.yml @@ -159,7 +159,7 @@ jobs: role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} mask-aws-account-id: true - name: Setup Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "16.12" - name: Setup python diff --git a/.github/workflows/reusable_deploy_v2_sar.yml b/.github/workflows/reusable_deploy_v2_sar.yml index 0f4a3f3e231..930c8fb11cd 100644 --- a/.github/workflows/reusable_deploy_v2_sar.yml +++ b/.github/workflows/reusable_deploy_v2_sar.yml @@ -113,7 +113,7 @@ jobs: mask-aws-account-id: true - name: Setup Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: ${{ env.NODE_VERSION }} - name: Download artifact diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml index 50b59813b07..404e3a683a6 100644 --- a/.github/workflows/reusable_deploy_v3_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml @@ -163,7 +163,7 @@ jobs: role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} mask-aws-account-id: true - name: Setup Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "18.20.4" - name: Setup python diff --git a/.github/workflows/reusable_deploy_v3_sar.yml b/.github/workflows/reusable_deploy_v3_sar.yml index b5d110e95d6..993aca1dd86 100644 --- a/.github/workflows/reusable_deploy_v3_sar.yml +++ b/.github/workflows/reusable_deploy_v3_sar.yml @@ -109,7 +109,7 @@ jobs: role-to-assume: ${{ secrets.AWS_SAR_V2_ROLE_ARN }} mask-aws-account-id: true - name: Setup Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: ${{ env.NODE_VERSION }} - name: Download artifact diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index f3c5eba055f..d2cc90f8fd1 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -62,7 +62,7 @@ jobs: architecture: "x64" cache: "poetry" - name: Setup Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "20.10.0" - name: Install CDK CLI From 34f8fe9a084722bf01e02299594fb59d3a98d282 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:38:57 +0000 Subject: [PATCH 040/139] chore(deps): bump actions/upload-artifact from 4.5.0 to 4.6.0 (#5962) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.5.0 to 4.6.0. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/6f51ac03b9356f520e9adb1b1b7802705f340c2b...65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/layer_govcloud.yml | 4 ++-- .github/workflows/layer_govcloud_python313.yml | 4 ++-- .github/workflows/layer_rename.yml | 4 ++-- .github/workflows/ossf_scorecard.yml | 2 +- .github/workflows/publish_v2_layer.yml | 2 +- .github/workflows/publish_v3_layer.yml | 2 +- .github/workflows/record_pr.yml | 2 +- .github/workflows/reusable_deploy_v2_layer_stack.yml | 2 +- .github/workflows/reusable_deploy_v3_layer_stack.yml | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/layer_govcloud.yml b/.github/workflows/layer_govcloud.yml index 3a98ceca223..03a2182c770 100644 --- a/.github/workflows/layer_govcloud.yml +++ b/.github/workflows/layer_govcloud.yml @@ -69,14 +69,14 @@ jobs: aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-${{ matrix.arch }}:${{ inputs.version }} --query 'Content.Location' | xargs curl -L -o ${{ matrix.layer }}_${{ matrix.arch }}.zip aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-${{ matrix.arch }}:${{ inputs.version }} > ${{ matrix.layer }}_${{ matrix.arch }}.json - name: Store Zip - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: ${{ matrix.layer }}_${{ matrix.arch }}.zip path: ${{ matrix.layer }}_${{ matrix.arch }}.zip retention-days: 1 if-no-files-found: error - name: Store Metadata - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: ${{ matrix.layer }}_${{ matrix.arch }}.json path: ${{ matrix.layer }}_${{ matrix.arch }}.json diff --git a/.github/workflows/layer_govcloud_python313.yml b/.github/workflows/layer_govcloud_python313.yml index 40a25eac2e9..70c2414675a 100644 --- a/.github/workflows/layer_govcloud_python313.yml +++ b/.github/workflows/layer_govcloud_python313.yml @@ -65,14 +65,14 @@ jobs: aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-${{ matrix.arch }}:${{ inputs.version }} --query 'Content.Location' | xargs curl -L -o ${{ matrix.layer }}_${{ matrix.arch }}.zip aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-${{ matrix.arch }}:${{ inputs.version }} > ${{ matrix.layer }}_${{ matrix.arch }}.json - name: Store Zip - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: ${{ matrix.layer }}_${{ matrix.arch }}.zip path: ${{ matrix.layer }}_${{ matrix.arch }}.zip retention-days: 1 if-no-files-found: error - name: Store Metadata - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: ${{ matrix.layer }}_${{ matrix.arch }}.json path: ${{ matrix.layer }}_${{ matrix.arch }}.json diff --git a/.github/workflows/layer_rename.yml b/.github/workflows/layer_rename.yml index 0db7d9a37a3..b3354e92887 100644 --- a/.github/workflows/layer_rename.yml +++ b/.github/workflows/layer_rename.yml @@ -66,14 +66,14 @@ jobs: aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-x86:${{ inputs.version }} --query 'Content.Location' | xargs curl -L -o ${{ matrix.layer }}_x86_64.zip aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-x86:${{ inputs.version }} > ${{ matrix.layer }}_x86_64.json - name: Store Zip - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: ${{ matrix.layer }}_x86_64.zip path: ${{ matrix.layer }}_x86_64.zip retention-days: 1 if-no-files-found: error - name: Store Metadata - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: ${{ matrix.layer }}_x86_64.json path: ${{ matrix.layer }}_x86_64.json diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index 473db555bb0..df43f225871 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -35,7 +35,7 @@ jobs: repo_token: ${{ secrets.SCORECARD_TOKEN }} # read-only fine-grained token to read branch protection settings - name: "Upload results" - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: SARIF file path: results.sarif diff --git a/.github/workflows/publish_v2_layer.yml b/.github/workflows/publish_v2_layer.yml index b9fd1a0c750..772c9e2de2a 100644 --- a/.github/workflows/publish_v2_layer.yml +++ b/.github/workflows/publish_v2_layer.yml @@ -146,7 +146,7 @@ jobs: - name: zip output run: zip -r cdk.out.zip cdk.out - name: Archive CDK artifacts - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: cdk-layer-artefact path: layer/cdk.out.zip diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 47e5e3d8038..3efd59557a8 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -151,7 +151,7 @@ jobs: - name: zip output run: zip -r cdk.py${{ matrix.python-version }}.out.zip cdk.out - name: Archive CDK artifacts - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: cdk-layer-artifact-py${{ matrix.python-version }} path: layer_v3/cdk.py${{ matrix.python-version }}.out.zip diff --git a/.github/workflows/record_pr.yml b/.github/workflows/record_pr.yml index 2ee18fa74b0..1f0b6ef23c0 100644 --- a/.github/workflows/record_pr.yml +++ b/.github/workflows/record_pr.yml @@ -53,7 +53,7 @@ jobs: script: | const script = require('.github/scripts/save_pr_details.js') await script({github, context, core}) - - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: pr path: pr.txt diff --git a/.github/workflows/reusable_deploy_v2_layer_stack.yml b/.github/workflows/reusable_deploy_v2_layer_stack.yml index b5cfa481e45..9feee088c2c 100644 --- a/.github/workflows/reusable_deploy_v2_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v2_layer_stack.yml @@ -198,7 +198,7 @@ jobs: cat cdk-layer-stack/${{ matrix.region }}-layer-version.txt - name: Save Layer ARN artifact if: ${{ inputs.stage == 'PROD' }} - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: cdk-layer-stack-${{ matrix.region }} path: ./layer/cdk-layer-stack/* # NOTE: upload-artifact does not inherit working-directory setting. diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml index 404e3a683a6..c255d37059a 100644 --- a/.github/workflows/reusable_deploy_v3_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml @@ -209,7 +209,7 @@ jobs: cat cdk-layer-stack/${{steps.constants.outputs.LAYER_VERSION}} - name: Save Layer ARN artifact if: ${{ inputs.stage == 'PROD' }} - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: cdk-layer-stack-${{ matrix.region }}-${{ matrix.python-version }} path: ./layer_v3/cdk-layer-stack/* # NOTE: upload-artifact does not inherit working-directory setting. From c8c9659600b9618a2d96e58c44d4bc4a70f0c78a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:39:54 +0000 Subject: [PATCH 041/139] chore(deps-dev): bump isort from 5.13.2 to 6.0.0 (#5965) Bumps [isort](https://github.com/pycqa/isort) from 5.13.2 to 6.0.0. - [Release notes](https://github.com/pycqa/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md) - [Commits](https://github.com/pycqa/isort/compare/5.13.2...6.0.0) --- updated-dependencies: - dependency-name: isort dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 13 +++++++------ pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 75839815750..235b0b2af74 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1982,17 +1982,18 @@ files = [ [[package]] name = "isort" -version = "5.13.2" +version = "6.0.0" description = "A Python utility / library to sort Python imports." optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.9.0" files = [ - {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, - {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, + {file = "isort-6.0.0-py3-none-any.whl", hash = "sha256:567954102bb47bb12e0fae62606570faacddd441e45683968c8d1734fb1af892"}, + {file = "isort-6.0.0.tar.gz", hash = "sha256:75d9d8a1438a9432a7d7b54f2d3b45cad9a4a0fdba43617d9873379704a8bdf1"}, ] [package.extras] -colors = ["colorama (>=0.4.6)"] +colors = ["colorama"] +plugins = ["setuptools"] [[package]] name = "jinja2" @@ -4504,4 +4505,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "2bd6190fb26fceb1fa2b7efd2a3904b47130cbd38d2608c22091f1ec10495672" +content-hash = "4ab143a3ce04ab9054e157efcb90f694d87985113a5fb97161268d25d35d0280" diff --git a/pyproject.toml b/pyproject.toml index cb9a50b3080..4535d17e5bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -79,7 +79,7 @@ coverage = { extras = ["toml"], version = "^7.6" } pytest = "^8.3.4" black = "^24.8" boto3 = "^1.26.164" -isort = "^5.13.2" +isort = ">=5.13.2,<7.0.0" pytest-cov = ">=5,<7" pytest-mock = "^3.14.0" pdoc3 = "^0.11.0" From 9241d15d4503db6fae3d0b0107c9a8b7478e94b5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:41:14 +0000 Subject: [PATCH 042/139] chore(ci): new pre-release 3.5.1a2 (#5970) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.5.1a2/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.5.1a2/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index e5f16482eba..c681b2c79a8 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.1a1" +VERSION = "3.5.1a2" diff --git a/provenance/3.5.1a2/multiple.intoto.jsonl b/provenance/3.5.1a2/multiple.intoto.jsonl new file mode 100644 index 00000000000..a9c94a8335a --- /dev/null +++ b/provenance/3.5.1a2/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWEyLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiYTAzMzNlZjFlNGQ2Y2M1ZTRjZjVjZTc1ZGQ4MTRmNTNmNDk2MjdlNDMwNzVjMTkyZTIzOGRhYTJkMzY1MDZjZSJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWEyLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI3NWY4MzZkOGZiY2VkZmQzNzBkZDI3NDljZDc5YmZhNzYxM2YzY2E4MmFiZDc5MzI4ZGIyOTE1ZjkyMTg1MGViIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiMjRmY2MwZjdiYmZiM2Y1YjViNmU5Yjc0NWU4NjBmMDFjNjg0NDg3MyJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwNiwiZm9ya3NfY291bnQiOjQwNiwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo3NCwib3Blbl9pc3N1ZXNfY291bnQiOjc0LCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDEtMzFUMDc6MjY6MjFaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjY3NDgzLCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5NzYsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDEtMzBUMjM6MDQ6MjBaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5NzYsIndhdGNoZXJzX2NvdW50IjoyOTc2LCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzA2ODY5MjkzMCIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTY2IiwiZ2l0aHViX3NoYTEiOiIyNGZjYzBmN2JiZmIzZjViNWI2ZTliNzQ1ZTg2MGYwMWM2ODQ0ODczIn19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMDY4NjkyOTMwLTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiIyNGZjYzBmN2JiZmIzZjViNWI2ZTliNzQ1ZTg2MGYwMWM2ODQ0ODczIn19XX19","signatures":[{"keyid":"","sig":"MEUCICOsN/kVZ8uRbwIJvo3fC+zDTfsldiUFlciZ6UF/thLvAiEAnTh2k/YoeZIjT3wvMEkU4iYUn53nAWBcRMaaiV/qqm4=","cert":"-----BEGIN CERTIFICATE-----\nMIIHZTCCBuygAwIBAgIUNICEhsMtBmFplKkqsNlDS5L8n20wCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMTMxMDgwNzQyWhcNMjUwMTMxMDgxNzQyWjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAE6+S+ocOH0WG6f7jUV88EwQZEaQ0Aj/6Y5Z5Q\nmvzSbAEzioGA0M9jQLZXhZQMyyShKZPE14WKl63PNikJ0E7b5aOCBgswggYHMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUPdEo\nzJ7twK1pwiJx+aDS1xAyRA0wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCgyNGZj\nYzBmN2JiZmIzZjViNWI2ZTliNzQ1ZTg2MGYwMWM2ODQ0ODczMBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDCgyNGZjYzBmN2JiZmIzZjViNWI2ZTliNzQ1ZTg2MGYwMWM2ODQ0ODczMCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoMjRm\nY2MwZjdiYmZiM2Y1YjViNmU5Yjc0NWU4NjBmMDFjNjg0NDg3MzAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMwNjg2OTI5MzAvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlLtmxsAAAAQDAEcwRQIhAJrsBTJRGfQkCLoLWeZW\n7jL97W5XrSQl0uFmwyuPUX/QAiBDvxpcEOvcV0yLvKROmmUs326BqP+5onQ5QcwC\noXGPTTAKBggqhkjOPQQDAwNnADBkAjA2x+VEUt2Bx4DuBauS5rCGLlCfNJh2eVF8\nBdbkr1fGeIJfdwvahYYZlCIKB4D3XyUCMHVjawhBRkYeDxetlReCjSrrqTzGYPer\nfREw5GychT7sBBZScjfb/tIzdvc3Jyvxig==\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 4535d17e5bc..5b334cca0f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.1a1" +version = "3.5.1a2" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From cf8c37d0f7b397dd128e96bd656c199d9cec6892 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:43:54 +0000 Subject: [PATCH 043/139] chore(deps-dev): bump cfn-lint from 1.22.7 to 1.23.1 (#5967) Bumps [cfn-lint](https://github.com/aws-cloudformation/cfn-lint) from 1.22.7 to 1.23.1. - [Release notes](https://github.com/aws-cloudformation/cfn-lint/releases) - [Changelog](https://github.com/aws-cloudformation/cfn-lint/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-cloudformation/cfn-lint/compare/v1.22.7...v1.23.1) --- updated-dependencies: - dependency-name: cfn-lint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 235b0b2af74..a2626dd6348 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1070,13 +1070,13 @@ pycparser = "*" [[package]] name = "cfn-lint" -version = "1.22.7" +version = "1.23.1" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" files = [ - {file = "cfn_lint-1.22.7-py3-none-any.whl", hash = "sha256:6ae732fd11cba6b01ce577fe4d985c407166010faf385eb5b30236916b02ad29"}, - {file = "cfn_lint-1.22.7.tar.gz", hash = "sha256:0cd99a217c3f197939b15dd0badfa49e90142d315c78e644f07bb8d943dd1b3e"}, + {file = "cfn_lint-1.23.1-py3-none-any.whl", hash = "sha256:6f89f557dea6484cd5bc1b32cef91e9898dd1d98f12d5b59a7f6baf9cf61b7ee"}, + {file = "cfn_lint-1.23.1.tar.gz", hash = "sha256:2ee8722673414a3993921d87cc1893934d313b9b953da7a91442f81958d86644"}, ] [package.dependencies] @@ -4505,4 +4505,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "4ab143a3ce04ab9054e157efcb90f694d87985113a5fb97161268d25d35d0280" +content-hash = "38cb8e4a579272ae56eaeceaaf57eefd40471e7a4cc61a44efe76743893a8bf5" diff --git a/pyproject.toml b/pyproject.toml index 5b334cca0f5..526a04c238a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -108,7 +108,7 @@ hvac = "^2.3.0" aws-requests-auth = "^0.4.3" urllib3 = "<2" requests = ">=2.32.0" -cfn-lint = "1.22.7" +cfn-lint = "1.23.1" mypy = "^1.1.1" types-python-dateutil = "^2.8.19.6" aws-cdk-aws-appsync-alpha = "^2.59.0a0" From 23052b6aa565b2668fea19980ba71a9bdfdbea7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:46:37 +0000 Subject: [PATCH 044/139] chore(ci): changelog rebuild (#5971) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 834edf15faf..0480a45e059 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,8 +15,11 @@ ## Maintenance -* **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) +* **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) +* **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) +* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) +* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) From 61226c3686819c8b42854b485b970da5ec6ad28a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:47:08 +0000 Subject: [PATCH 045/139] chore(deps-dev): bump ruff from 0.9.3 to 0.9.4 (#5969) Bumps [ruff](https://github.com/astral-sh/ruff) from 0.9.3 to 0.9.4. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.9.3...0.9.4) --- updated-dependencies: - dependency-name: ruff dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 40 ++++++++++++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/poetry.lock b/poetry.lock index a2626dd6348..a0349631d0a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3749,29 +3749,29 @@ files = [ [[package]] name = "ruff" -version = "0.9.3" +version = "0.9.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624"}, - {file = "ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c"}, - {file = "ruff-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c59ab92f8e92d6725b7ded9d4a31be3ef42688a115c6d3da9457a5bda140e2b4"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc153c25e715be41bb228bc651c1e9b1a88d5c6e5ed0194fa0dfea02b026439"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:646909a1e25e0dc28fbc529eab8eb7bb583079628e8cbe738192853dbbe43af5"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a5a46e09355695fbdbb30ed9889d6cf1c61b77b700a9fafc21b41f097bfbba4"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c4bb09d2bbb394e3730d0918c00276e79b2de70ec2a5231cd4ebb51a57df9ba1"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96a87ec31dc1044d8c2da2ebbed1c456d9b561e7d087734336518181b26b3aa5"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb7554aca6f842645022fe2d301c264e6925baa708b392867b7a62645304df4"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabc332b7075a914ecea912cd1f3d4370489c8018f2c945a30bcc934e3bc06a6"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:33866c3cc2a575cbd546f2cd02bdd466fed65118e4365ee538a3deffd6fcb730"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:006e5de2621304c8810bcd2ee101587712fa93b4f955ed0985907a36c427e0c2"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ba6eea4459dbd6b1be4e6bfc766079fb9b8dd2e5a35aff6baee4d9b1514ea519"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90230a6b8055ad47d3325e9ee8f8a9ae7e273078a66401ac66df68943ced029b"}, - {file = "ruff-0.9.3-py3-none-win32.whl", hash = "sha256:eabe5eb2c19a42f4808c03b82bd313fc84d4e395133fb3fc1b1516170a31213c"}, - {file = "ruff-0.9.3-py3-none-win_amd64.whl", hash = "sha256:040ceb7f20791dfa0e78b4230ee9dce23da3b64dd5848e40e3bf3ab76468dcf4"}, - {file = "ruff-0.9.3-py3-none-win_arm64.whl", hash = "sha256:800d773f6d4d33b0a3c60e2c6ae8f4c202ea2de056365acfa519aa48acf28e0b"}, - {file = "ruff-0.9.3.tar.gz", hash = "sha256:8293f89985a090ebc3ed1064df31f3b4b56320cdfcec8b60d3295bddb955c22a"}, + {file = "ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706"}, + {file = "ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf"}, + {file = "ruff-0.9.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54499fb08408e32b57360f6f9de7157a5fec24ad79cb3f42ef2c3f3f728dfe2b"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c892540108314a6f01f105040b5106aeb829fa5fb0561d2dcaf71485021137"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de9edf2ce4b9ddf43fd93e20ef635a900e25f622f87ed6e3047a664d0e8f810e"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c90c32357c74f11deb7fbb065126d91771b207bf9bfaaee01277ca59b574ec"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56acd6c694da3695a7461cc55775f3a409c3815ac467279dfa126061d84b314b"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0c93e7d47ed951b9394cf352d6695b31498e68fd5782d6cbc282425655f687a"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d4c8772670aecf037d1bf7a07c39106574d143b26cfe5ed1787d2f31e800214"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc5f1d7afeda8d5d37660eeca6d389b142d7f2b5a1ab659d9214ebd0e025231"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faa935fc00ae854d8b638c16a5f1ce881bc3f67446957dd6f2af440a5fc8526b"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a6c634fc6f5a0ceae1ab3e13c58183978185d131a29c425e4eaa9f40afe1e6d6"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:433dedf6ddfdec7f1ac7575ec1eb9844fa60c4c8c2f8887a070672b8d353d34c"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d612dbd0f3a919a8cc1d12037168bfa536862066808960e0cc901404b77968f0"}, + {file = "ruff-0.9.4-py3-none-win32.whl", hash = "sha256:db1192ddda2200671f9ef61d9597fcef89d934f5d1705e571a93a67fb13a4402"}, + {file = "ruff-0.9.4-py3-none-win_amd64.whl", hash = "sha256:05bebf4cdbe3ef75430d26c375773978950bbf4ee3c95ccb5448940dc092408e"}, + {file = "ruff-0.9.4-py3-none-win_arm64.whl", hash = "sha256:585792f1e81509e38ac5123492f8875fbc36f3ede8185af0a26df348e5154f41"}, + {file = "ruff-0.9.4.tar.gz", hash = "sha256:6907ee3529244bb0ed066683e075f09285b38dd5b4039370df6ff06041ca19e7"}, ] [[package]] @@ -4505,4 +4505,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "38cb8e4a579272ae56eaeceaaf57eefd40471e7a4cc61a44efe76743893a8bf5" +content-hash = "18f5348392862636a7e20cb0fc4e0f080e618af52ff138c15b5ca87f181ff18e" diff --git a/pyproject.toml b/pyproject.toml index 526a04c238a..29cf2f3e527 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -114,7 +114,7 @@ types-python-dateutil = "^2.8.19.6" aws-cdk-aws-appsync-alpha = "^2.59.0a0" httpx = ">=0.23.3,<0.29.0" sentry-sdk = ">=1.22.2,<3.0.0" -ruff = ">=0.5.1,<0.9.4" +ruff = ">=0.5.1,<0.9.5" retry2 = "^0.9.5" pytest-socket = ">=0.6,<0.8" types-redis = "^4.6.0.7" From 5e72d584a25459275ffc25d9e53ce0ec7f4bd09f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:53:49 +0000 Subject: [PATCH 046/139] chore(deps-dev): bump black from 24.10.0 to 25.1.0 (#5968) Bumps [black](https://github.com/psf/black) from 24.10.0 to 25.1.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/24.10.0...25.1.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 48 ++++++++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/poetry.lock b/poetry.lock index a0349631d0a..02b9ecd89e1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -363,33 +363,33 @@ yaml = ["PyYAML"] [[package]] name = "black" -version = "24.10.0" +version = "25.1.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" files = [ - {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, - {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, - {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, - {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, - {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, - {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, - {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, - {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, - {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, - {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, - {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, - {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, - {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, - {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, - {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, - {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, - {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, - {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, - {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, - {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, - {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, - {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, + {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, + {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, + {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, + {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, + {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, + {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, + {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, + {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, + {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, + {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, + {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, + {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, + {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, + {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, + {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, + {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, + {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"}, + {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"}, + {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"}, + {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"}, + {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, + {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, ] [package.dependencies] @@ -4505,4 +4505,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "18f5348392862636a7e20cb0fc4e0f080e618af52ff138c15b5ca87f181ff18e" +content-hash = "7b0e350232a85de1bf6b1b1fd36bc97f9a458b1c0ad8ce378a809dec426e3ecd" diff --git a/pyproject.toml b/pyproject.toml index 29cf2f3e527..cebdcba2b4a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -77,7 +77,7 @@ datamasking = ["aws-encryption-sdk", "jsonpath-ng"] [tool.poetry.group.dev.dependencies] coverage = { extras = ["toml"], version = "^7.6" } pytest = "^8.3.4" -black = "^24.8" +black = ">=24.8,<26.0" boto3 = "^1.26.164" isort = ">=5.13.2,<7.0.0" pytest-cov = ">=5,<7" From bc89c72fc7cc9cc8584058ce92c9510c31dbc79e Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Fri, 31 Jan 2025 18:57:17 +0000 Subject: [PATCH 047/139] docs(api): migrating the validation utility to mkdocstrings (#5972) Mkdocstrings - Validation module --- .../utilities/validation/__init__.py | 2 ++ .../utilities/validation/exceptions.py | 2 +- docs/api_doc/validation.md | 2 ++ mkdocs.yml | 19 +++++++++---------- 4 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 docs/api_doc/validation.md diff --git a/aws_lambda_powertools/utilities/validation/__init__.py b/aws_lambda_powertools/utilities/validation/__init__.py index 45d076ff207..d19581a1258 100644 --- a/aws_lambda_powertools/utilities/validation/__init__.py +++ b/aws_lambda_powertools/utilities/validation/__init__.py @@ -1,5 +1,7 @@ """ Simple validator to enforce incoming/outgoing event conforms with JSON Schema +!!! abstract "Usage Documentation" + [`Validation`](../utilities/validation.md) """ from .exceptions import ( diff --git a/aws_lambda_powertools/utilities/validation/exceptions.py b/aws_lambda_powertools/utilities/validation/exceptions.py index 9a1c3de22a3..8f8f77df64f 100644 --- a/aws_lambda_powertools/utilities/validation/exceptions.py +++ b/aws_lambda_powertools/utilities/validation/exceptions.py @@ -19,7 +19,7 @@ def __init__( rule: str | None = None, rule_definition: Any | None = None, ): - """ + """When serialization fail schema validation Parameters ---------- diff --git a/docs/api_doc/validation.md b/docs/api_doc/validation.md new file mode 100644 index 00000000000..1cdba7b5fa1 --- /dev/null +++ b/docs/api_doc/validation.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.validation diff --git a/mkdocs.yml b/mkdocs.yml index f97d46ebc3e..c82b2576e3a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -62,6 +62,8 @@ nav: # - Overview: contributing/tracks/overview.md # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md + - API Documentation: + - Validation: api_doc/validation.md theme: name: material @@ -144,22 +146,19 @@ plugins: import: - https://docs.python.org/3/objects.inv options: - # General - allow_inspection: true - show_source: true - show_bases: true # Headings - heading_level: 2 - #show_root_heading: false + #heading_level: 2 + #show_root_heading: true #show_root_toc_entry: true #show_root_full_path: true #show_root_members_full_path: false #show_object_full_path: false - #show_category_heading: true + show_category_heading: false # Members - filters: ["!^_[^_]"] + filters: ["!^_"] group_by_category: true - show_submodules: false + members_order: alphabetical + show_submodules: true # Docstrings docstring_style: numpy docstring_options: @@ -168,10 +167,10 @@ plugins: merge_init_into_class: true show_if_no_docstring: false # Signature - annotations_path: brief show_signature: true show_signature_annotations: true separate_signature: true + summary: true extra_css: - stylesheets/extra.css From 18dbb1d24e9cdf39f709b9fec01e2fa6752db2d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Falc=C3=A3o?= Date: Fri, 31 Jan 2025 19:22:54 -0300 Subject: [PATCH 048/139] feat(logger): add clear_state method (#5956) * feat(logger): add clear_state method to Logger * changes after feedback * change reset default keys --------- Co-authored-by: Leandro Damascena --- aws_lambda_powertools/logging/logger.py | 10 +++- docs/core/logger.md | 25 ++++++++- examples/logger/src/after_clear_state.json | 7 +++ examples/logger/src/before_clear_state.json | 20 +++++++ examples/logger/src/clear_state_method.py | 15 ++++++ .../required_dependencies/test_logger.py | 54 +++++++++++++++++++ 6 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 examples/logger/src/after_clear_state.json create mode 100644 examples/logger/src/before_clear_state.json create mode 100644 examples/logger/src/clear_state_method.py diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index ab29b6af649..61bfb82867b 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -222,6 +222,7 @@ def __init__( choice=sampling_rate, env=os.getenv(constants.LOGGER_LOG_SAMPLING_RATE), ) + self._default_log_keys: dict[str, Any] = {"service": self.service, "sampling_rate": self.sampling_rate} self.child = child self.logger_formatter = logger_formatter self._stream = stream or sys.stdout @@ -231,7 +232,6 @@ def __init__( self._is_deduplication_disabled = resolve_truthy_env_var_choice( env=os.getenv(constants.LOGGER_LOG_DEDUPLICATION_ENV, "false"), ) - self._default_log_keys = {"service": self.service, "sampling_rate": self.sampling_rate} self._logger = self._get_logger() # NOTE: This is primarily to improve UX, so IDEs can autocomplete LambdaPowertoolsFormatter options @@ -605,6 +605,14 @@ def append_context_keys(self, **additional_keys: Any) -> Generator[None, None, N with self.registered_formatter.append_context_keys(**additional_keys): yield + def clear_state(self) -> None: + """Removes all custom keys that were appended to the Logger.""" + # Clear all custom keys from the formatter + self.registered_formatter.clear_state() + + # Reset to default keys + self.structure_logs(**self._default_log_keys) + # These specific thread-safe methods are necessary to manage shared context in concurrent environments. # They prevent race conditions and ensure data consistency across multiple threads. def thread_safe_append_keys(self, **additional_keys: object) -> None: diff --git a/docs/core/logger.md b/docs/core/logger.md index 9915f7cc4b4..27fb532ad00 100644 --- a/docs/core/logger.md +++ b/docs/core/logger.md @@ -274,13 +274,15 @@ You can remove any additional key from Logger state using `remove_keys`. #### Clearing all state +##### Decorator with clear_state + Logger is commonly initialized in the global scope. Due to [Lambda Execution Context reuse](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-context.html){target="_blank"}, this means that custom keys can be persisted across invocations. If you want all custom keys to be deleted, you can use `clear_state=True` param in `inject_lambda_context` decorator. ???+ tip "Tip: When is this useful?" It is useful when you add multiple custom keys conditionally, instead of setting a default `None` value if not present. Any key with `None` value is automatically removed by Logger. ???+ danger "Danger: This can have unintended side effects if you use Layers" - Lambda Layers code is imported before the Lambda handler. + Lambda Layers code is imported before the Lambda handler. When a Lambda function starts, it first imports and executes all code in the Layers (including any global scope code) before proceeding to the function's own code. This means that `clear_state=True` will instruct Logger to remove any keys previously added before Lambda handler execution proceeds. @@ -304,6 +306,27 @@ Logger is commonly initialized in the global scope. Due to [Lambda Execution Con --8<-- "examples/logger/src/clear_state_event_two.json" ``` +##### clear_state method + +You can call `clear_state()` as a method explicitly within your code to clear appended keys at any point during the execution of your Lambda invocation. + +=== "clear_state_method.py" + + ```python hl_lines="12" + --8<-- "examples/logger/src/clear_state_method.py" + ``` +=== "Output before clear_state()" + + ```json hl_lines="9 17" + --8<-- "examples/logger/src/before_clear_state.json" + ``` + +=== "Output after clear_state()" + + ```json hl_lines="4" + --8<-- "examples/logger/src/after_clear_state.json" + ``` + ### Accessing currently configured keys You can view all currently configured keys from the Logger state using the `get_current_keys()` method. This method is useful when you need to avoid overwriting keys that are already configured. diff --git a/examples/logger/src/after_clear_state.json b/examples/logger/src/after_clear_state.json new file mode 100644 index 00000000000..54dd72ed41e --- /dev/null +++ b/examples/logger/src/after_clear_state.json @@ -0,0 +1,7 @@ +{ + "level": "INFO", + "location": "lambda_handler:126", + "message": "State after clearing - only show default keys", + "timestamp": "2025-01-30 13:56:03,158-0300", + "service": "payment" +} \ No newline at end of file diff --git a/examples/logger/src/before_clear_state.json b/examples/logger/src/before_clear_state.json new file mode 100644 index 00000000000..a710dbde0d6 --- /dev/null +++ b/examples/logger/src/before_clear_state.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "level": "INFO", + "location": "lambda_handler:122", + "message": "Starting order processing", + "timestamp": "2025-01-30 13:56:03,157-0300", + "service": "payment", + "order_id": "12345" + }, + { + "level": "INFO", + "location": "lambda_handler:124", + "message": "Final state before clearing", + "timestamp": "2025-01-30 13:56:03,157-0300", + "service": "payment", + "order_id": "12345" + } + ] +} \ No newline at end of file diff --git a/examples/logger/src/clear_state_method.py b/examples/logger/src/clear_state_method.py new file mode 100644 index 00000000000..1564b4c2c39 --- /dev/null +++ b/examples/logger/src/clear_state_method.py @@ -0,0 +1,15 @@ +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.typing import LambdaContext + +logger = Logger(service="payment", level="DEBUG") + + +def lambda_handler(event: dict, context: LambdaContext) -> str: + try: + logger.append_keys(order_id="12345") + logger.info("Starting order processing") + finally: + logger.info("Final state before clearing") + logger.clear_state() + logger.info("State after clearing - only show default keys") + return "Completed" diff --git a/tests/functional/logger/required_dependencies/test_logger.py b/tests/functional/logger/required_dependencies/test_logger.py index 5c85677d73d..92c8e27ff4b 100644 --- a/tests/functional/logger/required_dependencies/test_logger.py +++ b/tests/functional/logger/required_dependencies/test_logger.py @@ -1232,3 +1232,57 @@ def test_logger_change_level_child_logger(stdout, service_name): logs = list(stdout.getvalue().strip().split("\n")) assert len(logs) == 1 assert "service" in logs[0] + + +def test_clear_state_with_append_keys(): + # GIVEN a Logger is initialized + logger = Logger(service="service_name", stream=stdout) + + # WHEN append keys are added + logger.append_keys(custom_key="custom_key") + logger.info("message with appended keys") + logger.clear_state() + + # THEN context keys should be cleared + assert "custom_key" not in logger.get_current_keys() + + +def test_clear_state(stdout, service_name): + # GIVEN a Logger is initialized + logger = Logger(service=service_name, stream=stdout) + logger.info("message for the user") + + # WHEN the clear_state method is called + logger.clear_state() + + # THEN the logger's current keys should be reset to their default values + expected_keys = { + "level": "%(levelname)s", + "location": "%(funcName)s:%(lineno)d", + "message": None, + "timestamp": "%(asctime)s", + "service": service_name, + "sampling_rate": None, + } + assert logger.get_current_keys() == expected_keys + + +def test_clear_state_log_output(stdout, service_name): + # GIVEN a Logger is initialized + logger = Logger(service=service_name, stream=stdout) + + # WHEN we append a custom key and log + logger.append_keys(custom_key="test_value") + logger.info("first message") + + # AND we clear the state and log again + logger.clear_state() + logger.info("second message") + + # THEN the first log should contain the custom key + # AND the second log should not contain the custom key + first_log, second_log = capture_multiple_logging_statements_output(stdout) + + assert "custom_key" in first_log + assert first_log["custom_key"] == "test_value" + assert "custom_key" not in second_log From 1cbf760ddc42dc42cd3124dffea0c1db8d90433b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 19:31:17 -0300 Subject: [PATCH 049/139] chore(deps): bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 (#5975) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore(deps): bump aws-actions/configure-aws-credentials Bumps [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) from 4.0.2 to 4.0.3. - [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases) - [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-actions/configure-aws-credentials/compare/e3dd6a429d7300a6a4c196c26e071d42e0343502...4fc4975a852c8cd99761e2de1f4ba73402e44dd9) --- updated-dependencies: - dependency-name: aws-actions/configure-aws-credentials dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- .github/workflows/bootstrap_region.yml | 4 ++-- .github/workflows/dispatch_analytics.yml | 2 +- .github/workflows/layer_govcloud.yml | 6 +++--- .github/workflows/layer_govcloud_python313.yml | 6 +++--- .github/workflows/layer_govcloud_verify.yml | 6 +++--- .github/workflows/layer_rename.yml | 4 ++-- .github/workflows/reusable_deploy_v2_layer_stack.yml | 2 +- .github/workflows/reusable_deploy_v2_sar.yml | 4 ++-- .github/workflows/reusable_deploy_v3_layer_stack.yml | 2 +- .github/workflows/reusable_deploy_v3_sar.yml | 4 ++-- .github/workflows/reusable_publish_docs.yml | 2 +- .github/workflows/run-e2e-tests.yml | 2 +- .github/workflows/update_ssm.yml | 2 +- 13 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/bootstrap_region.yml b/.github/workflows/bootstrap_region.yml index 3cc96d3113f..ed3dd80511a 100644 --- a/.github/workflows/bootstrap_region.yml +++ b/.github/workflows/bootstrap_region.yml @@ -45,7 +45,7 @@ jobs: steps: - id: credentials name: AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: aws-region: ${{ inputs.region }} role-to-assume: ${{ secrets.REGION_IAM_ROLE }} @@ -91,7 +91,7 @@ jobs: steps: - id: credentials name: AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: aws-region: us-east-1 role-to-assume: ${{ secrets.REGION_IAM_ROLE }} diff --git a/.github/workflows/dispatch_analytics.yml b/.github/workflows/dispatch_analytics.yml index ddc4294b262..0d9612f5643 100644 --- a/.github/workflows/dispatch_analytics.yml +++ b/.github/workflows/dispatch_analytics.yml @@ -43,7 +43,7 @@ jobs: statuses: read steps: - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: aws-region: eu-central-1 role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} diff --git a/.github/workflows/layer_govcloud.yml b/.github/workflows/layer_govcloud.yml index 03a2182c770..b58475b22b7 100644 --- a/.github/workflows/layer_govcloud.yml +++ b/.github/workflows/layer_govcloud.yml @@ -59,7 +59,7 @@ jobs: environment: Prod (Readonly) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-east-1 @@ -116,7 +116,7 @@ jobs: SHA=$(jq -r '.Content.CodeSha256' '${{ matrix.layer }}_${{ matrix.arch }}.json') test "$(openssl dgst -sha256 -binary ${{ matrix.layer }}_${{ matrix.arch }}.zip | openssl enc -base64)" == "$SHA" && echo "SHA OK: ${SHA}" || exit 1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-east-1 @@ -185,7 +185,7 @@ jobs: SHA=$(jq -r '.Content.CodeSha256' '${{ matrix.layer }}_${{ matrix.arch }}.json') test "$(openssl dgst -sha256 -binary ${{ matrix.layer }}_${{ matrix.arch }}.zip | openssl enc -base64)" == "$SHA" && echo "SHA OK: ${SHA}" || exit 1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-west-1 diff --git a/.github/workflows/layer_govcloud_python313.yml b/.github/workflows/layer_govcloud_python313.yml index 70c2414675a..e7aa8896631 100644 --- a/.github/workflows/layer_govcloud_python313.yml +++ b/.github/workflows/layer_govcloud_python313.yml @@ -55,7 +55,7 @@ jobs: environment: Prod (Readonly) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-east-1 @@ -108,7 +108,7 @@ jobs: SHA=$(jq -r '.Content.CodeSha256' '${{ matrix.layer }}_${{ matrix.arch }}.json') test "$(openssl dgst -sha256 -binary ${{ matrix.layer }}_${{ matrix.arch }}.zip | openssl enc -base64)" == "$SHA" && echo "SHA OK: ${SHA}" || exit 1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-east-1 @@ -173,7 +173,7 @@ jobs: SHA=$(jq -r '.Content.CodeSha256' '${{ matrix.layer }}_${{ matrix.arch }}.json') test "$(openssl dgst -sha256 -binary ${{ matrix.layer }}_${{ matrix.arch }}.zip | openssl enc -base64)" == "$SHA" && echo "SHA OK: ${SHA}" || exit 1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-west-1 diff --git a/.github/workflows/layer_govcloud_verify.yml b/.github/workflows/layer_govcloud_verify.yml index 2395183c111..2313dfc3fdd 100644 --- a/.github/workflows/layer_govcloud_verify.yml +++ b/.github/workflows/layer_govcloud_verify.yml @@ -39,7 +39,7 @@ jobs: environment: Prod (Readonly) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-east-1 @@ -69,7 +69,7 @@ jobs: environment: GovCloud Prod (East) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-east-1 @@ -100,7 +100,7 @@ jobs: environment: GovCloud Prod (West) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-east-1 diff --git a/.github/workflows/layer_rename.yml b/.github/workflows/layer_rename.yml index b3354e92887..bfe3ffa817c 100644 --- a/.github/workflows/layer_rename.yml +++ b/.github/workflows/layer_rename.yml @@ -56,7 +56,7 @@ jobs: environment: layer-prod steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} aws-region: us-east-1 @@ -140,7 +140,7 @@ jobs: SHA=$(jq -r '.Content.CodeSha256' ${{ matrix.layer }}_x86_64.json) test $(openssl dgst -sha256 -binary ${{ matrix.layer }}_x86_64.zip | openssl enc -base64) == $SHA && echo "SHA OK: ${SHA}" || exit 1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} aws-region: ${{ matrix.region }} diff --git a/.github/workflows/reusable_deploy_v2_layer_stack.yml b/.github/workflows/reusable_deploy_v2_layer_stack.yml index 9feee088c2c..c973a589991 100644 --- a/.github/workflows/reusable_deploy_v2_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v2_layer_stack.yml @@ -153,7 +153,7 @@ jobs: - name: Install poetry run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: aws-region: ${{ matrix.region }} role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} diff --git a/.github/workflows/reusable_deploy_v2_sar.yml b/.github/workflows/reusable_deploy_v2_sar.yml index 930c8fb11cd..64158f630bf 100644 --- a/.github/workflows/reusable_deploy_v2_sar.yml +++ b/.github/workflows/reusable_deploy_v2_sar.yml @@ -90,7 +90,7 @@ jobs: artifact_name: ${{ inputs.source_code_artifact_name }} - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: aws-region: ${{ env.AWS_REGION }} role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} @@ -101,7 +101,7 @@ jobs: # we then jump to our specific SAR Account with the correctly scoped IAM Role # this allows us to have a single trail when a release occurs for a given layer (beta+prod+SAR beta+SAR prod) - name: AWS credentials SAR role - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 id: aws-credentials-sar-role with: aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }} diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml index c255d37059a..a9348f48169 100644 --- a/.github/workflows/reusable_deploy_v3_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml @@ -157,7 +157,7 @@ jobs: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 pipx inject poetry git+https://github.com/python-poetry/poetry-plugin-export@8c83d26603ca94f2e203bfded7b6d7f530960e06 # v1.8.0 - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: aws-region: ${{ matrix.region }} role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} diff --git a/.github/workflows/reusable_deploy_v3_sar.yml b/.github/workflows/reusable_deploy_v3_sar.yml index 993aca1dd86..61a3a4cae51 100644 --- a/.github/workflows/reusable_deploy_v3_sar.yml +++ b/.github/workflows/reusable_deploy_v3_sar.yml @@ -87,7 +87,7 @@ jobs: - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: aws-region: ${{ env.AWS_REGION }} role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} @@ -98,7 +98,7 @@ jobs: # we then jump to our specific SAR Account with the correctly scoped IAM Role # this allows us to have a single trail when a release occurs for a given layer (beta+prod+SAR beta+SAR prod) - name: AWS credentials SAR role - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 id: aws-credentials-sar-role with: aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }} diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index f8e411ea5ea..225b94fcb9f 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -79,7 +79,7 @@ jobs: poetry run mike set-default --push latest - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: aws-region: us-east-1 role-to-assume: ${{ secrets.AWS_DOCS_ROLE_ARN }} diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index d2cc90f8fd1..555f7b7a2af 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -72,7 +72,7 @@ jobs: - name: Install dependencies run: make dev-quality-code - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: role-to-assume: ${{ secrets.AWS_TEST_ROLE_ARN }} aws-region: ${{ env.AWS_DEFAULT_REGION }} diff --git a/.github/workflows/update_ssm.yml b/.github/workflows/update_ssm.yml index 2f8492dcb89..7ff47695015 100644 --- a/.github/workflows/update_ssm.yml +++ b/.github/workflows/update_ssm.yml @@ -66,7 +66,7 @@ jobs: run: | echo 'CONVERTED_REGION=${{ matrix.region }}' | tr 'a-z\-' 'A-Z_' >> "$GITHUB_OUTPUT" - id: creds - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 with: aws-region: ${{ matrix.region }} role-to-assume: ${{ secrets[format('{0}', steps.transform.outputs.CONVERTED_REGION)] }} From e151756b16f102305f4fb60c98213b9290b57cd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:21:02 +0000 Subject: [PATCH 050/139] chore(deps): bump release-drafter/release-drafter from 6.0.0 to 6.1.0 (#5976) --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 473968803b0..53698e4fb3e 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -27,6 +27,6 @@ jobs: permissions: contents: write # create release in draft mode steps: - - uses: release-drafter/release-drafter@3f0f87098bd6b5c5b9a36d49c41d998ea58f9348 # v5.20.1 + - uses: release-drafter/release-drafter@b1476f6e6eb133afa41ed8589daba6dc69b4d3f5 # v5.20.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 03fa7b320502a464885cf781964eb1028de4aa2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:21:33 +0000 Subject: [PATCH 051/139] chore(deps): bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 (#5977) --- .github/workflows/secure_workflows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/secure_workflows.yml b/.github/workflows/secure_workflows.yml index 4512de6d3b4..8056b6e43b6 100644 --- a/.github/workflows/secure_workflows.yml +++ b/.github/workflows/secure_workflows.yml @@ -32,7 +32,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Ensure 3rd party workflows have SHA pinned - uses: zgosalvez/github-actions-ensure-sha-pinned-actions@64418826697dcd77c93a8e4a1f7601a1942e57b5 # v3.0.18 + uses: zgosalvez/github-actions-ensure-sha-pinned-actions@c3a2b64f69b7a1542a68f44d9edbd9ec3fc1455e # v3.0.20 with: allowlist: | slsa-framework/slsa-github-generator From dada25c287c9fa40e6dca9d87e0170f79c373861 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:22:04 +0000 Subject: [PATCH 052/139] chore(deps): bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 (#5980) --- .github/workflows/pre-release.yml | 2 +- .github/workflows/release-v3.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index fac36206d43..b0f1f37ccd8 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -232,7 +232,7 @@ jobs: - name: Upload to PyPi prod if: ${{ !inputs.skip_pypi }} - uses: pypa/gh-action-pypi-publish@67339c736fd9354cd4f8cb0b744f2b82a74b5c70 # v1.12.3 + uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 # Creates a PR with the latest version we've just released # since our trunk is protected against any direct pushes from automation diff --git a/.github/workflows/release-v3.yml b/.github/workflows/release-v3.yml index 6a351b3262a..4431bba9ed5 100644 --- a/.github/workflows/release-v3.yml +++ b/.github/workflows/release-v3.yml @@ -237,12 +237,12 @@ jobs: - name: Upload to PyPi prod if: ${{ !inputs.skip_pypi }} - uses: pypa/gh-action-pypi-publish@67339c736fd9354cd4f8cb0b744f2b82a74b5c70 # v1.12.3 + uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 # PyPi test maintenance affected us numerous times, leaving for history purposes # - name: Upload to PyPi test # if: ${{ !inputs.skip_pypi }} - # uses: pypa/gh-action-pypi-publish@67339c736fd9354cd4f8cb0b744f2b82a74b5c70 # v1.12.3 + # uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 # with: # repository-url: https://test.pypi.org/legacy/ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b7b76d65ca8..f7f859feb9a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -237,12 +237,12 @@ jobs: - name: Upload to PyPi prod if: ${{ !inputs.skip_pypi }} - uses: pypa/gh-action-pypi-publish@67339c736fd9354cd4f8cb0b744f2b82a74b5c70 # v1.12.3 + uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 # PyPi test maintenance affected us numerous times, leaving for history purposes # - name: Upload to PyPi test # if: ${{ !inputs.skip_pypi }} - # uses: pypa/gh-action-pypi-publish@67339c736fd9354cd4f8cb0b744f2b82a74b5c70 # v1.12.3 + # uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 # with: # repository-url: https://test.pypi.org/legacy/ From 6593e40714bf4ab32dc7d3fa171be10ac54e031a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:22:44 +0000 Subject: [PATCH 053/139] chore(deps): bump actions/setup-go from 5.2.0 to 5.3.0 (#5978) --- .github/workflows/bootstrap_region.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/bootstrap_region.yml b/.github/workflows/bootstrap_region.yml index ed3dd80511a..349a00fa38c 100644 --- a/.github/workflows/bootstrap_region.yml +++ b/.github/workflows/bootstrap_region.yml @@ -98,7 +98,7 @@ jobs: mask-aws-account-id: true - id: go-setup name: Setup Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 - id: go-env name: Go Env run: go env From 827d0554d0582e9c1359c47313bd3cc8e43510e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:29:32 +0000 Subject: [PATCH 054/139] chore(deps): bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs (#5979) --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index 2da27006b13..b909511ff1c 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # v9.1.18 -FROM squidfunk/mkdocs-material@sha256:41942f7a2f5163aacd0e866e076d95db4f26550b97d76c1594c04250cbb580e9 +FROM squidfunk/mkdocs-material@sha256:471695f3e611d9858788ac04e4daa9af961ccab73f1c0f545e90f8cc5d4268b8 # pip-compile --generate-hashes --output-file=requirements.txt requirements.in COPY requirements.txt /tmp/ RUN pip install --require-hashes -r /tmp/requirements.txt From 88613e36bb1ee38912f9684a8f353fc2256f3a8d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:49:43 +0000 Subject: [PATCH 055/139] chore(ci): changelog rebuild (#5981) --- CHANGELOG.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0480a45e059..284fbee457f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,15 +11,30 @@ ## Documentation +* **api:** migrating the validation utility to mkdocstrings ([#5972](https://github.com/aws-powertools/powertools-lambda-python/issues/5972)) * **layer:** update layer version number - v3.5.0 ([#5952](https://github.com/aws-powertools/powertools-lambda-python/issues/5952)) +## Features + +* **logger:** add clear_state method ([#5956](https://github.com/aws-powertools/powertools-lambda-python/issues/5956)) + ## Maintenance * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) -* **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) -* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) +* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) +* **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) +* **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) +* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) +* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) * **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) +* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) +* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) +* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) +* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) +* **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) +* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) From 544ebb19092bc09952ee4b2424e0aa4639864177 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 2 Feb 2025 17:09:30 +0000 Subject: [PATCH 056/139] chore(ci): changelog rebuild (#5982) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 284fbee457f..735c67dd2c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,19 +22,24 @@ * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) -* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) * **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) -* **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) +* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) +* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) +* **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) +* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) * **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) +* **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) +* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) * **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) * **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) +* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) * **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) -* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) -* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) -* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) * **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) -* **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) * **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) +* **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) +* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) +* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) From 6c11d3ab51e6a8bb760d99f70f47cd6dbb2889ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 08:49:45 +0000 Subject: [PATCH 057/139] chore(ci): new pre-release 3.5.1a3 (#5998) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.5.1a3/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.5.1a3/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index c681b2c79a8..7dfc2a5bd2d 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.1a2" +VERSION = "3.5.1a3" diff --git a/provenance/3.5.1a3/multiple.intoto.jsonl b/provenance/3.5.1a3/multiple.intoto.jsonl new file mode 100644 index 00000000000..3262822bd16 --- /dev/null +++ b/provenance/3.5.1a3/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWEzLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiMDhhYzlmYzY5Yjg1MzU0OGI0YWMwMTFmYmZiMDFhMDMzNzk4M2I5ZDRkNTM4M2VmYjkyNjZlZDZhODAzZGQ3OCJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWEzLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiIxMjM4MzY3NGM4YzM1OTMwM2M2ZDkyYzJkNjI5YzYyMTg3MGY1YmZiZDQ5NTNmN2U5Mjg1MmY4NWJlYWVmZjUyIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiNGIyYTIzOTQ2ZWQwN2Y5ZGRhZWYyNTQzYWMwMWUyZWZiYjdlMGZhMiJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwNywiZm9ya3NfY291bnQiOjQwNywiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo3OSwib3Blbl9pc3N1ZXNfY291bnQiOjc5LCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDItMDJUMTc6MTA6MjlaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjY3OTE5LCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5NzcsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDItMDJUMTc6MDk6MzVaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5NzcsIndhdGNoZXJzX2NvdW50IjoyOTc3LCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzEwODg4OTY0OSIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTY3IiwiZ2l0aHViX3NoYTEiOiI0YjJhMjM5NDZlZDA3ZjlkZGFlZjI1NDNhYzAxZTJlZmJiN2UwZmEyIn19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMTA4ODg5NjQ5LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiI0YjJhMjM5NDZlZDA3ZjlkZGFlZjI1NDNhYzAxZTJlZmJiN2UwZmEyIn19XX19","signatures":[{"keyid":"","sig":"MEUCIAY8F9UVAIKvxA5SUDtARIJ1n7uQg/cJEQgUfhD8yxMbAiEA2zYGziYQ/AVgbL+e6kuVfw0dIypytRbOIxypG4Nln50=","cert":"-----BEGIN CERTIFICATE-----\nMIIHZjCCBuygAwIBAgIUMgv75r7USXHZjYaaxwGP9CXinZ0wCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMjAzMDgwNzE5WhcNMjUwMjAzMDgxNzE5WjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEghbdmSXb1gYKC4kPt/foD5zmlG2kXubjL6sP\nEiw0d9VBfpL+war90gxbXY/qeI/op9G0wt/S//9hSSbuS/Wd2qOCBgswggYHMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUoivo\nOFD7qb9ashMakrrnfa8nTdYwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCg0YjJh\nMjM5NDZlZDA3ZjlkZGFlZjI1NDNhYzAxZTJlZmJiN2UwZmEyMBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDCg0YjJhMjM5NDZlZDA3ZjlkZGFlZjI1NDNhYzAxZTJlZmJiN2UwZmEyMCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoNGIy\nYTIzOTQ2ZWQwN2Y5ZGRhZWYyNTQzYWMwMWUyZWZiYjdlMGZhMjAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMxMDg4ODk2NDkvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlMrZgDsAAAQDAEcwRQIgUQ80N03lqon6YKWNPZbF\nfp1tz3DMF8su1FPKseDeMIUCIQCtg7BM2hQp/+CbYk8NjcU0ELzWIOjwpSE9zeAp\nGWuQPjAKBggqhkjOPQQDAwNoADBlAjAcOLDXZ6C+t0vMHKsOcszN+nMxzNgT6M0x\nusjTmYPrmqNRllIHgE6zJObKF8DtL1kCMQDMUfBsKDcs05QMY/J6/a4u9Ua1SRsX\nnGl9zx5abz5y37BmdSJoe/23w9nOuyZc0qA=\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index cebdcba2b4a..cb06fa3e431 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.1a2" +version = "3.5.1a3" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From 38084d99b14f895a93709a468b6d5bcee0f9f0b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 10:26:43 +0000 Subject: [PATCH 058/139] chore(ci): changelog rebuild (#5999) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 735c67dd2c0..65fbef7968b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,22 +24,23 @@ * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) * **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) * **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) -* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) +* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) +* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) * **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) -* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) * **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) +* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) * **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) * **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) -* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) -* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) +* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) +* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) * **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) * **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) -* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) -* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) +* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) * **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) -* **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) -* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) * **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) +* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) +* **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) +* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) From f83e2845e3b674312a38154656f0ae77a8ef657b Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 12:31:43 +0000 Subject: [PATCH 059/139] docs(api): migrating the typing utility to mkdocstrings (#5996) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mkdocstrings - Typing module Co-authored-by: Ana Falcão --- docs/api_doc/typing.md | 2 ++ mkdocs.yml | 1 + 2 files changed, 3 insertions(+) create mode 100644 docs/api_doc/typing.md diff --git a/docs/api_doc/typing.md b/docs/api_doc/typing.md new file mode 100644 index 00000000000..7f54981d128 --- /dev/null +++ b/docs/api_doc/typing.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.typing diff --git a/mkdocs.yml b/mkdocs.yml index c82b2576e3a..a25bf8ea113 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,7 @@ nav: # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md - API Documentation: + - Typing: api_doc/typing.md - Validation: api_doc/validation.md theme: From 4ecde434e72b7daf831f82708a43bb41cbd15cba Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 12:32:13 +0000 Subject: [PATCH 060/139] refactor(metrics): Improve type annotations for metrics decorator (#6000) Fix type annotation with metrics decorator --- aws_lambda_powertools/metrics/metrics.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aws_lambda_powertools/metrics/metrics.py b/aws_lambda_powertools/metrics/metrics.py index 8674f053bd4..0bcf54917ed 100644 --- a/aws_lambda_powertools/metrics/metrics.py +++ b/aws_lambda_powertools/metrics/metrics.py @@ -1,7 +1,7 @@ # NOTE: keeps for compatibility from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Callable from aws_lambda_powertools.metrics.provider.cloudwatch_emf.cloudwatch import AmazonCloudWatchEMFProvider @@ -149,8 +149,8 @@ def log_metrics( capture_cold_start_metric: bool = False, raise_on_empty_metrics: bool = False, default_dimensions: dict[str, str] | None = None, - **kwargs, - ): + **kwargs: dict[str, Any], + ) -> Callable[..., Any]: return self.provider.log_metrics( lambda_handler=lambda_handler, capture_cold_start_metric=capture_cold_start_metric, From bf4c978e3c7faf366ea30e7e9729d80b52ddf629 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 15:36:39 +0000 Subject: [PATCH 061/139] docs(api): migrating the streaming utility to mkdocstrings (#6003) Mkdocstrings - Streaming module --- aws_lambda_powertools/utilities/streaming/__init__.py | 6 ++++++ aws_lambda_powertools/utilities/typing/__init__.py | 2 ++ docs/api_doc/streaming.md | 5 +++++ mkdocs.yml | 1 + 4 files changed, 14 insertions(+) create mode 100644 docs/api_doc/streaming.md diff --git a/aws_lambda_powertools/utilities/streaming/__init__.py b/aws_lambda_powertools/utilities/streaming/__init__.py index 8c326b99400..c709a2e3166 100644 --- a/aws_lambda_powertools/utilities/streaming/__init__.py +++ b/aws_lambda_powertools/utilities/streaming/__init__.py @@ -1,3 +1,9 @@ +""" +The streaming utility handles datasets larger than the available memory as streaming data. +!!! abstract "Usage Documentation" + [`Streaming`](../utilities/streaming.md) +""" + from aws_lambda_powertools.utilities.streaming.s3_object import S3Object __all__ = ["S3Object"] diff --git a/aws_lambda_powertools/utilities/typing/__init__.py b/aws_lambda_powertools/utilities/typing/__init__.py index a6c80395a88..22f907025fc 100644 --- a/aws_lambda_powertools/utilities/typing/__init__.py +++ b/aws_lambda_powertools/utilities/typing/__init__.py @@ -1,5 +1,7 @@ """ Typing for developer ease in the IDE +!!! abstract "Usage Documentation" + [`Typing`](../utilities/typing.md) """ from .lambda_context import LambdaContext diff --git a/docs/api_doc/streaming.md b/docs/api_doc/streaming.md new file mode 100644 index 00000000000..f87aa7dfa18 --- /dev/null +++ b/docs/api_doc/streaming.md @@ -0,0 +1,5 @@ + +::: aws_lambda_powertools.utilities.streaming.s3_object +::: aws_lambda_powertools.utilities.streaming.transformations.csv +::: aws_lambda_powertools.utilities.streaming.transformations.gzip +::: aws_lambda_powertools.utilities.streaming.transformations.zip diff --git a/mkdocs.yml b/mkdocs.yml index a25bf8ea113..e16ffe33008 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,7 @@ nav: # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md - API Documentation: + - Streaming: api_doc/streaming.md - Typing: api_doc/typing.md - Validation: api_doc/validation.md From f855a4fdfe2ca7bfec67f8caffcbae9842410c6f Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 16:03:18 +0000 Subject: [PATCH 062/139] docs(api): migrating the parser utility to mkdocstrings (#6004) * Mkdocstrings - Parser module * Mkdocstrings - Parser module --- aws_lambda_powertools/utilities/parser/parser.py | 7 +++++++ docs/api_doc/parser.md | 2 ++ mkdocs.yml | 1 + 3 files changed, 10 insertions(+) create mode 100644 docs/api_doc/parser.md diff --git a/aws_lambda_powertools/utilities/parser/parser.py b/aws_lambda_powertools/utilities/parser/parser.py index 4f6115255a8..446209880fd 100644 --- a/aws_lambda_powertools/utilities/parser/parser.py +++ b/aws_lambda_powertools/utilities/parser/parser.py @@ -1,3 +1,10 @@ +""" +The Parser utility simplifies data parsing and validation using Pydantic. It allows you to define data models +in pure Python classes, parse and validate incoming events, and extract only the data you need. +!!! abstract "Usage Documentation" + [`Parser`](../utilities/parser.md) +""" + from __future__ import annotations import logging diff --git a/docs/api_doc/parser.md b/docs/api_doc/parser.md new file mode 100644 index 00000000000..be52cde0b7d --- /dev/null +++ b/docs/api_doc/parser.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.parser.parser diff --git a/mkdocs.yml b/mkdocs.yml index e16ffe33008..a83aad098a6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,7 @@ nav: # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md - API Documentation: + - Parser: api_doc/parser.md - Streaming: api_doc/streaming.md - Typing: api_doc/typing.md - Validation: api_doc/validation.md From d6eccc7735af51f330ac61acac6bf3b023e091fb Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 16:21:02 +0000 Subject: [PATCH 063/139] docs(api): migrating the parameters utility to mkdocstrings (#6005) Mkdocstrings - Parameters module --- docs/api_doc/parameters/appconfig.md | 2 ++ docs/api_doc/parameters/base.md | 2 ++ docs/api_doc/parameters/dynamodb.md | 2 ++ docs/api_doc/parameters/secrets.md | 2 ++ docs/api_doc/parameters/ssm.md | 2 ++ mkdocs.yml | 6 ++++++ 6 files changed, 16 insertions(+) create mode 100644 docs/api_doc/parameters/appconfig.md create mode 100644 docs/api_doc/parameters/base.md create mode 100644 docs/api_doc/parameters/dynamodb.md create mode 100644 docs/api_doc/parameters/secrets.md create mode 100644 docs/api_doc/parameters/ssm.md diff --git a/docs/api_doc/parameters/appconfig.md b/docs/api_doc/parameters/appconfig.md new file mode 100644 index 00000000000..24e188b5bc1 --- /dev/null +++ b/docs/api_doc/parameters/appconfig.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.parameters.appconfig diff --git a/docs/api_doc/parameters/base.md b/docs/api_doc/parameters/base.md new file mode 100644 index 00000000000..73e9b153a4f --- /dev/null +++ b/docs/api_doc/parameters/base.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.parameters.base diff --git a/docs/api_doc/parameters/dynamodb.md b/docs/api_doc/parameters/dynamodb.md new file mode 100644 index 00000000000..3ecceee765e --- /dev/null +++ b/docs/api_doc/parameters/dynamodb.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.parameters.dynamodb diff --git a/docs/api_doc/parameters/secrets.md b/docs/api_doc/parameters/secrets.md new file mode 100644 index 00000000000..2929cb4975d --- /dev/null +++ b/docs/api_doc/parameters/secrets.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.parameters.secrets diff --git a/docs/api_doc/parameters/ssm.md b/docs/api_doc/parameters/ssm.md new file mode 100644 index 00000000000..040c65a3858 --- /dev/null +++ b/docs/api_doc/parameters/ssm.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.parameters.ssm diff --git a/mkdocs.yml b/mkdocs.yml index a83aad098a6..096173e5354 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,12 @@ nav: # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md - API Documentation: + - Parameters: + - Base: api_doc/parameters/base.md + - AppConfig: api_doc/parameters/appconfig.md + - DynamoDB: api_doc/parameters/dynamodb.md + - SSM: api_doc/parameters/ssm.md + - Secrets: api_doc/parameters/secrets.md - Parser: api_doc/parser.md - Streaming: api_doc/streaming.md - Typing: api_doc/typing.md From afaf57322432a9646b8a6a1ff0714d8449753964 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 16:37:16 +0000 Subject: [PATCH 064/139] docs(api): migrating the jmespath utility to mkdocstrings (#6006) Mkdocstrings - JMESPath module --- aws_lambda_powertools/utilities/jmespath_utils/__init__.py | 7 ++++++- aws_lambda_powertools/utilities/parameters/base.py | 2 ++ docs/api_doc/jmespath_functions.md | 2 ++ mkdocs.yml | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 docs/api_doc/jmespath_functions.md diff --git a/aws_lambda_powertools/utilities/jmespath_utils/__init__.py b/aws_lambda_powertools/utilities/jmespath_utils/__init__.py index 1bdff7a12ce..231fb732c83 100644 --- a/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +++ b/aws_lambda_powertools/utilities/jmespath_utils/__init__.py @@ -1,3 +1,8 @@ +""" +Built-in JMESPath Functions to easily deserialize common encoded JSON payloads in Lambda functions. +!!! abstract "Usage Documentation" + [`JMESPath Functions`](../utilities/jmespath_functions.md) +""" from __future__ import annotations import base64 @@ -42,7 +47,7 @@ def query(data: dict | str, envelope: str, jmespath_options: dict | None = None) Built-in JMESPath functions include: powertools_json, powertools_base64, powertools_base64_gzip - Examples + Example -------- **Deserialize JSON string and extracts data from body key** diff --git a/aws_lambda_powertools/utilities/parameters/base.py b/aws_lambda_powertools/utilities/parameters/base.py index 897cd4ace57..b92bfa19cb2 100644 --- a/aws_lambda_powertools/utilities/parameters/base.py +++ b/aws_lambda_powertools/utilities/parameters/base.py @@ -1,5 +1,7 @@ """ Base for Parameter providers +!!! abstract "Usage Documentation" + [`Parameters`](../utilities/parameters.md) """ from __future__ import annotations diff --git a/docs/api_doc/jmespath_functions.md b/docs/api_doc/jmespath_functions.md new file mode 100644 index 00000000000..c4e539faf13 --- /dev/null +++ b/docs/api_doc/jmespath_functions.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.jmespath_utils diff --git a/mkdocs.yml b/mkdocs.yml index 096173e5354..97fd2b8f04a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,7 @@ nav: # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md - API Documentation: + - JMESPath Functions: api_doc/jmespath_functions.md - Parameters: - Base: api_doc/parameters/base.md - AppConfig: api_doc/parameters/appconfig.md From 32d93bc0f74334b657310156ea41897e6ca26ca0 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 17:01:30 +0000 Subject: [PATCH 065/139] docs(api): migrating the idempotency utility to mkdocstrings (#6007) Mkdocstrings - Idempotency module --- .../utilities/idempotency/base.py | 6 +++++ .../utilities/idempotency/idempotency.py | 24 +++++++++---------- .../idempotency/persistence/dynamodb.py | 2 +- .../idempotency/persistence/redis.py | 2 +- .../utilities/parameters/base.py | 2 +- docs/api_doc/idempotency/base.md | 2 ++ docs/api_doc/idempotency/config.md | 2 ++ docs/api_doc/idempotency/exceptions.md | 2 ++ docs/api_doc/idempotency/persistence.md | 2 ++ docs/api_doc/idempotency/serialization.md | 2 ++ mkdocs.yml | 6 +++++ 11 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 docs/api_doc/idempotency/base.md create mode 100644 docs/api_doc/idempotency/config.md create mode 100644 docs/api_doc/idempotency/exceptions.md create mode 100644 docs/api_doc/idempotency/persistence.md create mode 100644 docs/api_doc/idempotency/serialization.md diff --git a/aws_lambda_powertools/utilities/idempotency/base.py b/aws_lambda_powertools/utilities/idempotency/base.py index 0841fb7500f..eb4fe0eab5f 100644 --- a/aws_lambda_powertools/utilities/idempotency/base.py +++ b/aws_lambda_powertools/utilities/idempotency/base.py @@ -1,3 +1,9 @@ +""" +Base for Idempotency utility +!!! abstract "Usage Documentation" + [`Idempotency`](../../utilities/idempotency.md) +""" + from __future__ import annotations import datetime diff --git a/aws_lambda_powertools/utilities/idempotency/idempotency.py b/aws_lambda_powertools/utilities/idempotency/idempotency.py index 1305d0a5405..6aec2572fb1 100644 --- a/aws_lambda_powertools/utilities/idempotency/idempotency.py +++ b/aws_lambda_powertools/utilities/idempotency/idempotency.py @@ -61,20 +61,20 @@ def idempotent( key_prefix: str | Optional Custom prefix for idempotency key: key_prefix#hash - Examples + Example -------- **Processes Lambda's event in an idempotent manner** - >>> from aws_lambda_powertools.utilities.idempotency import ( - >>> idempotent, DynamoDBPersistenceLayer, IdempotencyConfig - >>> ) - >>> - >>> idem_config=IdempotencyConfig(event_key_jmespath="body") - >>> persistence_layer = DynamoDBPersistenceLayer(table_name="idempotency_store") - >>> - >>> @idempotent(config=idem_config, persistence_store=persistence_layer) - >>> def handler(event, context): - >>> return {"StatusCode": 200} + from aws_lambda_powertools.utilities.idempotency import ( + idempotent, DynamoDBPersistenceLayer, IdempotencyConfig + ) + + idem_config=IdempotencyConfig(event_key_jmespath="body") + persistence_layer = DynamoDBPersistenceLayer(table_name="idempotency_store") + + @idempotent(config=idem_config, persistence_store=persistence_layer) + def handler(event, context): + return {"StatusCode": 200} """ # Skip idempotency controls when POWERTOOLS_IDEMPOTENCY_DISABLED has a truthy value @@ -136,7 +136,7 @@ def idempotent_function( key_prefix: str | Optional Custom prefix for idempotency key: key_prefix#hash - Examples + Example -------- **Processes an order in an idempotent manner** diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py b/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py index 23ef222b5c8..0b04ec135c7 100644 --- a/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +++ b/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py @@ -76,7 +76,7 @@ def __init__( boto3_client : DynamoDBClient, optional Boto3 DynamoDB Client to use, boto3_session and boto_config will be ignored if both are provided - Examples + Example -------- **Create a DynamoDB persistence layer with custom settings** diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/redis.py b/aws_lambda_powertools/utilities/idempotency/persistence/redis.py index 06a6548080b..7f27566cc24 100644 --- a/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +++ b/aws_lambda_powertools/utilities/idempotency/persistence/redis.py @@ -112,7 +112,7 @@ def __init__( ssl: bool, optional: default True set whether to use ssl for Redis connection - Examples + Example -------- ```python diff --git a/aws_lambda_powertools/utilities/parameters/base.py b/aws_lambda_powertools/utilities/parameters/base.py index b92bfa19cb2..610530f3263 100644 --- a/aws_lambda_powertools/utilities/parameters/base.py +++ b/aws_lambda_powertools/utilities/parameters/base.py @@ -1,7 +1,7 @@ """ Base for Parameter providers !!! abstract "Usage Documentation" - [`Parameters`](../utilities/parameters.md) + [`Parameters`](../../utilities/parameters.md) """ from __future__ import annotations diff --git a/docs/api_doc/idempotency/base.md b/docs/api_doc/idempotency/base.md new file mode 100644 index 00000000000..f93ab9e82f6 --- /dev/null +++ b/docs/api_doc/idempotency/base.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.idempotency.base diff --git a/docs/api_doc/idempotency/config.md b/docs/api_doc/idempotency/config.md new file mode 100644 index 00000000000..2c3ca67eb83 --- /dev/null +++ b/docs/api_doc/idempotency/config.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.idempotency.config diff --git a/docs/api_doc/idempotency/exceptions.md b/docs/api_doc/idempotency/exceptions.md new file mode 100644 index 00000000000..674b004ae24 --- /dev/null +++ b/docs/api_doc/idempotency/exceptions.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.idempotency.exceptions diff --git a/docs/api_doc/idempotency/persistence.md b/docs/api_doc/idempotency/persistence.md new file mode 100644 index 00000000000..a18181c103b --- /dev/null +++ b/docs/api_doc/idempotency/persistence.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.idempotency.persistence diff --git a/docs/api_doc/idempotency/serialization.md b/docs/api_doc/idempotency/serialization.md new file mode 100644 index 00000000000..014c187151c --- /dev/null +++ b/docs/api_doc/idempotency/serialization.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.idempotency.serialization diff --git a/mkdocs.yml b/mkdocs.yml index 97fd2b8f04a..5aea420d82a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,12 @@ nav: # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md - API Documentation: + - Idempotency: + - Base: api_doc/idempotency/base.md + - Config: api_doc/idempotency/config.md + - Exceptions: api_doc/idempotency/exceptions.md + - Persistence: api_doc/idempotency/persistence.md + - Serialization: api_doc/idempotency/serialization.md - JMESPath Functions: api_doc/jmespath_functions.md - Parameters: - Base: api_doc/parameters/base.md From a11dbc163883c3df973cb862fef28cdac2321984 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 19:57:30 +0000 Subject: [PATCH 066/139] docs(api): migrating the AppConfig utility to mkdocstrings (#6008) Mkdocstrings - AppConfig module --- .../utilities/feature_flags/appconfig.py | 4 ++++ .../utilities/feature_flags/base.py | 3 ++- .../utilities/feature_flags/comparators.py | 5 +++-- .../utilities/feature_flags/feature_flags.py | 12 +++++++----- docs/api_doc/feature_flags/appconfig.md | 2 ++ docs/api_doc/feature_flags/base.md | 2 ++ docs/api_doc/feature_flags/comparators.md | 2 ++ docs/api_doc/feature_flags/exceptions.md | 2 ++ docs/api_doc/feature_flags/feature_flags.md | 2 ++ docs/api_doc/feature_flags/schema.md | 2 ++ mkdocs.yml | 7 +++++++ 11 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 docs/api_doc/feature_flags/appconfig.md create mode 100644 docs/api_doc/feature_flags/base.md create mode 100644 docs/api_doc/feature_flags/comparators.md create mode 100644 docs/api_doc/feature_flags/exceptions.md create mode 100644 docs/api_doc/feature_flags/feature_flags.md create mode 100644 docs/api_doc/feature_flags/schema.md diff --git a/aws_lambda_powertools/utilities/feature_flags/appconfig.py b/aws_lambda_powertools/utilities/feature_flags/appconfig.py index 794530eee47..4f0ad3e4418 100644 --- a/aws_lambda_powertools/utilities/feature_flags/appconfig.py +++ b/aws_lambda_powertools/utilities/feature_flags/appconfig.py @@ -1,3 +1,7 @@ +"""Advanced feature flags utility +!!! abstract "Usage Documentation" + [`Feature Flags`](../../utilities/feature_flags.md) +""" from __future__ import annotations import logging diff --git a/aws_lambda_powertools/utilities/feature_flags/base.py b/aws_lambda_powertools/utilities/feature_flags/base.py index cd2d65fa211..03394f8ced3 100644 --- a/aws_lambda_powertools/utilities/feature_flags/base.py +++ b/aws_lambda_powertools/utilities/feature_flags/base.py @@ -28,7 +28,8 @@ def get_configuration(self) -> dict[str, Any]: dict[str, Any] parsed JSON dictionary - **Example** + Example + ------- ```python { diff --git a/aws_lambda_powertools/utilities/feature_flags/comparators.py b/aws_lambda_powertools/utilities/feature_flags/comparators.py index 47354f26e73..0d836d19b11 100644 --- a/aws_lambda_powertools/utilities/feature_flags/comparators.py +++ b/aws_lambda_powertools/utilities/feature_flags/comparators.py @@ -56,6 +56,8 @@ def compare_time_range(context_value: Any, condition_value: dict) -> bool: end_time = current_time.replace(hour=int(end_hour), minute=int(end_min)) if int(end_hour) < int(start_hour): + # In normal circumstances, we need to assert **both** conditions + """ # When the end hour is smaller than start hour, it means we are crossing a day's boundary. # In this case we need to assert that current_time is **either** on one side or the other side of the boundary # @@ -69,10 +71,9 @@ def compare_time_range(context_value: Any, condition_value: dict) -> bool: # │ │ │ # └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ # │ - + """ return (start_time <= current_time) or (current_time <= end_time) else: - # In normal circumstances, we need to assert **both** conditions return start_time <= current_time <= end_time diff --git a/aws_lambda_powertools/utilities/feature_flags/feature_flags.py b/aws_lambda_powertools/utilities/feature_flags/feature_flags.py index ae0cae6d31c..6fb8d51753a 100644 --- a/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +++ b/aws_lambda_powertools/utilities/feature_flags/feature_flags.py @@ -179,7 +179,8 @@ def get_configuration(self) -> dict: dict[str, dict] parsed JSON dictionary - **Example** + Example + ------- ```python { @@ -251,7 +252,7 @@ def evaluate(self, *, name: str, context: dict[str, Any] | None = None, default: Can be boolean or any JSON values for non-boolean features. - Examples + Example -------- ```python @@ -343,7 +344,8 @@ def get_enabled_features(self, *, context: dict[str, Any] | None = None) -> list list[str] list of all feature names that either matches context or have True as default - **Example** + Example + ------- ```python ["premium_features", "my_feature_two", "always_true_feature"] @@ -400,8 +402,8 @@ def validation_exception_handler(self, exc_class: Exception | list[Exception]): exc_class : Exception | list[Exception] One or more exceptions to catch - Examples - -------- + Example + ------- ```python feature_flags = FeatureFlags(store=app_config) diff --git a/docs/api_doc/feature_flags/appconfig.md b/docs/api_doc/feature_flags/appconfig.md new file mode 100644 index 00000000000..fad198ef15c --- /dev/null +++ b/docs/api_doc/feature_flags/appconfig.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.feature_flags.appconfig diff --git a/docs/api_doc/feature_flags/base.md b/docs/api_doc/feature_flags/base.md new file mode 100644 index 00000000000..aef629bac52 --- /dev/null +++ b/docs/api_doc/feature_flags/base.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.feature_flags.base diff --git a/docs/api_doc/feature_flags/comparators.md b/docs/api_doc/feature_flags/comparators.md new file mode 100644 index 00000000000..0286336529e --- /dev/null +++ b/docs/api_doc/feature_flags/comparators.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.feature_flags.comparators diff --git a/docs/api_doc/feature_flags/exceptions.md b/docs/api_doc/feature_flags/exceptions.md new file mode 100644 index 00000000000..ad9d20a7731 --- /dev/null +++ b/docs/api_doc/feature_flags/exceptions.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.feature_flags.exceptions diff --git a/docs/api_doc/feature_flags/feature_flags.md b/docs/api_doc/feature_flags/feature_flags.md new file mode 100644 index 00000000000..dacffe23460 --- /dev/null +++ b/docs/api_doc/feature_flags/feature_flags.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.feature_flags.feature_flags diff --git a/docs/api_doc/feature_flags/schema.md b/docs/api_doc/feature_flags/schema.md new file mode 100644 index 00000000000..7998f31f4f2 --- /dev/null +++ b/docs/api_doc/feature_flags/schema.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.feature_flags.schema diff --git a/mkdocs.yml b/mkdocs.yml index 5aea420d82a..1238a20fe3d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,13 @@ nav: # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md - API Documentation: + - Feature Flags: + - AppConfig: api_doc/feature_flags/appconfig.md + - Base: api_doc/feature_flags/base.md + - Comparators: api_doc/feature_flags/comparators.md + - Exceptions: api_doc/feature_flags/exceptions.md + - Feature flags: api_doc/feature_flags/feature_flags.md + - Schema: api_doc/feature_flags/schema.md - Idempotency: - Base: api_doc/idempotency/base.md - Config: api_doc/idempotency/config.md From fa202237308e455d7e1eab62f78e63c9ff485e38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 21:19:32 +0000 Subject: [PATCH 067/139] chore(deps): bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs (#6012) chore(deps): bump squidfunk/mkdocs-material in /docs Bumps squidfunk/mkdocs-material from `471695f` to `7e841df`. --- updated-dependencies: - dependency-name: squidfunk/mkdocs-material dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index b909511ff1c..757f0b3843d 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # v9.1.18 -FROM squidfunk/mkdocs-material@sha256:471695f3e611d9858788ac04e4daa9af961ccab73f1c0f545e90f8cc5d4268b8 +FROM squidfunk/mkdocs-material@sha256:7e841df1cfb6c8c4ff0968f2cfe55127fb1a2f5614e1c9bc23cbc11fe4c96644 # pip-compile --generate-hashes --output-file=requirements.txt requirements.in COPY requirements.txt /tmp/ RUN pip install --require-hashes -r /tmp/requirements.txt From 682319e86cb3e399cf8cd25dc899827dd3341f9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 21:20:54 +0000 Subject: [PATCH 068/139] chore(deps-dev): bump mkdocstrings-python from 1.13.0 to 1.14.2 (#6011) Bumps [mkdocstrings-python](https://github.com/mkdocstrings/python) from 1.13.0 to 1.14.2. - [Release notes](https://github.com/mkdocstrings/python/releases) - [Changelog](https://github.com/mkdocstrings/python/blob/main/CHANGELOG.md) - [Commits](https://github.com/mkdocstrings/python/compare/1.13.0...1.14.2) --- updated-dependencies: - dependency-name: mkdocstrings-python dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index 02b9ecd89e1..6a3434c1c52 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2445,24 +2445,23 @@ files = [ [[package]] name = "mkdocstrings" -version = "0.27.0" +version = "0.28.0" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.9" files = [ - {file = "mkdocstrings-0.27.0-py3-none-any.whl", hash = "sha256:6ceaa7ea830770959b55a16203ac63da24badd71325b96af950e59fd37366332"}, - {file = "mkdocstrings-0.27.0.tar.gz", hash = "sha256:16adca6d6b0a1f9e0c07ff0b02ced8e16f228a9d65a37c063ec4c14d7b76a657"}, + {file = "mkdocstrings-0.28.0-py3-none-any.whl", hash = "sha256:84cf3dc910614781fe0fee46ce8006fde7df6cc7cca2e3f799895fb8a9170b39"}, + {file = "mkdocstrings-0.28.0.tar.gz", hash = "sha256:df20afef1eafe36ba466ae20732509ecb74237653a585f5061937e54b553b4e0"}, ] [package.dependencies] -click = ">=7.0" importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} Jinja2 = ">=2.11.1" Markdown = ">=3.6" MarkupSafe = ">=1.1" mkdocs = ">=1.4" -mkdocs-autorefs = ">=1.2" -platformdirs = ">=2.2" +mkdocs-autorefs = ">=1.3" +mkdocs-get-deps = ">=0.2" pymdown-extensions = ">=6.3" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""} @@ -2473,19 +2472,20 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.13.0" +version = "1.14.2" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" files = [ - {file = "mkdocstrings_python-1.13.0-py3-none-any.whl", hash = "sha256:b88bbb207bab4086434743849f8e796788b373bd32e7bfefbf8560ac45d88f97"}, - {file = "mkdocstrings_python-1.13.0.tar.gz", hash = "sha256:2dbd5757e8375b9720e81db16f52f1856bf59905428fd7ef88005d1370e2f64c"}, + {file = "mkdocstrings_python-1.14.2-py3-none-any.whl", hash = "sha256:0a467fbf3c0c7b4722802140807c1913ca3368beeb6aabab2b4ce4407dc856d9"}, + {file = "mkdocstrings_python-1.14.2.tar.gz", hash = "sha256:3ff9f4d356896b555fa491c6b843c939afc36846f216cca49fd4c48c34bf62ce"}, ] [package.dependencies] griffe = ">=0.49" mkdocs-autorefs = ">=1.2" -mkdocstrings = ">=0.26" +mkdocstrings = ">=0.28" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} [[package]] name = "mpmath" From 6fcb3075b79185af5af2ab68a57f73dcc3e3ab8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 21:21:34 +0000 Subject: [PATCH 069/139] chore(deps-dev): bump mkdocs-material from 9.6.1 to 9.6.2 (#6009) Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.6.1 to 9.6.2. - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.1...9.6.2) --- updated-dependencies: - dependency-name: mkdocs-material dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6a3434c1c52..7acdd9f1a14 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2405,13 +2405,13 @@ mkdocs = ">=0.17" [[package]] name = "mkdocs-material" -version = "9.6.1" +version = "9.6.2" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.6.1-py3-none-any.whl", hash = "sha256:c1742d410be29811a9b7e863cb25a578b9e255fe6f04c69f8c6838863a58e141"}, - {file = "mkdocs_material-9.6.1.tar.gz", hash = "sha256:da37dba220d9fbfc5f1fc567fafc4028e3c3d7d828f2779ed09ab726ceca77dc"}, + {file = "mkdocs_material-9.6.2-py3-none-any.whl", hash = "sha256:71d90dbd63b393ad11a4d90151dfe3dcbfcd802c0f29ce80bebd9bbac6abc753"}, + {file = "mkdocs_material-9.6.2.tar.gz", hash = "sha256:a3de1c5d4c745f10afa78b1a02f917b9dce0808fb206adc0f5bb48b58c1ca21f"}, ] [package.dependencies] From fbeae5523e772658e18e1462929854049b9c2cf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 21:22:12 +0000 Subject: [PATCH 070/139] chore(deps-dev): bump boto3-stubs from 1.36.10 to 1.36.11 (#6010) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.10 to 1.36.11. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7acdd9f1a14..66cfcaf9e89 100644 --- a/poetry.lock +++ b/poetry.lock @@ -428,13 +428,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.10" -description = "Type annotations for boto3 1.36.10 generated with mypy-boto3-builder 8.9.0" +version = "1.36.11" +description = "Type annotations for boto3 1.36.11 generated with mypy-boto3-builder 8.9.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.10-py3-none-any.whl", hash = "sha256:fda0b92e50e0b30ac54807b9e10e06e9224f699ccce80be8ac426cdc63f09ff1"}, - {file = "boto3_stubs-1.36.10.tar.gz", hash = "sha256:fdf82fbe27c4b909df13080922fe27b2e565bf5b546bfec9805e66e983c1b5d9"}, + {file = "boto3_stubs-1.36.11-py3-none-any.whl", hash = "sha256:4e1e714a29142befcf25c13069016cd3fd7693bd6614dbc34458203de773e507"}, + {file = "boto3_stubs-1.36.11.tar.gz", hash = "sha256:b41cd3cef5c442f2f77d10a4609fffaa8c223232b361154af674f559651f7089"}, ] [package.dependencies] @@ -501,7 +501,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.10)"] +boto3 = ["boto3 (==1.36.11)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From 111c3e4059a9025a293cc85426cc97d3a01b8c96 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 21:34:36 +0000 Subject: [PATCH 071/139] docs(api): migrating the data masking utility to mkdocstrings (#6013) Mkdocstrings - DataMasking module --- aws_lambda_powertools/utilities/data_masking/base.py | 11 +++++++++-- .../utilities/data_masking/provider/base.py | 4 ++-- .../data_masking/provider/kms/aws_encryption_sdk.py | 4 ++-- docs/api_doc/data_masking/base.md | 2 ++ docs/api_doc/data_masking/exceptions.md | 2 ++ docs/api_doc/data_masking/provider.md | 2 ++ mkdocs.yml | 8 ++++++-- 7 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 docs/api_doc/data_masking/base.md create mode 100644 docs/api_doc/data_masking/exceptions.md create mode 100644 docs/api_doc/data_masking/provider.md diff --git a/aws_lambda_powertools/utilities/data_masking/base.py b/aws_lambda_powertools/utilities/data_masking/base.py index 9b80e50bd58..c5f49cfade8 100644 --- a/aws_lambda_powertools/utilities/data_masking/base.py +++ b/aws_lambda_powertools/utilities/data_masking/base.py @@ -1,3 +1,9 @@ +""" +Base class for Data Masking +!!! abstract "Usage Documentation" + [`Data masking`](../../utilities/data_masking.md) +""" + from __future__ import annotations import functools @@ -24,8 +30,9 @@ class DataMasking: The DataMasking class orchestrates erasing, encrypting, and decrypting for the base provider. - Example: - ``` + Example + ------- + ```python from aws_lambda_powertools.utilities.data_masking.base import DataMasking def lambda_handler(event, context): diff --git a/aws_lambda_powertools/utilities/data_masking/provider/base.py b/aws_lambda_powertools/utilities/data_masking/provider/base.py index 28bc8384f8d..8751becfb2c 100644 --- a/aws_lambda_powertools/utilities/data_masking/provider/base.py +++ b/aws_lambda_powertools/utilities/data_masking/provider/base.py @@ -11,9 +11,9 @@ class BaseProvider: """ The BaseProvider class serves as an abstract base class for data masking providers. - Examples + Example -------- - ``` + ```python from aws_lambda_powertools.utilities._data_masking.provider import BaseProvider from aws_lambda_powertools.utilities.data_masking import DataMasking diff --git a/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py b/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py index 497b67c6edd..62c4d19e045 100644 --- a/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +++ b/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py @@ -48,9 +48,9 @@ class AWSEncryptionSDKProvider(BaseProvider): """ The AWSEncryptionSDKProvider is used as a provider for the DataMasking class. - Usage + Example ------- - ``` + ```python from aws_lambda_powertools.utilities.data_masking import DataMasking from aws_lambda_powertools.utilities.data_masking.providers.kms.aws_encryption_sdk import ( AWSEncryptionSDKProvider, diff --git a/docs/api_doc/data_masking/base.md b/docs/api_doc/data_masking/base.md new file mode 100644 index 00000000000..f53f55f4c39 --- /dev/null +++ b/docs/api_doc/data_masking/base.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.data_masking.base diff --git a/docs/api_doc/data_masking/exceptions.md b/docs/api_doc/data_masking/exceptions.md new file mode 100644 index 00000000000..7c640463e64 --- /dev/null +++ b/docs/api_doc/data_masking/exceptions.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.data_masking.exceptions diff --git a/docs/api_doc/data_masking/provider.md b/docs/api_doc/data_masking/provider.md new file mode 100644 index 00000000000..406c360c495 --- /dev/null +++ b/docs/api_doc/data_masking/provider.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.data_masking.provider diff --git a/mkdocs.yml b/mkdocs.yml index 1238a20fe3d..e32d5536cb2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,14 +63,18 @@ nav: # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md - API Documentation: - - Feature Flags: + - Data Masking: + - Base: api_doc/data_masking/base.md + - Exception: api_doc/data_masking/exceptions.md + - Provider: api_doc/data_masking/provider.md + - Feature Flags: - AppConfig: api_doc/feature_flags/appconfig.md - Base: api_doc/feature_flags/base.md - Comparators: api_doc/feature_flags/comparators.md - Exceptions: api_doc/feature_flags/exceptions.md - Feature flags: api_doc/feature_flags/feature_flags.md - Schema: api_doc/feature_flags/schema.md - - Idempotency: + - Idempotency: - Base: api_doc/idempotency/base.md - Config: api_doc/idempotency/config.md - Exceptions: api_doc/idempotency/exceptions.md From 90302ef74d45e2fb3bad9cdce5240cc50e53d8ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 21:54:16 +0000 Subject: [PATCH 072/139] chore(deps-dev): bump boto3-stubs from 1.36.10 to 1.36.12 (#6014) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.10 to 1.36.12. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 66cfcaf9e89..73a95c22a6f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -428,13 +428,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.11" -description = "Type annotations for boto3 1.36.11 generated with mypy-boto3-builder 8.9.0" +version = "1.36.12" +description = "Type annotations for boto3 1.36.12 generated with mypy-boto3-builder 8.9.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.11-py3-none-any.whl", hash = "sha256:4e1e714a29142befcf25c13069016cd3fd7693bd6614dbc34458203de773e507"}, - {file = "boto3_stubs-1.36.11.tar.gz", hash = "sha256:b41cd3cef5c442f2f77d10a4609fffaa8c223232b361154af674f559651f7089"}, + {file = "boto3_stubs-1.36.12-py3-none-any.whl", hash = "sha256:84ea0b281a37b363358364a87c2764cbe685166fc47bdac6d08c61bbfc13af50"}, + {file = "boto3_stubs-1.36.12.tar.gz", hash = "sha256:3637af3b29db13ec2349ef765f4e7fae7f09bb708c3b8bc93dd9a8113e3e4e9c"}, ] [package.dependencies] @@ -501,7 +501,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.11)"] +boto3 = ["boto3 (==1.36.12)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From e93b244bdef61d14bcd196e9490222fdd64c0a37 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 21:55:23 +0000 Subject: [PATCH 073/139] docs(api): migrating the event source data classes utility to mkdocstrings (#6015) Mkdocstrings - Data Classes module --- aws_lambda_powertools/utilities/data_classes/common.py | 6 ++++++ aws_lambda_powertools/utilities/feature_flags/appconfig.py | 1 + aws_lambda_powertools/utilities/jmespath_utils/__init__.py | 1 + docs/api_doc/data_classes.md | 2 ++ mkdocs.yml | 1 + 5 files changed, 11 insertions(+) create mode 100644 docs/api_doc/data_classes.md diff --git a/aws_lambda_powertools/utilities/data_classes/common.py b/aws_lambda_powertools/utilities/data_classes/common.py index ec4335b9ee8..8374bf5ee08 100644 --- a/aws_lambda_powertools/utilities/data_classes/common.py +++ b/aws_lambda_powertools/utilities/data_classes/common.py @@ -1,3 +1,9 @@ +""" +Base class for Event Source Data Classes +!!! abstract "Usage Documentation" + [`Data classes`](../utilities/data_classes.md) +""" + from __future__ import annotations import base64 diff --git a/aws_lambda_powertools/utilities/feature_flags/appconfig.py b/aws_lambda_powertools/utilities/feature_flags/appconfig.py index 4f0ad3e4418..2becf16d0fd 100644 --- a/aws_lambda_powertools/utilities/feature_flags/appconfig.py +++ b/aws_lambda_powertools/utilities/feature_flags/appconfig.py @@ -2,6 +2,7 @@ !!! abstract "Usage Documentation" [`Feature Flags`](../../utilities/feature_flags.md) """ + from __future__ import annotations import logging diff --git a/aws_lambda_powertools/utilities/jmespath_utils/__init__.py b/aws_lambda_powertools/utilities/jmespath_utils/__init__.py index 231fb732c83..c35f9b610cf 100644 --- a/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +++ b/aws_lambda_powertools/utilities/jmespath_utils/__init__.py @@ -3,6 +3,7 @@ !!! abstract "Usage Documentation" [`JMESPath Functions`](../utilities/jmespath_functions.md) """ + from __future__ import annotations import base64 diff --git a/docs/api_doc/data_classes.md b/docs/api_doc/data_classes.md new file mode 100644 index 00000000000..47090024306 --- /dev/null +++ b/docs/api_doc/data_classes.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.data_classes.common diff --git a/mkdocs.yml b/mkdocs.yml index e32d5536cb2..815fcb45b7e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,7 @@ nav: # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md - API Documentation: + - Event Source Data Classes: api_doc/data_classes.md - Data Masking: - Base: api_doc/data_masking/base.md - Exception: api_doc/data_masking/exceptions.md From d8263ad05af9c6a08079614083d84e44fa1160fc Mon Sep 17 00:00:00 2001 From: Philip Tzou Date: Mon, 3 Feb 2025 14:00:54 -0800 Subject: [PATCH 074/139] feat(openapi): enhance support for tuple return type validation (#5997) Co-authored-by: Leandro Damascena --- .gitignore | 5 ++- .../event_handler/openapi/params.py | 23 +++++++++-- .../_pydantic/test_openapi_params.py | 38 ++++++++++++++++++- 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 990f6517fe9..9f244805f60 100644 --- a/.gitignore +++ b/.gitignore @@ -314,4 +314,7 @@ examples/**/sam/.aws-sam cdk.out # NOTE: different accounts will be used for E2E thus creating unnecessary git clutter -cdk.context.json \ No newline at end of file +cdk.context.json + +# vim +*.swp diff --git a/aws_lambda_powertools/event_handler/openapi/params.py b/aws_lambda_powertools/event_handler/openapi/params.py index ffcef8b5096..d346375dd44 100644 --- a/aws_lambda_powertools/event_handler/openapi/params.py +++ b/aws_lambda_powertools/event_handler/openapi/params.py @@ -932,7 +932,8 @@ def analyze_param( ModelField | None The type annotation and the Pydantic field representing the parameter """ - field_info, type_annotation = get_field_info_and_type_annotation(annotation, value, is_path_param) + field_info, type_annotation = \ + get_field_info_and_type_annotation(annotation, value, is_path_param, is_response_param) # If the value is a FieldInfo, we use it as the FieldInfo for the parameter if isinstance(value, FieldInfo): @@ -962,7 +963,9 @@ def analyze_param( return field -def get_field_info_and_type_annotation(annotation, value, is_path_param: bool) -> tuple[FieldInfo | None, Any]: +def get_field_info_and_type_annotation( + annotation, value, is_path_param: bool, is_response_param: bool +) -> tuple[FieldInfo | None, Any]: """ Get the FieldInfo and type annotation from an annotation and value. """ @@ -976,6 +979,10 @@ def get_field_info_and_type_annotation(annotation, value, is_path_param: bool) - # If the annotation is a Response type, we recursively call this function with the inner type elif get_origin(annotation) is Response: field_info, type_annotation = get_field_info_response_type(annotation, value) + # If the response param is a tuple with two elements, we use the first element as the type annotation, + # just like we did in the APIGateway._to_response + elif is_response_param and get_origin(annotation) is tuple and len(get_args(annotation)) == 2: + field_info, type_annotation = get_field_info_tuple_type(annotation, value) # If the annotation is not an Annotated type, we use it as the type annotation else: type_annotation = annotation @@ -983,12 +990,22 @@ def get_field_info_and_type_annotation(annotation, value, is_path_param: bool) - return field_info, type_annotation +def get_field_info_tuple_type(annotation, value) -> tuple[FieldInfo | None, Any]: + (inner_type, _) = get_args(annotation) + + # If the inner type is an Annotated type, we need to extract the type annotation and the FieldInfo + if get_origin(inner_type) is Annotated: + return get_field_info_annotated_type(inner_type, value, False) + + return None, inner_type + + def get_field_info_response_type(annotation, value) -> tuple[FieldInfo | None, Any]: # Example: get_args(Response[inner_type]) == (inner_type,) # noqa: ERA001 (inner_type,) = get_args(annotation) # Recursively resolve the inner type - return get_field_info_and_type_annotation(inner_type, value, False) + return get_field_info_and_type_annotation(inner_type, value, False, True) def get_field_info_annotated_type(annotation, value, is_path_param: bool) -> tuple[FieldInfo | None, Any]: diff --git a/tests/functional/event_handler/_pydantic/test_openapi_params.py b/tests/functional/event_handler/_pydantic/test_openapi_params.py index a57156db130..0273c4b5712 100644 --- a/tests/functional/event_handler/_pydantic/test_openapi_params.py +++ b/tests/functional/event_handler/_pydantic/test_openapi_params.py @@ -1,6 +1,6 @@ from dataclasses import dataclass from datetime import datetime -from typing import List +from typing import List, Tuple from pydantic import BaseModel, Field from typing_extensions import Annotated @@ -172,6 +172,42 @@ def handler() -> Response[Annotated[str, Body(title="Response title")]]: assert response.schema_.type == "string" +def test_openapi_with_tuple_returns(): + app = APIGatewayRestResolver() + + @app.get("/") + def handler() -> Tuple[str, int]: + return "Hello, world", 200 + + schema = app.get_openapi_schema() + assert len(schema.paths.keys()) == 1 + + get = schema.paths["/"].get + assert get.parameters is None + + response = get.responses[200].content[JSON_CONTENT_TYPE] + assert response.schema_.title == "Return" + assert response.schema_.type == "string" + + +def test_openapi_with_tuple_annotated_returns(): + app = APIGatewayRestResolver() + + @app.get("/") + def handler() -> Tuple[Annotated[str, Body(title="Response title")], int]: + return "Hello, world", 200 + + schema = app.get_openapi_schema() + assert len(schema.paths.keys()) == 1 + + get = schema.paths["/"].get + assert get.parameters is None + + response = get.responses[200].content[JSON_CONTENT_TYPE] + assert response.schema_.title == "Response title" + assert response.schema_.type == "string" + + def test_openapi_with_omitted_param(): app = APIGatewayRestResolver() From b037568fb667ab1b3ab59e19c3899f0356805e84 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 3 Feb 2025 22:14:59 +0000 Subject: [PATCH 075/139] docs(api): migrating the batch utility to mkdocstrings (#6016) * Mkdocstrings - Batch module * Mkdocstrings - Batch module --- aws_lambda_powertools/logging/__init__.py | 3 +- aws_lambda_powertools/metrics/__init__.py | 3 +- .../middleware_factory/__init__.py | 2 +- aws_lambda_powertools/tracing/__init__.py | 3 +- aws_lambda_powertools/utilities/batch/base.py | 2 ++ .../utilities/batch/decorators.py | 9 +++--- .../batch/sqs_fifo_partial_processor.py | 2 +- .../provider/kms/aws_encryption_sdk.py | 28 +++++++++---------- .../utilities/parser/__init__.py | 3 +- docs/api_doc/batch/base.md | 2 ++ docs/api_doc/batch/decorators.md | 3 ++ docs/api_doc/batch/exceptions.md | 2 ++ mkdocs.yml | 4 +++ 13 files changed, 37 insertions(+), 29 deletions(-) create mode 100644 docs/api_doc/batch/base.md create mode 100644 docs/api_doc/batch/decorators.md create mode 100644 docs/api_doc/batch/exceptions.md diff --git a/aws_lambda_powertools/logging/__init__.py b/aws_lambda_powertools/logging/__init__.py index 2c9532ef540..38dd68c1caa 100644 --- a/aws_lambda_powertools/logging/__init__.py +++ b/aws_lambda_powertools/logging/__init__.py @@ -1,5 +1,4 @@ -"""Logging utility -""" +"""Logging utility""" from .logger import Logger diff --git a/aws_lambda_powertools/metrics/__init__.py b/aws_lambda_powertools/metrics/__init__.py index cafd348b8ec..be88ee59258 100644 --- a/aws_lambda_powertools/metrics/__init__.py +++ b/aws_lambda_powertools/metrics/__init__.py @@ -1,5 +1,4 @@ -"""CloudWatch Embedded Metric Format utility -""" +"""CloudWatch Embedded Metric Format utility""" from aws_lambda_powertools.metrics.base import MetricResolution, MetricUnit, single_metric from aws_lambda_powertools.metrics.exceptions import ( diff --git a/aws_lambda_powertools/middleware_factory/__init__.py b/aws_lambda_powertools/middleware_factory/__init__.py index b44d49d6987..cdeb1e6262e 100644 --- a/aws_lambda_powertools/middleware_factory/__init__.py +++ b/aws_lambda_powertools/middleware_factory/__init__.py @@ -1,4 +1,4 @@ -""" Utilities to enhance middlewares """ +"""Utilities to enhance middlewares""" from .factory import lambda_handler_decorator diff --git a/aws_lambda_powertools/tracing/__init__.py b/aws_lambda_powertools/tracing/__init__.py index 1031ae4aec6..71a9d54a37f 100644 --- a/aws_lambda_powertools/tracing/__init__.py +++ b/aws_lambda_powertools/tracing/__init__.py @@ -1,5 +1,4 @@ -"""Tracing utility -""" +"""Tracing utility""" from .extensions import aiohttp_trace_config from .tracer import Tracer diff --git a/aws_lambda_powertools/utilities/batch/base.py b/aws_lambda_powertools/utilities/batch/base.py index 1c70d4a7adc..2cb74296ca0 100644 --- a/aws_lambda_powertools/utilities/batch/base.py +++ b/aws_lambda_powertools/utilities/batch/base.py @@ -1,5 +1,7 @@ """ Batch processing utilities +!!! abstract "Usage Documentation" + [`Batch processing`](../../utilities/batch.md) """ from __future__ import annotations diff --git a/aws_lambda_powertools/utilities/batch/decorators.py b/aws_lambda_powertools/utilities/batch/decorators.py index f23d64d0ce3..0cba41f98fe 100644 --- a/aws_lambda_powertools/utilities/batch/decorators.py +++ b/aws_lambda_powertools/utilities/batch/decorators.py @@ -51,9 +51,8 @@ def async_batch_processor( processor: AsyncBatchProcessor Batch Processor to handle partial failure cases - Examples + Example -------- - **Processes Lambda's event with a BasePartialProcessor** >>> from aws_lambda_powertools.utilities.batch import async_batch_processor, AsyncBatchProcessor >>> from aws_lambda_powertools.utilities.data_classes.sqs_event import SQSRecord >>> @@ -119,7 +118,7 @@ def batch_processor( processor: BatchProcessor Batch Processor to handle partial failure cases - Examples + Example -------- **Processes Lambda's event with a BatchProcessor** @@ -180,7 +179,7 @@ def process_partial_response( result: PartialItemFailureResponse Lambda Partial Batch Response - Examples + Example -------- **Processes Lambda's SQS event** @@ -244,7 +243,7 @@ def async_process_partial_response( result: PartialItemFailureResponse Lambda Partial Batch Response - Examples + Example -------- **Processes Lambda's SQS event** diff --git a/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py b/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py index d493e43bd93..2e680e2f04e 100644 --- a/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +++ b/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py @@ -21,7 +21,7 @@ class SqsFifoPartialProcessor(BatchProcessor): Stops processing records when the first record fails. The remaining records are reported as failed items. Example - _______ + ------- ## Process batch triggered by a FIFO SQS diff --git a/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py b/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py index 62c4d19e045..07d48efe569 100644 --- a/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +++ b/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py @@ -142,17 +142,17 @@ def encrypt(self, data: Any, provider_options: dict | None = None, **encryption_ Parameters ------- - data : Any - The data to be encrypted. - provider_options : dict - Additional options for the aws_encryption_sdk.EncryptionSDKClient - **encryption_context : str - Additional keyword arguments collected into a dictionary. + data: Any + The data to be encrypted. + provider_options: dict + Additional options for the aws_encryption_sdk.EncryptionSDKClient + **encryption_context: str + Additional keyword arguments collected into a dictionary. Returns ------- - ciphertext : str - The encrypted data, as a base64-encoded string. + ciphertext: str + The encrypted data, as a base64-encoded string. """ provider_options = provider_options or {} self._validate_encryption_context(encryption_context) @@ -179,15 +179,15 @@ def decrypt(self, data: str, provider_options: dict | None = None, **encryption_ Parameters ------- - data : str - The encrypted data, as a base64-encoded string - provider_options - Additional options for the aws_encryption_sdk.EncryptionSDKClient + data: str + The encrypted data, as a base64-encoded string + provider_options + Additional options for the aws_encryption_sdk.EncryptionSDKClient Returns ------- - ciphertext : bytes - The decrypted data in bytes + ciphertext: bytes + The decrypted data in bytes """ provider_options = provider_options or {} self._validate_encryption_context(encryption_context) diff --git a/aws_lambda_powertools/utilities/parser/__init__.py b/aws_lambda_powertools/utilities/parser/__init__.py index 29127a3035b..e4e08b790b8 100644 --- a/aws_lambda_powertools/utilities/parser/__init__.py +++ b/aws_lambda_powertools/utilities/parser/__init__.py @@ -1,5 +1,4 @@ -"""Advanced event_parser utility -""" +"""Advanced event_parser utility""" from pydantic import BaseModel, Field, ValidationError, field_validator, model_validator diff --git a/docs/api_doc/batch/base.md b/docs/api_doc/batch/base.md new file mode 100644 index 00000000000..adec8fb2b8e --- /dev/null +++ b/docs/api_doc/batch/base.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.batch.base diff --git a/docs/api_doc/batch/decorators.md b/docs/api_doc/batch/decorators.md new file mode 100644 index 00000000000..739f8475c05 --- /dev/null +++ b/docs/api_doc/batch/decorators.md @@ -0,0 +1,3 @@ + +::: aws_lambda_powertools.utilities.batch.decorators +::: aws_lambda_powertools.utilities.batch.sqs_fifo_partial_processor diff --git a/docs/api_doc/batch/exceptions.md b/docs/api_doc/batch/exceptions.md new file mode 100644 index 00000000000..a77226fb0d9 --- /dev/null +++ b/docs/api_doc/batch/exceptions.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.utilities.batch.exceptions diff --git a/mkdocs.yml b/mkdocs.yml index 815fcb45b7e..d9952b03ed0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,10 @@ nav: # - Casual to regular contributor: contributing/tracks/casual_regular_contributor.md # - Customer to advocate: contributing/tracks/customer_advocate.md - API Documentation: + - Batch Processing: + - Base: api_doc/batch/base.md + - Decorators: api_doc/batch/decorators.md + - Exceptions: api_doc/batch/exceptions.md - Event Source Data Classes: api_doc/data_classes.md - Data Masking: - Base: api_doc/data_masking/base.md From 8967681f321a9aef5a14aed0e115777212137ae1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2025 08:46:37 +0000 Subject: [PATCH 076/139] chore(ci): new pre-release 3.5.1a4 (#6018) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.5.1a4/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.5.1a4/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index 7dfc2a5bd2d..99f852fa3b4 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.1a3" +VERSION = "3.5.1a4" diff --git a/provenance/3.5.1a4/multiple.intoto.jsonl b/provenance/3.5.1a4/multiple.intoto.jsonl new file mode 100644 index 00000000000..9e18c3fddf6 --- /dev/null +++ b/provenance/3.5.1a4/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE0LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjg3ZDA3MTlmZGJlZTQ2Zjg0ZjA0ODAwNGUxOGFkMDg2YzE1YTMyNDZlYTA1MWNhMjRhYTRlMzA5NDA0YjM4OSJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE0LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiIwMThkNWU1ZTJhNzVjY2RlZTEwNmNlYTNmMDMzNjA0MjZiOGI0Y2U1YzIyNDdiZDc3OGFkNDg2ZWNiNWYwNTNkIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiZDExZGI5YjUxODgyYzAyZmUwNmZkMDcxMDdjNmYxMDJiNmE4NmExOSJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwNywiZm9ya3NfY291bnQiOjQwNywiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo2Nywib3Blbl9pc3N1ZXNfY291bnQiOjY3LCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDItMDNUMjI6MzE6MzlaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjc2OTA1LCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5NzksInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDItMDNUMjI6MTU6MDNaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5NzksIndhdGNoZXJzX2NvdW50IjoyOTc5LCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzEzMDg1MzI4NCIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTY4IiwiZ2l0aHViX3NoYTEiOiJkMTFkYjliNTE4ODJjMDJmZTA2ZmQwNzEwN2M2ZjEwMmI2YTg2YTE5In19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMTMwODUzMjg0LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiJkMTFkYjliNTE4ODJjMDJmZTA2ZmQwNzEwN2M2ZjEwMmI2YTg2YTE5In19XX19","signatures":[{"keyid":"","sig":"MEUCIQCQUl1Por3aaNsjPx6gNoVca4oAr1BTIaIDrRRSiIEOzAIgZ+yme/chkZC8drmsIrcjmzZqjfPX0z5vsQbkRpGuu9M=","cert":"-----BEGIN CERTIFICATE-----\nMIIHZjCCBuugAwIBAgIUaquS/ddblTy91v44Vj6cV4RH4W4wCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMjA0MDgwNzMzWhcNMjUwMjA0MDgxNzMzWjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAE0yWlBAISq7ijiENWn6xk8T0foNdS2C1+65Fk\nVBwdkHnUGwpn54flO7/AYp771xiu7ecDeyCcBzrKvedua1f/8KOCBgowggYGMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUewW4\nn2EPIdaZD2pXsMO2dmAXbCwwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChkMTFk\nYjliNTE4ODJjMDJmZTA2ZmQwNzEwN2M2ZjEwMmI2YTg2YTE5MBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDChkMTFkYjliNTE4ODJjMDJmZTA2ZmQwNzEwN2M2ZjEwMmI2YTg2YTE5MCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoZDEx\nZGI5YjUxODgyYzAyZmUwNmZkMDcxMDdjNmYxMDJiNmE4NmExOTAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMxMzA4NTMyODQvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlNAAFHsAAAQDAEYwRAIgKLRo1Y7uG4ehy24OFfMj\n5gSvay8J8nFOllLYW/SOdt8CIBOW7uup/GSW5/VaFujKE7rTns7v5DnRur6IgoZj\nSJUyMAoGCCqGSM49BAMDA2kAMGYCMQCYy7JWNmpPBZmNdDbHgsnLOLXovFRJKldG\nX+3lVRUaB3uzR2ERXJSXzxF+bLhpQ3YCMQCOxK0jMU9M0QzZNsnbnxny9b/1Q1nk\nG7e0HlkvY4yOUrwRroRT6upsEwJfAjO9QmY=\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index cb06fa3e431..9752d278e4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.1a3" +version = "3.5.1a4" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From 6a3327f8fa8416fec6c6ec5e42b5b1eaba585b45 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 4 Feb 2025 08:51:49 +0000 Subject: [PATCH 077/139] docs(api): migrating the tracer utility to mkdocstrings (#6017) Mkdocstrings - Tracer --- aws_lambda_powertools/tracing/base.py | 5 +++++ docs/api_doc/tracer/base.md | 2 ++ docs/api_doc/tracer/tracing.md | 2 ++ mkdocs.yml | 3 +++ 4 files changed, 12 insertions(+) create mode 100644 docs/api_doc/tracer/base.md create mode 100644 docs/api_doc/tracer/tracing.md diff --git a/aws_lambda_powertools/tracing/base.py b/aws_lambda_powertools/tracing/base.py index 74b146ad6e8..bcce4122f7d 100644 --- a/aws_lambda_powertools/tracing/base.py +++ b/aws_lambda_powertools/tracing/base.py @@ -1,3 +1,8 @@ +""" +Tracing utility +!!! abstract "Usage Documentation" + [`Tracer`](../../core/tracer.md) +""" from __future__ import annotations import abc diff --git a/docs/api_doc/tracer/base.md b/docs/api_doc/tracer/base.md new file mode 100644 index 00000000000..3973deb4c5d --- /dev/null +++ b/docs/api_doc/tracer/base.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.tracing.base diff --git a/docs/api_doc/tracer/tracing.md b/docs/api_doc/tracer/tracing.md new file mode 100644 index 00000000000..336f2e05cbc --- /dev/null +++ b/docs/api_doc/tracer/tracing.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.tracing.tracer diff --git a/mkdocs.yml b/mkdocs.yml index d9952b03ed0..194cbd1e9d1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -94,6 +94,9 @@ nav: - Secrets: api_doc/parameters/secrets.md - Parser: api_doc/parser.md - Streaming: api_doc/streaming.md + - Tracer: + - Base: api_doc/tracer/base.md + - Tracing: api_doc/tracer/tracing.md - Typing: api_doc/typing.md - Validation: api_doc/validation.md From 6bcea4467a0fa2c93950f6238e521842cf7c54a3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2025 10:14:13 +0000 Subject: [PATCH 078/139] chore(ci): changelog rebuild (#6020) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65fbef7968b..c1b69f3bace 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,37 +9,59 @@ * **docs:** typo in a service name in Event Handler ([#5944](https://github.com/aws-powertools/powertools-lambda-python/issues/5944)) * **logger:** child logger must respect log level ([#5950](https://github.com/aws-powertools/powertools-lambda-python/issues/5950)) +## Code Refactoring + +* **metrics:** Improve type annotations for metrics decorator ([#6000](https://github.com/aws-powertools/powertools-lambda-python/issues/6000)) + ## Documentation +* **api:** migrating the tracer utility to mkdocstrings ([#6017](https://github.com/aws-powertools/powertools-lambda-python/issues/6017)) +* **api:** migrating the batch utility to mkdocstrings ([#6016](https://github.com/aws-powertools/powertools-lambda-python/issues/6016)) +* **api:** migrating the event source data classes utility to mkdocstrings ([#6015](https://github.com/aws-powertools/powertools-lambda-python/issues/6015)) +* **api:** migrating the data masking utility to mkdocstrings ([#6013](https://github.com/aws-powertools/powertools-lambda-python/issues/6013)) +* **api:** migrating the AppConfig utility to mkdocstrings ([#6008](https://github.com/aws-powertools/powertools-lambda-python/issues/6008)) +* **api:** migrating the idempotency utility to mkdocstrings ([#6007](https://github.com/aws-powertools/powertools-lambda-python/issues/6007)) +* **api:** migrating the jmespath utility to mkdocstrings ([#6006](https://github.com/aws-powertools/powertools-lambda-python/issues/6006)) +* **api:** migrating the parameters utility to mkdocstrings ([#6005](https://github.com/aws-powertools/powertools-lambda-python/issues/6005)) +* **api:** migrating the parser utility to mkdocstrings ([#6004](https://github.com/aws-powertools/powertools-lambda-python/issues/6004)) +* **api:** migrating the streaming utility to mkdocstrings ([#6003](https://github.com/aws-powertools/powertools-lambda-python/issues/6003)) +* **api:** migrating the typing utility to mkdocstrings ([#5996](https://github.com/aws-powertools/powertools-lambda-python/issues/5996)) * **api:** migrating the validation utility to mkdocstrings ([#5972](https://github.com/aws-powertools/powertools-lambda-python/issues/5972)) * **layer:** update layer version number - v3.5.0 ([#5952](https://github.com/aws-powertools/powertools-lambda-python/issues/5952)) ## Features * **logger:** add clear_state method ([#5956](https://github.com/aws-powertools/powertools-lambda-python/issues/5956)) +* **openapi:** enhance support for tuple return type validation ([#5997](https://github.com/aws-powertools/powertools-lambda-python/issues/5997)) ## Maintenance +* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) * **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) -* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) * **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) -* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) -* **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) +* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) +* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) +* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) * **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) +* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) * **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) +* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) +* **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) +* **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) +* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) * **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) * **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) * **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) -* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) -* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) -* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) -* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) * **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) * **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) * **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) * **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) +* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) +* **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) +* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) +* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) * **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) From d0f850ba16fa8d4fdd5ef53c3da1a7e01098dd75 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 4 Feb 2025 10:18:39 +0000 Subject: [PATCH 079/139] docs(api): migrating the Middleware Factory utility to mkdocstrings (#6019) * Mkdocstrings - Middleware Factory * Mkdocstrings - Middleware Factory --------- Co-authored-by: Simon Thulbourn --- aws_lambda_powertools/middleware_factory/__init__.py | 5 ++++- docs/api_doc/middleware_factory.md | 2 ++ mkdocs.yml | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 docs/api_doc/middleware_factory.md diff --git a/aws_lambda_powertools/middleware_factory/__init__.py b/aws_lambda_powertools/middleware_factory/__init__.py index cdeb1e6262e..ebdb338cc15 100644 --- a/aws_lambda_powertools/middleware_factory/__init__.py +++ b/aws_lambda_powertools/middleware_factory/__init__.py @@ -1,4 +1,7 @@ -"""Utilities to enhance middlewares""" +"""Utilities to enhance middleware +!!! abstract "Usage Documentation" + [`Middleware Factory`](../utilities/middleware_factory.md) +""" from .factory import lambda_handler_decorator diff --git a/docs/api_doc/middleware_factory.md b/docs/api_doc/middleware_factory.md new file mode 100644 index 00000000000..8d5f5221c11 --- /dev/null +++ b/docs/api_doc/middleware_factory.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.middleware_factory diff --git a/mkdocs.yml b/mkdocs.yml index 194cbd1e9d1..ac00c887248 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -86,6 +86,7 @@ nav: - Persistence: api_doc/idempotency/persistence.md - Serialization: api_doc/idempotency/serialization.md - JMESPath Functions: api_doc/jmespath_functions.md + - Middleware Factory: api_doc/middleware_factory.md - Parameters: - Base: api_doc/parameters/base.md - AppConfig: api_doc/parameters/appconfig.md From c4c00e8216429f0de3423b09d1a042f4696b5d85 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 4 Feb 2025 10:50:05 +0000 Subject: [PATCH 080/139] docs(api): migrating the logger utility to mkdocstrings (#6021) Mkdocstrings - Logging --- aws_lambda_powertools/logging/exceptions.py | 3 +++ aws_lambda_powertools/logging/formatter.py | 14 ++++++------ aws_lambda_powertools/logging/logger.py | 25 ++++++++++++--------- docs/api_doc/logger/datadog_formatter.md | 2 ++ docs/api_doc/logger/exceptions.md | 2 ++ docs/api_doc/logger/formatter.md | 2 ++ docs/api_doc/logger/lambda_context.md | 2 ++ docs/api_doc/logger/logger.md | 2 ++ mkdocs.yml | 6 +++++ 9 files changed, 41 insertions(+), 17 deletions(-) create mode 100644 docs/api_doc/logger/datadog_formatter.md create mode 100644 docs/api_doc/logger/exceptions.md create mode 100644 docs/api_doc/logger/formatter.md create mode 100644 docs/api_doc/logger/lambda_context.md create mode 100644 docs/api_doc/logger/logger.md diff --git a/aws_lambda_powertools/logging/exceptions.py b/aws_lambda_powertools/logging/exceptions.py index 65b30906edf..6202c8105f4 100644 --- a/aws_lambda_powertools/logging/exceptions.py +++ b/aws_lambda_powertools/logging/exceptions.py @@ -1,2 +1,5 @@ class InvalidLoggerSamplingRateError(Exception): + """ + Logger configured with Invalid Sampling value + """ pass diff --git a/aws_lambda_powertools/logging/formatter.py b/aws_lambda_powertools/logging/formatter.py index 824c5c0ef16..f04f7c87e73 100644 --- a/aws_lambda_powertools/logging/formatter.py +++ b/aws_lambda_powertools/logging/formatter.py @@ -273,17 +273,17 @@ def append_context_keys(self, **additional_keys: Any) -> Generator[None, None, N """ Context manager to temporarily add logging keys. - Parameters: + Parameters ----------- - **keys: Any + **additional_keys: Any Key-value pairs to include in the log context during the lifespan of the context manager. - Example: + Example -------- - >>> logger = Logger(service="example_service") - >>> with logger.append_context_keys(user_id="123", operation="process"): - >>> logger.info("Log with context") - >>> logger.info("Log without context") + logger = Logger(service="example_service") + with logger.append_context_keys(user_id="123", operation="process"): + logger.info("Log with context") + logger.info("Log without context") """ # Add keys to the context self.append_keys(**additional_keys) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index 61bfb82867b..d643e87ca3a 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -1,3 +1,8 @@ +""" +Logger utility +!!! abstract "Usage Documentation" + [`Logger`](../../core/logger.md) +""" from __future__ import annotations import functools @@ -82,7 +87,7 @@ class Logger: by default "INFO" child: bool, optional create a child Logger named ., False by default - sample_rate: float, optional + sampling_rate: float, optional sample rate for debug calls within execution context defaults to 0.0 stream: sys.stdout, optional valid output for a logging stream, by default sys.stdout @@ -103,7 +108,6 @@ class Logger: use_datetime_directive: bool, optional Interpret `datefmt` as a format string for `datetime.datetime.strftime`, rather than `time.strftime`. - See https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior . This also supports a custom %F directive for milliseconds. use_rfc3339: bool, optional @@ -116,7 +120,6 @@ class Logger: by default json.loads json_default : Callable, optional function to coerce unserializable values, by default `str()` - Only used when no custom formatter is set utc : bool, optional set logging timestamp to UTC, by default False to continue to use local time as per stdlib @@ -590,17 +593,19 @@ def append_context_keys(self, **additional_keys: Any) -> Generator[None, None, N """ Context manager to temporarily add logging keys. - Parameters: + Parameters ----------- - **keys: Any + **additional_keys: Any Key-value pairs to include in the log context during the lifespan of the context manager. - Example: + Example -------- - >>> logger = Logger(service="example_service") - >>> with logger.append_context_keys(user_id="123", operation="process"): - >>> logger.info("Log with context") - >>> logger.info("Log without context") + **Logging with contextual keys** + + logger = Logger(service="example_service") + with logger.append_context_keys(user_id="123", operation="process"): + logger.info("Log with context") + logger.info("Log without context") """ with self.registered_formatter.append_context_keys(**additional_keys): yield diff --git a/docs/api_doc/logger/datadog_formatter.md b/docs/api_doc/logger/datadog_formatter.md new file mode 100644 index 00000000000..3d037d18214 --- /dev/null +++ b/docs/api_doc/logger/datadog_formatter.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.logging.formatters.datadog diff --git a/docs/api_doc/logger/exceptions.md b/docs/api_doc/logger/exceptions.md new file mode 100644 index 00000000000..531a6bd8773 --- /dev/null +++ b/docs/api_doc/logger/exceptions.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.logging.exceptions diff --git a/docs/api_doc/logger/formatter.md b/docs/api_doc/logger/formatter.md new file mode 100644 index 00000000000..064b6e4b546 --- /dev/null +++ b/docs/api_doc/logger/formatter.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.logging.formatter diff --git a/docs/api_doc/logger/lambda_context.md b/docs/api_doc/logger/lambda_context.md new file mode 100644 index 00000000000..eec5841c6e4 --- /dev/null +++ b/docs/api_doc/logger/lambda_context.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.logging.lambda_context diff --git a/docs/api_doc/logger/logger.md b/docs/api_doc/logger/logger.md new file mode 100644 index 00000000000..d688d106d75 --- /dev/null +++ b/docs/api_doc/logger/logger.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.logging.logger diff --git a/mkdocs.yml b/mkdocs.yml index ac00c887248..a82ae76dbdd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -86,6 +86,12 @@ nav: - Persistence: api_doc/idempotency/persistence.md - Serialization: api_doc/idempotency/serialization.md - JMESPath Functions: api_doc/jmespath_functions.md + - Logger: + - DataDog Formatter: api_doc/logger/datadog_formatter.md + - Exceptions: api_doc/logger/exceptions.md + - Formatter: api_doc/logger/formatter.md + - Lambda Context: api_doc/logger/lambda_context.md + - Logger: api_doc/logger/logger.md - Middleware Factory: api_doc/middleware_factory.md - Parameters: - Base: api_doc/parameters/base.md From a95c8c7f60702d95b23f6c0b1b2444f7d3b9c6ac Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 4 Feb 2025 11:41:22 +0000 Subject: [PATCH 081/139] docs(api): migrating the metrics utility to mkdocstrings (#6022) Mkdocstrings - Metrics --- aws_lambda_powertools/metrics/base.py | 6 ++++++ .../metrics/provider/cloudwatch_emf/cloudwatch.py | 2 +- docs/api_doc/metrics/base.md | 2 ++ docs/api_doc/metrics/exceptions.md | 2 ++ docs/api_doc/metrics/metrics.md | 2 ++ docs/api_doc/metrics/provider_datadog.md | 2 ++ docs/api_doc/metrics/provider_emf.md | 2 ++ mkdocs.yml | 6 ++++++ 8 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 docs/api_doc/metrics/base.md create mode 100644 docs/api_doc/metrics/exceptions.md create mode 100644 docs/api_doc/metrics/metrics.md create mode 100644 docs/api_doc/metrics/provider_datadog.md create mode 100644 docs/api_doc/metrics/provider_emf.md diff --git a/aws_lambda_powertools/metrics/base.py b/aws_lambda_powertools/metrics/base.py index 7304afa5a42..32325e5ce29 100644 --- a/aws_lambda_powertools/metrics/base.py +++ b/aws_lambda_powertools/metrics/base.py @@ -1,3 +1,9 @@ +""" +Metrics utility +!!! abstract "Usage Documentation" + [`Metrics`](../../core/metrics.md) +""" + from __future__ import annotations import datetime diff --git a/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py b/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py index cd9a90a0d19..7a7db86c9c6 100644 --- a/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +++ b/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py @@ -330,7 +330,7 @@ def set_timestamp(self, timestamp: int | datetime.datetime): """ Set the timestamp for the metric. - Parameters: + Parameters ----------- timestamp: int | datetime.datetime The timestamp to create the metric. diff --git a/docs/api_doc/metrics/base.md b/docs/api_doc/metrics/base.md new file mode 100644 index 00000000000..2fac9156233 --- /dev/null +++ b/docs/api_doc/metrics/base.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.metrics.base diff --git a/docs/api_doc/metrics/exceptions.md b/docs/api_doc/metrics/exceptions.md new file mode 100644 index 00000000000..285a2654342 --- /dev/null +++ b/docs/api_doc/metrics/exceptions.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.metrics.exceptions diff --git a/docs/api_doc/metrics/metrics.md b/docs/api_doc/metrics/metrics.md new file mode 100644 index 00000000000..ec268279335 --- /dev/null +++ b/docs/api_doc/metrics/metrics.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.metrics.metrics diff --git a/docs/api_doc/metrics/provider_datadog.md b/docs/api_doc/metrics/provider_datadog.md new file mode 100644 index 00000000000..70836789d43 --- /dev/null +++ b/docs/api_doc/metrics/provider_datadog.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.metrics.provider.datadog.datadog diff --git a/docs/api_doc/metrics/provider_emf.md b/docs/api_doc/metrics/provider_emf.md new file mode 100644 index 00000000000..610e2c83db0 --- /dev/null +++ b/docs/api_doc/metrics/provider_emf.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.metrics.provider.cloudwatch_emf.cloudwatch diff --git a/mkdocs.yml b/mkdocs.yml index a82ae76dbdd..68b5835efc4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -92,6 +92,12 @@ nav: - Formatter: api_doc/logger/formatter.md - Lambda Context: api_doc/logger/lambda_context.md - Logger: api_doc/logger/logger.md + - Metrics: + - Base: api_doc/metrics/base.md + - Exceptions: api_doc/metrics/exceptions.md + - Providers: + - EMF: api_doc/metrics/provider_emf.md + - DataDog: api_doc/metrics/provider_datadog.md - Middleware Factory: api_doc/middleware_factory.md - Parameters: - Base: api_doc/parameters/base.md From f88ca79c41a27138137181dc155eabb453aba8f9 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 4 Feb 2025 12:17:27 +0000 Subject: [PATCH 082/139] docs(api): migrating the event handler utility to mkdocstrings (#6023) Mkdocstrings - Event handler --- aws_lambda_powertools/event_handler/api_gateway.py | 12 ++++++++++-- .../event_handler/middlewares/base.py | 2 +- .../event_handler/middlewares/openapi_validation.py | 2 +- .../event_handler/middlewares/schema_validation.py | 2 +- .../event_handler/openapi/params.py | 9 ++++----- .../event_handler/openapi/swagger_ui/html.py | 2 +- aws_lambda_powertools/logging/exceptions.py | 1 + aws_lambda_powertools/logging/logger.py | 1 + .../metrics/provider/datadog/datadog.py | 4 ---- aws_lambda_powertools/tracing/base.py | 1 + docs/api_doc/event_handler/api_gateway.md | 2 ++ docs/api_doc/event_handler/appsync.md | 2 ++ docs/api_doc/event_handler/middleware.md | 2 ++ docs/api_doc/event_handler/openapi.md | 2 ++ mkdocs.yml | 5 +++++ 15 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 docs/api_doc/event_handler/api_gateway.md create mode 100644 docs/api_doc/event_handler/appsync.md create mode 100644 docs/api_doc/event_handler/middleware.md create mode 100644 docs/api_doc/event_handler/openapi.md diff --git a/aws_lambda_powertools/event_handler/api_gateway.py b/aws_lambda_powertools/event_handler/api_gateway.py index 1485c563a06..4e2be256ecb 100644 --- a/aws_lambda_powertools/event_handler/api_gateway.py +++ b/aws_lambda_powertools/event_handler/api_gateway.py @@ -313,10 +313,10 @@ def __init__( middlewares: list[Callable[..., Response]] | None = None, ): """ + Internally used Route Configuration Parameters ---------- - method: str The HTTP method, example "GET" path: str @@ -908,6 +908,8 @@ def build(self, event: ResponseEventT, cors: CORSConfig | None = None) -> dict[s class BaseRouter(ABC): + """Base class for Routing""" + current_event: BaseProxyEvent lambda_context: LambdaContext context: dict @@ -1459,7 +1461,7 @@ def _registered_api_adapter(app: ApiGatewayResolver, next_middleware: Callable[. class ApiGatewayResolver(BaseRouter): - """API Gateway and ALB proxy resolver + """API Gateway, VPC Laticce, Bedrock and ALB proxy resolver Examples -------- @@ -2570,6 +2572,8 @@ def register_exception_handler(func: Callable): class APIGatewayRestResolver(ApiGatewayResolver): + """Amazon API Gateway REST and HTTP API v1 payload resolver""" + current_event: APIGatewayProxyEvent def __init__( @@ -2650,6 +2654,8 @@ def _compile_regex(rule: str, base_regex: str = _ROUTE_REGEX): class APIGatewayHttpResolver(ApiGatewayResolver): + """Amazon API Gateway HTTP API v2 payload resolver""" + current_event: APIGatewayProxyEventV2 def __init__( @@ -2685,6 +2691,8 @@ def _get_base_path(self) -> str: class ALBResolver(ApiGatewayResolver): + """Amazon Application Load Balancer (ALB) resolver""" + current_event: ALBEvent def __init__( diff --git a/aws_lambda_powertools/event_handler/middlewares/base.py b/aws_lambda_powertools/event_handler/middlewares/base.py index 3998c7c80bd..5b4f82b405f 100644 --- a/aws_lambda_powertools/event_handler/middlewares/base.py +++ b/aws_lambda_powertools/event_handler/middlewares/base.py @@ -26,7 +26,7 @@ class BaseMiddlewareHandler(Generic[EventHandlerInstance], ABC): This is the middleware handler function where middleware logic is implemented. The next middleware handler is represented by `next_middleware`, returning a Response object. - Examples + Example -------- **Correlation ID Middleware** diff --git a/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py b/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py index a73fd454458..555ec519bf6 100644 --- a/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +++ b/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py @@ -37,7 +37,7 @@ class OpenAPIValidationMiddleware(BaseMiddlewareHandler): Lambda handler. It also validates the response against the OpenAPI schema defined by the Lambda handler. It should not be used directly, but rather through the `enable_validation` parameter of the `ApiGatewayResolver`. - Examples + Example -------- ```python diff --git a/aws_lambda_powertools/event_handler/middlewares/schema_validation.py b/aws_lambda_powertools/event_handler/middlewares/schema_validation.py index c31d15bec03..c24fff0cbe0 100644 --- a/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +++ b/aws_lambda_powertools/event_handler/middlewares/schema_validation.py @@ -18,7 +18,7 @@ class SchemaValidationMiddleware(BaseMiddlewareHandler): """Middleware to validate API request and response against JSON Schema using the [Validation utility](https://docs.powertools.aws.dev/lambda/python/latest/utilities/validation/). - Examples + Example -------- **Validating incoming event** diff --git a/aws_lambda_powertools/event_handler/openapi/params.py b/aws_lambda_powertools/event_handler/openapi/params.py index d346375dd44..5211d678a2b 100644 --- a/aws_lambda_powertools/event_handler/openapi/params.py +++ b/aws_lambda_powertools/event_handler/openapi/params.py @@ -879,8 +879,6 @@ def get_flat_dependant( ---------- dependant: Dependant The dependant model to flatten - skip_repeats: bool - If True, child Dependents already visited will be skipped to avoid duplicates visited: list[CacheKey], optional Keeps track of visited Dependents to avoid infinite recursion. Defaults to empty list. @@ -932,8 +930,9 @@ def analyze_param( ModelField | None The type annotation and the Pydantic field representing the parameter """ - field_info, type_annotation = \ - get_field_info_and_type_annotation(annotation, value, is_path_param, is_response_param) + field_info, type_annotation = get_field_info_and_type_annotation( + annotation, value, is_path_param, is_response_param, + ) # If the value is a FieldInfo, we use it as the FieldInfo for the parameter if isinstance(value, FieldInfo): @@ -964,7 +963,7 @@ def analyze_param( def get_field_info_and_type_annotation( - annotation, value, is_path_param: bool, is_response_param: bool + annotation, value, is_path_param: bool, is_response_param: bool, ) -> tuple[FieldInfo | None, Any]: """ Get the FieldInfo and type annotation from an annotation and value. diff --git a/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py b/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py index 70d98743bcf..6bcbcff50a4 100644 --- a/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +++ b/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py @@ -22,7 +22,7 @@ def generate_swagger_html( spec: str The OpenAPI spec swagger_js: str - Swagger UI JavaScript source code or URL + Swagger UI JavaScript source code or URL swagger_css: str Swagger UI CSS source code or URL swagger_base_url: str diff --git a/aws_lambda_powertools/logging/exceptions.py b/aws_lambda_powertools/logging/exceptions.py index 6202c8105f4..488234608f0 100644 --- a/aws_lambda_powertools/logging/exceptions.py +++ b/aws_lambda_powertools/logging/exceptions.py @@ -2,4 +2,5 @@ class InvalidLoggerSamplingRateError(Exception): """ Logger configured with Invalid Sampling value """ + pass diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index d643e87ca3a..840d068d438 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -3,6 +3,7 @@ !!! abstract "Usage Documentation" [`Logger`](../../core/logger.md) """ + from __future__ import annotations import functools diff --git a/aws_lambda_powertools/metrics/provider/datadog/datadog.py b/aws_lambda_powertools/metrics/provider/datadog/datadog.py index d79782363f4..0442af3f86c 100644 --- a/aws_lambda_powertools/metrics/provider/datadog/datadog.py +++ b/aws_lambda_powertools/metrics/provider/datadog/datadog.py @@ -87,10 +87,6 @@ def add_metric( Timestamp in int for the metrics, default = time.time() tags: list[str] In format like ["tag:value", "tag2:value2"] - args: Any - extra args will be dropped for compatibility - kwargs: Any - extra kwargs will be converted into tags, e.g., add_metrics(sales=sam) -> tags=['sales:sam'] Examples -------- diff --git a/aws_lambda_powertools/tracing/base.py b/aws_lambda_powertools/tracing/base.py index bcce4122f7d..e095287ce62 100644 --- a/aws_lambda_powertools/tracing/base.py +++ b/aws_lambda_powertools/tracing/base.py @@ -3,6 +3,7 @@ !!! abstract "Usage Documentation" [`Tracer`](../../core/tracer.md) """ + from __future__ import annotations import abc diff --git a/docs/api_doc/event_handler/api_gateway.md b/docs/api_doc/event_handler/api_gateway.md new file mode 100644 index 00000000000..2d30a6c38c7 --- /dev/null +++ b/docs/api_doc/event_handler/api_gateway.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.event_handler.api_gateway diff --git a/docs/api_doc/event_handler/appsync.md b/docs/api_doc/event_handler/appsync.md new file mode 100644 index 00000000000..dd1ec4c12bb --- /dev/null +++ b/docs/api_doc/event_handler/appsync.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.event_handler.appsync diff --git a/docs/api_doc/event_handler/middleware.md b/docs/api_doc/event_handler/middleware.md new file mode 100644 index 00000000000..cd1fed521f2 --- /dev/null +++ b/docs/api_doc/event_handler/middleware.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.event_handler.middlewares diff --git a/docs/api_doc/event_handler/openapi.md b/docs/api_doc/event_handler/openapi.md new file mode 100644 index 00000000000..02c64c429f1 --- /dev/null +++ b/docs/api_doc/event_handler/openapi.md @@ -0,0 +1,2 @@ + +::: aws_lambda_powertools.event_handler.openapi diff --git a/mkdocs.yml b/mkdocs.yml index 68b5835efc4..5430dad21b0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -72,6 +72,11 @@ nav: - Base: api_doc/data_masking/base.md - Exception: api_doc/data_masking/exceptions.md - Provider: api_doc/data_masking/provider.md + - Event Handler: + - AppSync: api_doc/event_handler/appsync.md + - Middleware: api_doc/event_handler/middleware.md + - OpenAPI: api_doc/event_handler/openapi.md + - REST: api_doc/event_handler/api_gateway.md - Feature Flags: - AppConfig: api_doc/feature_flags/appconfig.md - Base: api_doc/feature_flags/base.md From ed57561d337b0274c6795476c8c2405a122d91aa Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 4 Feb 2025 15:46:03 +0000 Subject: [PATCH 083/139] chore(ci): remove pdoc3 library (#6024) * Removing pdoc3 * Removing pdoc3 * Removing pdoc3 * Removing pdoc3 * Removing pdoc3 --- .github/workflows/quality_check.yml | 2 + .github/workflows/reusable_publish_docs.yml | 3 - Makefile | 21 +- .../event_handler/openapi/params.py | 10 +- poetry.lock | 432 ++++++++++++++++-- pyproject.toml | 2 +- 6 files changed, 410 insertions(+), 60 deletions(-) diff --git a/.github/workflows/quality_check.yml b/.github/workflows/quality_check.yml index 8ae08e8481b..fcb4c8143c6 100644 --- a/.github/workflows/quality_check.yml +++ b/.github/workflows/quality_check.yml @@ -61,6 +61,8 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dependencies run: make dev-quality-code + - name: Checking third-party library licenses + run: make check-licenses - name: Formatting and Linting run: make lint - name: Static type checking diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index 225b94fcb9f..e16feab9415 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -84,9 +84,6 @@ jobs: aws-region: us-east-1 role-to-assume: ${{ secrets.AWS_DOCS_ROLE_ARN }} mask-aws-account-id: true - - name: Copy API Docs - run: | - cp -r api site/ - name: Deploy Docs (Version) env: VERSION: ${{ inputs.version }} diff --git a/Makefile b/Makefile index f9111bd9394..4bb1e78390c 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -.PHONY: target dev format lint test coverage-html pr build build-docs build-docs-api build-docs-website -.PHONY: docs-local docs-api-local security-baseline complexity-baseline release-prod release-test release +.PHONY: target dev format lint test coverage-html pr build build-docs build-docs-website check-licenses +.PHONY: docs-local security-baseline complexity-baseline release-prod release-test release target: @$(MAKE) pr @@ -21,6 +21,10 @@ dev-gitpod: poetry install --extras "all redis datamasking" pre-commit install +# Running licensecheck with zero to break the pipeline if there is an invalid license +check-licenses: + poetry run licensecheck -u poetry:dev --zero + format: poetry run black aws_lambda_powertools tests examples @@ -55,7 +59,7 @@ coverage-html: pre-commit: pre-commit run --show-diff-on-failure -pr: lint lint-docs mypy pre-commit test security-baseline complexity-baseline +pr: lint lint-docs mypy pre-commit check-licenses test security-baseline complexity-baseline build: pr poetry build @@ -65,14 +69,6 @@ release-docs: rm -rf site api @echo "Updating website docs" poetry run mike deploy --push --update-aliases ${VERSION} ${ALIAS} - @echo "Building API docs" - @$(MAKE) build-docs-api VERSION=${VERSION} - -build-docs-api: - poetry run pdoc --html --output-dir ./api/ ./aws_lambda_powertools --force - mv -f ./api/aws_lambda_powertools/* ./api/ - rm -rf ./api/aws_lambda_powertools - mkdir ${VERSION} && cp -R api ${VERSION} docs-local: poetry run mkdocs serve @@ -81,9 +77,6 @@ docs-local-docker: docker build -t squidfunk/mkdocs-material ./docs/ docker run --rm -it -p 8000:8000 -v ${PWD}:/docs squidfunk/mkdocs-material -docs-api-local: - poetry run pdoc --http : aws_lambda_powertools - security-baseline: poetry run bandit --baseline bandit.baseline -r aws_lambda_powertools diff --git a/aws_lambda_powertools/event_handler/openapi/params.py b/aws_lambda_powertools/event_handler/openapi/params.py index 5211d678a2b..1d6b5da145c 100644 --- a/aws_lambda_powertools/event_handler/openapi/params.py +++ b/aws_lambda_powertools/event_handler/openapi/params.py @@ -931,7 +931,10 @@ def analyze_param( The type annotation and the Pydantic field representing the parameter """ field_info, type_annotation = get_field_info_and_type_annotation( - annotation, value, is_path_param, is_response_param, + annotation, + value, + is_path_param, + is_response_param, ) # If the value is a FieldInfo, we use it as the FieldInfo for the parameter @@ -963,7 +966,10 @@ def analyze_param( def get_field_info_and_type_annotation( - annotation, value, is_path_param: bool, is_response_param: bool, + annotation, + value, + is_path_param: bool, + is_response_param: bool, ) -> tuple[FieldInfo | None, Any]: """ Get the FieldInfo and type annotation from an annotation and value. diff --git a/poetry.lock b/poetry.lock index 73a95c22a6f..05575f3d15d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,10 +6,12 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [[package]] name = "anyio" @@ -17,6 +19,7 @@ version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, @@ -33,12 +36,25 @@ doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + [[package]] name = "argcomplete" version = "3.5.3" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "argcomplete-3.5.3-py3-none-any.whl", hash = "sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61"}, {file = "argcomplete-3.5.3.tar.gz", hash = "sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392"}, @@ -53,29 +69,33 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] +markers = {main = "extra == \"redis\" and python_full_version < \"3.11.3\"", dev = "python_full_version < \"3.11.3\""} [[package]] name = "attrs" -version = "24.3.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" +groups = ["main", "dev"] files = [ - {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, - {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] +markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "aws-cdk-asset-awscli-v1" @@ -83,6 +103,7 @@ version = "2.2.221" description = "A library that contains the AWS CLI for use in Lambda Layers" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.asset_awscli_v1-2.2.221-py3-none-any.whl", hash = "sha256:66a83e4116b6a7a0041f99f7bca7d0ea354c9ab2e17a938a3dcec50f7272f5d9"}, {file = "aws_cdk_asset_awscli_v1-2.2.221.tar.gz", hash = "sha256:7ea0366c8090dc396fed85baddbcf48ac4a088c1bf606cd776138e6526679108"}, @@ -99,6 +120,7 @@ version = "2.1.3" description = "A Lambda Layer that contains kubectl v1.20" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.asset_kubectl_v20-2.1.3-py3-none-any.whl", hash = "sha256:d5612e5bd03c215a28ce53193b1144ecf4e93b3b6779563c046a8a74d83a3979"}, {file = "aws_cdk_asset_kubectl_v20-2.1.3.tar.gz", hash = "sha256:237cd8530d9e8be0bbc7159af927dbb6b7f91bf3f4099c8ef4d9a213b34264be"}, @@ -115,6 +137,7 @@ version = "2.1.0" description = "@aws-cdk/asset-node-proxy-agent-v6" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.asset_node_proxy_agent_v6-2.1.0-py3-none-any.whl", hash = "sha256:24a388b69a44d03bae6dbf864c4e25ba650d4b61c008b4568b94ffbb9a69e40e"}, {file = "aws_cdk_asset_node_proxy_agent_v6-2.1.0.tar.gz", hash = "sha256:1f292c0631f86708ba4ee328b3a2b229f7e46ea1c79fbde567ee9eb119c2b0e2"}, @@ -131,6 +154,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-alpha-2.114.1a0.tar.gz", hash = "sha256:9e8c3131f4fa3e0926eb3d76aeacd578a6aa51f95b39c10a86112c991bb75864"}, {file = "aws_cdk.aws_apigatewayv2_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:a101ce56d846976ad1c8020054dfe73fd9f45afdbe71f2a297acc84c1a201403"}, @@ -149,6 +173,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-authorizers" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-authorizers-alpha-2.114.1a0.tar.gz", hash = "sha256:ee290e2ed0f1506dbbb12b3b8963f50b379121759077002c265977fbaf18fd9f"}, {file = "aws_cdk.aws_apigatewayv2_authorizers_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:2576e1ce06dab314020bff50f5d59b8715a7adf18106eac811028c22f61c9baa"}, @@ -168,6 +193,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-integrations" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-integrations-alpha-2.114.1a0.tar.gz", hash = "sha256:19e1824b577683e7d3c2b01fd58c176ebe4c7b8d1b4af4cfdc3893d3ffbac9af"}, {file = "aws_cdk.aws_apigatewayv2_integrations_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:1e440a70e6b4cbe077c95ffdd3fd0cfb3962f90762ea2e973eaa2ab7719ccb2c"}, @@ -187,6 +213,7 @@ version = "2.59.0a0" description = "The CDK Construct Library for AWS::AppSync" optional = false python-versions = "~=3.7" +groups = ["dev"] files = [ {file = "aws-cdk.aws-appsync-alpha-2.59.0a0.tar.gz", hash = "sha256:f5c7773b70b759efd576561dc3d71af5762a6f7cbc9ee9eef5e538c7ab3dccc7"}, {file = "aws_cdk.aws_appsync_alpha-2.59.0a0-py3-none-any.whl", hash = "sha256:ecc235f1f70d404c8d03cf250be0227becd14c468f8c43b6d9df334a1d60c8e2"}, @@ -205,6 +232,7 @@ version = "2.177.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.aws_lambda_python_alpha-2.177.0a0-py3-none-any.whl", hash = "sha256:5aacc26970e30909b372fd2e8b98ce7197b8074d78ec4f1d900a8ddd02bc5114"}, {file = "aws_cdk_aws_lambda_python_alpha-2.177.0a0.tar.gz", hash = "sha256:0137957603cd91b473de3a455bf4d95de4ba60c1ba9f25f62d3edeb965202c4e"}, @@ -223,6 +251,7 @@ version = "39.2.9" description = "Cloud Assembly Schema" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.cloud_assembly_schema-39.2.9-py3-none-any.whl", hash = "sha256:3d16bbe45a463e5327b3d618e1501a2f4ecc6a8764dea71b045e431976135bc8"}, {file = "aws_cdk_cloud_assembly_schema-39.2.9.tar.gz", hash = "sha256:ed82fc47eee25888fedeb3f668d61e7fb22b0afa393d5ae5cc9e44e75113b85b"}, @@ -239,6 +268,7 @@ version = "2.177.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk_lib-2.177.0-py3-none-any.whl", hash = "sha256:acdf06aaf52367a64b4bf88381e8272cb7b5961c242020ace822c79749e53cac"}, {file = "aws_cdk_lib-2.177.0.tar.gz", hash = "sha256:5e51c48da31555beb38243bb2882e98ee9fe1796466ba9f8d3088701b47965e5"}, @@ -260,6 +290,8 @@ version = "4.0.0" description = "AWS Encryption SDK implementation for Python" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "aws-encryption-sdk-4.0.0.tar.gz", hash = "sha256:57df8b5c1b9f18db4373c6e8e65563791063a71be93d0849950ed365272db354"}, {file = "aws_encryption_sdk-4.0.0-py2.py3-none-any.whl", hash = "sha256:a94483785dff2cd166ccb8f3a15cdfe5cba7a3717f6604543c816a3a32f7c412"}, @@ -280,6 +312,7 @@ version = "0.4.3" description = "AWS signature version 4 signing process for the python requests module" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "aws-requests-auth-0.4.3.tar.gz", hash = "sha256:33593372018b960a31dbbe236f89421678b885c35f0b6a7abfae35bb77e069b2"}, {file = "aws_requests_auth-0.4.3-py2.py3-none-any.whl", hash = "sha256:646bc37d62140ea1c709d20148f5d43197e6bd2d63909eb36fa4bb2345759977"}, @@ -294,6 +327,7 @@ version = "1.94.0" description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates" optional = false python-versions = "!=4.0,<=4.0,>=3.8" +groups = ["dev"] files = [ {file = "aws_sam_translator-1.94.0-py3-none-any.whl", hash = "sha256:100e33eeffcfa81f7c45cadeb0ee29596ce829f6b4d2745140f04fa19a41f539"}, {file = "aws_sam_translator-1.94.0.tar.gz", hash = "sha256:8ec258d9f7ece72ef91c81f4edb45a2db064c16844b6afac90c575893beaa391"}, @@ -314,6 +348,8 @@ version = "2.14.0" description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers to record and emit information from within their applications to the AWS X-Ray service." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"tracer\" or extra == \"all\"" files = [ {file = "aws_xray_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:cfbe6feea3d26613a2a869d14c9246a844285c97087ad8f296f901633554ad94"}, {file = "aws_xray_sdk-2.14.0.tar.gz", hash = "sha256:aab843c331af9ab9ba5cefb3a303832a19db186140894a523edafc024cc0493c"}, @@ -329,6 +365,7 @@ version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, @@ -343,6 +380,7 @@ version = "1.8.2" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "bandit-1.8.2-py3-none-any.whl", hash = "sha256:df6146ad73dd30e8cbda4e29689ddda48364e36ff655dbfc86998401fcf1721f"}, {file = "bandit-1.8.2.tar.gz", hash = "sha256:e00ad5a6bc676c0954669fe13818024d66b70e42cf5adb971480cf3b671e835f"}, @@ -367,6 +405,7 @@ version = "25.1.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, @@ -413,6 +452,7 @@ version = "1.36.10" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "boto3-1.36.10-py3-none-any.whl", hash = "sha256:5f8d5c2024a2d1411d3d67abb7357ec7d4c6162e3f1c396dc9b79d042cfd0a80"}, {file = "boto3-1.36.10.tar.gz", hash = "sha256:d2f1010db699326b26fbd465d91c4b49177c9d995d7e72c0f31335f139efa0d2"}, @@ -432,6 +472,7 @@ version = "1.36.12" description = "Type annotations for boto3 1.36.12 generated with mypy-boto3-builder 8.9.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "boto3_stubs-1.36.12-py3-none-any.whl", hash = "sha256:84ea0b281a37b363358364a87c2764cbe685166fc47bdac6d08c61bbfc13af50"}, {file = "boto3_stubs-1.36.12.tar.gz", hash = "sha256:3637af3b29db13ec2349ef765f4e7fae7f09bb708c3b8bc93dd9a8113e3e4e9c"}, @@ -868,6 +909,7 @@ version = "1.36.10" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "botocore-1.36.10-py3-none-any.whl", hash = "sha256:45c8a6e01dc18d44a13ba688f1d60ad562db8154b08c46b412387ea040a741c2"}, {file = "botocore-1.36.10.tar.gz", hash = "sha256:d27bb73f0ea81395527a6298ac0a7ea5b2958094169f7cf7d48e3f4e4bc21b65"}, @@ -890,6 +932,7 @@ version = "1.36.9" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "botocore_stubs-1.36.9-py3-none-any.whl", hash = "sha256:76fc0651fc4e7d9a83de944d109f4d779a064265c5f243699718e1d06104efd9"}, {file = "botocore_stubs-1.36.9.tar.gz", hash = "sha256:786857fc9f4e11f16b62e0383b8d60a3a03a9ac10fe23d57d1fa726e77626535"}, @@ -907,6 +950,8 @@ version = "0.16.1" description = "Python module to generate and modify bytecode" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"}, {file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"}, @@ -921,6 +966,7 @@ version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -947,6 +993,7 @@ version = "2.35.4" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "cdk_nag-2.35.4-py3-none-any.whl", hash = "sha256:f9d0f6ffbe79aecc082697d57810aa1ed2b62f2dc582c487f37dcbb2812274bf"}, {file = "cdk_nag-2.35.4.tar.gz", hash = "sha256:5389ffd6689576708039edf9cc3a155de46e6950edaff27fb7db4a05bedafb26"}, @@ -965,6 +1012,7 @@ version = "0.1.290" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "cdklabs.generative_ai_cdk_constructs-0.1.290-py3-none-any.whl", hash = "sha256:3297a25ee2acbf6e70ee100a7e712023b076ea688820e53fa352b1c05a769cf0"}, {file = "cdklabs_generative_ai_cdk_constructs-0.1.290.tar.gz", hash = "sha256:693f732e8552d28100b5da918a17cb19fd19b25b81040faf11688a24afbe42c0"}, @@ -984,6 +1032,7 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -995,6 +1044,7 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -1064,6 +1114,7 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] +markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = "*" @@ -1074,6 +1125,7 @@ version = "1.23.1" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfn_lint-1.23.1-py3-none-any.whl", hash = "sha256:6f89f557dea6484cd5bc1b32cef91e9898dd1d98f12d5b59a7f6baf9cf61b7ee"}, {file = "cfn_lint-1.23.1.tar.gz", hash = "sha256:2ee8722673414a3993921d87cc1893934d313b9b953da7a91442f81958d86644"}, @@ -1100,6 +1152,7 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -1201,6 +1254,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -1215,6 +1269,7 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1226,6 +1281,7 @@ version = "6.9.0" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, @@ -1243,6 +1299,7 @@ version = "10.4.2" description = "A programming model for software-defined state" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "constructs-10.4.2-py3-none-any.whl", hash = "sha256:1f0f59b004edebfde0f826340698b8c34611f57848139b7954904c61645f13c1"}, {file = "constructs-10.4.2.tar.gz", hash = "sha256:ce54724360fffe10bab27d8a081844eb81f5ace7d7c62c84b719c49f164d5307"}, @@ -1259,6 +1316,7 @@ version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, @@ -1336,6 +1394,7 @@ version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1365,6 +1424,7 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] +markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1385,6 +1445,8 @@ version = "0.51.0" description = "The Datadog Python library" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "datadog-0.51.0-py2.py3-none-any.whl", hash = "sha256:a9764f091c96af4e0996d4400b168fc5fba380f911d6d672c9dcd4773e29ea3f"}, {file = "datadog-0.51.0.tar.gz", hash = "sha256:3279534f831ae0b4ae2d8ce42ef038b4ab38e667d7ed6ff7437982d7a0cf5250"}, @@ -1399,6 +1461,8 @@ version = "6.105.0" description = "The Datadog AWS Lambda Library" optional = true python-versions = "<4,>=3.8.0" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "datadog_lambda-6.105.0-py3-none-any.whl", hash = "sha256:447d13b6f4971da8aa1227e554a1c2f8985b62aaacbb182bc093a7e048cd1fc4"}, {file = "datadog_lambda-6.105.0.tar.gz", hash = "sha256:59d7900b2136e14441dc29de4ff778301d2c8175cc26caf3819c648293357fbb"}, @@ -1419,6 +1483,8 @@ version = "2.20.0" description = "Datadog APM client library" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e1dee099099b95acf7d0e552179925cfec58a52315cc914d153506367b195bc4"}, {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9d209bef14caafcd53be8c14e04741d86c08f76496c1bf755e2eaa38605ce3e0"}, @@ -1515,6 +1581,7 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -1526,6 +1593,8 @@ version = "1.2.18" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, @@ -1543,6 +1612,7 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -1558,6 +1628,7 @@ version = "0.5.0" description = "Python module and CLI for hashing of file system directories." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dirhash-0.5.0-py3-none-any.whl", hash = "sha256:523dfd6b058c64f45b31604376926c6e2bd2ea301d0df23095d4055674e38b09"}, {file = "dirhash-0.5.0.tar.gz", hash = "sha256:e60760f0ab2e935d8cb088923ea2c6492398dca42cec785df778985fd4cd5386"}, @@ -1572,6 +1643,7 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -1583,6 +1655,7 @@ version = "7.1.0" description = "A Python library for the Docker Engine API." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, @@ -1605,6 +1678,8 @@ version = "0.6.1" description = "Python application configuration via the environment" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"}, {file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"}, @@ -1619,6 +1694,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11.0\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1633,6 +1710,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1647,6 +1725,8 @@ version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"validation\" or extra == \"all\"" files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, @@ -1655,12 +1735,29 @@ files = [ [package.extras] devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] +[[package]] +name = "fhconfparser" +version = "2024.1" +description = "Provides a config language independent way to read a config file." +optional = false +python-versions = ">=3.8,<4.0" +groups = ["dev"] +files = [ + {file = "fhconfparser-2024.1-py3-none-any.whl", hash = "sha256:f6048cb646e69a3422a581bc0102150c2b79fe7ff26b82233e5ef52f72820e3e"}, + {file = "fhconfparser-2024.1.tar.gz", hash = "sha256:de8af019f0071e614d523985e1d93e0fce20a409d1c64dead03b1b665d4b2e4d"}, +] + +[package.dependencies] +attrs = ">=23.2.0,<24" +tomli = ">=2.0.1,<3" + [[package]] name = "filelock" version = "3.17.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, @@ -1677,6 +1774,7 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -1694,6 +1792,7 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1708,6 +1807,7 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1726,6 +1826,7 @@ version = "1.5.6" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "griffe-1.5.6-py3-none-any.whl", hash = "sha256:b2a3afe497c6c1f952e54a23095ecc09435016293e77af8478ed65df1022a394"}, {file = "griffe-1.5.6.tar.gz", hash = "sha256:181f6666d5aceb6cd6e2da5a2b646cfb431e47a0da1fda283845734b67e10944"}, @@ -1740,6 +1841,7 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1751,6 +1853,7 @@ version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -1772,6 +1875,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1796,6 +1900,7 @@ version = "2.3.0" description = "HashiCorp Vault API client" optional = false python-versions = "<4.0,>=3.8" +groups = ["dev"] files = [ {file = "hvac-2.3.0-py3-none-any.whl", hash = "sha256:a3afc5710760b6ee9b3571769df87a0333da45da05a5f9f963e1d3925a84be7d"}, {file = "hvac-2.3.0.tar.gz", hash = "sha256:1b85e3320e8642dd82f234db63253cda169a817589e823713dc5fca83119b1e2"}, @@ -1813,6 +1918,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1827,6 +1933,7 @@ version = "3.3.0" description = "Iterative JSON parser with standard Python iterator interfaces" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f7a5250599c366369fbf3bc4e176f5daa28eb6bc7d6130d02462ed335361675"}, {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f87a7e52f79059f9c58f6886c262061065eb6f7554a587be7ed3aa63e6b71b34"}, @@ -1930,6 +2037,7 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -1953,6 +2061,7 @@ version = "6.5.2" description = "Read resources from Python packages" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, @@ -1975,6 +2084,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1986,6 +2096,7 @@ version = "6.0.0" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.9.0" +groups = ["dev"] files = [ {file = "isort-6.0.0-py3-none-any.whl", hash = "sha256:567954102bb47bb12e0fae62606570faacddd441e45683968c8d1734fb1af892"}, {file = "isort-6.0.0.tar.gz", hash = "sha256:75d9d8a1438a9432a7d7b54f2d3b45cad9a4a0fdba43617d9873379704a8bdf1"}, @@ -2001,6 +2112,7 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -2018,6 +2130,7 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -2029,6 +2142,7 @@ version = "1.106.0" description = "Python client for jsii runtime" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "jsii-1.106.0-py3-none-any.whl", hash = "sha256:5a44d7c3a5a326fa3d9befdb3770b380057e0a61e3804e7c4907f70d76afaaa2"}, {file = "jsii-1.106.0.tar.gz", hash = "sha256:c79c47899f53a7c3c4b20f80d3cd306628fe9ed1852eee970324c71eba1d974e"}, @@ -2049,6 +2163,7 @@ version = "1.33" description = "Apply JSON-Patches (RFC 6902)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +groups = ["dev"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -2063,10 +2178,10 @@ version = "1.7.0" description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, - {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, - {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -2078,6 +2193,7 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -2089,6 +2205,7 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -2110,6 +2227,7 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -2124,29 +2242,56 @@ version = "2.6.2" description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"datadog\" and python_version >= \"3.13.0\"" files = [ {file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"}, {file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"}, ] [[package]] -name = "mako" -version = "1.3.8" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +name = "licensecheck" +version = "2024.3" +description = "Output the licenses used by dependencies and check if these are compatible with the project license" optional = false -python-versions = ">=3.8" +python-versions = "<4.0,>=3.8" +groups = ["dev"] files = [ - {file = "Mako-1.3.8-py3-none-any.whl", hash = "sha256:42f48953c7eb91332040ff567eb7eea69b22e7a4affbc5ba8e845e8f730f6627"}, - {file = "mako-1.3.8.tar.gz", hash = "sha256:577b97e414580d3e088d47c2dbbe9594aa7a5146ed2875d4dfa9075af2dd3cc8"}, + {file = "licensecheck-2024.3-py3-none-any.whl", hash = "sha256:0baef4c1865e0325a35ff25ed12a0c7094035b7dcfbab9a1abfe43d7735adebe"}, + {file = "licensecheck-2024.3.tar.gz", hash = "sha256:e838e1c87a7ede553df376ad35a69d7c4b02676df0fba9dd1c6a6866eb0e0ee5"}, ] [package.dependencies] -MarkupSafe = ">=0.9.2" +appdirs = ">=1.4.4,<2" +fhconfparser = ">=2024.1,<2026" +loguru = ">=0.7.2,<2" +markdown = ">=3.6,<4" +packaging = ">=24.0,<25" +requests = ">=2.31.0,<3" +requests-cache = ">=1.2.0,<2" +requirements-parser = ">=0.11.0,<2" +rich = ">=13.7.1,<14" +tomli = ">=2.0.1,<3" +uv = ">=0.3.3,<2" + +[[package]] +name = "loguru" +version = "0.7.3" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = "<4.0,>=3.5" +groups = ["dev"] +files = [ + {file = "loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c"}, + {file = "loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -babel = ["Babel"] -lingua = ["lingua"] -testing = ["pytest"] +dev = ["Sphinx (==8.1.3)", "build (==1.2.2)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.5.0)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.13.0)", "mypy (==v1.4.1)", "myst-parser (==4.0.0)", "pre-commit (==4.0.1)", "pytest (==6.1.2)", "pytest (==8.3.2)", "pytest-cov (==2.12.1)", "pytest-cov (==5.0.0)", "pytest-cov (==6.0.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.1.0)", "sphinx-rtd-theme (==3.0.2)", "tox (==3.27.1)", "tox (==4.23.2)", "twine (==6.0.1)"] [[package]] name = "mando" @@ -2154,6 +2299,7 @@ version = "0.7.1" description = "Create Python CLI apps with little to no effort at all!" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mando-0.7.1-py2.py3-none-any.whl", hash = "sha256:26ef1d70928b6057ee3ca12583d73c63e05c49de8972d620c278a7b206581a8a"}, {file = "mando-0.7.1.tar.gz", hash = "sha256:18baa999b4b613faefb00eac4efadcf14f510b59b924b66e08289aa1de8c3500"}, @@ -2171,6 +2317,7 @@ version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -2189,6 +2336,7 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -2213,6 +2361,7 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -2283,6 +2432,7 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -2294,6 +2444,7 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -2305,6 +2456,7 @@ version = "2.1.3" description = "Manage multiple versions of your MkDocs-powered documentation" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, @@ -2330,6 +2482,7 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -2361,6 +2514,7 @@ version = "1.3.0" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "mkdocs_autorefs-1.3.0-py3-none-any.whl", hash = "sha256:d180f9778a04e78b7134e31418f238bba56f56d6a8af97873946ff661befffb3"}, {file = "mkdocs_autorefs-1.3.0.tar.gz", hash = "sha256:6867764c099ace9025d6ac24fd07b85a98335fbd30107ef01053697c8f46db61"}, @@ -2377,6 +2531,7 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -2394,6 +2549,7 @@ version = "0.3.2" description = "MkDocs plugin for setting revision date from git per markdown file." optional = false python-versions = ">=3.4" +groups = ["dev"] files = [ {file = "mkdocs_git_revision_date_plugin-0.3.2-py3-none-any.whl", hash = "sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef"}, ] @@ -2409,6 +2565,7 @@ version = "9.6.2" description = "Documentation that simply works" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_material-9.6.2-py3-none-any.whl", hash = "sha256:71d90dbd63b393ad11a4d90151dfe3dcbfcd802c0f29ce80bebd9bbac6abc753"}, {file = "mkdocs_material-9.6.2.tar.gz", hash = "sha256:a3de1c5d4c745f10afa78b1a02f917b9dce0808fb206adc0f5bb48b58c1ca21f"}, @@ -2438,6 +2595,7 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -2449,6 +2607,7 @@ version = "0.28.0" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "mkdocstrings-0.28.0-py3-none-any.whl", hash = "sha256:84cf3dc910614781fe0fee46ce8006fde7df6cc7cca2e3f799895fb8a9170b39"}, {file = "mkdocstrings-0.28.0.tar.gz", hash = "sha256:df20afef1eafe36ba466ae20732509ecb74237653a585f5061937e54b553b4e0"}, @@ -2476,6 +2635,7 @@ version = "1.14.2" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "mkdocstrings_python-1.14.2-py3-none-any.whl", hash = "sha256:0a467fbf3c0c7b4722802140807c1913ca3368beeb6aabab2b4ce4407dc856d9"}, {file = "mkdocstrings_python-1.14.2.tar.gz", hash = "sha256:3ff9f4d356896b555fa491c6b843c939afc36846f216cca49fd4c48c34bf62ce"}, @@ -2493,6 +2653,7 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2510,6 +2671,7 @@ version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, @@ -2538,6 +2700,7 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -2597,6 +2760,7 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfig 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_appconfig-1.36.0-py3-none-any.whl", hash = "sha256:d627de43761a83991a0ab8cd10698d415f94dcc78a567433c7465fc8d1f5cc16"}, {file = "mypy_boto3_appconfig-1.36.0.tar.gz", hash = "sha256:3f38cbd2d7d359da88dc996eeeafa4c1174847909e31a327dd77263dfdfd5424"}, @@ -2611,6 +2775,7 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfigData 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_appconfigdata-1.36.0-py3-none-any.whl", hash = "sha256:68f02ce06ed9597b02154aff64655fc38c42919eda08fddb130ba17e9f70e9cb"}, {file = "mypy_boto3_appconfigdata-1.36.0.tar.gz", hash = "sha256:3436d149833ea69b4260a0f352aac19258d4676c7a21087625906f7da98624c7"}, @@ -2625,6 +2790,7 @@ version = "1.36.0" description = "Type annotations for boto3 CloudFormation 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_cloudformation-1.36.0-py3-none-any.whl", hash = "sha256:3f6cd81739aaf9634c4aa2b92579081038a76e4f2dec306d02eaaf558b332ce9"}, {file = "mypy_boto3_cloudformation-1.36.0.tar.gz", hash = "sha256:acc2c7ae8920f1167be097f6151685fe5aee99be2f890075edf93e05d298e8b0"}, @@ -2639,6 +2805,7 @@ version = "1.36.0" description = "Type annotations for boto3 CloudWatch 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_cloudwatch-1.36.0-py3-none-any.whl", hash = "sha256:2f6cb81c05a1b4be3510e0857b22913a241488bc08f55b0ad96e8b775c144891"}, {file = "mypy_boto3_cloudwatch-1.36.0.tar.gz", hash = "sha256:a370d61522121ab457c443c338a652d0d3e1c22102d9db9f197fd5dcb7e656a4"}, @@ -2653,6 +2820,7 @@ version = "1.36.0" description = "Type annotations for boto3 DynamoDB 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_dynamodb-1.36.0-py3-none-any.whl", hash = "sha256:b782a817ce8956f8d53ac94c85f969dfe51451fc99f16a3b62776f1e0ed3f1ba"}, {file = "mypy_boto3_dynamodb-1.36.0.tar.gz", hash = "sha256:1687e4689236a5391755126e86ec2596d408eb95408c31ac09a3d1eb289d516d"}, @@ -2667,6 +2835,7 @@ version = "1.36.0" description = "Type annotations for boto3 Lambda 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_lambda-1.36.0-py3-none-any.whl", hash = "sha256:8a6693be1352b51e232cee73f73ce36014d19b4777bdf6969c5e707aba424ca1"}, {file = "mypy_boto3_lambda-1.36.0.tar.gz", hash = "sha256:5e9f23702060529aad216a3ce2a2368391a112df07909fbd3aa80d573d84893c"}, @@ -2681,6 +2850,7 @@ version = "1.36.3" description = "Type annotations for boto3 CloudWatchLogs 1.36.3 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_logs-1.36.3-py3-none-any.whl", hash = "sha256:553cb31261eb4484394af9ac965fa33b0d414e927c47768021a0a6ec89625f64"}, {file = "mypy_boto3_logs-1.36.3.tar.gz", hash = "sha256:76d233632a36665094ac888a685fade150c10665ab4cad1b17265037fcadd098"}, @@ -2695,6 +2865,7 @@ version = "1.36.9" description = "Type annotations for boto3 S3 1.36.9 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_s3-1.36.9-py3-none-any.whl", hash = "sha256:506edd56892452dff5b673e3c79a11b6f8935076ce4a9daaac4cda708a176201"}, {file = "mypy_boto3_s3-1.36.9.tar.gz", hash = "sha256:368c963969eda65bb3a9df61e87510dd8b3247cce59f559c2ec6c43d5796bef5"}, @@ -2709,6 +2880,7 @@ version = "1.36.0" description = "Type annotations for boto3 SecretsManager 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_secretsmanager-1.36.0-py3-none-any.whl", hash = "sha256:d7fd56b08afed32ce26f2663ec57f9ea074e1e5149a4388eccb46653e3cb5a66"}, {file = "mypy_boto3_secretsmanager-1.36.0.tar.gz", hash = "sha256:6e1f91cd5b0c1f0533f8cfa91e4755855d39931475e7d1e23ee8dbb2e7163d18"}, @@ -2723,6 +2895,7 @@ version = "1.36.6" description = "Type annotations for boto3 SSM 1.36.6 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_ssm-1.36.6-py3-none-any.whl", hash = "sha256:7f255428d79a8eb0adfde6f21b1b996275295d993157ffe0a6585bfea711583b"}, {file = "mypy_boto3_ssm-1.36.6.tar.gz", hash = "sha256:edc819b7526ab35b105648603839d158b00146af5743fc7784db3227073e1973"}, @@ -2737,6 +2910,7 @@ version = "1.36.0" description = "Type annotations for boto3 XRay 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_xray-1.36.0-py3-none-any.whl", hash = "sha256:b92a06db10f623db4ec0641227f468b7a57c77f8e599846cfddace4b434f70a5"}, {file = "mypy_boto3_xray-1.36.0.tar.gz", hash = "sha256:5ae2b4c333bf2881870ffb96f1d99cd5e7ee1706d071b6923dcd6de6ceb3ac0c"}, @@ -2751,6 +2925,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2762,6 +2937,7 @@ version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, @@ -2780,6 +2956,7 @@ version = "2024.10.9" description = "Flexible test automation." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "nox-2024.10.9-py3-none-any.whl", hash = "sha256:1d36f309a0a2a853e9bccb76bbef6bb118ba92fa92674d15604ca99adeb29eab"}, {file = "nox-2024.10.9.tar.gz", hash = "sha256:7aa9dc8d1c27e9f45ab046ffd1c3b2c4f7c91755304769df231308849ebded95"}, @@ -2802,6 +2979,8 @@ version = "1.16.0" description = "OpenTelemetry Python API" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "opentelemetry_api-1.16.0-py3-none-any.whl", hash = "sha256:79e8f0cf88dbdd36b6abf175d2092af1efcaa2e71552d0d2b3b181a9707bf4bc"}, {file = "opentelemetry_api-1.16.0.tar.gz", hash = "sha256:4b0e895a3b1f5e1908043ebe492d33e33f9ccdbe6d02d3994c2f8721a63ddddb"}, @@ -2817,6 +2996,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -2828,6 +3008,7 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -2843,6 +3024,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -2854,32 +3036,19 @@ version = "6.1.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" +groups = ["dev"] files = [ {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, ] -[[package]] -name = "pdoc3" -version = "0.11.5" -description = "Auto-generate API documentation for Python projects." -optional = false -python-versions = ">=3.9" -files = [ - {file = "pdoc3-0.11.5-py3-none-any.whl", hash = "sha256:b614436239716e1655e538f68a42c62a0bac566e70ddd86c58bc66d6a9ec90a0"}, - {file = "pdoc3-0.11.5.tar.gz", hash = "sha256:fc40607e3f46860ba42c02d30075fe1a52c039b77ffa8e86c1cbc4a8078841b3"}, -] - -[package.dependencies] -mako = "*" -markdown = ">=3.0" - [[package]] name = "platformdirs" version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -2896,6 +3065,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -2911,6 +3081,8 @@ version = "3.11" description = "Python Lex & Yacc" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, @@ -2922,6 +3094,8 @@ version = "5.29.3" description = "" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, @@ -2942,6 +3116,7 @@ version = "0.0.3" description = "Publication helps you maintain public-api-friendly modules by preventing unintentional access to private implementation details via introspection." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "publication-0.0.3-py2.py3-none-any.whl", hash = "sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6"}, {file = "publication-0.0.3.tar.gz", hash = "sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4"}, @@ -2953,6 +3128,7 @@ version = "9.0.0" description = "Get CPU info with pure Python" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -2964,10 +3140,12 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -2975,10 +3153,12 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] annotated-types = ">=0.6.0" @@ -2995,6 +3175,7 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -3097,6 +3278,7 @@ files = [ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" @@ -3107,6 +3289,8 @@ version = "2.7.1" description = "Settings management using Pydantic" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"all\"" files = [ {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, @@ -3127,6 +3311,7 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -3141,6 +3326,7 @@ version = "10.14.2" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pymdown_extensions-10.14.2-py3-none-any.whl", hash = "sha256:f45bc5892410e54fd738ab8ccd736098b7ff0cb27fdb4bf24d0a0c6584bc90e1"}, {file = "pymdown_extensions-10.14.2.tar.gz", hash = "sha256:7a77b8116dc04193f2c01143760a43387bd9dc4aa05efacb7d838885a7791253"}, @@ -3159,6 +3345,7 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -3173,6 +3360,7 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -3195,6 +3383,7 @@ version = "0.25.3" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3"}, {file = "pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a"}, @@ -3213,6 +3402,7 @@ version = "5.1.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pytest-benchmark-5.1.0.tar.gz", hash = "sha256:9ea661cdc292e8231f7cd4c10b0319e56a2118e2c09d9f50e1b3d150d2aca105"}, {file = "pytest_benchmark-5.1.0-py3-none-any.whl", hash = "sha256:922de2dfa3033c227c96da942d1878191afa135a29485fb942e85dff1c592c89"}, @@ -3233,6 +3423,7 @@ version = "6.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, @@ -3251,6 +3442,7 @@ version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -3268,6 +3460,7 @@ version = "0.7.0" description = "Pytest Plugin to disable socket calls during tests" optional = false python-versions = ">=3.8,<4.0" +groups = ["dev"] files = [ {file = "pytest_socket-0.7.0-py3-none-any.whl", hash = "sha256:7e0f4642177d55d317bbd58fc68c6bd9048d6eadb2d46a89307fa9221336ce45"}, {file = "pytest_socket-0.7.0.tar.gz", hash = "sha256:71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3"}, @@ -3282,6 +3475,7 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -3302,6 +3496,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3316,10 +3511,12 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] +markers = {main = "extra == \"all\""} [package.extras] cli = ["click (>=5.0)"] @@ -3330,6 +3527,8 @@ version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -3357,6 +3556,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -3419,6 +3619,7 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -3433,6 +3634,7 @@ version = "6.0.1" description = "Code Metrics in Python" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "radon-6.0.1-py2.py3-none-any.whl", hash = "sha256:632cc032364a6f8bb1010a2f6a12d0f14bc7e5ede76585ef29dc0cecf4cd8859"}, {file = "radon-6.0.1.tar.gz", hash = "sha256:d1ac0053943a893878940fedc8b19ace70386fc9c9bf0a09229a44125ebf45b5"}, @@ -3451,10 +3653,12 @@ version = "5.2.1" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, ] +markers = {main = "extra == \"redis\""} [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} @@ -3469,6 +3673,7 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -3485,6 +3690,7 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -3588,6 +3794,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -3603,12 +3810,60 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-cache" +version = "1.2.1" +description = "A persistent cache for python requests" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603"}, + {file = "requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1"}, +] + +[package.dependencies] +attrs = ">=21.2" +cattrs = ">=22.2" +platformdirs = ">=2.5" +requests = ">=2.22" +url-normalize = ">=1.4" +urllib3 = ">=1.25.5" + +[package.extras] +all = ["boto3 (>=1.15)", "botocore (>=1.18)", "itsdangerous (>=2.0)", "pymongo (>=3)", "pyyaml (>=6.0.1)", "redis (>=3)", "ujson (>=5.4)"] +bson = ["bson (>=0.5)"] +docs = ["furo (>=2023.3,<2024.0)", "linkify-it-py (>=2.0,<3.0)", "myst-parser (>=1.0,<2.0)", "sphinx (>=5.0.2,<6.0.0)", "sphinx-autodoc-typehints (>=1.19)", "sphinx-automodapi (>=0.14)", "sphinx-copybutton (>=0.5)", "sphinx-design (>=0.2)", "sphinx-notfound-page (>=0.8)", "sphinxcontrib-apidoc (>=0.3)", "sphinxext-opengraph (>=0.9)"] +dynamodb = ["boto3 (>=1.15)", "botocore (>=1.18)"] +json = ["ujson (>=5.4)"] +mongodb = ["pymongo (>=3)"] +redis = ["redis (>=3)"] +security = ["itsdangerous (>=2.0)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "requirements-parser" +version = "0.11.0" +description = "This is a small Python module for parsing Pip requirement files." +optional = false +python-versions = "<4.0,>=3.8" +groups = ["dev"] +files = [ + {file = "requirements_parser-0.11.0-py3-none-any.whl", hash = "sha256:50379eb50311834386c2568263ae5225d7b9d0867fb55cf4ecc93959de2c2684"}, + {file = "requirements_parser-0.11.0.tar.gz", hash = "sha256:35f36dc969d14830bf459803da84f314dc3d17c802592e9e970f63d0359e5920"}, +] + +[package.dependencies] +packaging = ">=23.2" +types-setuptools = ">=69.1.0" + [[package]] name = "retry2" version = "0.9.5" description = "Easy to use retry decorator." optional = false python-versions = ">=2.6" +groups = ["dev"] files = [ {file = "retry2-0.9.5-py2.py3-none-any.whl", hash = "sha256:f7fee13b1e15d0611c462910a6aa72a8919823988dd0412152bc3719c89a4e55"}, ] @@ -3622,6 +3877,7 @@ version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, @@ -3641,6 +3897,7 @@ version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, @@ -3753,6 +4010,7 @@ version = "0.9.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706"}, {file = "ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf"}, @@ -3780,6 +4038,7 @@ version = "0.11.2" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc"}, {file = "s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f"}, @@ -3797,6 +4056,7 @@ version = "0.0.4" description = "Flexible recursive directory iterator: scandir meets glob(\"**\", recursive=True)" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "scantree-0.0.4-py3-none-any.whl", hash = "sha256:7616ab65aa6b7f16fcf8e6fa1d9afaa99a27ab72bba05c61b691853b96763174"}, {file = "scantree-0.0.4.tar.gz", hash = "sha256:15bd5cb24483b04db2c70653604e8ea3522e98087db7e38ab8482f053984c0ac"}, @@ -3812,6 +4072,7 @@ version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, @@ -3867,6 +4128,8 @@ version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, @@ -3887,6 +4150,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -3898,6 +4162,7 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -3909,6 +4174,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -3920,6 +4186,7 @@ version = "5.4.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "stevedore-5.4.0-py3-none-any.whl", hash = "sha256:b0be3c4748b3ea7b854b265dcb4caa891015e442416422be16f8b31756107857"}, {file = "stevedore-5.4.0.tar.gz", hash = "sha256:79e92235ecb828fe952b6b8b0c6c87863248631922c8e8e0fa5b17b232c4514d"}, @@ -3934,6 +4201,7 @@ version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, @@ -3951,6 +4219,7 @@ version = "4.9.1" description = "Python library for throwaway instances of anything that can run in a Docker container" optional = false python-versions = "<4.0,>=3.9" +groups = ["dev"] files = [ {file = "testcontainers-4.9.1-py3-none-any.whl", hash = "sha256:315fb94b42a383872df530aa45319745278ef0cc18b9cfcdc231a75d14afa5a0"}, {file = "testcontainers-4.9.1.tar.gz", hash = "sha256:37fe9a222549ddb788463935965b16f91809e9a8d654f437d6a59eac9b77f76f"}, @@ -4005,6 +4274,7 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -4046,6 +4316,7 @@ version = "2.13.3" description = "Run-time type checker for Python" optional = false python-versions = ">=3.5.3" +groups = ["dev"] files = [ {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, @@ -4061,6 +4332,7 @@ version = "0.23.8" description = "Type annotations and code completion for awscrt" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_awscrt-0.23.8-py3-none-any.whl", hash = "sha256:d66b3817565769f5311b7e171a3c48d3dbf8a8f9c22f02686c2f003b6559a2a5"}, {file = "types_awscrt-0.23.8.tar.gz", hash = "sha256:2141391a8f4d36cf098406c19d9060b34f13a558c22d4aadac250a0c57d12710"}, @@ -4072,6 +4344,7 @@ version = "1.16.0.20241221" description = "Typing stubs for cffi" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_cffi-1.16.0.20241221-py3-none-any.whl", hash = "sha256:e5b76b4211d7a9185f6ab8d06a106d56c7eb80af7cdb8bfcb4186ade10fb112f"}, {file = "types_cffi-1.16.0.20241221.tar.gz", hash = "sha256:1c96649618f4b6145f58231acb976e0b448be6b847f7ab733dabe62dfbff6591"}, @@ -4086,6 +4359,7 @@ version = "24.1.0.20240722" description = "Typing stubs for pyOpenSSL" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39"}, {file = "types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54"}, @@ -4101,6 +4375,7 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -4112,6 +4387,7 @@ version = "4.6.0.20241004" description = "Typing stubs for redis" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types-redis-4.6.0.20241004.tar.gz", hash = "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e"}, {file = "types_redis-4.6.0.20241004-py3-none-any.whl", hash = "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed"}, @@ -4127,6 +4403,7 @@ version = "2.31.0.6" description = "Typing stubs for requests" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, @@ -4141,6 +4418,7 @@ version = "0.11.2" description = "Type annotations and code completion for s3transfer" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:09c31cff8c79a433fcf703b840b66d1f694a6c70c410ef52015dd4fe07ee0ae2"}, {file = "types_s3transfer-0.11.2.tar.gz", hash = "sha256:3ccb8b90b14434af2fb0d6c08500596d93f3a83fb804a2bb843d9bf4f7c2ca60"}, @@ -4152,6 +4430,7 @@ version = "75.8.0.20250110" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480"}, {file = "types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271"}, @@ -4163,6 +4442,7 @@ version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -4174,6 +4454,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -4185,6 +4466,8 @@ version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -4266,12 +4549,28 @@ files = [ {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, ] +[[package]] +name = "url-normalize" +version = "1.4.3" +description = "URL normalization for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +groups = ["dev"] +files = [ + {file = "url-normalize-1.4.3.tar.gz", hash = "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2"}, + {file = "url_normalize-1.4.3-py2.py3-none-any.whl", hash = "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"}, +] + +[package.dependencies] +six = "*" + [[package]] name = "urllib3" version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -4282,12 +4581,41 @@ brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotl secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "uv" +version = "0.5.27" +description = "An extremely fast Python package and project manager, written in Rust." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "uv-0.5.27-py3-none-linux_armv6l.whl", hash = "sha256:57ba7b4e9f5cc25c0a003f18b9a37a881a60e161cd081cfe3f540dd4c4dfa270"}, + {file = "uv-0.5.27-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5f6042fb5d29b09408a0f17016cce1b9ddc6298fbf712b15b01862078e1a4fc5"}, + {file = "uv-0.5.27-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5e8ce099c129e48c88c1bfa92f3b439c0dbd314e6ea29609ebe9f281c051e8ac"}, + {file = "uv-0.5.27-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:5ca212d3c8141e3f25b1aaed124f34c782af93d94ca03638f295fde6bb15f8a6"}, + {file = "uv-0.5.27-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7bd021410bcaf64c197916c33d2bbca08b8ff3ced7e17936fa037dc96146dcca"}, + {file = "uv-0.5.27-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fef326056b5551f0ef9d2c0ddacfe69940bdc01b30d39a78fac13fe24c23bfe9"}, + {file = "uv-0.5.27-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:dc40d3912edde1a504dba31f034e88bc178c5ba8771c13aab8ca7781711be6bf"}, + {file = "uv-0.5.27-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebfa9bbcf82db56cd65aca91b08839c247806a7c2cb6c7ddf8c762ece083e7bd"}, + {file = "uv-0.5.27-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:751e64d543a965a44a02aa1de9d83c861a2721cc57ee7f6aa7f1c6c6018b3511"}, + {file = "uv-0.5.27-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f78e0753dd24b0f1adb5cc99a733848ef59d070a3e2dba88810e7bf78512971b"}, + {file = "uv-0.5.27-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:e7eab779aa2cbdfb768c420d51f4275d60f9d68d54ee41e2db34966a16d1318b"}, + {file = "uv-0.5.27-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:4d9159eb1c1b4f762cba924ea879470752f17de48dc07516d22dea9887db6fd7"}, + {file = "uv-0.5.27-py3-none-musllinux_1_1_i686.whl", hash = "sha256:c31e440fc479da7385158393ab5f25a00dbb8c993f83deaaf3d4d3db3a706694"}, + {file = "uv-0.5.27-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:fb9e7f9ab760aa21dfaac5ff876f43683a7eab1619c8fe063438abf4dd3bddef"}, + {file = "uv-0.5.27-py3-none-win32.whl", hash = "sha256:9dfb3adaee9bd9574c7743ff9a3a108cb8f95ffef4fe85f177e435a996aa6428"}, + {file = "uv-0.5.27-py3-none-win_amd64.whl", hash = "sha256:3046562b314513c69f93f33f5d933d470413355257a5c67c8ea34022fa53fd3b"}, + {file = "uv-0.5.27-py3-none-win_arm64.whl", hash = "sha256:e0d265294b565f7b136d4dc65a7cb90aa98e0a9ff824edf33644537a231a45ab"}, + {file = "uv-0.5.27.tar.gz", hash = "sha256:5d8174d71c2d884181a79c96b35a0ef1e4b4a57356c53d781399da015f393b24"}, +] + [[package]] name = "verspec" version = "0.1.0" description = "Flexible version handling" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, @@ -4302,6 +4630,7 @@ version = "20.29.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"}, {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"}, @@ -4322,6 +4651,7 @@ version = "6.0.0" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, @@ -4358,12 +4688,29 @@ files = [ [package.extras] watchmedo = ["PyYAML (>=3.10)"] +[[package]] +name = "win32-setctime" +version = "1.2.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +groups = ["dev"] +markers = "sys_platform == \"win32\"" +files = [ + {file = "win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390"}, + {file = "win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + [[package]] name = "wrapt" version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -4445,6 +4792,7 @@ files = [ {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] +markers = {main = "extra == \"tracer\" or extra == \"all\" or extra == \"datadog\" or extra == \"datamasking\""} [[package]] name = "xenon" @@ -4452,6 +4800,7 @@ version = "0.9.3" description = "Monitor code metrics for Python on your CI server" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "xenon-0.9.3-py2.py3-none-any.whl", hash = "sha256:6e2c2c251cc5e9d01fe984e623499b13b2140fcbf74d6c03a613fa43a9347097"}, {file = "xenon-0.9.3.tar.gz", hash = "sha256:4a7538d8ba08aa5d79055fb3e0b2393c0bd6d7d16a4ab0fcdef02ef1f10a43fa"}, @@ -4468,6 +4817,8 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -4479,6 +4830,7 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, @@ -4503,6 +4855,6 @@ tracer = ["aws-xray-sdk"] validation = ["fastjsonschema"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.9,<4.0.0" -content-hash = "7b0e350232a85de1bf6b1b1fd36bc97f9a458b1c0ad8ce378a809dec426e3ecd" +content-hash = "d27dd170872d83815a1458cafe08ce028b6629c5274f344913ab4330d8e399ad" diff --git a/pyproject.toml b/pyproject.toml index 9752d278e4b..8e66d76ee59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -82,7 +82,6 @@ boto3 = "^1.26.164" isort = ">=5.13.2,<7.0.0" pytest-cov = ">=5,<7" pytest-mock = "^3.14.0" -pdoc3 = "^0.11.0" pytest-asyncio = ">=0.24,<0.26" bandit = "^1.7.10" radon = "^6.0.1" @@ -123,6 +122,7 @@ multiprocess = "^0.70.16" boto3-stubs = {extras = ["appconfig", "appconfigdata", "cloudformation", "cloudwatch", "dynamodb", "lambda", "logs", "s3", "secretsmanager", "ssm", "xray"], version = "^1.34.139"} nox = "^2024.4.15" mkdocstrings-python = "^1.13.0" +licensecheck = "^2024.3" [tool.coverage.run] source = ["aws_lambda_powertools"] From 61271a1fc4257ef428e3d738c707db306ab58738 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2025 22:04:34 +0000 Subject: [PATCH 084/139] chore(deps-dev): bump mkdocstrings-python from 1.14.2 to 1.14.4 (#6025) Bumps [mkdocstrings-python](https://github.com/mkdocstrings/python) from 1.14.2 to 1.14.4. - [Release notes](https://github.com/mkdocstrings/python/releases) - [Changelog](https://github.com/mkdocstrings/python/blob/main/CHANGELOG.md) - [Commits](https://github.com/mkdocstrings/python/compare/1.14.2...1.14.4) --- updated-dependencies: - dependency-name: mkdocstrings-python dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 232 ++-------------------------------------------------- 1 file changed, 7 insertions(+), 225 deletions(-) diff --git a/poetry.lock b/poetry.lock index 05575f3d15d..8b511988aa7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,12 +6,10 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [[package]] name = "anyio" @@ -19,7 +17,6 @@ version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, @@ -42,7 +39,6 @@ version = "1.4.4" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, @@ -54,7 +50,6 @@ version = "3.5.3" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "argcomplete-3.5.3-py3-none-any.whl", hash = "sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61"}, {file = "argcomplete-3.5.3.tar.gz", hash = "sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392"}, @@ -69,12 +64,10 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] -markers = {main = "extra == \"redis\" and python_full_version < \"3.11.3\"", dev = "python_full_version < \"3.11.3\""} [[package]] name = "attrs" @@ -82,12 +75,10 @@ version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] -markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] @@ -103,7 +94,6 @@ version = "2.2.221" description = "A library that contains the AWS CLI for use in Lambda Layers" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_awscli_v1-2.2.221-py3-none-any.whl", hash = "sha256:66a83e4116b6a7a0041f99f7bca7d0ea354c9ab2e17a938a3dcec50f7272f5d9"}, {file = "aws_cdk_asset_awscli_v1-2.2.221.tar.gz", hash = "sha256:7ea0366c8090dc396fed85baddbcf48ac4a088c1bf606cd776138e6526679108"}, @@ -120,7 +110,6 @@ version = "2.1.3" description = "A Lambda Layer that contains kubectl v1.20" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_kubectl_v20-2.1.3-py3-none-any.whl", hash = "sha256:d5612e5bd03c215a28ce53193b1144ecf4e93b3b6779563c046a8a74d83a3979"}, {file = "aws_cdk_asset_kubectl_v20-2.1.3.tar.gz", hash = "sha256:237cd8530d9e8be0bbc7159af927dbb6b7f91bf3f4099c8ef4d9a213b34264be"}, @@ -137,7 +126,6 @@ version = "2.1.0" description = "@aws-cdk/asset-node-proxy-agent-v6" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_node_proxy_agent_v6-2.1.0-py3-none-any.whl", hash = "sha256:24a388b69a44d03bae6dbf864c4e25ba650d4b61c008b4568b94ffbb9a69e40e"}, {file = "aws_cdk_asset_node_proxy_agent_v6-2.1.0.tar.gz", hash = "sha256:1f292c0631f86708ba4ee328b3a2b229f7e46ea1c79fbde567ee9eb119c2b0e2"}, @@ -154,7 +142,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-alpha-2.114.1a0.tar.gz", hash = "sha256:9e8c3131f4fa3e0926eb3d76aeacd578a6aa51f95b39c10a86112c991bb75864"}, {file = "aws_cdk.aws_apigatewayv2_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:a101ce56d846976ad1c8020054dfe73fd9f45afdbe71f2a297acc84c1a201403"}, @@ -173,7 +160,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-authorizers" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-authorizers-alpha-2.114.1a0.tar.gz", hash = "sha256:ee290e2ed0f1506dbbb12b3b8963f50b379121759077002c265977fbaf18fd9f"}, {file = "aws_cdk.aws_apigatewayv2_authorizers_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:2576e1ce06dab314020bff50f5d59b8715a7adf18106eac811028c22f61c9baa"}, @@ -193,7 +179,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-integrations" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-integrations-alpha-2.114.1a0.tar.gz", hash = "sha256:19e1824b577683e7d3c2b01fd58c176ebe4c7b8d1b4af4cfdc3893d3ffbac9af"}, {file = "aws_cdk.aws_apigatewayv2_integrations_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:1e440a70e6b4cbe077c95ffdd3fd0cfb3962f90762ea2e973eaa2ab7719ccb2c"}, @@ -213,7 +198,6 @@ version = "2.59.0a0" description = "The CDK Construct Library for AWS::AppSync" optional = false python-versions = "~=3.7" -groups = ["dev"] files = [ {file = "aws-cdk.aws-appsync-alpha-2.59.0a0.tar.gz", hash = "sha256:f5c7773b70b759efd576561dc3d71af5762a6f7cbc9ee9eef5e538c7ab3dccc7"}, {file = "aws_cdk.aws_appsync_alpha-2.59.0a0-py3-none-any.whl", hash = "sha256:ecc235f1f70d404c8d03cf250be0227becd14c468f8c43b6d9df334a1d60c8e2"}, @@ -232,7 +216,6 @@ version = "2.177.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.aws_lambda_python_alpha-2.177.0a0-py3-none-any.whl", hash = "sha256:5aacc26970e30909b372fd2e8b98ce7197b8074d78ec4f1d900a8ddd02bc5114"}, {file = "aws_cdk_aws_lambda_python_alpha-2.177.0a0.tar.gz", hash = "sha256:0137957603cd91b473de3a455bf4d95de4ba60c1ba9f25f62d3edeb965202c4e"}, @@ -251,7 +234,6 @@ version = "39.2.9" description = "Cloud Assembly Schema" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.cloud_assembly_schema-39.2.9-py3-none-any.whl", hash = "sha256:3d16bbe45a463e5327b3d618e1501a2f4ecc6a8764dea71b045e431976135bc8"}, {file = "aws_cdk_cloud_assembly_schema-39.2.9.tar.gz", hash = "sha256:ed82fc47eee25888fedeb3f668d61e7fb22b0afa393d5ae5cc9e44e75113b85b"}, @@ -268,7 +250,6 @@ version = "2.177.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk_lib-2.177.0-py3-none-any.whl", hash = "sha256:acdf06aaf52367a64b4bf88381e8272cb7b5961c242020ace822c79749e53cac"}, {file = "aws_cdk_lib-2.177.0.tar.gz", hash = "sha256:5e51c48da31555beb38243bb2882e98ee9fe1796466ba9f8d3088701b47965e5"}, @@ -290,8 +271,6 @@ version = "4.0.0" description = "AWS Encryption SDK implementation for Python" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "aws-encryption-sdk-4.0.0.tar.gz", hash = "sha256:57df8b5c1b9f18db4373c6e8e65563791063a71be93d0849950ed365272db354"}, {file = "aws_encryption_sdk-4.0.0-py2.py3-none-any.whl", hash = "sha256:a94483785dff2cd166ccb8f3a15cdfe5cba7a3717f6604543c816a3a32f7c412"}, @@ -312,7 +291,6 @@ version = "0.4.3" description = "AWS signature version 4 signing process for the python requests module" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "aws-requests-auth-0.4.3.tar.gz", hash = "sha256:33593372018b960a31dbbe236f89421678b885c35f0b6a7abfae35bb77e069b2"}, {file = "aws_requests_auth-0.4.3-py2.py3-none-any.whl", hash = "sha256:646bc37d62140ea1c709d20148f5d43197e6bd2d63909eb36fa4bb2345759977"}, @@ -327,7 +305,6 @@ version = "1.94.0" description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates" optional = false python-versions = "!=4.0,<=4.0,>=3.8" -groups = ["dev"] files = [ {file = "aws_sam_translator-1.94.0-py3-none-any.whl", hash = "sha256:100e33eeffcfa81f7c45cadeb0ee29596ce829f6b4d2745140f04fa19a41f539"}, {file = "aws_sam_translator-1.94.0.tar.gz", hash = "sha256:8ec258d9f7ece72ef91c81f4edb45a2db064c16844b6afac90c575893beaa391"}, @@ -348,8 +325,6 @@ version = "2.14.0" description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers to record and emit information from within their applications to the AWS X-Ray service." optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"tracer\" or extra == \"all\"" files = [ {file = "aws_xray_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:cfbe6feea3d26613a2a869d14c9246a844285c97087ad8f296f901633554ad94"}, {file = "aws_xray_sdk-2.14.0.tar.gz", hash = "sha256:aab843c331af9ab9ba5cefb3a303832a19db186140894a523edafc024cc0493c"}, @@ -365,7 +340,6 @@ version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, @@ -380,7 +354,6 @@ version = "1.8.2" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "bandit-1.8.2-py3-none-any.whl", hash = "sha256:df6146ad73dd30e8cbda4e29689ddda48364e36ff655dbfc86998401fcf1721f"}, {file = "bandit-1.8.2.tar.gz", hash = "sha256:e00ad5a6bc676c0954669fe13818024d66b70e42cf5adb971480cf3b671e835f"}, @@ -405,7 +378,6 @@ version = "25.1.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, @@ -452,7 +424,6 @@ version = "1.36.10" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "boto3-1.36.10-py3-none-any.whl", hash = "sha256:5f8d5c2024a2d1411d3d67abb7357ec7d4c6162e3f1c396dc9b79d042cfd0a80"}, {file = "boto3-1.36.10.tar.gz", hash = "sha256:d2f1010db699326b26fbd465d91c4b49177c9d995d7e72c0f31335f139efa0d2"}, @@ -472,7 +443,6 @@ version = "1.36.12" description = "Type annotations for boto3 1.36.12 generated with mypy-boto3-builder 8.9.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "boto3_stubs-1.36.12-py3-none-any.whl", hash = "sha256:84ea0b281a37b363358364a87c2764cbe685166fc47bdac6d08c61bbfc13af50"}, {file = "boto3_stubs-1.36.12.tar.gz", hash = "sha256:3637af3b29db13ec2349ef765f4e7fae7f09bb708c3b8bc93dd9a8113e3e4e9c"}, @@ -909,7 +879,6 @@ version = "1.36.10" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "botocore-1.36.10-py3-none-any.whl", hash = "sha256:45c8a6e01dc18d44a13ba688f1d60ad562db8154b08c46b412387ea040a741c2"}, {file = "botocore-1.36.10.tar.gz", hash = "sha256:d27bb73f0ea81395527a6298ac0a7ea5b2958094169f7cf7d48e3f4e4bc21b65"}, @@ -932,7 +901,6 @@ version = "1.36.9" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "botocore_stubs-1.36.9-py3-none-any.whl", hash = "sha256:76fc0651fc4e7d9a83de944d109f4d779a064265c5f243699718e1d06104efd9"}, {file = "botocore_stubs-1.36.9.tar.gz", hash = "sha256:786857fc9f4e11f16b62e0383b8d60a3a03a9ac10fe23d57d1fa726e77626535"}, @@ -950,8 +918,6 @@ version = "0.16.1" description = "Python module to generate and modify bytecode" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"}, {file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"}, @@ -966,7 +932,6 @@ version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -993,7 +958,6 @@ version = "2.35.4" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "cdk_nag-2.35.4-py3-none-any.whl", hash = "sha256:f9d0f6ffbe79aecc082697d57810aa1ed2b62f2dc582c487f37dcbb2812274bf"}, {file = "cdk_nag-2.35.4.tar.gz", hash = "sha256:5389ffd6689576708039edf9cc3a155de46e6950edaff27fb7db4a05bedafb26"}, @@ -1012,7 +976,6 @@ version = "0.1.290" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "cdklabs.generative_ai_cdk_constructs-0.1.290-py3-none-any.whl", hash = "sha256:3297a25ee2acbf6e70ee100a7e712023b076ea688820e53fa352b1c05a769cf0"}, {file = "cdklabs_generative_ai_cdk_constructs-0.1.290.tar.gz", hash = "sha256:693f732e8552d28100b5da918a17cb19fd19b25b81040faf11688a24afbe42c0"}, @@ -1032,7 +995,6 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -1044,7 +1006,6 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -1114,7 +1075,6 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] -markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = "*" @@ -1125,7 +1085,6 @@ version = "1.23.1" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "cfn_lint-1.23.1-py3-none-any.whl", hash = "sha256:6f89f557dea6484cd5bc1b32cef91e9898dd1d98f12d5b59a7f6baf9cf61b7ee"}, {file = "cfn_lint-1.23.1.tar.gz", hash = "sha256:2ee8722673414a3993921d87cc1893934d313b9b953da7a91442f81958d86644"}, @@ -1152,7 +1111,6 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -1254,7 +1212,6 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -1269,7 +1226,6 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1281,7 +1237,6 @@ version = "6.9.0" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, @@ -1299,7 +1254,6 @@ version = "10.4.2" description = "A programming model for software-defined state" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "constructs-10.4.2-py3-none-any.whl", hash = "sha256:1f0f59b004edebfde0f826340698b8c34611f57848139b7954904c61645f13c1"}, {file = "constructs-10.4.2.tar.gz", hash = "sha256:ce54724360fffe10bab27d8a081844eb81f5ace7d7c62c84b719c49f164d5307"}, @@ -1316,7 +1270,6 @@ version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, @@ -1394,7 +1347,6 @@ version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1424,7 +1376,6 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] -markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1445,8 +1396,6 @@ version = "0.51.0" description = "The Datadog Python library" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "datadog-0.51.0-py2.py3-none-any.whl", hash = "sha256:a9764f091c96af4e0996d4400b168fc5fba380f911d6d672c9dcd4773e29ea3f"}, {file = "datadog-0.51.0.tar.gz", hash = "sha256:3279534f831ae0b4ae2d8ce42ef038b4ab38e667d7ed6ff7437982d7a0cf5250"}, @@ -1461,8 +1410,6 @@ version = "6.105.0" description = "The Datadog AWS Lambda Library" optional = true python-versions = "<4,>=3.8.0" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "datadog_lambda-6.105.0-py3-none-any.whl", hash = "sha256:447d13b6f4971da8aa1227e554a1c2f8985b62aaacbb182bc093a7e048cd1fc4"}, {file = "datadog_lambda-6.105.0.tar.gz", hash = "sha256:59d7900b2136e14441dc29de4ff778301d2c8175cc26caf3819c648293357fbb"}, @@ -1483,8 +1430,6 @@ version = "2.20.0" description = "Datadog APM client library" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e1dee099099b95acf7d0e552179925cfec58a52315cc914d153506367b195bc4"}, {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9d209bef14caafcd53be8c14e04741d86c08f76496c1bf755e2eaa38605ce3e0"}, @@ -1581,7 +1526,6 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" -groups = ["dev"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -1593,8 +1537,6 @@ version = "1.2.18" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, @@ -1612,7 +1554,6 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -1628,7 +1569,6 @@ version = "0.5.0" description = "Python module and CLI for hashing of file system directories." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "dirhash-0.5.0-py3-none-any.whl", hash = "sha256:523dfd6b058c64f45b31604376926c6e2bd2ea301d0df23095d4055674e38b09"}, {file = "dirhash-0.5.0.tar.gz", hash = "sha256:e60760f0ab2e935d8cb088923ea2c6492398dca42cec785df778985fd4cd5386"}, @@ -1643,7 +1583,6 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -1655,7 +1594,6 @@ version = "7.1.0" description = "A Python library for the Docker Engine API." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, @@ -1678,8 +1616,6 @@ version = "0.6.1" description = "Python application configuration via the environment" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"}, {file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"}, @@ -1694,8 +1630,6 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version < \"3.11.0\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1710,7 +1644,6 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1725,8 +1658,6 @@ version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"validation\" or extra == \"all\"" files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, @@ -1741,7 +1672,6 @@ version = "2024.1" description = "Provides a config language independent way to read a config file." optional = false python-versions = ">=3.8,<4.0" -groups = ["dev"] files = [ {file = "fhconfparser-2024.1-py3-none-any.whl", hash = "sha256:f6048cb646e69a3422a581bc0102150c2b79fe7ff26b82233e5ef52f72820e3e"}, {file = "fhconfparser-2024.1.tar.gz", hash = "sha256:de8af019f0071e614d523985e1d93e0fce20a409d1c64dead03b1b665d4b2e4d"}, @@ -1757,7 +1687,6 @@ version = "3.17.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, @@ -1774,7 +1703,6 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -1792,7 +1720,6 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1807,7 +1734,6 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1826,7 +1752,6 @@ version = "1.5.6" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "griffe-1.5.6-py3-none-any.whl", hash = "sha256:b2a3afe497c6c1f952e54a23095ecc09435016293e77af8478ed65df1022a394"}, {file = "griffe-1.5.6.tar.gz", hash = "sha256:181f6666d5aceb6cd6e2da5a2b646cfb431e47a0da1fda283845734b67e10944"}, @@ -1841,7 +1766,6 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1853,7 +1777,6 @@ version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -1875,7 +1798,6 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1900,7 +1822,6 @@ version = "2.3.0" description = "HashiCorp Vault API client" optional = false python-versions = "<4.0,>=3.8" -groups = ["dev"] files = [ {file = "hvac-2.3.0-py3-none-any.whl", hash = "sha256:a3afc5710760b6ee9b3571769df87a0333da45da05a5f9f963e1d3925a84be7d"}, {file = "hvac-2.3.0.tar.gz", hash = "sha256:1b85e3320e8642dd82f234db63253cda169a817589e823713dc5fca83119b1e2"}, @@ -1918,7 +1839,6 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1933,7 +1853,6 @@ version = "3.3.0" description = "Iterative JSON parser with standard Python iterator interfaces" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f7a5250599c366369fbf3bc4e176f5daa28eb6bc7d6130d02462ed335361675"}, {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f87a7e52f79059f9c58f6886c262061065eb6f7554a587be7ed3aa63e6b71b34"}, @@ -2037,7 +1956,6 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -2061,7 +1979,6 @@ version = "6.5.2" description = "Read resources from Python packages" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, @@ -2084,7 +2001,6 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -2096,7 +2012,6 @@ version = "6.0.0" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.9.0" -groups = ["dev"] files = [ {file = "isort-6.0.0-py3-none-any.whl", hash = "sha256:567954102bb47bb12e0fae62606570faacddd441e45683968c8d1734fb1af892"}, {file = "isort-6.0.0.tar.gz", hash = "sha256:75d9d8a1438a9432a7d7b54f2d3b45cad9a4a0fdba43617d9873379704a8bdf1"}, @@ -2112,7 +2027,6 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -2130,7 +2044,6 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -2142,7 +2055,6 @@ version = "1.106.0" description = "Python client for jsii runtime" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "jsii-1.106.0-py3-none-any.whl", hash = "sha256:5a44d7c3a5a326fa3d9befdb3770b380057e0a61e3804e7c4907f70d76afaaa2"}, {file = "jsii-1.106.0.tar.gz", hash = "sha256:c79c47899f53a7c3c4b20f80d3cd306628fe9ed1852eee970324c71eba1d974e"}, @@ -2163,7 +2075,6 @@ version = "1.33" description = "Apply JSON-Patches (RFC 6902)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -groups = ["dev"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -2178,10 +2089,10 @@ version = "1.7.0" description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, + {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, + {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -2193,7 +2104,6 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -2205,7 +2115,6 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -2227,7 +2136,6 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -2242,8 +2150,6 @@ version = "2.6.2" description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"datadog\" and python_version >= \"3.13.0\"" files = [ {file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"}, {file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"}, @@ -2255,7 +2161,6 @@ version = "2024.3" description = "Output the licenses used by dependencies and check if these are compatible with the project license" optional = false python-versions = "<4.0,>=3.8" -groups = ["dev"] files = [ {file = "licensecheck-2024.3-py3-none-any.whl", hash = "sha256:0baef4c1865e0325a35ff25ed12a0c7094035b7dcfbab9a1abfe43d7735adebe"}, {file = "licensecheck-2024.3.tar.gz", hash = "sha256:e838e1c87a7ede553df376ad35a69d7c4b02676df0fba9dd1c6a6866eb0e0ee5"}, @@ -2280,7 +2185,6 @@ version = "0.7.3" description = "Python logging made (stupidly) simple" optional = false python-versions = "<4.0,>=3.5" -groups = ["dev"] files = [ {file = "loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c"}, {file = "loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6"}, @@ -2299,7 +2203,6 @@ version = "0.7.1" description = "Create Python CLI apps with little to no effort at all!" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mando-0.7.1-py2.py3-none-any.whl", hash = "sha256:26ef1d70928b6057ee3ca12583d73c63e05c49de8972d620c278a7b206581a8a"}, {file = "mando-0.7.1.tar.gz", hash = "sha256:18baa999b4b613faefb00eac4efadcf14f510b59b924b66e08289aa1de8c3500"}, @@ -2317,7 +2220,6 @@ version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -2336,7 +2238,6 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -2361,7 +2262,6 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -2432,7 +2332,6 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -2444,7 +2343,6 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -2456,7 +2354,6 @@ version = "2.1.3" description = "Manage multiple versions of your MkDocs-powered documentation" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, @@ -2482,7 +2379,6 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -2514,7 +2410,6 @@ version = "1.3.0" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "mkdocs_autorefs-1.3.0-py3-none-any.whl", hash = "sha256:d180f9778a04e78b7134e31418f238bba56f56d6a8af97873946ff661befffb3"}, {file = "mkdocs_autorefs-1.3.0.tar.gz", hash = "sha256:6867764c099ace9025d6ac24fd07b85a98335fbd30107ef01053697c8f46db61"}, @@ -2531,7 +2426,6 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -2549,7 +2443,6 @@ version = "0.3.2" description = "MkDocs plugin for setting revision date from git per markdown file." optional = false python-versions = ">=3.4" -groups = ["dev"] files = [ {file = "mkdocs_git_revision_date_plugin-0.3.2-py3-none-any.whl", hash = "sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef"}, ] @@ -2565,7 +2458,6 @@ version = "9.6.2" description = "Documentation that simply works" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_material-9.6.2-py3-none-any.whl", hash = "sha256:71d90dbd63b393ad11a4d90151dfe3dcbfcd802c0f29ce80bebd9bbac6abc753"}, {file = "mkdocs_material-9.6.2.tar.gz", hash = "sha256:a3de1c5d4c745f10afa78b1a02f917b9dce0808fb206adc0f5bb48b58c1ca21f"}, @@ -2595,7 +2487,6 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -2607,7 +2498,6 @@ version = "0.28.0" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "mkdocstrings-0.28.0-py3-none-any.whl", hash = "sha256:84cf3dc910614781fe0fee46ce8006fde7df6cc7cca2e3f799895fb8a9170b39"}, {file = "mkdocstrings-0.28.0.tar.gz", hash = "sha256:df20afef1eafe36ba466ae20732509ecb74237653a585f5061937e54b553b4e0"}, @@ -2631,14 +2521,13 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.14.2" +version = "1.14.4" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ - {file = "mkdocstrings_python-1.14.2-py3-none-any.whl", hash = "sha256:0a467fbf3c0c7b4722802140807c1913ca3368beeb6aabab2b4ce4407dc856d9"}, - {file = "mkdocstrings_python-1.14.2.tar.gz", hash = "sha256:3ff9f4d356896b555fa491c6b843c939afc36846f216cca49fd4c48c34bf62ce"}, + {file = "mkdocstrings_python-1.14.4-py3-none-any.whl", hash = "sha256:35d73fdf2079a2a4e2c8e8ff52976463a75d138f97ffadbc7d29108c6de11b35"}, + {file = "mkdocstrings_python-1.14.4.tar.gz", hash = "sha256:12e1b1a3848554484896b602dda1096033adeb2715fef421f47d6a163d6c983d"}, ] [package.dependencies] @@ -2653,7 +2542,6 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2671,7 +2559,6 @@ version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, @@ -2700,7 +2587,6 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -2760,7 +2646,6 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfig 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_appconfig-1.36.0-py3-none-any.whl", hash = "sha256:d627de43761a83991a0ab8cd10698d415f94dcc78a567433c7465fc8d1f5cc16"}, {file = "mypy_boto3_appconfig-1.36.0.tar.gz", hash = "sha256:3f38cbd2d7d359da88dc996eeeafa4c1174847909e31a327dd77263dfdfd5424"}, @@ -2775,7 +2660,6 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfigData 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_appconfigdata-1.36.0-py3-none-any.whl", hash = "sha256:68f02ce06ed9597b02154aff64655fc38c42919eda08fddb130ba17e9f70e9cb"}, {file = "mypy_boto3_appconfigdata-1.36.0.tar.gz", hash = "sha256:3436d149833ea69b4260a0f352aac19258d4676c7a21087625906f7da98624c7"}, @@ -2790,7 +2674,6 @@ version = "1.36.0" description = "Type annotations for boto3 CloudFormation 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_cloudformation-1.36.0-py3-none-any.whl", hash = "sha256:3f6cd81739aaf9634c4aa2b92579081038a76e4f2dec306d02eaaf558b332ce9"}, {file = "mypy_boto3_cloudformation-1.36.0.tar.gz", hash = "sha256:acc2c7ae8920f1167be097f6151685fe5aee99be2f890075edf93e05d298e8b0"}, @@ -2805,7 +2688,6 @@ version = "1.36.0" description = "Type annotations for boto3 CloudWatch 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_cloudwatch-1.36.0-py3-none-any.whl", hash = "sha256:2f6cb81c05a1b4be3510e0857b22913a241488bc08f55b0ad96e8b775c144891"}, {file = "mypy_boto3_cloudwatch-1.36.0.tar.gz", hash = "sha256:a370d61522121ab457c443c338a652d0d3e1c22102d9db9f197fd5dcb7e656a4"}, @@ -2820,7 +2702,6 @@ version = "1.36.0" description = "Type annotations for boto3 DynamoDB 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_dynamodb-1.36.0-py3-none-any.whl", hash = "sha256:b782a817ce8956f8d53ac94c85f969dfe51451fc99f16a3b62776f1e0ed3f1ba"}, {file = "mypy_boto3_dynamodb-1.36.0.tar.gz", hash = "sha256:1687e4689236a5391755126e86ec2596d408eb95408c31ac09a3d1eb289d516d"}, @@ -2835,7 +2716,6 @@ version = "1.36.0" description = "Type annotations for boto3 Lambda 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_lambda-1.36.0-py3-none-any.whl", hash = "sha256:8a6693be1352b51e232cee73f73ce36014d19b4777bdf6969c5e707aba424ca1"}, {file = "mypy_boto3_lambda-1.36.0.tar.gz", hash = "sha256:5e9f23702060529aad216a3ce2a2368391a112df07909fbd3aa80d573d84893c"}, @@ -2850,7 +2730,6 @@ version = "1.36.3" description = "Type annotations for boto3 CloudWatchLogs 1.36.3 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_logs-1.36.3-py3-none-any.whl", hash = "sha256:553cb31261eb4484394af9ac965fa33b0d414e927c47768021a0a6ec89625f64"}, {file = "mypy_boto3_logs-1.36.3.tar.gz", hash = "sha256:76d233632a36665094ac888a685fade150c10665ab4cad1b17265037fcadd098"}, @@ -2865,7 +2744,6 @@ version = "1.36.9" description = "Type annotations for boto3 S3 1.36.9 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_s3-1.36.9-py3-none-any.whl", hash = "sha256:506edd56892452dff5b673e3c79a11b6f8935076ce4a9daaac4cda708a176201"}, {file = "mypy_boto3_s3-1.36.9.tar.gz", hash = "sha256:368c963969eda65bb3a9df61e87510dd8b3247cce59f559c2ec6c43d5796bef5"}, @@ -2880,7 +2758,6 @@ version = "1.36.0" description = "Type annotations for boto3 SecretsManager 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_secretsmanager-1.36.0-py3-none-any.whl", hash = "sha256:d7fd56b08afed32ce26f2663ec57f9ea074e1e5149a4388eccb46653e3cb5a66"}, {file = "mypy_boto3_secretsmanager-1.36.0.tar.gz", hash = "sha256:6e1f91cd5b0c1f0533f8cfa91e4755855d39931475e7d1e23ee8dbb2e7163d18"}, @@ -2895,7 +2772,6 @@ version = "1.36.6" description = "Type annotations for boto3 SSM 1.36.6 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_ssm-1.36.6-py3-none-any.whl", hash = "sha256:7f255428d79a8eb0adfde6f21b1b996275295d993157ffe0a6585bfea711583b"}, {file = "mypy_boto3_ssm-1.36.6.tar.gz", hash = "sha256:edc819b7526ab35b105648603839d158b00146af5743fc7784db3227073e1973"}, @@ -2910,7 +2786,6 @@ version = "1.36.0" description = "Type annotations for boto3 XRay 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_xray-1.36.0-py3-none-any.whl", hash = "sha256:b92a06db10f623db4ec0641227f468b7a57c77f8e599846cfddace4b434f70a5"}, {file = "mypy_boto3_xray-1.36.0.tar.gz", hash = "sha256:5ae2b4c333bf2881870ffb96f1d99cd5e7ee1706d071b6923dcd6de6ceb3ac0c"}, @@ -2925,7 +2800,6 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" -groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2937,7 +2811,6 @@ version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, @@ -2956,7 +2829,6 @@ version = "2024.10.9" description = "Flexible test automation." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "nox-2024.10.9-py3-none-any.whl", hash = "sha256:1d36f309a0a2a853e9bccb76bbef6bb118ba92fa92674d15604ca99adeb29eab"}, {file = "nox-2024.10.9.tar.gz", hash = "sha256:7aa9dc8d1c27e9f45ab046ffd1c3b2c4f7c91755304769df231308849ebded95"}, @@ -2979,8 +2851,6 @@ version = "1.16.0" description = "OpenTelemetry Python API" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "opentelemetry_api-1.16.0-py3-none-any.whl", hash = "sha256:79e8f0cf88dbdd36b6abf175d2092af1efcaa2e71552d0d2b3b181a9707bf4bc"}, {file = "opentelemetry_api-1.16.0.tar.gz", hash = "sha256:4b0e895a3b1f5e1908043ebe492d33e33f9ccdbe6d02d3994c2f8721a63ddddb"}, @@ -2996,7 +2866,6 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -3008,7 +2877,6 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -3024,7 +2892,6 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -3036,7 +2903,6 @@ version = "6.1.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" -groups = ["dev"] files = [ {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, @@ -3048,7 +2914,6 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -3065,7 +2930,6 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -3081,8 +2945,6 @@ version = "3.11" description = "Python Lex & Yacc" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, @@ -3094,8 +2956,6 @@ version = "5.29.3" description = "" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, @@ -3116,7 +2976,6 @@ version = "0.0.3" description = "Publication helps you maintain public-api-friendly modules by preventing unintentional access to private implementation details via introspection." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "publication-0.0.3-py2.py3-none-any.whl", hash = "sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6"}, {file = "publication-0.0.3.tar.gz", hash = "sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4"}, @@ -3128,7 +2987,6 @@ version = "9.0.0" description = "Get CPU info with pure Python" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -3140,12 +2998,10 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -3153,12 +3009,10 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] annotated-types = ">=0.6.0" @@ -3175,7 +3029,6 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -3278,7 +3131,6 @@ files = [ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" @@ -3289,8 +3141,6 @@ version = "2.7.1" description = "Settings management using Pydantic" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"all\"" files = [ {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, @@ -3311,7 +3161,6 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -3326,7 +3175,6 @@ version = "10.14.2" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pymdown_extensions-10.14.2-py3-none-any.whl", hash = "sha256:f45bc5892410e54fd738ab8ccd736098b7ff0cb27fdb4bf24d0a0c6584bc90e1"}, {file = "pymdown_extensions-10.14.2.tar.gz", hash = "sha256:7a77b8116dc04193f2c01143760a43387bd9dc4aa05efacb7d838885a7791253"}, @@ -3345,7 +3193,6 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -3360,7 +3207,6 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -3383,7 +3229,6 @@ version = "0.25.3" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3"}, {file = "pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a"}, @@ -3402,7 +3247,6 @@ version = "5.1.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pytest-benchmark-5.1.0.tar.gz", hash = "sha256:9ea661cdc292e8231f7cd4c10b0319e56a2118e2c09d9f50e1b3d150d2aca105"}, {file = "pytest_benchmark-5.1.0-py3-none-any.whl", hash = "sha256:922de2dfa3033c227c96da942d1878191afa135a29485fb942e85dff1c592c89"}, @@ -3423,7 +3267,6 @@ version = "6.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, @@ -3442,7 +3285,6 @@ version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -3460,7 +3302,6 @@ version = "0.7.0" description = "Pytest Plugin to disable socket calls during tests" optional = false python-versions = ">=3.8,<4.0" -groups = ["dev"] files = [ {file = "pytest_socket-0.7.0-py3-none-any.whl", hash = "sha256:7e0f4642177d55d317bbd58fc68c6bd9048d6eadb2d46a89307fa9221336ce45"}, {file = "pytest_socket-0.7.0.tar.gz", hash = "sha256:71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3"}, @@ -3475,7 +3316,6 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -3496,7 +3336,6 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3511,12 +3350,10 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] -markers = {main = "extra == \"all\""} [package.extras] cli = ["click (>=5.0)"] @@ -3527,8 +3364,6 @@ version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" -groups = ["dev"] -markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -3556,7 +3391,6 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -3619,7 +3453,6 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -3634,7 +3467,6 @@ version = "6.0.1" description = "Code Metrics in Python" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "radon-6.0.1-py2.py3-none-any.whl", hash = "sha256:632cc032364a6f8bb1010a2f6a12d0f14bc7e5ede76585ef29dc0cecf4cd8859"}, {file = "radon-6.0.1.tar.gz", hash = "sha256:d1ac0053943a893878940fedc8b19ace70386fc9c9bf0a09229a44125ebf45b5"}, @@ -3653,12 +3485,10 @@ version = "5.2.1" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, ] -markers = {main = "extra == \"redis\""} [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} @@ -3673,7 +3503,6 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -3690,7 +3519,6 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -3794,7 +3622,6 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -3816,7 +3643,6 @@ version = "1.2.1" description = "A persistent cache for python requests" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603"}, {file = "requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1"}, @@ -3847,7 +3673,6 @@ version = "0.11.0" description = "This is a small Python module for parsing Pip requirement files." optional = false python-versions = "<4.0,>=3.8" -groups = ["dev"] files = [ {file = "requirements_parser-0.11.0-py3-none-any.whl", hash = "sha256:50379eb50311834386c2568263ae5225d7b9d0867fb55cf4ecc93959de2c2684"}, {file = "requirements_parser-0.11.0.tar.gz", hash = "sha256:35f36dc969d14830bf459803da84f314dc3d17c802592e9e970f63d0359e5920"}, @@ -3863,7 +3688,6 @@ version = "0.9.5" description = "Easy to use retry decorator." optional = false python-versions = ">=2.6" -groups = ["dev"] files = [ {file = "retry2-0.9.5-py2.py3-none-any.whl", hash = "sha256:f7fee13b1e15d0611c462910a6aa72a8919823988dd0412152bc3719c89a4e55"}, ] @@ -3877,7 +3701,6 @@ version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, @@ -3897,7 +3720,6 @@ version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, @@ -4010,7 +3832,6 @@ version = "0.9.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706"}, {file = "ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf"}, @@ -4038,7 +3859,6 @@ version = "0.11.2" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc"}, {file = "s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f"}, @@ -4056,7 +3876,6 @@ version = "0.0.4" description = "Flexible recursive directory iterator: scandir meets glob(\"**\", recursive=True)" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "scantree-0.0.4-py3-none-any.whl", hash = "sha256:7616ab65aa6b7f16fcf8e6fa1d9afaa99a27ab72bba05c61b691853b96763174"}, {file = "scantree-0.0.4.tar.gz", hash = "sha256:15bd5cb24483b04db2c70653604e8ea3522e98087db7e38ab8482f053984c0ac"}, @@ -4072,7 +3891,6 @@ version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, @@ -4128,8 +3946,6 @@ version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, @@ -4150,7 +3966,6 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -4162,7 +3977,6 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -4174,7 +3988,6 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -4186,7 +3999,6 @@ version = "5.4.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "stevedore-5.4.0-py3-none-any.whl", hash = "sha256:b0be3c4748b3ea7b854b265dcb4caa891015e442416422be16f8b31756107857"}, {file = "stevedore-5.4.0.tar.gz", hash = "sha256:79e92235ecb828fe952b6b8b0c6c87863248631922c8e8e0fa5b17b232c4514d"}, @@ -4201,7 +4013,6 @@ version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, @@ -4219,7 +4030,6 @@ version = "4.9.1" description = "Python library for throwaway instances of anything that can run in a Docker container" optional = false python-versions = "<4.0,>=3.9" -groups = ["dev"] files = [ {file = "testcontainers-4.9.1-py3-none-any.whl", hash = "sha256:315fb94b42a383872df530aa45319745278ef0cc18b9cfcdc231a75d14afa5a0"}, {file = "testcontainers-4.9.1.tar.gz", hash = "sha256:37fe9a222549ddb788463935965b16f91809e9a8d654f437d6a59eac9b77f76f"}, @@ -4274,7 +4084,6 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -4316,7 +4125,6 @@ version = "2.13.3" description = "Run-time type checker for Python" optional = false python-versions = ">=3.5.3" -groups = ["dev"] files = [ {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, @@ -4332,7 +4140,6 @@ version = "0.23.8" description = "Type annotations and code completion for awscrt" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_awscrt-0.23.8-py3-none-any.whl", hash = "sha256:d66b3817565769f5311b7e171a3c48d3dbf8a8f9c22f02686c2f003b6559a2a5"}, {file = "types_awscrt-0.23.8.tar.gz", hash = "sha256:2141391a8f4d36cf098406c19d9060b34f13a558c22d4aadac250a0c57d12710"}, @@ -4344,7 +4151,6 @@ version = "1.16.0.20241221" description = "Typing stubs for cffi" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_cffi-1.16.0.20241221-py3-none-any.whl", hash = "sha256:e5b76b4211d7a9185f6ab8d06a106d56c7eb80af7cdb8bfcb4186ade10fb112f"}, {file = "types_cffi-1.16.0.20241221.tar.gz", hash = "sha256:1c96649618f4b6145f58231acb976e0b448be6b847f7ab733dabe62dfbff6591"}, @@ -4359,7 +4165,6 @@ version = "24.1.0.20240722" description = "Typing stubs for pyOpenSSL" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39"}, {file = "types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54"}, @@ -4375,7 +4180,6 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -4387,7 +4191,6 @@ version = "4.6.0.20241004" description = "Typing stubs for redis" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types-redis-4.6.0.20241004.tar.gz", hash = "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e"}, {file = "types_redis-4.6.0.20241004-py3-none-any.whl", hash = "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed"}, @@ -4403,7 +4206,6 @@ version = "2.31.0.6" description = "Typing stubs for requests" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, @@ -4418,7 +4220,6 @@ version = "0.11.2" description = "Type annotations and code completion for s3transfer" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:09c31cff8c79a433fcf703b840b66d1f694a6c70c410ef52015dd4fe07ee0ae2"}, {file = "types_s3transfer-0.11.2.tar.gz", hash = "sha256:3ccb8b90b14434af2fb0d6c08500596d93f3a83fb804a2bb843d9bf4f7c2ca60"}, @@ -4430,7 +4231,6 @@ version = "75.8.0.20250110" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480"}, {file = "types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271"}, @@ -4442,7 +4242,6 @@ version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -4454,7 +4253,6 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -4466,8 +4264,6 @@ version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -4555,7 +4351,6 @@ version = "1.4.3" description = "URL normalization for Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -groups = ["dev"] files = [ {file = "url-normalize-1.4.3.tar.gz", hash = "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2"}, {file = "url_normalize-1.4.3-py2.py3-none-any.whl", hash = "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"}, @@ -4570,7 +4365,6 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -4587,7 +4381,6 @@ version = "0.5.27" description = "An extremely fast Python package and project manager, written in Rust." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "uv-0.5.27-py3-none-linux_armv6l.whl", hash = "sha256:57ba7b4e9f5cc25c0a003f18b9a37a881a60e161cd081cfe3f540dd4c4dfa270"}, {file = "uv-0.5.27-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5f6042fb5d29b09408a0f17016cce1b9ddc6298fbf712b15b01862078e1a4fc5"}, @@ -4615,7 +4408,6 @@ version = "0.1.0" description = "Flexible version handling" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, @@ -4630,7 +4422,6 @@ version = "20.29.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"}, {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"}, @@ -4651,7 +4442,6 @@ version = "6.0.0" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, @@ -4694,8 +4484,6 @@ version = "1.2.0" description = "A small Python utility to set file creation time on Windows" optional = false python-versions = ">=3.5" -groups = ["dev"] -markers = "sys_platform == \"win32\"" files = [ {file = "win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390"}, {file = "win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0"}, @@ -4710,7 +4498,6 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -4792,7 +4579,6 @@ files = [ {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] -markers = {main = "extra == \"tracer\" or extra == \"all\" or extra == \"datadog\" or extra == \"datamasking\""} [[package]] name = "xenon" @@ -4800,7 +4586,6 @@ version = "0.9.3" description = "Monitor code metrics for Python on your CI server" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "xenon-0.9.3-py2.py3-none-any.whl", hash = "sha256:6e2c2c251cc5e9d01fe984e623499b13b2140fcbf74d6c03a613fa43a9347097"}, {file = "xenon-0.9.3.tar.gz", hash = "sha256:4a7538d8ba08aa5d79055fb3e0b2393c0bd6d7d16a4ab0fcdef02ef1f10a43fa"}, @@ -4817,8 +4602,6 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -4830,7 +4613,6 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, @@ -4855,6 +4637,6 @@ tracer = ["aws-xray-sdk"] validation = ["fastjsonschema"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = ">=3.9,<4.0.0" content-hash = "d27dd170872d83815a1458cafe08ce028b6629c5274f344913ab4330d8e399ad" From b938745496179fb25da9c83e442d8fcba2f032b5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 09:12:29 +0000 Subject: [PATCH 085/139] chore(ci): new pre-release 3.5.1a5 (#6026) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.5.1a5/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.5.1a5/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index 99f852fa3b4..18d3abe086c 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.1a4" +VERSION = "3.5.1a5" diff --git a/provenance/3.5.1a5/multiple.intoto.jsonl b/provenance/3.5.1a5/multiple.intoto.jsonl new file mode 100644 index 00000000000..d3f09af5c75 --- /dev/null +++ b/provenance/3.5.1a5/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE1LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiODcxNTQ0MDJjNGQ5ZDMyYTljZWZmY2ZlNDA1ZDAxN2U5M2M0ZDc1NGNlY2E1ZjdlYjczZGQ0MzM4NDM4YTFjZCJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE1LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJlMzU4NTU2Y2ZjZDdhOTc0NTE5OTY1MDE4YWE2ODUyOTA0NGM2NGY3YTMyZjFhNTVmYmNjNTA4YTg2MGQ2Nzc0In19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiZjRlNzdmMWFjNTA0NjE4NzU2YTMyNDY0YjUyNDRhMTA4YmQwYzA4MiJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwOCwiZm9ya3NfY291bnQiOjQwOCwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo1OSwib3Blbl9pc3N1ZXNfY291bnQiOjU5LCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDItMDRUMjI6NDM6NDBaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjgxOTc5LCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5ODAsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDItMDRUMjI6MDQ6MzlaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5ODAsIndhdGNoZXJzX2NvdW50IjoyOTgwLCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzE1Mjc2MjI0OCIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTY5IiwiZ2l0aHViX3NoYTEiOiJmNGU3N2YxYWM1MDQ2MTg3NTZhMzI0NjRiNTI0NGExMDhiZDBjMDgyIn19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMTUyNzYyMjQ4LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiJmNGU3N2YxYWM1MDQ2MTg3NTZhMzI0NjRiNTI0NGExMDhiZDBjMDgyIn19XX19","signatures":[{"keyid":"","sig":"MEUCIH4KwjQeCn+3fJ5egn05L90+0OfDPZIRYY796Xd+gcuuAiEA87rSe1H5bafn+6u6WaAounjyurR20CzrZHSeg0Ld2xo=","cert":"-----BEGIN CERTIFICATE-----\nMIIHZDCCBuugAwIBAgIUFzoVNI6JCYXoDh2wH2I512V2Fr8wCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMjA1MDgwNzE0WhcNMjUwMjA1MDgxNzE0WjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEdopnPAltBNLILBka8XFH0mrp7DKzNo95TpKv\n8F6t2vee6tSP3UHILcBB77zs9qHFciNK80tipHfz2NXuPloZxaOCBgowggYGMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUCDEr\naa5iyGHk4FhPUndgAGzmQzwwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChmNGU3\nN2YxYWM1MDQ2MTg3NTZhMzI0NjRiNTI0NGExMDhiZDBjMDgyMBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDChmNGU3N2YxYWM1MDQ2MTg3NTZhMzI0NjRiNTI0NGExMDhiZDBjMDgyMCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoZjRl\nNzdmMWFjNTA0NjE4NzU2YTMyNDY0YjUyNDRhMTA4YmQwYzA4MjAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMxNTI3NjIyNDgvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlNUmJCIAAAQDAEYwRAIgZp+mTTlfZ5YfR0cBZpqz\nokbL+XRZOuPpY55Hri1ZJ2gCIFaE3lZXC12+xRX8QacXfJ2CXekwU6k3sMLXx89B\nsZZtMAoGCCqGSM49BAMDA2cAMGQCMFHYm/nNYeckfp3tkVmwHB75s4Hgufpg6sNz\nYzltv9gkHjxc1LO0RTnFgEC+iQxbFgIwFNwYhVu1SI9rqb/HlHtYQeR/u9jpi02f\nxln4ylYjS4iIxNQtnUwA4+M5gDe0zpDj\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 8e66d76ee59..240e66212c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.1a4" +version = "3.5.1a5" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From 72e0e63d59799858ea37d3b5f75a6389fab84df6 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 5 Feb 2025 09:32:30 +0000 Subject: [PATCH 086/139] chore(ci): add new script to bump Lambda layer version (#6001) * Adding new script to bump layer version * Adding new script to bump layer version * Making changes to work with GNU sed --- .github/workflows/publish_v3_layer.yml | 40 ++++++++++++------------- .github/workflows/release-v3.yml | 5 ++++ layer_v3/scripts/update_layer_arn_v3.sh | 38 +++++++++++++++++++++++ 3 files changed, 62 insertions(+), 21 deletions(-) create mode 100755 layer_v3/scripts/update_layer_arn_v3.sh diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 3efd59557a8..48247253d90 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -33,6 +33,9 @@ on: latest_published_version: description: "Latest PyPi published version to rebuild latest docs for, e.g. 3.0.0, 3.0.0a1 (pre-release)" required: true + layer_documentation_version: + description: "Version to be updated in our documentation. e.g. if the current layer number is 3, this value must be 4." + required: true source_code_artifact_name: description: "Artifact name to restore sealed source code" type: string @@ -52,6 +55,10 @@ on: type: string description: "Latest PyPi published version to rebuild latest docs for, e.g. 3.0.0, 3.0.0a1 (pre-release)" required: true + layer_documentation_version: + type: string + description: "Version to be updated in our documentation. e.g. if the current layer number is 3, this value must be 4." + required: true pre_release: description: "Publishes documentation using a pre-release tag (3.0.0a1)." default: false @@ -257,29 +264,20 @@ jobs: integrity_hash: ${{ inputs.source_code_integrity_hash }} artifact_name: ${{ inputs.source_code_artifact_name }} - # UNCOMMENT THIS - # - name: Download CDK layer artifacts - # uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 - # with: - # path: cdk-layer-stack - # pattern: cdk-layer-stack-* # merge all Layer artifacts created per region earlier (reusable_deploy_v2_layer_stack.yml; step "Save Layer ARN artifact") - # merge-multiple: true - # - name: Replace layer versions in documentation - # run: | - # ls -la cdk-layer-stack/ - # ./layer_v3/scripts/update_layer_arn.sh cdk-layer-stack + - name: Replace layer versions in documentation + run: ./layer_v3/scripts/update_layer_arn_v3.sh ${{ inputs.layer_documentation_version }} # NOTE: It felt unnecessary creating yet another PR to update changelog w/ latest tag # since this is the only step in the release where we update docs from a temp branch - # - name: Update changelog with latest tag - # run: make changelog - # - name: Create PR - # id: create-pr - # uses: ./.github/actions/create-pr - # with: - # files: "docs/index.md examples CHANGELOG.md" - # temp_branch_prefix: "ci-layer-docs" - # pull_request_title: "chore(ci): layer docs update" - # github_token: ${{ secrets.GITHUB_TOKEN }} + - name: Update changelog with latest tag + run: make changelog + - name: Create PR + id: create-pr + uses: ./.github/actions/create-pr + with: + files: "docs/index.md docs/includes/_layer_homepage_arm64.md docs/includes/_layer_homepage_x86.md examples CHANGELOG.md" + temp_branch_prefix: "ci-layer-docs" + pull_request_title: "chore(ci): layer docs update" + github_token: ${{ secrets.GITHUB_TOKEN }} prepare_docs_alias: runs-on: ubuntu-latest diff --git a/.github/workflows/release-v3.yml b/.github/workflows/release-v3.yml index 4431bba9ed5..4cbc2dbaee0 100644 --- a/.github/workflows/release-v3.yml +++ b/.github/workflows/release-v3.yml @@ -39,6 +39,10 @@ on: description: "Version to be released in PyPi, Docs, and Lambda Layer, e.g. v3.0.0, v3.0.0a0 (pre-release)" default: v3.0.0 required: true + layer_documentation_version: + description: "Lambda layer version to be updated in our documentation. e.g. if the current layer number is 3, this value must be 4." + type: string + required: true skip_pypi: description: "Skip publishing to PyPi as it can't publish more than once. Useful for semi-failed releases" default: false @@ -342,6 +346,7 @@ jobs: uses: ./.github/workflows/publish_v3_layer.yml with: latest_published_version: ${{ needs.seal.outputs.RELEASE_VERSION }} + layer_documentation_version: ${{ inputs.layer_documentation_version }} pre_release: ${{ inputs.pre_release }} source_code_artifact_name: ${{ needs.seal.outputs.artifact_name }} source_code_integrity_hash: ${{ needs.seal.outputs.integrity_hash }} diff --git a/layer_v3/scripts/update_layer_arn_v3.sh b/layer_v3/scripts/update_layer_arn_v3.sh new file mode 100755 index 00000000000..42f4a3dd5bf --- /dev/null +++ b/layer_v3/scripts/update_layer_arn_v3.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# This script is run during the publish_v3_layer.yml CI job, +# and it is responsible for replacing the layer ARN in our documentation. +# Our pipeline must generate the same layer number for all commercial regions + gov cloud +# If this doesn't happens, we have an error and we must fix it in the deployment. +# +# see .github/workflows/reusable_deploy_v3_layer_stack.yml + + +# Get the new version number from the first command-line argument +new_version=$1 +if [ -z "$new_version" ]; then + echo "Usage: $0 " + exit 1 +fi + +# Find all files with specified extensions in ./docs and ./examples directories +# -type f: only find files (not directories) +# \( ... \): group conditions +# -o: logical OR +# -print0: use null character as separator (handles filenames with spaces) +find ./docs ./examples -type f \( -name "*.md" -o -name "*.py" -o -name "*.yaml" -o -name "*.txt" -o -name "*.tf" -o -name "*.yml" \) -print0 | while IFS= read -r -d '' file; do + echo "Processing file: $file" + + # Use sed to replace the version number in the Lambda layer ARN + # -i: edit files in-place without creating a backup + # -E: use extended regular expressions + # The regex matches the layer name and replaces only the version number at the end + sed -i -E "s/(AWSLambdaPowertoolsPythonV3-python[0-9]+-((arm64)|(x86_64)):)[0-9]+/\1$new_version/g" "$file" + if [ $? -eq 0 ]; then + echo "Updated $file successfully" + grep "arn:aws:lambda:" "$file" + else + echo "Error processing $file" + fi +done +echo "Layer version update attempt completed." From bbd4dd58c5b9c2431951321d8d9a90a52d4ad030 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 10:05:19 +0000 Subject: [PATCH 087/139] chore(ci): changelog rebuild (#6027) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1b69f3bace..06920936e3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,10 @@ ## Documentation +* **api:** migrating the event handler utility to mkdocstrings ([#6023](https://github.com/aws-powertools/powertools-lambda-python/issues/6023)) +* **api:** migrating the metrics utility to mkdocstrings ([#6022](https://github.com/aws-powertools/powertools-lambda-python/issues/6022)) +* **api:** migrating the logger utility to mkdocstrings ([#6021](https://github.com/aws-powertools/powertools-lambda-python/issues/6021)) +* **api:** migrating the Middleware Factory utility to mkdocstrings ([#6019](https://github.com/aws-powertools/powertools-lambda-python/issues/6019)) * **api:** migrating the tracer utility to mkdocstrings ([#6017](https://github.com/aws-powertools/powertools-lambda-python/issues/6017)) * **api:** migrating the batch utility to mkdocstrings ([#6016](https://github.com/aws-powertools/powertools-lambda-python/issues/6016)) * **api:** migrating the event source data classes utility to mkdocstrings ([#6015](https://github.com/aws-powertools/powertools-lambda-python/issues/6015)) @@ -36,33 +40,37 @@ ## Maintenance -* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) +* **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) +* **ci:** new pre-release 3.5.1a5 ([#6026](https://github.com/aws-powertools/powertools-lambda-python/issues/6026)) * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) +* **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) +* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) * **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) -* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) * **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) -* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) -* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) +* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) +* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) +* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) +* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) * **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) * **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) -* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) -* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) -* **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) -* **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) * **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) -* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) +* **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) +* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) +* **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) * **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) -* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) -* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) +* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) +* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) * **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) +* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) * **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) +* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) * **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) -* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) * **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) * **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) * **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) -* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) +* **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) +* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) From 9bf48a92b4a5c54235ccb484a56e3a8c9f0b8fad Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:37:04 +0000 Subject: [PATCH 088/139] chore(ci): new pre-release 3.5.1a6 (#6033) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.5.1a6/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.5.1a6/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index 18d3abe086c..096007bfeac 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.1a5" +VERSION = "3.5.1a6" diff --git a/provenance/3.5.1a6/multiple.intoto.jsonl b/provenance/3.5.1a6/multiple.intoto.jsonl new file mode 100644 index 00000000000..fc474e1dbf5 --- /dev/null +++ b/provenance/3.5.1a6/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE2LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiMDUwZWE3OWZiMDEyOTlkZDY0NGRjMTlhZDkwODRmNTk0NWE3NmVhNDVmMzAxZTVlY2M0MWE0NGVlMWNmYWFmOCJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE2LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2M2Y1NTU1ZDE1NTczMGExZGJmNThiZGU0ODUwZDNmYTQwOWNkNjkxODllZjA0ZWEyZGJlNDYyMmZiNTFkYzBkIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiM2E0YmQ5OTNmZjMxMjg5NzhkN2EwZDRiYTI3MzAzZTM2M2IwZDYzMSJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwOCwiZm9ya3NfY291bnQiOjQwOCwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo2Miwib3Blbl9pc3N1ZXNfY291bnQiOjYyLCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDItMDVUMjA6NDQ6MTRaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjgxOTkwLCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5ODAsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDItMDVUMTA6MDU6MjRaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5ODAsIndhdGNoZXJzX2NvdW50IjoyOTgwLCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzE3NDMwOTA0MSIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTcwIiwiZ2l0aHViX3NoYTEiOiIzYTRiZDk5M2ZmMzEyODk3OGQ3YTBkNGJhMjczMDNlMzYzYjBkNjMxIn19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMTc0MzA5MDQxLTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiIzYTRiZDk5M2ZmMzEyODk3OGQ3YTBkNGJhMjczMDNlMzYzYjBkNjMxIn19XX19","signatures":[{"keyid":"","sig":"MEUCIHPxyD7Fbff073k7EFJdk1Zkns57QhDflaN70793XaYhAiEA7B6YZtK/Q0XsMdYVHknlZESbAUQZdB1B9pvFfiSK1zI=","cert":"-----BEGIN CERTIFICATE-----\nMIIHZzCCBuygAwIBAgIUIX/kIuxLppks3pOivByIKk2hDXEwCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMjA2MDgwNzIyWhcNMjUwMjA2MDgxNzIyWjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAE5I0xqKopebdG458MrVOiFrImIyqsbqen9B1f\nUQYjxOGpk6cjqtVTk3jG44ehCnJiw+Ed/p1s6MYqSiF0yA1+WKOCBgswggYHMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU39cC\nPvNgMzmQQzGR6uGb/BxKzCEwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCgzYTRi\nZDk5M2ZmMzEyODk3OGQ3YTBkNGJhMjczMDNlMzYzYjBkNjMxMBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDCgzYTRiZDk5M2ZmMzEyODk3OGQ3YTBkNGJhMjczMDNlMzYzYjBkNjMxMCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoM2E0\nYmQ5OTNmZjMxMjg5NzhkN2EwZDRiYTI3MzAzZTM2M2IwZDYzMTAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMxNzQzMDkwNDEvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlNpMn3EAAAQDAEcwRQIgT2T+w+zYCr5M/26jXK8f\ngC5r28a8ZVRhkl3DYcWTZ8UCIQD/qSoSaXzFBoQQqajRGiZmKdiepNN2gtoqNXhL\ndiZ33DAKBggqhkjOPQQDAwNpADBmAjEA1sJgCeUJxNUCKqGjNNBNejObX9FPBO8b\nSgQ2hOjxIS/Jf36d95Fwe5DRXoUMrOBjAjEAjjsRjpC6Ug3oOCgEzWAw/sbS3aMC\nolYU6FmCmb7bLY/ERPgH+DbITJo19olLq8Hc\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 240e66212c7..8ef522cab6a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.1a5" +version = "3.5.1a6" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From 3e679441a61079a51f64b0024511d092ec917ad4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:37:33 +0000 Subject: [PATCH 089/139] chore(deps-dev): bump mkdocstrings-python from 1.14.4 to 1.14.5 (#6032) Bumps [mkdocstrings-python](https://github.com/mkdocstrings/python) from 1.14.4 to 1.14.5. - [Release notes](https://github.com/mkdocstrings/python/releases) - [Changelog](https://github.com/mkdocstrings/python/blob/main/CHANGELOG.md) - [Commits](https://github.com/mkdocstrings/python/compare/1.14.4...1.14.5) --- updated-dependencies: - dependency-name: mkdocstrings-python dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8b511988aa7..0ac41bfbc5a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2521,13 +2521,13 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.14.4" +version = "1.14.5" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" files = [ - {file = "mkdocstrings_python-1.14.4-py3-none-any.whl", hash = "sha256:35d73fdf2079a2a4e2c8e8ff52976463a75d138f97ffadbc7d29108c6de11b35"}, - {file = "mkdocstrings_python-1.14.4.tar.gz", hash = "sha256:12e1b1a3848554484896b602dda1096033adeb2715fef421f47d6a163d6c983d"}, + {file = "mkdocstrings_python-1.14.5-py3-none-any.whl", hash = "sha256:ac394f273ae298aeaa6be4506768f05e61bd7c8119437ea98553354b1185c469"}, + {file = "mkdocstrings_python-1.14.5.tar.gz", hash = "sha256:8582eeac8cce952f395d76ec636fc814757cba7d8458aa75ba0529a3aa10d98c"}, ] [package.dependencies] From b41d8bac46fdb7ab974ebac470f1211b1cb59bc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:37:58 +0000 Subject: [PATCH 090/139] chore(deps-dev): bump cfn-lint from 1.23.1 to 1.24.0 (#6030) Bumps [cfn-lint](https://github.com/aws-cloudformation/cfn-lint) from 1.23.1 to 1.24.0. - [Release notes](https://github.com/aws-cloudformation/cfn-lint/releases) - [Changelog](https://github.com/aws-cloudformation/cfn-lint/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-cloudformation/cfn-lint/compare/v1.23.1...v1.24.0) --- updated-dependencies: - dependency-name: cfn-lint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0ac41bfbc5a..00ef5c38cc5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1081,13 +1081,13 @@ pycparser = "*" [[package]] name = "cfn-lint" -version = "1.23.1" +version = "1.24.0" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" files = [ - {file = "cfn_lint-1.23.1-py3-none-any.whl", hash = "sha256:6f89f557dea6484cd5bc1b32cef91e9898dd1d98f12d5b59a7f6baf9cf61b7ee"}, - {file = "cfn_lint-1.23.1.tar.gz", hash = "sha256:2ee8722673414a3993921d87cc1893934d313b9b953da7a91442f81958d86644"}, + {file = "cfn_lint-1.24.0-py3-none-any.whl", hash = "sha256:b8ca01ba384587aa7c0e09bf71cb4fa6993bd6da56498139f316e238f47d4eb8"}, + {file = "cfn_lint-1.24.0.tar.gz", hash = "sha256:8b081808aa3a2f60abf9ef4ce05b1f270adab5b81124376f2f8e95c2fd767fb6"}, ] [package.dependencies] @@ -4639,4 +4639,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "d27dd170872d83815a1458cafe08ce028b6629c5274f344913ab4330d8e399ad" +content-hash = "f0e15a774ebec0f7753ba718c3201d1ad01420b18f18278d3eca2b7dcd9082ef" diff --git a/pyproject.toml b/pyproject.toml index 8ef522cab6a..f9421df2fc4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -107,7 +107,7 @@ hvac = "^2.3.0" aws-requests-auth = "^0.4.3" urllib3 = "<2" requests = ">=2.32.0" -cfn-lint = "1.23.1" +cfn-lint = "1.24.0" mypy = "^1.1.1" types-python-dateutil = "^2.8.19.6" aws-cdk-aws-appsync-alpha = "^2.59.0a0" From 1e1c23fd15422ed5c8d2593feb5e62ceed4190bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:39:43 +0000 Subject: [PATCH 091/139] chore(deps-dev): bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 (#6031) chore(deps-dev): bump cdklabs-generative-ai-cdk-constructs Bumps [cdklabs-generative-ai-cdk-constructs](https://github.com/awslabs/generative-ai-cdk-constructs) from 0.1.290 to 0.1.291. - [Release notes](https://github.com/awslabs/generative-ai-cdk-constructs/releases) - [Changelog](https://github.com/awslabs/generative-ai-cdk-constructs/blob/main/CHANGELOG.md) - [Commits](https://github.com/awslabs/generative-ai-cdk-constructs/compare/v0.1.290...v0.1.291) --- updated-dependencies: - dependency-name: cdklabs-generative-ai-cdk-constructs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index 00ef5c38cc5..06127231f7f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -954,13 +954,13 @@ ujson = ["ujson (>=5.7.0)"] [[package]] name = "cdk-nag" -version = "2.35.4" +version = "2.35.11" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" files = [ - {file = "cdk_nag-2.35.4-py3-none-any.whl", hash = "sha256:f9d0f6ffbe79aecc082697d57810aa1ed2b62f2dc582c487f37dcbb2812274bf"}, - {file = "cdk_nag-2.35.4.tar.gz", hash = "sha256:5389ffd6689576708039edf9cc3a155de46e6950edaff27fb7db4a05bedafb26"}, + {file = "cdk_nag-2.35.11-py3-none-any.whl", hash = "sha256:9d3320035da387d8edf043fab6d671c958d38be42580821a2fb569091036c718"}, + {file = "cdk_nag-2.35.11.tar.gz", hash = "sha256:7f9241bfb32f17b1079a3ecd3d0a0fbd773b4317ddc85952cb7fbfbc2d724fe8"}, ] [package.dependencies] @@ -972,18 +972,18 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "cdklabs-generative-ai-cdk-constructs" -version = "0.1.290" +version = "0.1.291" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" files = [ - {file = "cdklabs.generative_ai_cdk_constructs-0.1.290-py3-none-any.whl", hash = "sha256:3297a25ee2acbf6e70ee100a7e712023b076ea688820e53fa352b1c05a769cf0"}, - {file = "cdklabs_generative_ai_cdk_constructs-0.1.290.tar.gz", hash = "sha256:693f732e8552d28100b5da918a17cb19fd19b25b81040faf11688a24afbe42c0"}, + {file = "cdklabs.generative_ai_cdk_constructs-0.1.291-py3-none-any.whl", hash = "sha256:913ce67b37d256d28630fbaae4b662b07f63755b9891d77492511f3659872373"}, + {file = "cdklabs_generative_ai_cdk_constructs-0.1.291.tar.gz", hash = "sha256:f9a2fdb399b106460016d06113891d6e85dd649bdf10936473262789373d8c1e"}, ] [package.dependencies] -aws-cdk-lib = ">=2.176.0,<3.0.0" -cdk-nag = ">=2.35.0,<3.0.0" +aws-cdk-lib = ">=2.177.0,<3.0.0" +cdk-nag = ">=2.35.9,<3.0.0" constructs = ">=10.3.0,<11.0.0" jsii = ">=1.106.0,<2.0.0" publication = ">=0.0.3" From 9931c821da13f15ffa7e8ed980d98b980e81e30b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:40:10 +0000 Subject: [PATCH 092/139] chore(deps-dev): bump boto3-stubs from 1.36.12 to 1.36.14 (#6029) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.12 to 1.36.14. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 06127231f7f..8322346b783 100644 --- a/poetry.lock +++ b/poetry.lock @@ -439,13 +439,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.12" -description = "Type annotations for boto3 1.36.12 generated with mypy-boto3-builder 8.9.0" +version = "1.36.14" +description = "Type annotations for boto3 1.36.14 generated with mypy-boto3-builder 8.9.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.12-py3-none-any.whl", hash = "sha256:84ea0b281a37b363358364a87c2764cbe685166fc47bdac6d08c61bbfc13af50"}, - {file = "boto3_stubs-1.36.12.tar.gz", hash = "sha256:3637af3b29db13ec2349ef765f4e7fae7f09bb708c3b8bc93dd9a8113e3e4e9c"}, + {file = "boto3_stubs-1.36.14-py3-none-any.whl", hash = "sha256:dcde60b21a4026719b82b7f4679ecd9af9372b3d0c9a7f45f1cf2c496bcf19b4"}, + {file = "boto3_stubs-1.36.14.tar.gz", hash = "sha256:9eccdee8091b095a8ce5119b825dccba73555d88a813636b95c3ea2e57186e4f"}, ] [package.dependencies] @@ -512,7 +512,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.12)"] +boto3 = ["boto3 (==1.36.14)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From 09452342a0ba9de3461107dd4d1dfd8422daffa8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:40:35 +0000 Subject: [PATCH 093/139] chore(deps-dev): bump mypy from 1.14.1 to 1.15.0 (#6028) Bumps [mypy](https://github.com/python/mypy) from 1.14.1 to 1.15.0. - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v1.14.1...v1.15.0) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 74 ++++++++++++++++++++++++----------------------------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8322346b783..bfe34390324 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2583,49 +2583,43 @@ dill = ">=0.3.9" [[package]] name = "mypy" -version = "1.14.1" +version = "1.15.0" description = "Optional static typing for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, - {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, - {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, - {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, - {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, - {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, - {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, - {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, - {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, - {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, - {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, - {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, - {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, - {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, - {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, - {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, - {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, - {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, - {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, - {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, - {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, - {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, - {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, - {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, - {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, - {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, - {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, - {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, - {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, - {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, - {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, - {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, - {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, - {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, - {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, - {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, - {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, - {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, + {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"}, + {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"}, + {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"}, + {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"}, + {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"}, + {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"}, + {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"}, + {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"}, + {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"}, + {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"}, + {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"}, + {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"}, + {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"}, + {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"}, + {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"}, + {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"}, + {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"}, + {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"}, + {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"}, + {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"}, + {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"}, + {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"}, + {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"}, + {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"}, + {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"}, + {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"}, + {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"}, + {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"}, + {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"}, + {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"}, + {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"}, + {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"}, ] [package.dependencies] From b4860d0a84680b3113173a990d76897fe526c63c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 11:47:30 +0000 Subject: [PATCH 094/139] chore(ci): changelog rebuild (#6034) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06920936e3f..74e6d10cf4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,37 +40,43 @@ ## Maintenance -* **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) -* **ci:** new pre-release 3.5.1a5 ([#6026](https://github.com/aws-powertools/powertools-lambda-python/issues/6026)) * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) -* **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) -* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) +* **ci:** new pre-release 3.5.1a6 ([#6033](https://github.com/aws-powertools/powertools-lambda-python/issues/6033)) +* **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) +* **ci:** new pre-release 3.5.1a5 ([#6026](https://github.com/aws-powertools/powertools-lambda-python/issues/6026)) * **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) -* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) +* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) +* **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) * **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) -* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) -* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) -* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) -* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) -* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) -* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) -* **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) -* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) +* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) * **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) +* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) * **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) +* **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) +* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) * **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) +* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) * **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) -* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) -* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) -* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) -* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) +* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) +* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) +* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) +* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) * **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) +* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) +* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) * **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) +* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) * **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) -* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) +* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) +* **deps-dev:** bump mypy from 1.14.1 to 1.15.0 ([#6028](https://github.com/aws-powertools/powertools-lambda-python/issues/6028)) * **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) -* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) +* **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) +* **deps-dev:** bump cfn-lint from 1.23.1 to 1.24.0 ([#6030](https://github.com/aws-powertools/powertools-lambda-python/issues/6030)) +* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 ([#6031](https://github.com/aws-powertools/powertools-lambda-python/issues/6031)) +* **deps-dev:** bump boto3-stubs from 1.36.12 to 1.36.14 ([#6029](https://github.com/aws-powertools/powertools-lambda-python/issues/6029)) +* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) From 0174a9bebb815b0b9cf76d39471a32b16fbf671e Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 6 Feb 2025 16:08:46 +0100 Subject: [PATCH 095/139] chore(docs): enable privacy plugin in docs (#6036) --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 5430dad21b0..36704cdf857 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -189,6 +189,7 @@ markdown_extensions: copyright: Copyright © 2023 Amazon Web Services plugins: + - privacy - git-revision-date - search - mkdocstrings: From dab67b944f526d05c3285e959d8a2232d318b040 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 18:54:15 -0300 Subject: [PATCH 096/139] chore(deps-dev): bump aws-cdk-lib from 2.177.0 to 2.178.0 (#6038) Bumps [aws-cdk-lib](https://github.com/aws/aws-cdk) from 2.177.0 to 2.178.0. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/compare/v2.177.0...v2.178.0) --- updated-dependencies: - dependency-name: aws-cdk-lib dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index bfe34390324..4dd50e7ae6f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -246,13 +246,13 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "aws-cdk-lib" -version = "2.177.0" +version = "2.178.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" files = [ - {file = "aws_cdk_lib-2.177.0-py3-none-any.whl", hash = "sha256:acdf06aaf52367a64b4bf88381e8272cb7b5961c242020ace822c79749e53cac"}, - {file = "aws_cdk_lib-2.177.0.tar.gz", hash = "sha256:5e51c48da31555beb38243bb2882e98ee9fe1796466ba9f8d3088701b47965e5"}, + {file = "aws_cdk_lib-2.178.0-py3-none-any.whl", hash = "sha256:b9e4f2946cd6219c1fc58ad16d123c4ba56b92e9502fbca2bc33c523ba77d54f"}, + {file = "aws_cdk_lib-2.178.0.tar.gz", hash = "sha256:88fdd1774084441024604057a725dcf342e1721d63e948b35a37d66101d77889"}, ] [package.dependencies] From c480276f672cdc6c475158c4c129b3d455657e96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 19:41:55 -0300 Subject: [PATCH 097/139] chore(deps-dev): bump ruff from 0.9.4 to 0.9.5 (#6039) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [ruff](https://github.com/astral-sh/ruff) from 0.9.4 to 0.9.5. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.9.4...0.9.5) --- updated-dependencies: - dependency-name: ruff dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- poetry.lock | 40 ++++++++++++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4dd50e7ae6f..10a5d30ac8d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3822,29 +3822,29 @@ files = [ [[package]] name = "ruff" -version = "0.9.4" +version = "0.9.5" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706"}, - {file = "ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf"}, - {file = "ruff-0.9.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54499fb08408e32b57360f6f9de7157a5fec24ad79cb3f42ef2c3f3f728dfe2b"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c892540108314a6f01f105040b5106aeb829fa5fb0561d2dcaf71485021137"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de9edf2ce4b9ddf43fd93e20ef635a900e25f622f87ed6e3047a664d0e8f810e"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c90c32357c74f11deb7fbb065126d91771b207bf9bfaaee01277ca59b574ec"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56acd6c694da3695a7461cc55775f3a409c3815ac467279dfa126061d84b314b"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0c93e7d47ed951b9394cf352d6695b31498e68fd5782d6cbc282425655f687a"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d4c8772670aecf037d1bf7a07c39106574d143b26cfe5ed1787d2f31e800214"}, - {file = "ruff-0.9.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc5f1d7afeda8d5d37660eeca6d389b142d7f2b5a1ab659d9214ebd0e025231"}, - {file = "ruff-0.9.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faa935fc00ae854d8b638c16a5f1ce881bc3f67446957dd6f2af440a5fc8526b"}, - {file = "ruff-0.9.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a6c634fc6f5a0ceae1ab3e13c58183978185d131a29c425e4eaa9f40afe1e6d6"}, - {file = "ruff-0.9.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:433dedf6ddfdec7f1ac7575ec1eb9844fa60c4c8c2f8887a070672b8d353d34c"}, - {file = "ruff-0.9.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d612dbd0f3a919a8cc1d12037168bfa536862066808960e0cc901404b77968f0"}, - {file = "ruff-0.9.4-py3-none-win32.whl", hash = "sha256:db1192ddda2200671f9ef61d9597fcef89d934f5d1705e571a93a67fb13a4402"}, - {file = "ruff-0.9.4-py3-none-win_amd64.whl", hash = "sha256:05bebf4cdbe3ef75430d26c375773978950bbf4ee3c95ccb5448940dc092408e"}, - {file = "ruff-0.9.4-py3-none-win_arm64.whl", hash = "sha256:585792f1e81509e38ac5123492f8875fbc36f3ede8185af0a26df348e5154f41"}, - {file = "ruff-0.9.4.tar.gz", hash = "sha256:6907ee3529244bb0ed066683e075f09285b38dd5b4039370df6ff06041ca19e7"}, + {file = "ruff-0.9.5-py3-none-linux_armv6l.whl", hash = "sha256:d466d2abc05f39018d53f681fa1c0ffe9570e6d73cde1b65d23bb557c846f442"}, + {file = "ruff-0.9.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38840dbcef63948657fa7605ca363194d2fe8c26ce8f9ae12eee7f098c85ac8a"}, + {file = "ruff-0.9.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d56ba06da53536b575fbd2b56517f6f95774ff7be0f62c80b9e67430391eeb36"}, + {file = "ruff-0.9.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7cb2a01da08244c50b20ccfaeb5972e4228c3c3a1989d3ece2bc4b1f996001"}, + {file = "ruff-0.9.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96d5c76358419bc63a671caac70c18732d4fd0341646ecd01641ddda5c39ca0b"}, + {file = "ruff-0.9.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:deb8304636ed394211f3a6d46c0e7d9535b016f53adaa8340139859b2359a070"}, + {file = "ruff-0.9.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:df455000bf59e62b3e8c7ba5ed88a4a2bc64896f900f311dc23ff2dc38156440"}, + {file = "ruff-0.9.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de92170dfa50c32a2b8206a647949590e752aca8100a0f6b8cefa02ae29dce80"}, + {file = "ruff-0.9.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d28532d73b1f3f627ba88e1456f50748b37f3a345d2be76e4c653bec6c3e393"}, + {file = "ruff-0.9.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c746d7d1df64f31d90503ece5cc34d7007c06751a7a3bbeee10e5f2463d52d2"}, + {file = "ruff-0.9.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11417521d6f2d121fda376f0d2169fb529976c544d653d1d6044f4c5562516ee"}, + {file = "ruff-0.9.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b9d71c3879eb32de700f2f6fac3d46566f644a91d3130119a6378f9312a38e1"}, + {file = "ruff-0.9.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2e36c61145e70febcb78483903c43444c6b9d40f6d2f800b5552fec6e4a7bb9a"}, + {file = "ruff-0.9.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2f71d09aeba026c922aa7aa19a08d7bd27c867aedb2f74285a2639644c1c12f5"}, + {file = "ruff-0.9.5-py3-none-win32.whl", hash = "sha256:134f958d52aa6fdec3b294b8ebe2320a950d10c041473c4316d2e7d7c2544723"}, + {file = "ruff-0.9.5-py3-none-win_amd64.whl", hash = "sha256:78cc6067f6d80b6745b67498fb84e87d32c6fc34992b52bffefbdae3442967d6"}, + {file = "ruff-0.9.5-py3-none-win_arm64.whl", hash = "sha256:18a29f1a005bddb229e580795627d297dfa99f16b30c7039e73278cf6b5f9fa9"}, + {file = "ruff-0.9.5.tar.gz", hash = "sha256:11aecd7a633932875ab3cb05a484c99970b9d52606ce9ea912b690b02653d56c"}, ] [[package]] @@ -4633,4 +4633,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "f0e15a774ebec0f7753ba718c3201d1ad01420b18f18278d3eca2b7dcd9082ef" +content-hash = "d37a4b63b020d2257321698500e9e25dc419897c5f516526ad7d4f6d5d9362b3" diff --git a/pyproject.toml b/pyproject.toml index f9421df2fc4..09620addb47 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -113,7 +113,7 @@ types-python-dateutil = "^2.8.19.6" aws-cdk-aws-appsync-alpha = "^2.59.0a0" httpx = ">=0.23.3,<0.29.0" sentry-sdk = ">=1.22.2,<3.0.0" -ruff = ">=0.5.1,<0.9.5" +ruff = ">=0.5.1,<0.9.6" retry2 = "^0.9.5" pytest-socket = ">=0.6,<0.8" types-redis = "^4.6.0.7" From da5ae91875d02cb69c77f10d00416d79da669bbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 20:17:33 -0300 Subject: [PATCH 098/139] chore(deps-dev): bump aws-cdk-aws-lambda-python-alpha from 2.177.0a0 to 2.178.0a0 (#6041) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore(deps-dev): bump aws-cdk-aws-lambda-python-alpha Bumps [aws-cdk-aws-lambda-python-alpha](https://github.com/aws/aws-cdk) from 2.177.0a0 to 2.178.0a0. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/commits) --- updated-dependencies: - dependency-name: aws-cdk-aws-lambda-python-alpha dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 10a5d30ac8d..c54daac3bbe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -212,17 +212,17 @@ typeguard = ">=2.13.3,<2.14.0" [[package]] name = "aws-cdk-aws-lambda-python-alpha" -version = "2.177.0a0" +version = "2.178.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" files = [ - {file = "aws_cdk.aws_lambda_python_alpha-2.177.0a0-py3-none-any.whl", hash = "sha256:5aacc26970e30909b372fd2e8b98ce7197b8074d78ec4f1d900a8ddd02bc5114"}, - {file = "aws_cdk_aws_lambda_python_alpha-2.177.0a0.tar.gz", hash = "sha256:0137957603cd91b473de3a455bf4d95de4ba60c1ba9f25f62d3edeb965202c4e"}, + {file = "aws_cdk.aws_lambda_python_alpha-2.178.0a0-py3-none-any.whl", hash = "sha256:a1c8837d61e527715e3febf56e601396de9afe82d0d112c303725ff47da55aaf"}, + {file = "aws_cdk_aws_lambda_python_alpha-2.178.0a0.tar.gz", hash = "sha256:6f24f8bd07cb01b1e1cfddb72e9f0c48840398347ebd0faebd9bc1f4b6cfcb8a"}, ] [package.dependencies] -aws-cdk-lib = ">=2.177.0,<3.0.0" +aws-cdk-lib = ">=2.178.0,<3.0.0" constructs = ">=10.0.0,<11.0.0" jsii = ">=1.106.0,<2.0.0" publication = ">=0.0.3" From 82de6bedb68dd057c501f182e073255b7d075cb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 20:18:47 -0300 Subject: [PATCH 099/139] chore(deps-dev): bump aws-cdk from 2.177.0 to 2.178.0 (#6040) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [aws-cdk](https://github.com/aws/aws-cdk/tree/HEAD/packages/aws-cdk) from 2.177.0 to 2.178.0. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/commits/v2.178.0/packages/aws-cdk) --- updated-dependencies: - dependency-name: aws-cdk dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 533997328f3..53197d5586c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,13 @@ "package-lock.json": "^1.0.0" }, "devDependencies": { - "aws-cdk": "^2.177.0" + "aws-cdk": "^2.178.0" } }, "node_modules/aws-cdk": { - "version": "2.177.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.177.0.tgz", - "integrity": "sha512-TiBoyE5wMB5q4jX1bELwkklgbs5eLY1Phjfnb4Mof0K9tOSRJ9UEq6xEamF0esMS+TuYU7a/ESTpmKX3iYqA3w==", + "version": "2.178.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.178.0.tgz", + "integrity": "sha512-FcAByh9/HCgxEFE05434t+coYhOZSp92au77VSudBXhdgBrGPG28j1zSJY0XGPcH6eQxWaMWhSI6RzFK34R8MA==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index fb58778db5a..2ccc0c608cd 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "aws-lambda-powertools-python-e2e", "version": "1.0.0", "devDependencies": { - "aws-cdk": "^2.177.0" + "aws-cdk": "^2.178.0" }, "dependencies": { "package-lock.json": "^1.0.0" From badec0d4feb037c291beb665400e9d3f62623d27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 20:20:19 -0300 Subject: [PATCH 100/139] chore(deps): bump docker/setup-buildx-action from 3.8.0 to 3.9.0 (#6042) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.8.0 to 3.9.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/6524bf65af31da8d45b59e8c27de4bd072b392f5...f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- .github/workflows/publish_v2_layer.yml | 2 +- .github/workflows/publish_v3_layer.yml | 2 +- .github/workflows/quality_code_cdk_constructor.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish_v2_layer.yml b/.github/workflows/publish_v2_layer.yml index 772c9e2de2a..0c67f64c5f6 100644 --- a/.github/workflows/publish_v2_layer.yml +++ b/.github/workflows/publish_v2_layer.yml @@ -124,7 +124,7 @@ jobs: - name: Set up Docker Buildx id: builder - uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 + uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 with: install: true driver: docker diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 48247253d90..4a02b2cf8b9 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -136,7 +136,7 @@ jobs: - name: Set up Docker Buildx id: builder - uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 + uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 with: install: true driver: docker diff --git a/.github/workflows/quality_code_cdk_constructor.yml b/.github/workflows/quality_code_cdk_constructor.yml index b2feec85810..2ee61fd7075 100644 --- a/.github/workflows/quality_code_cdk_constructor.yml +++ b/.github/workflows/quality_code_cdk_constructor.yml @@ -57,7 +57,7 @@ jobs: # NOTE: we need QEMU to build Layer against a different architecture (e.g., ARM) - name: Set up Docker Buildx id: builder - uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 + uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 with: install: true driver: docker From 01cf1c8e1f779999c8f23e9b8a0fa6da5b446bcb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 20:21:37 -0300 Subject: [PATCH 101/139] chore(deps): bump docker/setup-qemu-action from 3.3.0 to 3.4.0 (#6043) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/53851d14592bedcffcf25ea515637cff71ef929a...4574d27a4764455b42196d70a065bc6853246a25) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- .github/workflows/publish_v2_layer.yml | 2 +- .github/workflows/publish_v3_layer.yml | 2 +- .github/workflows/quality_code_cdk_constructor.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish_v2_layer.yml b/.github/workflows/publish_v2_layer.yml index 0c67f64c5f6..38da26cbf9b 100644 --- a/.github/workflows/publish_v2_layer.yml +++ b/.github/workflows/publish_v2_layer.yml @@ -117,7 +117,7 @@ jobs: pip install --require-hashes -r requirements.txt - name: Set up QEMU - uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v2.0.0 + uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v2.0.0 with: platforms: arm64 # NOTE: we need QEMU to build Layer against a different architecture (e.g., ARM) diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 4a02b2cf8b9..90805f9434e 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -129,7 +129,7 @@ jobs: pip install --require-hashes -r requirements.txt - name: Set up QEMU - uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v2.0.0 + uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v2.0.0 with: platforms: arm64 # NOTE: we need QEMU to build Layer against a different architecture (e.g., ARM) diff --git a/.github/workflows/quality_code_cdk_constructor.yml b/.github/workflows/quality_code_cdk_constructor.yml index 2ee61fd7075..c9c923be16b 100644 --- a/.github/workflows/quality_code_cdk_constructor.yml +++ b/.github/workflows/quality_code_cdk_constructor.yml @@ -51,7 +51,7 @@ jobs: python-version: ${{ matrix.python-version }} cache: "poetry" - name: Set up QEMU - uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v2.0.0 + uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v2.0.0 with: platforms: arm64 # NOTE: we need QEMU to build Layer against a different architecture (e.g., ARM) From 8a491e034ed6380782a3609c6b0f166cd557c8c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 08:39:32 +0000 Subject: [PATCH 102/139] chore(ci): new pre-release 3.5.1a7 (#6044) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.5.1a7/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.5.1a7/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index 096007bfeac..0cd0088fd9b 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.1a6" +VERSION = "3.5.1a7" diff --git a/provenance/3.5.1a7/multiple.intoto.jsonl b/provenance/3.5.1a7/multiple.intoto.jsonl new file mode 100644 index 00000000000..474657fe965 --- /dev/null +++ b/provenance/3.5.1a7/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE3LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiNmQ4ZDJkMzZhZWU1OWI4NDhjMDFmYTQ4ZGY5N2Q4ZjBmYWJkYTc5NTY3MjBlZjJjMDhiZDFhMWRlMWE3YTFjYiJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE3LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiIwZjcxOWY4MDkxMTgyMDFmYjgxYTcwNDI3MjExZmMxZTQwNDYxNThmYTFlYTQwMjMyYzdiMTA4MGMzOGM1OGRiIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiZmI4YjRmZjM1MzI0Y2Q1MmM3ZjEzODdiOTAxNDgyYjczMzM1YmNkYSJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwOCwiZm9ya3NfY291bnQiOjQwOCwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo1Nywib3Blbl9pc3N1ZXNfY291bnQiOjU3LCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDItMDZUMjM6MjE6MzlaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjg2NjAzLCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5ODEsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDItMDZUMjM6MjE6NDJaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5ODEsIndhdGNoZXJzX2NvdW50IjoyOTgxLCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzE5NTYzMDI5NCIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTcxIiwiZ2l0aHViX3NoYTEiOiJmYjhiNGZmMzUzMjRjZDUyYzdmMTM4N2I5MDE0ODJiNzMzMzViY2RhIn19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMTk1NjMwMjk0LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiJmYjhiNGZmMzUzMjRjZDUyYzdmMTM4N2I5MDE0ODJiNzMzMzViY2RhIn19XX19","signatures":[{"keyid":"","sig":"MEUCIQC+/7Jm3AHMweRNOFceVlF7kAI4uP98rIQN0Tf7kkUUHwIgdO5abiSLBtgjcYyIqTZizfwvQZJvXgY4AkR47cfWuq4=","cert":"-----BEGIN CERTIFICATE-----\nMIIHZjCCBuygAwIBAgIUUCoHrtEnWdz6AQloHbOKJb4ZHY4wCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMjA3MDgwNjU5WhcNMjUwMjA3MDgxNjU5WjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEQVAZ+TbuoCDFYybGoZkDtWEFR4AUcyH6BaW5\nPickzMTWwUgvpOwSAN+XKu3PUUZso/QAp18htVsA0LAzl/vte6OCBgswggYHMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUcxZr\n7poyiAbU4BpiWP4fQLJjFH4wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChmYjhi\nNGZmMzUzMjRjZDUyYzdmMTM4N2I5MDE0ODJiNzMzMzViY2RhMBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDChmYjhiNGZmMzUzMjRjZDUyYzdmMTM4N2I5MDE0ODJiNzMzMzViY2RhMCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoZmI4\nYjRmZjM1MzI0Y2Q1MmM3ZjEzODdiOTAxNDgyYjczMzM1YmNkYTAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMxOTU2MzAyOTQvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlN9yoVMAAAQDAEcwRQIgeO9AHCCR2kHL2ROqzGs3\nTD1gg+R1G1r8dd65VehMMPACIQCNGNDCfQ3ZnC1rO91ShqUpF0AfZ8G6RCsBCOc2\nrFjR4jAKBggqhkjOPQQDAwNoADBlAjEAq/h2LQABoTkQHKcNkv9ZOF93B7jtBezU\nt0zNtlRPV5LVOjjgQ9LldlGjToRotbFHAjADVhvJj+XBVjdOhyyy+EX+TLl0x02q\nPrAaL+0g5uEOvfj4vO5BRYohdSvZlPIJeaA=\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 09620addb47..c7ce744418b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.1a6" +version = "3.5.1a7" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From e6bdfe14551f657376369c168d300a88bf347216 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 11:56:11 +0000 Subject: [PATCH 103/139] chore(ci): changelog rebuild (#6045) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74e6d10cf4f..5a52b0a522b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,41 +42,49 @@ * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) +* **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) +* **ci:** new pre-release 3.5.1a7 ([#6044](https://github.com/aws-powertools/powertools-lambda-python/issues/6044)) +* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) +* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) * **ci:** new pre-release 3.5.1a6 ([#6033](https://github.com/aws-powertools/powertools-lambda-python/issues/6033)) * **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) * **ci:** new pre-release 3.5.1a5 ([#6026](https://github.com/aws-powertools/powertools-lambda-python/issues/6026)) -* **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) * **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) * **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) -* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) -* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) +* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) +* **deps:** bump docker/setup-buildx-action from 3.8.0 to 3.9.0 ([#6042](https://github.com/aws-powertools/powertools-lambda-python/issues/6042)) +* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) +* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) +* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) * **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) -* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) * **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) +* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) +* **deps:** bump docker/setup-qemu-action from 3.3.0 to 3.4.0 ([#6043](https://github.com/aws-powertools/powertools-lambda-python/issues/6043)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) * **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) -* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) +* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) * **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) * **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) -* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) -* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) -* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) -* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) -* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) -* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) +* **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) +* **deps-dev:** bump boto3-stubs from 1.36.12 to 1.36.14 ([#6029](https://github.com/aws-powertools/powertools-lambda-python/issues/6029)) * **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) +* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) +* **deps-dev:** bump mypy from 1.14.1 to 1.15.0 ([#6028](https://github.com/aws-powertools/powertools-lambda-python/issues/6028)) +* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) +* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 ([#6031](https://github.com/aws-powertools/powertools-lambda-python/issues/6031)) * **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) +* **deps-dev:** bump cfn-lint from 1.23.1 to 1.24.0 ([#6030](https://github.com/aws-powertools/powertools-lambda-python/issues/6030)) +* **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) +* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) * **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) * **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) -* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) +* **deps-dev:** bump ruff from 0.9.4 to 0.9.5 ([#6039](https://github.com/aws-powertools/powertools-lambda-python/issues/6039)) * **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) -* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) -* **deps-dev:** bump mypy from 1.14.1 to 1.15.0 ([#6028](https://github.com/aws-powertools/powertools-lambda-python/issues/6028)) -* **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) -* **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) -* **deps-dev:** bump cfn-lint from 1.23.1 to 1.24.0 ([#6030](https://github.com/aws-powertools/powertools-lambda-python/issues/6030)) -* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 ([#6031](https://github.com/aws-powertools/powertools-lambda-python/issues/6031)) -* **deps-dev:** bump boto3-stubs from 1.36.12 to 1.36.14 ([#6029](https://github.com/aws-powertools/powertools-lambda-python/issues/6029)) -* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.177.0a0 to 2.178.0a0 ([#6041](https://github.com/aws-powertools/powertools-lambda-python/issues/6041)) +* **deps-dev:** bump aws-cdk from 2.177.0 to 2.178.0 ([#6040](https://github.com/aws-powertools/powertools-lambda-python/issues/6040)) +* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) +* **deps-dev:** bump aws-cdk-lib from 2.177.0 to 2.178.0 ([#6038](https://github.com/aws-powertools/powertools-lambda-python/issues/6038)) +* **docs:** enable privacy plugin in docs ([#6036](https://github.com/aws-powertools/powertools-lambda-python/issues/6036)) From 605365d0f914a06b48be0cec85938da357e03412 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 13:58:58 +0000 Subject: [PATCH 104/139] chore(deps-dev): bump aws-cdk from 2.178.0 to 2.178.1 (#6053) Bumps [aws-cdk](https://github.com/aws/aws-cdk/tree/HEAD/packages/aws-cdk) from 2.178.0 to 2.178.1. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/commits/v2.178.1/packages/aws-cdk) --- updated-dependencies: - dependency-name: aws-cdk dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 53197d5586c..ad8c05249dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,13 @@ "package-lock.json": "^1.0.0" }, "devDependencies": { - "aws-cdk": "^2.178.0" + "aws-cdk": "^2.178.1" } }, "node_modules/aws-cdk": { - "version": "2.178.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.178.0.tgz", - "integrity": "sha512-FcAByh9/HCgxEFE05434t+coYhOZSp92au77VSudBXhdgBrGPG28j1zSJY0XGPcH6eQxWaMWhSI6RzFK34R8MA==", + "version": "2.178.1", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.178.1.tgz", + "integrity": "sha512-64z9ARFI90jhX6sfjqqJghGxkfh1T4STxY3ccuRY8OxzAK1FY6XLjKBxSyXi9jJFa3v9nN57x7W32u4hZDj6gw==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 2ccc0c608cd..2698f422ad5 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "aws-lambda-powertools-python-e2e", "version": "1.0.0", "devDependencies": { - "aws-cdk": "^2.178.0" + "aws-cdk": "^2.178.1" }, "dependencies": { "package-lock.json": "^1.0.0" From 803a24b56c61609cec6eeea67de486319e58753f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 13:59:38 +0000 Subject: [PATCH 105/139] chore(deps-dev): bump aws-cdk-lib from 2.178.0 to 2.178.1 (#6047) Bumps [aws-cdk-lib](https://github.com/aws/aws-cdk) from 2.178.0 to 2.178.1. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/compare/v2.178.0...v2.178.1) --- updated-dependencies: - dependency-name: aws-cdk-lib dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index c54daac3bbe..7082003887f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -246,13 +246,13 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "aws-cdk-lib" -version = "2.178.0" +version = "2.178.1" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" files = [ - {file = "aws_cdk_lib-2.178.0-py3-none-any.whl", hash = "sha256:b9e4f2946cd6219c1fc58ad16d123c4ba56b92e9502fbca2bc33c523ba77d54f"}, - {file = "aws_cdk_lib-2.178.0.tar.gz", hash = "sha256:88fdd1774084441024604057a725dcf342e1721d63e948b35a37d66101d77889"}, + {file = "aws_cdk_lib-2.178.1-py3-none-any.whl", hash = "sha256:882feb0ae77fadc8fb8951649d12608bd2d776f6730e1c21cd6655615a234ae2"}, + {file = "aws_cdk_lib-2.178.1.tar.gz", hash = "sha256:c5ae0305d0c20093941ab77e7c6847d5ec8baaf98469c4b04901a0d2a3746f32"}, ] [package.dependencies] From 3de824ae869bbd63a5c0aa3fd70845c2424a829c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 14:00:24 +0000 Subject: [PATCH 106/139] chore(deps-dev): bump aws-cdk-aws-lambda-python-alpha from 2.178.0a0 to 2.178.1a0 (#6048) chore(deps-dev): bump aws-cdk-aws-lambda-python-alpha Bumps [aws-cdk-aws-lambda-python-alpha](https://github.com/aws/aws-cdk) from 2.178.0a0 to 2.178.1a0. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/commits) --- updated-dependencies: - dependency-name: aws-cdk-aws-lambda-python-alpha dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7082003887f..489f103c7da 100644 --- a/poetry.lock +++ b/poetry.lock @@ -212,17 +212,17 @@ typeguard = ">=2.13.3,<2.14.0" [[package]] name = "aws-cdk-aws-lambda-python-alpha" -version = "2.178.0a0" +version = "2.178.1a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" files = [ - {file = "aws_cdk.aws_lambda_python_alpha-2.178.0a0-py3-none-any.whl", hash = "sha256:a1c8837d61e527715e3febf56e601396de9afe82d0d112c303725ff47da55aaf"}, - {file = "aws_cdk_aws_lambda_python_alpha-2.178.0a0.tar.gz", hash = "sha256:6f24f8bd07cb01b1e1cfddb72e9f0c48840398347ebd0faebd9bc1f4b6cfcb8a"}, + {file = "aws_cdk.aws_lambda_python_alpha-2.178.1a0-py3-none-any.whl", hash = "sha256:15560cc63d85f51dc09b42deb60066cd5cd1d9cb7d744f7808833f58d6a8ab8a"}, + {file = "aws_cdk_aws_lambda_python_alpha-2.178.1a0.tar.gz", hash = "sha256:5a044728935bd584f15cc168491e5424e550135f5729ee7fd29e48e6ce41434b"}, ] [package.dependencies] -aws-cdk-lib = ">=2.178.0,<3.0.0" +aws-cdk-lib = ">=2.178.1,<3.0.0" constructs = ">=10.0.0,<11.0.0" jsii = ">=1.106.0,<2.0.0" publication = ">=0.0.3" From e8ef6064c62b42755eabd31e2b83bf2b5b88bc54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 14:00:52 +0000 Subject: [PATCH 107/139] chore(deps-dev): bump boto3-stubs from 1.36.14 to 1.36.15 (#6049) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.14 to 1.36.15. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 489f103c7da..2616cc136f5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -439,13 +439,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.14" -description = "Type annotations for boto3 1.36.14 generated with mypy-boto3-builder 8.9.0" +version = "1.36.15" +description = "Type annotations for boto3 1.36.15 generated with mypy-boto3-builder 8.9.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.14-py3-none-any.whl", hash = "sha256:dcde60b21a4026719b82b7f4679ecd9af9372b3d0c9a7f45f1cf2c496bcf19b4"}, - {file = "boto3_stubs-1.36.14.tar.gz", hash = "sha256:9eccdee8091b095a8ce5119b825dccba73555d88a813636b95c3ea2e57186e4f"}, + {file = "boto3_stubs-1.36.15-py3-none-any.whl", hash = "sha256:0768bab3b03d9bcf7e1345eea881cd2d5ab17e41f21d63dac2660ee9438e3557"}, + {file = "boto3_stubs-1.36.15.tar.gz", hash = "sha256:557562358f6d61b2ff36384f6d391ecc8211b69b2f5110eed3f689449dfa8024"}, ] [package.dependencies] @@ -512,7 +512,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.14)"] +boto3 = ["boto3 (==1.36.15)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From 149d324feca7d4288265809b8c63ae40ca9f630f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 14:02:03 +0000 Subject: [PATCH 108/139] chore(deps-dev): bump cdklabs-generative-ai-cdk-constructs from 0.1.291 to 0.1.292 (#6051) chore(deps-dev): bump cdklabs-generative-ai-cdk-constructs Bumps [cdklabs-generative-ai-cdk-constructs](https://github.com/awslabs/generative-ai-cdk-constructs) from 0.1.291 to 0.1.292. - [Release notes](https://github.com/awslabs/generative-ai-cdk-constructs/releases) - [Changelog](https://github.com/awslabs/generative-ai-cdk-constructs/blob/main/CHANGELOG.md) - [Commits](https://github.com/awslabs/generative-ai-cdk-constructs/compare/v0.1.291...v0.1.292) --- updated-dependencies: - dependency-name: cdklabs-generative-ai-cdk-constructs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2616cc136f5..68a91f6d041 100644 --- a/poetry.lock +++ b/poetry.lock @@ -972,18 +972,18 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "cdklabs-generative-ai-cdk-constructs" -version = "0.1.291" +version = "0.1.292" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" files = [ - {file = "cdklabs.generative_ai_cdk_constructs-0.1.291-py3-none-any.whl", hash = "sha256:913ce67b37d256d28630fbaae4b662b07f63755b9891d77492511f3659872373"}, - {file = "cdklabs_generative_ai_cdk_constructs-0.1.291.tar.gz", hash = "sha256:f9a2fdb399b106460016d06113891d6e85dd649bdf10936473262789373d8c1e"}, + {file = "cdklabs.generative_ai_cdk_constructs-0.1.292-py3-none-any.whl", hash = "sha256:ad154f14928c6d9f900e07964c844522837608e0fc5489c85f6f40e70af0d1e1"}, + {file = "cdklabs_generative_ai_cdk_constructs-0.1.292.tar.gz", hash = "sha256:ccfdf292b3da036e920071d4555365cfc96fdbede85cbeee0c1acfbde8a89db4"}, ] [package.dependencies] aws-cdk-lib = ">=2.177.0,<3.0.0" -cdk-nag = ">=2.35.9,<3.0.0" +cdk-nag = ">=2.35.10,<3.0.0" constructs = ">=10.3.0,<11.0.0" jsii = ">=1.106.0,<2.0.0" publication = ">=0.0.3" From 723d181826d7f0862087522663586cb6fd456e45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 14:02:29 +0000 Subject: [PATCH 109/139] chore(deps-dev): bump mkdocstrings-python from 1.14.5 to 1.14.6 (#6050) Bumps [mkdocstrings-python](https://github.com/mkdocstrings/python) from 1.14.5 to 1.14.6. - [Release notes](https://github.com/mkdocstrings/python/releases) - [Changelog](https://github.com/mkdocstrings/python/blob/main/CHANGELOG.md) - [Commits](https://github.com/mkdocstrings/python/compare/1.14.5...1.14.6) --- updated-dependencies: - dependency-name: mkdocstrings-python dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 68a91f6d041..9c0d6e4fd6c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2521,13 +2521,13 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.14.5" +version = "1.14.6" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" files = [ - {file = "mkdocstrings_python-1.14.5-py3-none-any.whl", hash = "sha256:ac394f273ae298aeaa6be4506768f05e61bd7c8119437ea98553354b1185c469"}, - {file = "mkdocstrings_python-1.14.5.tar.gz", hash = "sha256:8582eeac8cce952f395d76ec636fc814757cba7d8458aa75ba0529a3aa10d98c"}, + {file = "mkdocstrings_python-1.14.6-py3-none-any.whl", hash = "sha256:e0ca11b49ac0f23070afb566245f4ff80ea1700e03c9dbc143d70dbf1cae074e"}, + {file = "mkdocstrings_python-1.14.6.tar.gz", hash = "sha256:3fb6589491614422d781dacca085c0c5a53a7063af37a2fea5864e24e378b03e"}, ] [package.dependencies] From ca1bbcf121c7c2d691521ba2bf005e12d3233730 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 14:03:19 +0000 Subject: [PATCH 110/139] chore(deps): bump squidfunk/mkdocs-material from `7e841df` to `c62453b` in /docs (#6052) chore(deps): bump squidfunk/mkdocs-material in /docs Bumps squidfunk/mkdocs-material from `7e841df` to `c62453b`. --- updated-dependencies: - dependency-name: squidfunk/mkdocs-material dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index 757f0b3843d..46941467a98 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # v9.1.18 -FROM squidfunk/mkdocs-material@sha256:7e841df1cfb6c8c4ff0968f2cfe55127fb1a2f5614e1c9bc23cbc11fe4c96644 +FROM squidfunk/mkdocs-material@sha256:c62453b1ba229982c6325a71165c1a3007c11bd3dd470e7a1446c5783bd145b4 # pip-compile --generate-hashes --output-file=requirements.txt requirements.in COPY requirements.txt /tmp/ RUN pip install --require-hashes -r /tmp/requirements.txt From 63a39c20829a720f3353eea3c6d4354120d26f26 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 14:03:47 +0000 Subject: [PATCH 111/139] chore(ci): changelog rebuild (#6055) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- CHANGELOG.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a52b0a522b..17ea30b1573 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,49 +40,49 @@ ## Maintenance +* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) +* **ci:** new pre-release 3.5.1a7 ([#6044](https://github.com/aws-powertools/powertools-lambda-python/issues/6044)) * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) -* **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) -* **ci:** new pre-release 3.5.1a7 ([#6044](https://github.com/aws-powertools/powertools-lambda-python/issues/6044)) -* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) * **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) +* **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) * **ci:** new pre-release 3.5.1a6 ([#6033](https://github.com/aws-powertools/powertools-lambda-python/issues/6033)) * **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) * **ci:** new pre-release 3.5.1a5 ([#6026](https://github.com/aws-powertools/powertools-lambda-python/issues/6026)) -* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) +* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) * **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) +* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) +* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) +* **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) * **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) -* **deps:** bump docker/setup-buildx-action from 3.8.0 to 3.9.0 ([#6042](https://github.com/aws-powertools/powertools-lambda-python/issues/6042)) -* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) -* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) -* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) * **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) -* **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) -* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) +* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) +* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) +* **deps:** bump docker/setup-buildx-action from 3.8.0 to 3.9.0 ([#6042](https://github.com/aws-powertools/powertools-lambda-python/issues/6042)) * **deps:** bump docker/setup-qemu-action from 3.3.0 to 3.4.0 ([#6043](https://github.com/aws-powertools/powertools-lambda-python/issues/6043)) -* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) * **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) * **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) * **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) -* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) -* **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) -* **deps-dev:** bump boto3-stubs from 1.36.12 to 1.36.14 ([#6029](https://github.com/aws-powertools/powertools-lambda-python/issues/6029)) +* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) +* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) +* **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) * **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) * **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) -* **deps-dev:** bump mypy from 1.14.1 to 1.15.0 ([#6028](https://github.com/aws-powertools/powertools-lambda-python/issues/6028)) +* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) * **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) -* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 ([#6031](https://github.com/aws-powertools/powertools-lambda-python/issues/6031)) +* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) * **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) -* **deps-dev:** bump cfn-lint from 1.23.1 to 1.24.0 ([#6030](https://github.com/aws-powertools/powertools-lambda-python/issues/6030)) +* **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) * **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) * **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) -* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) -* **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) +* **deps-dev:** bump cfn-lint from 1.23.1 to 1.24.0 ([#6030](https://github.com/aws-powertools/powertools-lambda-python/issues/6030)) +* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 ([#6031](https://github.com/aws-powertools/powertools-lambda-python/issues/6031)) +* **deps-dev:** bump boto3-stubs from 1.36.12 to 1.36.14 ([#6029](https://github.com/aws-powertools/powertools-lambda-python/issues/6029)) +* **deps-dev:** bump mypy from 1.14.1 to 1.15.0 ([#6028](https://github.com/aws-powertools/powertools-lambda-python/issues/6028)) +* **deps-dev:** bump aws-cdk from 2.177.0 to 2.178.0 ([#6040](https://github.com/aws-powertools/powertools-lambda-python/issues/6040)) * **deps-dev:** bump ruff from 0.9.4 to 0.9.5 ([#6039](https://github.com/aws-powertools/powertools-lambda-python/issues/6039)) -* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) * **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.177.0a0 to 2.178.0a0 ([#6041](https://github.com/aws-powertools/powertools-lambda-python/issues/6041)) -* **deps-dev:** bump aws-cdk from 2.177.0 to 2.178.0 ([#6040](https://github.com/aws-powertools/powertools-lambda-python/issues/6040)) -* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) * **deps-dev:** bump aws-cdk-lib from 2.177.0 to 2.178.0 ([#6038](https://github.com/aws-powertools/powertools-lambda-python/issues/6038)) * **docs:** enable privacy plugin in docs ([#6036](https://github.com/aws-powertools/powertools-lambda-python/issues/6036)) From 62cc329efa9ef4c49608be67ce224e24fc7e27a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 14:15:27 +0000 Subject: [PATCH 112/139] chore(deps-dev): bump boto3-stubs from 1.36.14 to 1.36.16 (#6057) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.14 to 1.36.16. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9c0d6e4fd6c..a624f5eefd8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -439,13 +439,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.15" -description = "Type annotations for boto3 1.36.15 generated with mypy-boto3-builder 8.9.0" +version = "1.36.16" +description = "Type annotations for boto3 1.36.16 generated with mypy-boto3-builder 8.9.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.15-py3-none-any.whl", hash = "sha256:0768bab3b03d9bcf7e1345eea881cd2d5ab17e41f21d63dac2660ee9438e3557"}, - {file = "boto3_stubs-1.36.15.tar.gz", hash = "sha256:557562358f6d61b2ff36384f6d391ecc8211b69b2f5110eed3f689449dfa8024"}, + {file = "boto3_stubs-1.36.16-py3-none-any.whl", hash = "sha256:43ac9229ac239de16c37087a6fed145a1afda95c926cebfd4c292c29aab43720"}, + {file = "boto3_stubs-1.36.16.tar.gz", hash = "sha256:9fe8b6dc3d6b33ccc4241bd7e281f11525a45743a6b0bf4da93554b9a47f07d1"}, ] [package.dependencies] @@ -512,7 +512,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.15)"] +boto3 = ["boto3 (==1.36.16)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From 5d96915c3591274b54cf36973b2490de2b4f31d4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Feb 2025 22:56:36 +0000 Subject: [PATCH 113/139] chore(ci): changelog rebuild (#6059) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 54 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17ea30b1573..94f5b7d75a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,50 +40,58 @@ ## Maintenance -* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) -* **ci:** new pre-release 3.5.1a7 ([#6044](https://github.com/aws-powertools/powertools-lambda-python/issues/6044)) +* **ci:** new pre-release 3.5.1a6 ([#6033](https://github.com/aws-powertools/powertools-lambda-python/issues/6033)) +* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) -* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) * **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) -* **ci:** new pre-release 3.5.1a6 ([#6033](https://github.com/aws-powertools/powertools-lambda-python/issues/6033)) -* **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) +* **ci:** new pre-release 3.5.1a7 ([#6044](https://github.com/aws-powertools/powertools-lambda-python/issues/6044)) +* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) +* **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) * **ci:** new pre-release 3.5.1a5 ([#6026](https://github.com/aws-powertools/powertools-lambda-python/issues/6026)) * **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) -* **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) +* **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) +* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) * **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) +* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) * **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) +* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) * **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) -* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) -* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) -* **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) -* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) -* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) +* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) * **deps:** bump docker/setup-buildx-action from 3.8.0 to 3.9.0 ([#6042](https://github.com/aws-powertools/powertools-lambda-python/issues/6042)) * **deps:** bump docker/setup-qemu-action from 3.3.0 to 3.4.0 ([#6043](https://github.com/aws-powertools/powertools-lambda-python/issues/6043)) * **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) -* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) -* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) -* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) -* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) +* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) +* **deps:** bump squidfunk/mkdocs-material from `7e841df` to `c62453b` in /docs ([#6052](https://github.com/aws-powertools/powertools-lambda-python/issues/6052)) +* **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) +* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) +* **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.16 ([#6057](https://github.com/aws-powertools/powertools-lambda-python/issues/6057)) * **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) -* **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) -* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) -* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) -* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) * **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) -* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) +* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) * **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) * **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) -* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) * **deps-dev:** bump cfn-lint from 1.23.1 to 1.24.0 ([#6030](https://github.com/aws-powertools/powertools-lambda-python/issues/6030)) * **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 ([#6031](https://github.com/aws-powertools/powertools-lambda-python/issues/6031)) * **deps-dev:** bump boto3-stubs from 1.36.12 to 1.36.14 ([#6029](https://github.com/aws-powertools/powertools-lambda-python/issues/6029)) +* **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) +* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) * **deps-dev:** bump mypy from 1.14.1 to 1.15.0 ([#6028](https://github.com/aws-powertools/powertools-lambda-python/issues/6028)) -* **deps-dev:** bump aws-cdk from 2.177.0 to 2.178.0 ([#6040](https://github.com/aws-powertools/powertools-lambda-python/issues/6040)) +* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) +* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) +* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) +* **deps-dev:** bump aws-cdk-lib from 2.177.0 to 2.178.0 ([#6038](https://github.com/aws-powertools/powertools-lambda-python/issues/6038)) * **deps-dev:** bump ruff from 0.9.4 to 0.9.5 ([#6039](https://github.com/aws-powertools/powertools-lambda-python/issues/6039)) +* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) * **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.177.0a0 to 2.178.0a0 ([#6041](https://github.com/aws-powertools/powertools-lambda-python/issues/6041)) -* **deps-dev:** bump aws-cdk-lib from 2.177.0 to 2.178.0 ([#6038](https://github.com/aws-powertools/powertools-lambda-python/issues/6038)) +* **deps-dev:** bump aws-cdk from 2.177.0 to 2.178.0 ([#6040](https://github.com/aws-powertools/powertools-lambda-python/issues/6040)) +* **deps-dev:** bump aws-cdk from 2.178.0 to 2.178.1 ([#6053](https://github.com/aws-powertools/powertools-lambda-python/issues/6053)) +* **deps-dev:** bump aws-cdk-lib from 2.178.0 to 2.178.1 ([#6047](https://github.com/aws-powertools/powertools-lambda-python/issues/6047)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.178.0a0 to 2.178.1a0 ([#6048](https://github.com/aws-powertools/powertools-lambda-python/issues/6048)) +* **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.15 ([#6049](https://github.com/aws-powertools/powertools-lambda-python/issues/6049)) +* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.291 to 0.1.292 ([#6051](https://github.com/aws-powertools/powertools-lambda-python/issues/6051)) +* **deps-dev:** bump mkdocstrings-python from 1.14.5 to 1.14.6 ([#6050](https://github.com/aws-powertools/powertools-lambda-python/issues/6050)) * **docs:** enable privacy plugin in docs ([#6036](https://github.com/aws-powertools/powertools-lambda-python/issues/6036)) From ace4e89820facc69901e63c7ce3805a3d125866e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 09:13:12 +0000 Subject: [PATCH 114/139] chore(ci): new pre-release 3.5.1a8 (#6061) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.5.1a8/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.5.1a8/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index 0cd0088fd9b..b25c91e57f3 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.1a7" +VERSION = "3.5.1a8" diff --git a/provenance/3.5.1a8/multiple.intoto.jsonl b/provenance/3.5.1a8/multiple.intoto.jsonl new file mode 100644 index 00000000000..9583eeea6b0 --- /dev/null +++ b/provenance/3.5.1a8/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE4LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiOTQ2MDExMzFkYzA0YzcxMWM3M2I1MzE5YzVkODBlMDU2NmUwYzJjYjEwYjcyNTQxNzI2NGI0YmYwNTE2MTg0NCJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE4LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJkZTNjZTVjYmU5OTczNTZhM2Q2NzAyMmZiOTMyNTY0ZThkMGE5MTRmYmI0OGM3YTk3NjQ3Y2Q5NjhjZjVmYjA3In19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiODEyNzI2OTY4ODk4ZGM1MTE2MThhZGU3YTIyYTE0MWIxYzQ0NjllYSJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwOCwiZm9ya3NfY291bnQiOjQwOCwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo2MSwib3Blbl9pc3N1ZXNfY291bnQiOjYxLCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDItMDlUMjM6Mzc6NDhaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjg2ODIwLCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5ODEsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDItMDlUMjI6NTY6NDFaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5ODEsIndhdGNoZXJzX2NvdW50IjoyOTgxLCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzIzNjEyMzUxNyIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTcyIiwiZ2l0aHViX3NoYTEiOiI4MTI3MjY5Njg4OThkYzUxMTYxOGFkZTdhMjJhMTQxYjFjNDQ2OWVhIn19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMjM2MTIzNTE3LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiI4MTI3MjY5Njg4OThkYzUxMTYxOGFkZTdhMjJhMTQxYjFjNDQ2OWVhIn19XX19","signatures":[{"keyid":"","sig":"MEYCIQCtAtpk8DQUQb3bSjV042C52ry4uTvrbZihI3iha/PO9gIhAKGsX8AXs2uxa/kzQHB+4ybu+jJb9ov6h2nwdr6dOR1l","cert":"-----BEGIN CERTIFICATE-----\nMIIHZjCCBuygAwIBAgIUJ70rjz5cUUmAijLQ4hv96S1iLq8wCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMjEwMDgwNzI0WhcNMjUwMjEwMDgxNzI0WjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEtXsac6HHaZLvzrBLSKG1h1gNaeaLsF2tvCrK\nnothzGcHYW0zHl52ZOJFxbr/bvGsGb/p5Qhnj6MWM0W0xVmYVqOCBgswggYHMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUCh0Q\nZuM5lzdClUcKBy4skzvR54gwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCg4MTI3\nMjY5Njg4OThkYzUxMTYxOGFkZTdhMjJhMTQxYjFjNDQ2OWVhMBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDCg4MTI3MjY5Njg4OThkYzUxMTYxOGFkZTdhMjJhMTQxYjFjNDQ2OWVhMCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoODEy\nNzI2OTY4ODk4ZGM1MTE2MThhZGU3YTIyYTE0MWIxYzQ0NjllYTAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMyMzYxMjM1MTcvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlO7mGJUAAAQDAEcwRQIgOEVcMYJSCheF5WqCMtwt\n43xL2LsjVRJktrWzG9gorG0CIQD30xFlhK5fmM6mSTIUyAiI2Rmy0ELntb4JBXYz\n9PV+ejAKBggqhkjOPQQDAwNoADBlAjEA5juUAMHWw6yRWcv0vokmVyWKdFG5bZbM\n3P/IjMsMkR9mHkzz7xCNGaPoATVFXTpDAjA+5+/qcLCGRIMVBOuyfrtcIUGCFgVt\n/J1S+OOWg8YwJBmJgxXBRkc2Nd+YFltzxHY=\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index c7ce744418b..bb6f4da3249 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.1a7" +version = "3.5.1a8" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From e70ecab46b7294a37a2684111d05ac8268f62c08 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 07:57:09 -0300 Subject: [PATCH 115/139] chore(ci): changelog rebuild (#6062) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94f5b7d75a6..5844ee79653 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,38 +40,39 @@ ## Maintenance -* **ci:** new pre-release 3.5.1a6 ([#6033](https://github.com/aws-powertools/powertools-lambda-python/issues/6033)) -* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) +* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) +* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) +* **ci:** new pre-release 3.5.1a8 ([#6061](https://github.com/aws-powertools/powertools-lambda-python/issues/6061)) * **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) * **ci:** new pre-release 3.5.1a7 ([#6044](https://github.com/aws-powertools/powertools-lambda-python/issues/6044)) -* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) * **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) * **ci:** new pre-release 3.5.1a5 ([#6026](https://github.com/aws-powertools/powertools-lambda-python/issues/6026)) -* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) * **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) -* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) +* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) +* **ci:** new pre-release 3.5.1a6 ([#6033](https://github.com/aws-powertools/powertools-lambda-python/issues/6033)) * **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) * **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) * **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) * **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) -* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) * **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) +* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) * **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) * **deps:** bump docker/setup-buildx-action from 3.8.0 to 3.9.0 ([#6042](https://github.com/aws-powertools/powertools-lambda-python/issues/6042)) * **deps:** bump docker/setup-qemu-action from 3.3.0 to 3.4.0 ([#6043](https://github.com/aws-powertools/powertools-lambda-python/issues/6043)) +* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) * **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) * **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) * **deps:** bump squidfunk/mkdocs-material from `7e841df` to `c62453b` in /docs ([#6052](https://github.com/aws-powertools/powertools-lambda-python/issues/6052)) * **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) * **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) -* **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.16 ([#6057](https://github.com/aws-powertools/powertools-lambda-python/issues/6057)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.178.0a0 to 2.178.1a0 ([#6048](https://github.com/aws-powertools/powertools-lambda-python/issues/6048)) +* **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) * **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) -* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) * **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) +* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) * **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) -* **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) * **deps-dev:** bump cfn-lint from 1.23.1 to 1.24.0 ([#6030](https://github.com/aws-powertools/powertools-lambda-python/issues/6030)) * **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 ([#6031](https://github.com/aws-powertools/powertools-lambda-python/issues/6031)) * **deps-dev:** bump boto3-stubs from 1.36.12 to 1.36.14 ([#6029](https://github.com/aws-powertools/powertools-lambda-python/issues/6029)) @@ -88,10 +89,10 @@ * **deps-dev:** bump aws-cdk from 2.177.0 to 2.178.0 ([#6040](https://github.com/aws-powertools/powertools-lambda-python/issues/6040)) * **deps-dev:** bump aws-cdk from 2.178.0 to 2.178.1 ([#6053](https://github.com/aws-powertools/powertools-lambda-python/issues/6053)) * **deps-dev:** bump aws-cdk-lib from 2.178.0 to 2.178.1 ([#6047](https://github.com/aws-powertools/powertools-lambda-python/issues/6047)) -* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.178.0a0 to 2.178.1a0 ([#6048](https://github.com/aws-powertools/powertools-lambda-python/issues/6048)) * **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.15 ([#6049](https://github.com/aws-powertools/powertools-lambda-python/issues/6049)) * **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.291 to 0.1.292 ([#6051](https://github.com/aws-powertools/powertools-lambda-python/issues/6051)) * **deps-dev:** bump mkdocstrings-python from 1.14.5 to 1.14.6 ([#6050](https://github.com/aws-powertools/powertools-lambda-python/issues/6050)) +* **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.16 ([#6057](https://github.com/aws-powertools/powertools-lambda-python/issues/6057)) * **docs:** enable privacy plugin in docs ([#6036](https://github.com/aws-powertools/powertools-lambda-python/issues/6036)) From e5344339f041e672b4ba740b1ed396d366d51b40 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 10 Feb 2025 12:14:04 +0000 Subject: [PATCH 116/139] feat(event_source): add class APIGatewayAuthorizerResponseWebSocket (#6058) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adding new class to WebSocket Authorizer * Adding new class to WebSocket Authorizer * Making mypy happy * Making mypy happy --------- Co-authored-by: Ana Falcão --- .../api_gateway_authorizer_event.py | 173 +++++++++++++++-- docs/utilities/data_classes.md | 10 +- .../src/apigw_authorizer_request_websocket.py | 29 +++ .../apiGatewayAuthorizerWebSocketEvent.json | 81 ++++++++ ..._api_gateway_authorizer_websocket_event.py | 181 ++++++++++++++++++ 5 files changed, 456 insertions(+), 18 deletions(-) create mode 100644 examples/event_sources/src/apigw_authorizer_request_websocket.py create mode 100644 tests/events/apiGatewayAuthorizerWebSocketEvent.json create mode 100644 tests/unit/data_classes/required_dependencies/test_api_gateway_authorizer_websocket_event.py diff --git a/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py b/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py index 5143b9df88e..f77cb467996 100644 --- a/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +++ b/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py @@ -5,7 +5,7 @@ import warnings from typing import Any, overload -from typing_extensions import deprecated +from typing_extensions import deprecated, override from aws_lambda_powertools.utilities.data_classes.common import ( BaseRequestContext, @@ -28,9 +28,10 @@ def __init__( aws_account_id: str, api_id: str, stage: str, - http_method: str, + http_method: str | None, resource: str, partition: str = "aws", + is_websocket_authorizer: bool = False, ): self.partition = partition self.region = region @@ -40,39 +41,54 @@ def __init__( self.http_method = http_method # Remove matching "/" from `resource`. self.resource = resource.lstrip("/") + self.is_websocket_authorizer = is_websocket_authorizer @property def arn(self) -> str: """Build an arn from its parts eg: arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request""" - return ( - f"arn:{self.partition}:execute-api:{self.region}:{self.aws_account_id}:{self.api_id}/{self.stage}/" - f"{self.http_method}/{self.resource}" - ) + base_arn = f"arn:{self.partition}:execute-api:{self.region}:{self.aws_account_id}:{self.api_id}/{self.stage}" + + if not self.is_websocket_authorizer: + return f"{base_arn}/{self.http_method}/{self.resource}" + else: + return f"{base_arn}/{self.resource}" -def parse_api_gateway_arn(arn: str) -> APIGatewayRouteArn: +def parse_api_gateway_arn(arn: str, is_websocket_authorizer: bool = False) -> APIGatewayRouteArn: """Parses a gateway route arn as a APIGatewayRouteArn class Parameters ---------- arn : str ARN string for a methodArn or a routeArn + is_websocket_authorizer: bool + If it's a API Gateway Websocket + Returns ------- APIGatewayRouteArn """ arn_parts = arn.split(":") api_gateway_arn_parts = arn_parts[5].split("/") + + if not is_websocket_authorizer: + http_method = api_gateway_arn_parts[2] + resource = "/".join(api_gateway_arn_parts[3:]) if len(api_gateway_arn_parts) >= 4 else "" + else: + http_method = None + resource = "/".join(api_gateway_arn_parts[2:]) + return APIGatewayRouteArn( partition=arn_parts[1], region=arn_parts[3], aws_account_id=arn_parts[4], api_id=api_gateway_arn_parts[0], stage=api_gateway_arn_parts[1], - http_method=api_gateway_arn_parts[2], + http_method=http_method, # conditional allow us to handle /path/{proxy+} resources, as their length changes. - resource="/".join(api_gateway_arn_parts[3:]) if len(api_gateway_arn_parts) >= 4 else "", + resource=resource, + is_websocket_authorizer=is_websocket_authorizer, ) @@ -512,13 +528,14 @@ def _add_route(self, effect: str, http_method: str, resource: str, conditions: l raise ValueError(f"Invalid resource path: {resource}. Path should match {self.path_regex}") resource_arn = APIGatewayRouteArn( - self.region, - self.aws_account_id, - self.api_id, - self.stage, - http_method, - resource, - self.partition, + region=self.region, + aws_account_id=self.aws_account_id, + api_id=self.api_id, + stage=self.stage, + http_method=http_method, + resource=resource, + partition=self.partition, + is_websocket_authorizer=False, ).arn route = {"resourceArn": resource_arn, "conditions": conditions} @@ -617,3 +634,127 @@ def asdict(self) -> dict[str, Any]: response["context"] = self.context return response + + +class APIGatewayAuthorizerResponseWebSocket(APIGatewayAuthorizerResponse): + """The IAM Policy Response required for API Gateway WebSocket APIs + + Based on: - https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints/blob/\ + master/blueprints/python/api-gateway-authorizer-python.py + + Documentation: + ------------- + - https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html + - https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html + """ + + @staticmethod + def from_route_arn( + arn: str, + principal_id: str, + context: dict | None = None, + usage_identifier_key: str | None = None, + ) -> APIGatewayAuthorizerResponseWebSocket: + parsed_arn = parse_api_gateway_arn(arn, is_websocket_authorizer=True) + return APIGatewayAuthorizerResponseWebSocket( + principal_id, + parsed_arn.region, + parsed_arn.aws_account_id, + parsed_arn.api_id, + parsed_arn.stage, + context, + usage_identifier_key, + ) + + # Note: we need ignore[override] because we are removing the http_method field + @override + def _add_route(self, effect: str, resource: str, conditions: list[dict] | None = None): # type: ignore[override] + """Adds a route to the internal lists of allowed or denied routes. Each object in + the internal list contains a resource ARN and a condition statement. The condition + statement can be null.""" + resource_arn = APIGatewayRouteArn( + region=self.region, + aws_account_id=self.aws_account_id, + api_id=self.api_id, + stage=self.stage, + http_method=None, + resource=resource, + partition=self.partition, + is_websocket_authorizer=True, + ).arn + + route = {"resourceArn": resource_arn, "conditions": conditions} + + if effect.lower() == "allow": + self._allow_routes.append(route) + else: # deny + self._deny_routes.append(route) + + @override + def allow_all_routes(self): + """Adds a '*' allow to the policy to authorize access to all methods of an API""" + self._add_route(effect="Allow", resource="*") + + @override + def deny_all_routes(self): + """Adds a '*' allow to the policy to deny access to all methods of an API""" + + self._add_route(effect="Deny", resource="*") + + # Note: we need ignore[override] because we are removing the http_method field + @override + def allow_route(self, resource: str, conditions: list[dict] | None = None): # type: ignore[override] + """ + Add an API Gateway Websocket method to the list of allowed methods for the policy. + + This method adds an API Gateway Websocket method Resource path) to the list of + allowed methods for the policy. It optionally includes conditions for the policy statement. + + Parameters + ---------- + resource : str + The API Gateway resource path to allow. + conditions : list[dict] | None, optional + A list of condition dictionaries to apply to the policy statement. + Default is None. + + Notes + ----- + For more information on AWS policy conditions, see: + https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Condition + + Example + -------- + >>> policy = APIGatewayAuthorizerResponseWebSocket(...) + >>> policy.allow_route("/api/users", [{"StringEquals": {"aws:RequestTag/Environment": "Production"}}]) + """ + self._add_route(effect="Allow", resource=resource, conditions=conditions) + + # Note: we need ignore[override] because we are removing the http_method field + @override + def deny_route(self, resource: str, conditions: list[dict] | None = None): # type: ignore[override] + """ + Add an API Gateway Websocket method to the list of allowed methods for the policy. + + This method adds an API Gateway Websocket method Resource path) to the list of + denied methods for the policy. It optionally includes conditions for the policy statement. + + Parameters + ---------- + resource : str + The API Gateway resource path to allow. + conditions : list[dict] | None, optional + A list of condition dictionaries to apply to the policy statement. + Default is None. + + Notes + ----- + For more information on AWS policy conditions, see: + https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Condition + + Example + -------- + >>> policy = APIGatewayAuthorizerResponseWebSocket(...) + >>> policy.deny_route("/api/users", [{"StringEquals": {"aws:RequestTag/Environment": "Production"}}]) + """ + self._add_route(effect="Deny", resource=resource, conditions=conditions) diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 5d102e69784..57bd2584ae5 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -131,12 +131,18 @@ It is used for [API Gateway Rest API Lambda Authorizer payload](https://docs.aws Use **`APIGatewayAuthorizerRequestEvent`** for type `REQUEST` and **`APIGatewayAuthorizerTokenEvent`** for type `TOKEN`. -=== "app.py" +=== "Rest APIs" - ```python hl_lines="2-4 8" + ```python hl_lines="2-4 8 18" --8<-- "examples/event_sources/src/apigw_authorizer_request.py" ``` +=== "WebSocket APIs" + + ```python hl_lines="2-4 8 18" + --8<-- "examples/event_sources/src/apigw_authorizer_request_websocket.py" + ``` + === "API Gateway Authorizer Request Example Event" ```json hl_lines="3 11" diff --git a/examples/event_sources/src/apigw_authorizer_request_websocket.py b/examples/event_sources/src/apigw_authorizer_request_websocket.py new file mode 100644 index 00000000000..441d27c483d --- /dev/null +++ b/examples/event_sources/src/apigw_authorizer_request_websocket.py @@ -0,0 +1,29 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( + APIGatewayAuthorizerRequestEvent, + APIGatewayAuthorizerResponseWebSocket, +) + + +@event_source(data_class=APIGatewayAuthorizerRequestEvent) +def lambda_handler(event: APIGatewayAuthorizerRequestEvent, context): + # Simple auth check (replace with your actual auth logic) + is_authorized = event.headers.get("HeaderAuth1") == "headerValue1" + + if not is_authorized: + return {"principalId": "", "policyDocument": {"Version": "2012-10-17", "Statement": []}} + + arn = event.parsed_arn + + policy = APIGatewayAuthorizerResponseWebSocket( + principal_id="user", + context={"user": "example"}, + region=arn.region, + aws_account_id=arn.aws_account_id, + api_id=arn.api_id, + stage=arn.stage, + ) + + policy.allow_all_routes() + + return policy.asdict() diff --git a/tests/events/apiGatewayAuthorizerWebSocketEvent.json b/tests/events/apiGatewayAuthorizerWebSocketEvent.json new file mode 100644 index 00000000000..f89b7449e1e --- /dev/null +++ b/tests/events/apiGatewayAuthorizerWebSocketEvent.json @@ -0,0 +1,81 @@ +{ + "type":"REQUEST", + "methodArn":"arn:aws:execute-api:us-east-1:533568316194:c5jwxq709g/production/$connect", + "headers":{ + "Authorization":"Leo", + "Connection":"upgrade", + "content-length":"0", + "Host":"c5jwxq709g.execute-api.us-east-1.amazonaws.com", + "Sec-WebSocket-Extensions":"permessage-deflate; client_max_window_bits", + "Sec-WebSocket-Version":"13", + "Upgrade":"websocket", + "X-Amzn-Trace-Id":"Root=1-6797b6d3-64f9c928577f3ac56f5368ce", + "X-Forwarded-For":"93.108.161.96", + "X-Forwarded-Port":"443", + "X-Forwarded-Proto":"https" + }, + "multiValueHeaders":{ + "Authorization":[ + "Leo" + ], + "Connection":[ + "upgrade" + ], + "content-length":[ + "0" + ], + "Host":[ + "c5jwxq709g.execute-api.us-east-1.amazonaws.com" + ], + "Sec-WebSocket-Extensions":[ + "permessage-deflate; client_max_window_bits" + ], + "Sec-WebSocket-Key":[ + "CYZZrfNgEcgzzzwL44qytQ==" + ], + "Sec-WebSocket-Version":[ + "13" + ], + "Upgrade":[ + "websocket" + ], + "X-Amzn-Trace-Id":[ + "Root=1-6797b6d3-64f9c928577f3ac56f5368ce" + ], + "X-Forwarded-For":[ + "93.108.161.96" + ], + "X-Forwarded-Port":[ + "443" + ], + "X-Forwarded-Proto":[ + "https" + ] + }, + "queryStringParameters":{ + + }, + "multiValueQueryStringParameters":{ + + }, + "stageVariables":{ + + }, + "requestContext":{ + "routeKey":"$connect", + "eventType":"CONNECT", + "extendedRequestId":"FDmBIG3EoAMEqYA=", + "requestTime":"27/Jan/2025:16:39:47 +0000", + "messageDirection":"IN", + "stage":"production", + "connectedAt":1737995987617, + "requestTimeEpoch":1737995987617, + "identity":{ + "sourceIp":"93.108.161.96" + }, + "requestId":"FDmBIG3EoAMEqYA=", + "domainName":"c5jwxq709g.execute-api.us-east-1.amazonaws.com", + "connectionId":"FDmBIeapIAMCIQg=", + "apiId":"c5jwxq709g" + } +} diff --git a/tests/unit/data_classes/required_dependencies/test_api_gateway_authorizer_websocket_event.py b/tests/unit/data_classes/required_dependencies/test_api_gateway_authorizer_websocket_event.py new file mode 100644 index 00000000000..d1f0d10735b --- /dev/null +++ b/tests/unit/data_classes/required_dependencies/test_api_gateway_authorizer_websocket_event.py @@ -0,0 +1,181 @@ +import pytest + +from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( + DENY_ALL_RESPONSE, + APIGatewayAuthorizerResponseWebSocket, +) + + +@pytest.fixture +def builder(): + return APIGatewayAuthorizerResponseWebSocket("foo", "us-west-1", "123456789", "fantom", "dev") + + +def test_authorizer_response_no_statement(builder: APIGatewayAuthorizerResponseWebSocket): + # GIVEN a builder with no statements + with pytest.raises(ValueError) as ex: + # WHEN calling build + builder.asdict() + + # THEN raise a name error for not statements + assert str(ex.value) == "No statements defined for the policy" + + +def test_authorizer_response_allow_all_routes_with_context(): + arn = "arn:aws:execute-api:us-west-1:123456789:fantom/dev/$connect" + builder = APIGatewayAuthorizerResponseWebSocket.from_route_arn(arn, principal_id="foo", context={"name": "Foo"}) + builder.allow_all_routes() + assert builder.asdict() == { + "principalId": "foo", + "policyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": "execute-api:Invoke", + "Effect": "Allow", + "Resource": ["arn:aws:execute-api:us-west-1:123456789:fantom/dev/*"], + }, + ], + }, + "context": {"name": "Foo"}, + } + + +def test_authorizer_response_allow_all_routes_with_usage_identifier_key(): + arn = "arn:aws:execute-api:us-east-1:1111111111:api/dev/y" + builder = APIGatewayAuthorizerResponseWebSocket.from_route_arn(arn, principal_id="cow", usage_identifier_key="key") + builder.allow_all_routes() + assert builder.asdict() == { + "principalId": "cow", + "policyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": "execute-api:Invoke", + "Effect": "Allow", + "Resource": ["arn:aws:execute-api:us-east-1:1111111111:api/dev/*"], + }, + ], + }, + "usageIdentifierKey": "key", + } + + +def test_authorizer_response_deny_all_routes(builder: APIGatewayAuthorizerResponseWebSocket): + builder.deny_all_routes() + assert builder.asdict() == { + "principalId": "foo", + "policyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": "execute-api:Invoke", + "Effect": "Deny", + "Resource": ["arn:aws:execute-api:us-west-1:123456789:fantom/dev/*"], + }, + ], + }, + } + + +def test_authorizer_response_allow_route(builder: APIGatewayAuthorizerResponseWebSocket): + builder.allow_route(resource="/foo") + assert builder.asdict() == { + "policyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": "execute-api:Invoke", + "Effect": "Allow", + "Resource": ["arn:aws:execute-api:us-west-1:123456789:fantom/dev/foo"], + }, + ], + }, + "principalId": "foo", + } + + +def test_authorizer_response_deny_route(builder: APIGatewayAuthorizerResponseWebSocket): + builder.deny_route(resource="foo") + assert builder.asdict() == { + "principalId": "foo", + "policyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": "execute-api:Invoke", + "Effect": "Deny", + "Resource": ["arn:aws:execute-api:us-west-1:123456789:fantom/dev/foo"], + }, + ], + }, + } + + +def test_authorizer_response_allow_route_with_conditions(builder: APIGatewayAuthorizerResponseWebSocket): + condition = {"StringEquals": {"method.request.header.Content-Type": "text/html"}} + builder.allow_route( + resource="/foo", + conditions=[condition], + ) + assert builder.asdict() == { + "principalId": "foo", + "policyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": "execute-api:Invoke", + "Effect": "Allow", + "Resource": ["arn:aws:execute-api:us-west-1:123456789:fantom/dev/foo"], + "Condition": [{"StringEquals": {"method.request.header.Content-Type": "text/html"}}], + }, + ], + }, + } + + +def test_authorizer_response_deny_route_with_conditions(builder: APIGatewayAuthorizerResponseWebSocket): + condition = {"StringEquals": {"method.request.header.Content-Type": "application/json"}} + builder.deny_route(resource="/foo", conditions=[condition]) + assert builder.asdict() == { + "principalId": "foo", + "policyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": "execute-api:Invoke", + "Effect": "Deny", + "Resource": ["arn:aws:execute-api:us-west-1:123456789:fantom/dev/foo"], + "Condition": [{"StringEquals": {"method.request.header.Content-Type": "application/json"}}], + }, + ], + }, + } + + +def test_deny_all(): + # CHECK we always explicitly deny all + statements = DENY_ALL_RESPONSE["policyDocument"]["Statement"] + assert len(statements) == 1 + assert statements[0] == { + "Action": "execute-api:Invoke", + "Effect": "Deny", + "Resource": ["*"], + } + + +def test_authorizer_response_allow_route_with_underscore(builder: APIGatewayAuthorizerResponseWebSocket): + builder.allow_route(resource="/has_underscore") + assert builder.asdict() == { + "principalId": "foo", + "policyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": "execute-api:Invoke", + "Effect": "Allow", + "Resource": ["arn:aws:execute-api:us-west-1:123456789:fantom/dev/has_underscore"], + }, + ], + }, + } From 37d349017386dcc98f1af3ab1112c58d32ebf201 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 21:49:48 +0000 Subject: [PATCH 117/139] chore(deps): bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.20 to 3.0.21 (#6064) chore(deps): bump zgosalvez/github-actions-ensure-sha-pinned-actions Bumps [zgosalvez/github-actions-ensure-sha-pinned-actions](https://github.com/zgosalvez/github-actions-ensure-sha-pinned-actions) from 3.0.20 to 3.0.21. - [Release notes](https://github.com/zgosalvez/github-actions-ensure-sha-pinned-actions/releases) - [Commits](https://github.com/zgosalvez/github-actions-ensure-sha-pinned-actions/compare/c3a2b64f69b7a1542a68f44d9edbd9ec3fc1455e...6eb1abde32fed00453b0d03497f4ba4fecba146d) --- updated-dependencies: - dependency-name: zgosalvez/github-actions-ensure-sha-pinned-actions dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/secure_workflows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/secure_workflows.yml b/.github/workflows/secure_workflows.yml index 8056b6e43b6..4344f150595 100644 --- a/.github/workflows/secure_workflows.yml +++ b/.github/workflows/secure_workflows.yml @@ -32,7 +32,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Ensure 3rd party workflows have SHA pinned - uses: zgosalvez/github-actions-ensure-sha-pinned-actions@c3a2b64f69b7a1542a68f44d9edbd9ec3fc1455e # v3.0.20 + uses: zgosalvez/github-actions-ensure-sha-pinned-actions@6eb1abde32fed00453b0d03497f4ba4fecba146d # v3.0.21 with: allowlist: | slsa-framework/slsa-github-generator From b7d16548344daaa3dcc0ec40c865d7238e01c48d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 21:52:21 +0000 Subject: [PATCH 118/139] chore(deps-dev): bump mkdocs-material from 9.6.2 to 9.6.3 (#6065) Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.6.2 to 9.6.3. - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.2...9.6.3) --- updated-dependencies: - dependency-name: mkdocs-material dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index a624f5eefd8..36ca9c83b11 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2454,13 +2454,13 @@ mkdocs = ">=0.17" [[package]] name = "mkdocs-material" -version = "9.6.2" +version = "9.6.3" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.6.2-py3-none-any.whl", hash = "sha256:71d90dbd63b393ad11a4d90151dfe3dcbfcd802c0f29ce80bebd9bbac6abc753"}, - {file = "mkdocs_material-9.6.2.tar.gz", hash = "sha256:a3de1c5d4c745f10afa78b1a02f917b9dce0808fb206adc0f5bb48b58c1ca21f"}, + {file = "mkdocs_material-9.6.3-py3-none-any.whl", hash = "sha256:1125622067e26940806701219303b27c0933e04533560725d97ec26fd16a39cf"}, + {file = "mkdocs_material-9.6.3.tar.gz", hash = "sha256:c87f7d1c39ce6326da5e10e232aed51bae46252e646755900f4b0fc9192fa832"}, ] [package.dependencies] From 914de8511f0ac0688ef9c2aa81db67eedbae144d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 21:52:46 +0000 Subject: [PATCH 119/139] chore(deps-dev): bump coverage from 7.6.10 to 7.6.11 (#6067) Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.6.10 to 7.6.11. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.6.10...7.6.11) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 121 +++++++++++++++++++++++++--------------------------- 1 file changed, 58 insertions(+), 63 deletions(-) diff --git a/poetry.lock b/poetry.lock index 36ca9c83b11..81be3735ef4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1266,73 +1266,68 @@ typeguard = ">=2.13.3,<2.14.0" [[package]] name = "coverage" -version = "7.6.10" +version = "7.6.11" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, - {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, - {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"}, - {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"}, - {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"}, - {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"}, - {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"}, - {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"}, - {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"}, - {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"}, - {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"}, - {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"}, - {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"}, - {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"}, - {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"}, - {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"}, - {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"}, - {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"}, - {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"}, - {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"}, - {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"}, - {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"}, - {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"}, - {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"}, - {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"}, - {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"}, - {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"}, - {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"}, - {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"}, - {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"}, - {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"}, - {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"}, - {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"}, - {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"}, - {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"}, - {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"}, - {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"}, - {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"}, - {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"}, - {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"}, - {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"}, - {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"}, - {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"}, - {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"}, - {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"}, - {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"}, - {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"}, - {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"}, - {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"}, - {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"}, - {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"}, - {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"}, - {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"}, - {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"}, - {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"}, - {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"}, - {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"}, - {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"}, - {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"}, - {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"}, - {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"}, - {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"}, + {file = "coverage-7.6.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eafea49da254a8289bed3fab960f808b322eda5577cb17a3733014928bbfbebd"}, + {file = "coverage-7.6.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a3f7cbbcb4ad95067a6525f83a6fc78d9cbc1e70f8abaeeaeaa72ef34f48fc3"}, + {file = "coverage-7.6.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de6b079b39246a7da9a40cfa62d5766bd52b4b7a88cf5a82ec4c45bf6e152306"}, + {file = "coverage-7.6.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60d4ad09dfc8c36c4910685faafcb8044c84e4dae302e86c585b3e2e7778726c"}, + {file = "coverage-7.6.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e433b6e3a834a43dae2889adc125f3fa4c66668df420d8e49bc4ee817dd7a70"}, + {file = "coverage-7.6.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ac5d92e2cc121a13270697e4cb37e1eb4511ac01d23fe1b6c097facc3b46489e"}, + {file = "coverage-7.6.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5128f3ba694c0a1bde55fc480090392c336236c3e1a10dad40dc1ab17c7675ff"}, + {file = "coverage-7.6.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:397489c611b76302dfa1d9ea079e138dddc4af80fc6819d5f5119ec8ca6c0e47"}, + {file = "coverage-7.6.11-cp310-cp310-win32.whl", hash = "sha256:c7719a5e1dc93883a6b319bc0374ecd46fb6091ed659f3fbe281ab991634b9b0"}, + {file = "coverage-7.6.11-cp310-cp310-win_amd64.whl", hash = "sha256:c27df03730059118b8a923cfc8b84b7e9976742560af528242f201880879c1da"}, + {file = "coverage-7.6.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:532fe139691af134aa8b54ed60dd3c806aa81312d93693bd2883c7b61592c840"}, + {file = "coverage-7.6.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0b0f272901a5172090c0802053fbc503cdc3fa2612720d2669a98a7384a7bec"}, + {file = "coverage-7.6.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4bda710139ea646890d1c000feb533caff86904a0e0638f85e967c28cb8eec50"}, + {file = "coverage-7.6.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a165b09e7d5f685bf659063334a9a7b1a2d57b531753d3e04bd442b3cfe5845b"}, + {file = "coverage-7.6.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ff136607689c1c87f43d24203b6d2055b42030f352d5176f9c8b204d4235ef27"}, + {file = "coverage-7.6.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:050172741de03525290e67f0161ae5f7f387c88fca50d47fceb4724ceaa591d2"}, + {file = "coverage-7.6.11-cp311-cp311-win32.whl", hash = "sha256:27700d859be68e4fb2e7bf774cf49933dcac6f81a9bc4c13bd41735b8d26a53b"}, + {file = "coverage-7.6.11-cp311-cp311-win_amd64.whl", hash = "sha256:cd4839813b09ab1dd1be1bbc74f9a7787615f931f83952b6a9af1b2d3f708bf7"}, + {file = "coverage-7.6.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dbb1a822fd858d9853333a7c95d4e70dde9a79e65893138ce32c2ec6457d7a36"}, + {file = "coverage-7.6.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61c834cbb80946d6ebfddd9b393a4c46bec92fcc0fa069321fcb8049117f76ea"}, + {file = "coverage-7.6.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a46d56e99a31d858d6912d31ffa4ede6a325c86af13139539beefca10a1234ce"}, + {file = "coverage-7.6.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b48db06f53d1864fea6dbd855e6d51d41c0f06c212c3004511c0bdc6847b297"}, + {file = "coverage-7.6.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6ff5be3b1853e0862da9d349fe87f869f68e63a25f7c37ce1130b321140f963"}, + {file = "coverage-7.6.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be05bde21d5e6eefbc3a6de6b9bee2b47894b8945342e8663192809c4d1f08ce"}, + {file = "coverage-7.6.11-cp312-cp312-win32.whl", hash = "sha256:e3b746fa0ffc5b6b8856529de487da8b9aeb4fb394bb58de6502ef45f3434f12"}, + {file = "coverage-7.6.11-cp312-cp312-win_amd64.whl", hash = "sha256:ac476e6d0128fb7919b3fae726de72b28b5c9644cb4b579e4a523d693187c551"}, + {file = "coverage-7.6.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c86f4c7a6d1a54a24d804d9684d96e36a62d3ef7c0d7745ae2ea39e3e0293251"}, + {file = "coverage-7.6.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7eb0504bb307401fd08bc5163a351df301438b3beb88a4fa044681295bbefc67"}, + {file = "coverage-7.6.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca95d40900cf614e07f00cee8c2fad0371df03ca4d7a80161d84be2ec132b7a4"}, + {file = "coverage-7.6.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db4b1a69976b1b02acda15937538a1d3fe10b185f9d99920b17a740a0a102e06"}, + {file = "coverage-7.6.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf96beb05d004e4c51cd846fcdf9eee9eb2681518524b66b2e7610507944c2f"}, + {file = "coverage-7.6.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:08e5fb93576a6b054d3d326242af5ef93daaac9bb52bc25f12ccbc3fa94227cd"}, + {file = "coverage-7.6.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25575cd5a7d2acc46b42711e8aff826027c0e4f80fb38028a74f31ac22aae69d"}, + {file = "coverage-7.6.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8fa4fffd90ee92f62ff7404b4801b59e8ea8502e19c9bf2d3241ce745b52926c"}, + {file = "coverage-7.6.11-cp313-cp313-win32.whl", hash = "sha256:0d03c9452d9d1ccfe5d3a5df0427705022a49b356ac212d529762eaea5ef97b4"}, + {file = "coverage-7.6.11-cp313-cp313-win_amd64.whl", hash = "sha256:fd2fffc8ce8692ce540103dff26279d2af22d424516ddebe2d7e4d6dbb3816b2"}, + {file = "coverage-7.6.11-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:5e7ac966ab110bd94ee844f2643f196d78fde1cd2450399116d3efdd706e19f5"}, + {file = "coverage-7.6.11-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ba27a0375c5ef4d2a7712f829265102decd5ff78b96d342ac2fa555742c4f4f"}, + {file = "coverage-7.6.11-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2778be4f574b39ec9dcd9e5e13644f770351ee0990a0ecd27e364aba95af89b"}, + {file = "coverage-7.6.11-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5edc16712187139ab635a2e644cc41fc239bc6d245b16124045743130455c652"}, + {file = "coverage-7.6.11-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6ff122a0a10a30121d9f0cb3fbd03a6fe05861e4ec47adb9f25e9245aabc19"}, + {file = "coverage-7.6.11-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ff562952f15eff27247a4c4b03e45ce8a82e3fb197de6a7c54080f9d4ba07845"}, + {file = "coverage-7.6.11-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4f21e3617f48d683f30cf2a6c8b739c838e600cb1454fe6b2eb486ac2bce8fbd"}, + {file = "coverage-7.6.11-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6d60577673ba48d8ae8e362e61fd4ad1a640293ffe8991d11c86f195479100b7"}, + {file = "coverage-7.6.11-cp313-cp313t-win32.whl", hash = "sha256:13100f98497086b359bf56fc035a762c674de8ef526daa389ac8932cb9bff1e0"}, + {file = "coverage-7.6.11-cp313-cp313t-win_amd64.whl", hash = "sha256:2c81e53782043b323bd34c7de711ed9b4673414eb517eaf35af92185b873839c"}, + {file = "coverage-7.6.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ff52b4e2ac0080c96e506819586c4b16cdbf46724bda90d308a7330a73cc8521"}, + {file = "coverage-7.6.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f4679fcc9eb9004fdd1b00231ef1ec7167168071bebc4d66327e28c1979b4449"}, + {file = "coverage-7.6.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90de4e9ca4489e823138bd13098af9ac8028cc029f33f60098b5c08c675c7bda"}, + {file = "coverage-7.6.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c96a142057d83ee993eaf71629ca3fb952cda8afa9a70af4132950c2bd3deb9"}, + {file = "coverage-7.6.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:476f29a258b9cd153f2be5bf5f119d670d2806363595263917bddc167d6e5cce"}, + {file = "coverage-7.6.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:09d03f48d9025b8a6a116cddcb6c7b8ce80e4fb4c31dd2e124a7c377036ad58e"}, + {file = "coverage-7.6.11-cp39-cp39-win32.whl", hash = "sha256:bb35ae9f134fbd9cf7302a9654d5a1e597c974202678082dcc569eb39a8cde03"}, + {file = "coverage-7.6.11-cp39-cp39-win_amd64.whl", hash = "sha256:f382004fa4c93c01016d9226b9d696a08c53f6818b7ad59b4e96cb67e863353a"}, + {file = "coverage-7.6.11-pp39.pp310-none-any.whl", hash = "sha256:adc2d941c0381edfcf3897f94b9f41b1e504902fab78a04b1677f2f72afead4b"}, + {file = "coverage-7.6.11-py3-none-any.whl", hash = "sha256:f0f334ae844675420164175bf32b04e18a81fe57ad8eb7e0cfd4689d681ffed7"}, + {file = "coverage-7.6.11.tar.gz", hash = "sha256:e642e6a46a04e992ebfdabed79e46f478ec60e2c528e1e1a074d63800eda4286"}, ] [package.dependencies] From 0cd5bbece0774d326e3fed787a4dbd58d61f18a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 21:53:58 +0000 Subject: [PATCH 120/139] chore(deps-dev): bump ruff from 0.9.5 to 0.9.6 (#6066) Bumps [ruff](https://github.com/astral-sh/ruff) from 0.9.5 to 0.9.6. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.9.5...0.9.6) --- updated-dependencies: - dependency-name: ruff dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 40 ++++++++++++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/poetry.lock b/poetry.lock index 81be3735ef4..168d83758ca 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3817,29 +3817,29 @@ files = [ [[package]] name = "ruff" -version = "0.9.5" +version = "0.9.6" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.9.5-py3-none-linux_armv6l.whl", hash = "sha256:d466d2abc05f39018d53f681fa1c0ffe9570e6d73cde1b65d23bb557c846f442"}, - {file = "ruff-0.9.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38840dbcef63948657fa7605ca363194d2fe8c26ce8f9ae12eee7f098c85ac8a"}, - {file = "ruff-0.9.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d56ba06da53536b575fbd2b56517f6f95774ff7be0f62c80b9e67430391eeb36"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7cb2a01da08244c50b20ccfaeb5972e4228c3c3a1989d3ece2bc4b1f996001"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96d5c76358419bc63a671caac70c18732d4fd0341646ecd01641ddda5c39ca0b"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:deb8304636ed394211f3a6d46c0e7d9535b016f53adaa8340139859b2359a070"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:df455000bf59e62b3e8c7ba5ed88a4a2bc64896f900f311dc23ff2dc38156440"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de92170dfa50c32a2b8206a647949590e752aca8100a0f6b8cefa02ae29dce80"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d28532d73b1f3f627ba88e1456f50748b37f3a345d2be76e4c653bec6c3e393"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c746d7d1df64f31d90503ece5cc34d7007c06751a7a3bbeee10e5f2463d52d2"}, - {file = "ruff-0.9.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11417521d6f2d121fda376f0d2169fb529976c544d653d1d6044f4c5562516ee"}, - {file = "ruff-0.9.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b9d71c3879eb32de700f2f6fac3d46566f644a91d3130119a6378f9312a38e1"}, - {file = "ruff-0.9.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2e36c61145e70febcb78483903c43444c6b9d40f6d2f800b5552fec6e4a7bb9a"}, - {file = "ruff-0.9.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2f71d09aeba026c922aa7aa19a08d7bd27c867aedb2f74285a2639644c1c12f5"}, - {file = "ruff-0.9.5-py3-none-win32.whl", hash = "sha256:134f958d52aa6fdec3b294b8ebe2320a950d10c041473c4316d2e7d7c2544723"}, - {file = "ruff-0.9.5-py3-none-win_amd64.whl", hash = "sha256:78cc6067f6d80b6745b67498fb84e87d32c6fc34992b52bffefbdae3442967d6"}, - {file = "ruff-0.9.5-py3-none-win_arm64.whl", hash = "sha256:18a29f1a005bddb229e580795627d297dfa99f16b30c7039e73278cf6b5f9fa9"}, - {file = "ruff-0.9.5.tar.gz", hash = "sha256:11aecd7a633932875ab3cb05a484c99970b9d52606ce9ea912b690b02653d56c"}, + {file = "ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba"}, + {file = "ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504"}, + {file = "ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217"}, + {file = "ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6"}, + {file = "ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897"}, + {file = "ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08"}, + {file = "ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656"}, + {file = "ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d"}, + {file = "ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa"}, + {file = "ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a"}, + {file = "ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9"}, ] [[package]] @@ -4628,4 +4628,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "d37a4b63b020d2257321698500e9e25dc419897c5f516526ad7d4f6d5d9362b3" +content-hash = "9f429270dfd274c938e728842aa9412fe3f71a8be4daa282e52eeff1be881079" diff --git a/pyproject.toml b/pyproject.toml index bb6f4da3249..ad1fc7b1d95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -113,7 +113,7 @@ types-python-dateutil = "^2.8.19.6" aws-cdk-aws-appsync-alpha = "^2.59.0a0" httpx = ">=0.23.3,<0.29.0" sentry-sdk = ">=1.22.2,<3.0.0" -ruff = ">=0.5.1,<0.9.6" +ruff = ">=0.5.1,<0.9.7" retry2 = "^0.9.5" pytest-socket = ">=0.6,<0.8" types-redis = "^4.6.0.7" From 6751805e26c0d2e705e750e7eef3e35b70fc578e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Falc=C3=A3o?= Date: Tue, 11 Feb 2025 05:59:20 -0300 Subject: [PATCH 121/139] feat(metrics): disable metrics flush via environment variables (#6046) * disable metrics env var cloudwatch * add for datadog * add tests * acept none env var * fix is disable metrics * add documentation * fix mypy * add datadog tests * disable when powertools dev * add disable to flush * remove print * Changing metrics flush decision * Changing metrics flush decision --------- Co-authored-by: Leandro Damascena --- aws_lambda_powertools/metrics/functions.py | 27 +++ aws_lambda_powertools/metrics/metrics.py | 2 + .../provider/cloudwatch_emf/cloudwatch.py | 6 +- .../metrics/provider/datadog/datadog.py | 5 +- aws_lambda_powertools/shared/constants.py | 1 + docs/core/metrics.md | 16 +- docs/core/metrics/datadog.md | 14 +- docs/index.md | 1 + .../metrics/datadog/test_metrics_datadog.py | 160 ++++++++++++++++++ .../test_metrics_cloudwatch_emf.py | 157 +++++++++++++++++ 10 files changed, 375 insertions(+), 14 deletions(-) diff --git a/aws_lambda_powertools/metrics/functions.py b/aws_lambda_powertools/metrics/functions.py index 14c68e88275..75bf0855e18 100644 --- a/aws_lambda_powertools/metrics/functions.py +++ b/aws_lambda_powertools/metrics/functions.py @@ -1,5 +1,6 @@ from __future__ import annotations +import os from datetime import datetime from aws_lambda_powertools.metrics.provider.cloudwatch_emf.exceptions import ( @@ -8,6 +9,7 @@ ) from aws_lambda_powertools.metrics.provider.cloudwatch_emf.metric_properties import MetricResolution, MetricUnit from aws_lambda_powertools.shared import constants +from aws_lambda_powertools.shared.functions import strtobool def extract_cloudwatch_metric_resolution_value(metric_resolutions: list, resolution: int | MetricResolution) -> int: @@ -134,3 +136,28 @@ def convert_timestamp_to_emf_format(timestamp: int | datetime) -> int: # Returning zero represents the initial date of epoch time, # which will be skipped by Amazon CloudWatch. return 0 + + +def is_metrics_disabled() -> bool: + """ + Determine if metrics should be disabled based on environment variables. + + Returns: + bool: True if metrics are disabled, False otherwise. + + Rules: + - If POWERTOOLS_DEV is True and POWERTOOLS_METRICS_DISABLED is True: Disable metrics + - If POWERTOOLS_METRICS_DISABLED is True: Disable metrics + - If POWERTOOLS_DEV is True and POWERTOOLS_METRICS_DISABLED is not set: Disable metrics + """ + + is_dev_mode = strtobool(os.getenv(constants.POWERTOOLS_DEV_ENV, "false")) + is_metrics_disabled = strtobool(os.getenv(constants.METRICS_DISABLED_ENV, "false")) + + disable_conditions = [ + is_metrics_disabled, + is_metrics_disabled and is_dev_mode, + is_dev_mode and os.getenv(constants.METRICS_DISABLED_ENV) is None, + ] + + return any(disable_conditions) diff --git a/aws_lambda_powertools/metrics/metrics.py b/aws_lambda_powertools/metrics/metrics.py index 0bcf54917ed..a6493f25516 100644 --- a/aws_lambda_powertools/metrics/metrics.py +++ b/aws_lambda_powertools/metrics/metrics.py @@ -47,6 +47,8 @@ def lambda_handler(): metric namespace POWERTOOLS_SERVICE_NAME : str service name used for default dimension + POWERTOOLS_METRICS_DISABLED: bool + Powertools metrics disabled (e.g. `"true", "True", "TRUE"`) Parameters ---------- diff --git a/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py b/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py index 7a7db86c9c6..65c5b619f57 100644 --- a/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +++ b/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py @@ -15,6 +15,7 @@ convert_timestamp_to_emf_format, extract_cloudwatch_metric_resolution_value, extract_cloudwatch_metric_unit_value, + is_metrics_disabled, validate_emf_timestamp, ) from aws_lambda_powertools.metrics.provider.base import BaseProvider @@ -77,6 +78,7 @@ def __init__( self.default_dimensions = default_dimensions or {} self.namespace = resolve_env_var_choice(choice=namespace, env=os.getenv(constants.METRICS_NAMESPACE_ENV)) self.service = resolve_env_var_choice(choice=service, env=os.getenv(constants.SERVICE_NAME_ENV)) + self.metadata_set = metadata_set if metadata_set is not None else {} self.timestamp: int | None = None @@ -127,6 +129,7 @@ def add_metric( MetricResolutionError When metric resolution is not supported by CloudWatch """ + if not isinstance(value, numbers.Number): raise MetricValueError(f"{value} is not a valid number") @@ -268,6 +271,7 @@ def add_dimension(self, name: str, value: str) -> None: value : str Dimension value """ + logger.debug(f"Adding dimension: {name}:{value}") if len(self.dimension_set) == MAX_DIMENSIONS: raise SchemaValidationError( @@ -374,7 +378,7 @@ def flush_metrics(self, raise_on_empty_metrics: bool = False) -> None: "If application metrics should never be empty, consider using 'raise_on_empty_metrics'", stacklevel=2, ) - else: + elif not is_metrics_disabled(): logger.debug("Flushing existing metrics") metrics = self.serialize_metric_set() print(json.dumps(metrics, separators=(",", ":"))) diff --git a/aws_lambda_powertools/metrics/provider/datadog/datadog.py b/aws_lambda_powertools/metrics/provider/datadog/datadog.py index 0442af3f86c..3e88523df38 100644 --- a/aws_lambda_powertools/metrics/provider/datadog/datadog.py +++ b/aws_lambda_powertools/metrics/provider/datadog/datadog.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING, Any from aws_lambda_powertools.metrics.exceptions import MetricValueError, SchemaValidationError +from aws_lambda_powertools.metrics.functions import is_metrics_disabled from aws_lambda_powertools.metrics.provider import BaseProvider from aws_lambda_powertools.metrics.provider.datadog.warnings import DatadogDataValidationWarning from aws_lambda_powertools.shared import constants @@ -99,7 +100,6 @@ def add_metric( >>> sales='sam' >>> ) """ - # validating metric name if not self._validate_datadog_metric_name(name): docs = "https://docs.datadoghq.com/metrics/custom_metrics/#naming-custom-metrics" @@ -180,6 +180,7 @@ def flush_metrics(self, raise_on_empty_metrics: bool = False) -> None: raise_on_empty_metrics : bool, optional raise exception if no metrics are emitted, by default False """ + if not raise_on_empty_metrics and len(self.metric_set) == 0: warnings.warn( "No application metrics to publish. The cold-start metric may be published if enabled. " @@ -200,7 +201,7 @@ def flush_metrics(self, raise_on_empty_metrics: bool = False) -> None: timestamp=metric_item["e"], tags=metric_item["t"], ) - else: + elif not is_metrics_disabled(): # dd module not found: flush to log, this format can be recognized via datadog log forwarder # https://github.com/Datadog/datadog-lambda-python/blob/main/datadog_lambda/metric.py#L77 for metric_item in metrics: diff --git a/aws_lambda_powertools/shared/constants.py b/aws_lambda_powertools/shared/constants.py index 9652e09a0b2..199f37d99bb 100644 --- a/aws_lambda_powertools/shared/constants.py +++ b/aws_lambda_powertools/shared/constants.py @@ -40,6 +40,7 @@ METRICS_NAMESPACE_ENV: str = "POWERTOOLS_METRICS_NAMESPACE" DATADOG_FLUSH_TO_LOG: str = "DD_FLUSH_TO_LOG" SERVICE_NAME_ENV: str = "POWERTOOLS_SERVICE_NAME" +METRICS_DISABLED_ENV: str = "POWERTOOLS_METRICS_DISABLED" # If the timestamp of log event is more than 2 hours in future, the log event is skipped. # If the timestamp of log event is more than 14 days in past, the log event is skipped. # See https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html diff --git a/docs/core/metrics.md b/docs/core/metrics.md index 6fdcf1fa043..88f0292231d 100644 --- a/docs/core/metrics.md +++ b/docs/core/metrics.md @@ -34,12 +34,16 @@ If you're new to Amazon CloudWatch, there are five terminologies you must be awa ???+ tip All examples shared in this documentation are available within the [project repository](https://github.com/aws-powertools/powertools-lambda-python/tree/develop/examples){target="_blank"}. -Metric has two global settings that will be used across all metrics emitted: +Metric has three global settings that will be used across all metrics emitted: -| Setting | Description | Environment variable | Constructor parameter | -| -------------------- | ------------------------------------------------------------------------------- | ------------------------------ | --------------------- | -| **Metric namespace** | Logical container where all metrics will be placed e.g. `ServerlessAirline` | `POWERTOOLS_METRICS_NAMESPACE` | `namespace` | -| **Service** | Optionally, sets **service** metric dimension across all metrics e.g. `payment` | `POWERTOOLS_SERVICE_NAME` | `service` | +| Setting | Description | Environment variable | Constructor parameter | +| ------------------------------- | ------------------------------------------------------------------------------- | ------------------------------ | --------------------- | +| **Metric namespace** | Logical container where all metrics will be placed e.g. `ServerlessAirline` | `POWERTOOLS_METRICS_NAMESPACE` | `namespace` | +| **Service** | Optionally, sets **service** metric dimension across all metrics e.g. `payment` | `POWERTOOLS_SERVICE_NAME` | `service` | +| **Disable Powertools Metrics** | Optionally, disables all Powertools metrics. | `POWERTOOLS_METRICS_DISABLED` | N/A | + +???+ info + `POWERTOOLS_METRICS_DISABLED` will not disable default metrics created by AWS services. ???+ tip Use your application or main service as the metric namespace to easily group all metrics. @@ -79,7 +83,7 @@ You can create metrics using `add_metric`, and you can create dimensions for all CloudWatch EMF supports a max of 100 metrics per batch. Metrics utility will flush all metrics when adding the 100th metric. Subsequent metrics (101th+) will be aggregated into a new EMF object, for your convenience. ???+ warning "Warning: Do not create metrics or dimensions outside the handler" - Metrics or dimensions added in the global scope will only be added during cold start. Disregard if you that's the intended behavior. + Metrics or dimensions added in the global scope will only be added during cold start. Disregard if that's the intended behavior. ### Adding high-resolution metrics diff --git a/docs/core/metrics/datadog.md b/docs/core/metrics/datadog.md index 3cf38e1c425..c5b9fdc35b8 100644 --- a/docs/core/metrics/datadog.md +++ b/docs/core/metrics/datadog.md @@ -23,7 +23,7 @@ stateDiagram-v2 DatadogExtension --> Datadog: async state LambdaExtension { - DatadogExtension + DatadogExtension } ``` @@ -174,10 +174,14 @@ This has the advantage of keeping cold start metric separate from your applicati You can use any of the following environment variables to configure `DatadogMetrics`: -| Setting | Description | Environment variable | Constructor parameter | -| -------------------- | -------------------------------------------------------------------------------- | ------------------------------ | --------------------- | -| **Metric namespace** | Logical container where all metrics will be placed e.g. `ServerlessAirline` | `POWERTOOLS_METRICS_NAMESPACE` | `namespace` | -| **Flush to log** | Use this when you want to flush metrics to be exported through Datadog Forwarder | `DD_FLUSH_TO_LOG` | `flush_to_log` | +| Setting | Description | Environment variable | Constructor parameter | +| ------------------------------ | -------------------------------------------------------------------------------- | ------------------------------ | --------------------- | +| **Metric namespace** | Logical container where all metrics will be placed e.g. `ServerlessAirline` | `POWERTOOLS_METRICS_NAMESPACE` | `namespace` | +| **Flush to log** | Use this when you want to flush metrics to be exported through Datadog Forwarder | `DD_FLUSH_TO_LOG` | `flush_to_log` | +| **Disable Powertools Metrics** | Optionally, disables all Powertools metrics. | `POWERTOOLS_METRICS_DISABLED` | N/A | + +???+ info + `POWERTOOLS_METRICS_DISABLED` will not disable default metrics created by AWS services. ## Advanced diff --git a/docs/index.md b/docs/index.md index f2155db96af..4f5c165f287 100644 --- a/docs/index.md +++ b/docs/index.md @@ -432,6 +432,7 @@ When `POWERTOOLS_DEV` is set to a truthy value (`1`, `true`), it'll have the fol | __Logger__ | Increase JSON indentation to 4. This will ease local debugging when running functions locally under emulators or direct calls while not affecting unit tests.

However, Amazon CloudWatch Logs view will degrade as each new line is treated as a new message. | | __Event Handler__ | Enable full traceback errors in the response, indent request/responses, and CORS in dev mode (`*`). | | __Tracer__ | Future-proof safety to disables tracing operations in non-Lambda environments. This already happens automatically in the Tracer utility. | +| __Metrics__ | Disables Powertools metrics emission by default.

However, this can be overridden by explicitly setting POWERTOOLS_METRICS_DISABLED=false, which takes precedence over the dev mode setting. | ## Debug mode diff --git a/tests/functional/metrics/datadog/test_metrics_datadog.py b/tests/functional/metrics/datadog/test_metrics_datadog.py index 2626b8755c6..631518287a0 100644 --- a/tests/functional/metrics/datadog/test_metrics_datadog.py +++ b/tests/functional/metrics/datadog/test_metrics_datadog.py @@ -334,3 +334,163 @@ def test_namespace_env_var(monkeypatch): # THEN namespace should match the explicitly passed variable and not the env var assert output[0]["m"] == f"{env_namespace}.item_sold" + + +def test_metrics_disabled_with_env_var(monkeypatch, capsys): + # GIVEN environment variable is set to disable metrics + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true") + + # WHEN metrics is initialized and adding metrics + metrics = DatadogMetrics() + metrics.add_metric(name="test_metric", value=1) + metrics.flush_metrics() + + # THEN no metrics should have been recorded + captured = capsys.readouterr() + assert not captured.out + + +def test_metrics_disabled_persists_after_flush(monkeypatch, capsys): + # GIVEN environment variable is set to disable metrics + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true") + metrics = DatadogMetrics() + + # WHEN multiple operations are performed with flush in between + metrics.add_metric(name="metric1", value=1) + metrics.flush_metrics() + + # THEN first flush should not emit any metrics + captured = capsys.readouterr() + assert not captured.out + + # WHEN adding and flushing more metrics + metrics.add_metric(name="metric2", value=2) + metrics.flush_metrics() + + # THEN second flush should also not emit any metrics + captured = capsys.readouterr() + assert not captured.out + + +def test_metrics_disabled_with_namespace(monkeypatch, capsys): + # GIVEN environment variable is set to disable metrics + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true") + + # WHEN metrics is initialized with namespace and service + metrics = DatadogMetrics(namespace="test_namespace") + metrics.add_metric(name="test_metric", value=1) + metrics.flush_metrics() + + # THEN no metrics should have been recorded + captured = capsys.readouterr() + assert not captured.out + + +def test_metrics_disabled_with_dev_mode_true(monkeypatch, capsys): + # GIVEN dev mode is enabled + monkeypatch.setenv("POWERTOOLS_DEV", "true") + + # WHEN metrics is initialized + metrics = DatadogMetrics(namespace="test") + metrics.add_metric(name="test_metric", value=1) + metrics.flush_metrics() + + # THEN no metrics should have been recorded + captured = capsys.readouterr() + assert not captured.out + + +def test_metrics_enabled_with_env_var_false(monkeypatch, capsys): + # GIVEN environment variable is set to enable metrics + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "false") + + # WHEN metrics is initialized with namespace and metrics added + metrics = DatadogMetrics(namespace="test") + metrics.add_metric(name="test_metric", value=1) + metrics.flush_metrics() + + # THEN Datadog metrics should be written to stdout + output = capsys.readouterr().out + metrics_output = json.loads(output) + + assert metrics_output + + +def test_metrics_enabled_with_env_var_not_set(monkeypatch, capsys): + # GIVEN environment variable is not set + monkeypatch.delenv("POWERTOOLS_METRICS_DISABLED", raising=False) + + # WHEN metrics is initialized with namespace and metrics added + metrics = DatadogMetrics(namespace="test") + metrics.add_metric(name="test_metric", value=1) + metrics.flush_metrics() + + # THEN metrics should be written to stdout + output = capsys.readouterr().out + metrics_output = json.loads(output) + + assert "test.test_metric" in metrics_output["m"] + + +def test_metrics_enabled_with_dev_mode_false(monkeypatch, capsys): + # GIVEN dev mode is disabled + monkeypatch.setenv("POWERTOOLS_DEV", "false") + + # WHEN metrics is initialized + metrics = DatadogMetrics(namespace="test") + metrics.add_metric(name="test_metric", value=1) + metrics.flush_metrics() + + # THEN metrics should be written to stdout + output = capsys.readouterr().out + metrics_output = json.loads(output) + assert metrics_output + + +def test_metrics_disabled_dev_mode_overrides_metrics_disabled(monkeypatch, capsys): + # GIVEN dev mode is enabled but metrics disabled is false + monkeypatch.setenv("POWERTOOLS_DEV", "true") + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "false") + + # WHEN metrics is initialized + metrics = DatadogMetrics(namespace="test") + metrics.add_metric(name="test_metric", value=1) + metrics.flush_metrics() + + # THEN metrics should be written to stdout since POWERTOOLS_METRICS_DISABLED is false + output = capsys.readouterr().out + assert output # First verify we have output + metrics_output = json.loads(output) + assert metrics_output # Then verify it's valid JSON + assert "test.test_metric" in metrics_output["m"] # Verify the metric is present + + +def test_metrics_enabled_with_both_false(monkeypatch, capsys): + # GIVEN both dev mode and metrics disabled are false + monkeypatch.setenv("POWERTOOLS_DEV", "false") + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "false") + + # WHEN metrics is initialized + metrics = DatadogMetrics(namespace="test") + metrics.add_metric(name="test_metric", value=1) + metrics.flush_metrics() + + # THEN metrics should be written to stdout + output = capsys.readouterr().out + metrics_output = json.loads(output) + assert metrics_output + + +def test_metrics_disabled_with_dev_mode_false_and_metrics_disabled_true(monkeypatch, capsys): + # GIVEN dev mode is false but metrics disabled is true + monkeypatch.setenv("POWERTOOLS_DEV", "false") + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true") + + # WHEN metrics is initialized + metrics = DatadogMetrics(namespace="test") + metrics.add_metric(name="test_metric", value=1) + metrics.flush_metrics() + + # THEN no metrics should have been recorded + captured = capsys.readouterr() + assert not captured.out diff --git a/tests/functional/metrics/required_dependencies/test_metrics_cloudwatch_emf.py b/tests/functional/metrics/required_dependencies/test_metrics_cloudwatch_emf.py index 5633d573a54..29418c42bcf 100644 --- a/tests/functional/metrics/required_dependencies/test_metrics_cloudwatch_emf.py +++ b/tests/functional/metrics/required_dependencies/test_metrics_cloudwatch_emf.py @@ -1329,3 +1329,160 @@ def lambda_handler(evt, ctx): "This metric doesn't meet the requirements and will be skipped by Amazon CloudWatch. " "Ensure the timestamp is within 14 days past or 2 hours future." ) + + +def test_metrics_disabled_with_env_var(monkeypatch, namespace, capsys): + # GIVEN environment variable is set to disable metrics + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true") + + # WHEN metrics is initialized and adding metrics + metrics = Metrics(namespace=namespace) + metrics.add_metric(name="test_metric", unit="Count", value=1) + metrics.flush_metrics() + + # THEN no Powertools metrics should be sent to CloudWatch + output = capsys.readouterr() + assert not output.out + + +def test_metrics_disabled_persists_after_flush(monkeypatch, capsys, namespace): + # GIVEN environment variable is set to disable metrics + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true") + metrics = Metrics(namespace=namespace) + + # WHEN multiple operations are performed with flush in between + metrics.add_metric(name="metric1", unit="Count", value=1) + metrics.flush_metrics() + + # THEN first flush should not emit any metrics + captured = capsys.readouterr() + assert not captured.out + + # WHEN adding and flushing more metrics + metrics.add_metric(name="metric2", unit="Count", value=2) + metrics.flush_metrics() + + # THEN second flush should also not emit any metrics + captured = capsys.readouterr() + assert not captured.out + + +def test_metrics_disabled_with_namespace_and_service(monkeypatch, capsys): + # GIVEN environment variable is set to disable metrics + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true") + + # WHEN metrics is initialized with namespace and service + metrics = Metrics(namespace="test_namespace", service="test_service") + metrics.add_metric(name="test_metric", unit="Count", value=1) + metrics.flush_metrics() + + # THEN no metrics should have been recorded + captured = capsys.readouterr() + assert not captured.out + + +def test_metrics_enabled_with_env_var_false(monkeypatch, capsys): + # GIVEN environment variable is set to enable metrics + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "false") + + # WHEN metrics is initialized with namespace and metrics added + metrics = Metrics(namespace="test") + metrics.add_metric(name="test_metric", unit="Count", value=1) + metrics.flush_metrics() + + # THEN metrics should be written to stdout + output = capsys.readouterr().out + metrics_output = json.loads(output) + + assert "test_metric" in metrics_output + assert metrics_output["test_metric"] == [1.0] + assert metrics_output["_aws"]["CloudWatchMetrics"][0]["Namespace"] == "test" + assert metrics_output["_aws"]["CloudWatchMetrics"][0]["Metrics"][0]["Name"] == "test_metric" + + +def test_metrics_enabled_with_env_var_not_set(monkeypatch, capsys): + # GIVEN environment variable is not set + monkeypatch.delenv("POWERTOOLS_METRICS_DISABLED", raising=False) + + # WHEN metrics is initialized with namespace and metrics added + metrics = Metrics(namespace="test") + metrics.add_metric(name="test_metric", unit="Count", value=1) + metrics.flush_metrics() + + # THEN metrics should be written to stdout + output = capsys.readouterr().out + metrics_output = json.loads(output) + + assert "test_metric" in metrics_output + assert metrics_output["test_metric"] == [1.0] + assert metrics_output["_aws"]["CloudWatchMetrics"][0]["Namespace"] == "test" + assert metrics_output["_aws"]["CloudWatchMetrics"][0]["Metrics"][0]["Name"] == "test_metric" + + +def test_metrics_disabled_with_dev_mode(monkeypatch, namespace, capsys): + # GIVEN environment variable is set to disable metrics + monkeypatch.setenv("POWERTOOLS_DEV", "true") + + # WHEN metrics is initialized and adding metrics + metrics = Metrics(namespace=namespace) + metrics.add_metric(name="test_metric", unit="Count", value=1) + + # AND flushing metrics + metrics.flush_metrics() + + # THEN no metrics should have been recorded + captured = capsys.readouterr() + assert not captured.out + + +def test_metrics_enabled_with_dev_mode_false(monkeypatch, capsys): + # GIVEN environment variable is set to enable metrics + monkeypatch.setenv("POWERTOOLS_DEV", "false") + + # WHEN metrics is initialized with namespace and metrics added + metrics = Metrics(namespace="test") + metrics.add_metric(name="test_metric", unit="Count", value=1) + metrics.flush_metrics() + + # THEN metrics should be written to stdout + output = capsys.readouterr().out + metrics_output = json.loads(output) + + assert "test_metric" in metrics_output + assert metrics_output["test_metric"] == [1.0] + assert metrics_output["_aws"]["CloudWatchMetrics"][0]["Namespace"] == "test" + assert metrics_output["_aws"]["CloudWatchMetrics"][0]["Metrics"][0]["Name"] == "test_metric" + + +def test_metrics_dev_mode_does_not_override_metrics_disabled(monkeypatch, capsys): + # GIVEN dev mode is enabled but metrics disabled is explicitly false + monkeypatch.setenv("POWERTOOLS_DEV", "true") + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "false") + + # WHEN metrics is initialized + metrics = Metrics(namespace="test") + metrics.add_metric(name="test_metric", value=1, unit="Count") + metrics.flush_metrics() + + # THEN metrics should be written to stdout since POWERTOOLS_METRICS_DISABLED is false + output = capsys.readouterr().out + assert output # First verify we have output + metrics_output = json.loads(output) + assert metrics_output + assert "_aws" in metrics_output + assert any(metric["Name"] == "test_metric" for metric in metrics_output["_aws"]["CloudWatchMetrics"][0]["Metrics"]) + + +def test_metrics_disabled_with_dev_mode_false_and_metrics_disabled_true(monkeypatch, capsys): + # GIVEN dev mode is false but metrics disabled is true + monkeypatch.setenv("POWERTOOLS_DEV", "false") + monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true") + + # WHEN metrics is initialized + metrics = Metrics(namespace="test") + metrics.add_metric(name="test_metric", value=1, unit="Count") + metrics.flush_metrics() + + # THEN no metrics should have been recorded + captured = capsys.readouterr() + assert not captured.out From 1e1429ff712eceef75eeef138e778af4918bdbfb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 08:59:52 +0000 Subject: [PATCH 122/139] chore(ci): new pre-release 3.5.1a9 (#6069) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.5.1a9/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.5.1a9/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index b25c91e57f3..24a46d3940a 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.1a8" +VERSION = "3.5.1a9" diff --git a/provenance/3.5.1a9/multiple.intoto.jsonl b/provenance/3.5.1a9/multiple.intoto.jsonl new file mode 100644 index 00000000000..89d9a02ad58 --- /dev/null +++ b/provenance/3.5.1a9/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE5LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiYmMxZjAwZGY3ZmUzYjdmYjQ1ZjBkY2IxNTFiNGJiMmEwYTNmY2ZkNDIyNjg0ZTE0MzBkZTE1ZGI2NjY5MWFmZCJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjUuMWE5LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2NmQ3MmFmMDMxOTE1MDRhOTE2NjYzZGFmYjUyNTFlZDEyNzZkZWNmNTRmMDVkZmU5ZThjM2Q0NmZkYmJiMDE2In19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiMWNhMDVhMjcyYzhjMjQ1ZDVkYjFlMDNkNmNkZGNiYjZkM2QxODRmNyJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwOCwiZm9ya3NfY291bnQiOjQwOCwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo1OSwib3Blbl9pc3N1ZXNfY291bnQiOjU5LCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDItMTBUMjE6NTY6MTdaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjg2MjIwLCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5ODMsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDItMTFUMDU6MDE6MjlaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5ODMsIndhdGNoZXJzX2NvdW50IjoyOTgzLCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzI1ODI4OTY4NyIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTczIiwiZ2l0aHViX3NoYTEiOiIxY2EwNWEyNzJjOGMyNDVkNWRiMWUwM2Q2Y2RkY2JiNmQzZDE4NGY3In19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMjU4Mjg5Njg3LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiIxY2EwNWEyNzJjOGMyNDVkNWRiMWUwM2Q2Y2RkY2JiNmQzZDE4NGY3In19XX19","signatures":[{"keyid":"","sig":"MEUCIDwSCOre8yWH8osNcZVE0hK1WhO4Lj5TXcdMz+KGOC0BAiEApZ4fHP7B/XCoONpQH+a9gOWvJDF6lRiYMG/pirEqijM=","cert":"-----BEGIN CERTIFICATE-----\nMIIHZjCCBuygAwIBAgIUEP2vbsn3CmsfmG8GY3NnxxVghPswCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMjExMDgwNjU3WhcNMjUwMjExMDgxNjU3WjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAENnEUvPH6AZwA86iBNosXWKfBlGCHSVmV2SPa\nRQ7m2jePc1y2BaNU1kh9XXChn0NJAifZdSbdN5cSO/sKChMpaqOCBgswggYHMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUFfeZ\nRNn73KaC3Rn/HjxdU/oGpkQwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCgxY2Ew\nNWEyNzJjOGMyNDVkNWRiMWUwM2Q2Y2RkY2JiNmQzZDE4NGY3MBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDCgxY2EwNWEyNzJjOGMyNDVkNWRiMWUwM2Q2Y2RkY2JiNmQzZDE4NGY3MCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoMWNh\nMDVhMjcyYzhjMjQ1ZDVkYjFlMDNkNmNkZGNiYjZkM2QxODRmNzAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMyNTgyODk2ODcvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlPQMC5oAAAQDAEcwRQIhAK1GC+Gju7udOGYM9m7v\nN6fhUpQAVjpVaN5FBpLfTBoNAiBFwSFuc/0pJOBn44GS/7ZAYsrg3ik3jvSnRAIH\nj9iO5TAKBggqhkjOPQQDAwNoADBlAjEAwETKGts8i/12J2NFkMSpQhu/NO6nZKB7\ngNw3dTLn4ztiNMvYeiGFWwjbhmfRO0HBAjAtFeen+4kMdBFkX9o/Y81lpHiARemU\nVeuQr/10Q767/s6jw4Fwp6M+Y4xzKFsSMfM=\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index ad1fc7b1d95..8a306eccade 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.1a8" +version = "3.5.1a9" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From df7230fa63ea0fa2dd7f429022686d4699a0b04d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Falc=C3=A3o?= Date: Tue, 11 Feb 2025 07:29:04 -0300 Subject: [PATCH 123/139] feat(data-masking): add custom mask functionalities (#5837) * add custom mask functionalities * change flags name to more intuitive * fix type check error * add draft documentation * change doc examples * style: format code with black * fix format base * add tests for new masks * sub header for custom mask in docs * masking rules to handle complex nest * add test for masking rules * modifications based on the feedback * mypy and tests modification * create more tests * Refactoring tests * Refactoring tests * Refactoring tests * Adding docstring + arg parameter * Adding docstring + arg parameter * Removing unnecessary code * Removing unnecessary code * Removing unnecessary code --------- Co-authored-by: Leandro Damascena --- .../utilities/data_masking/base.py | 235 +++++++-- .../utilities/data_masking/provider/base.py | 142 ++++- docs/utilities/data_masking.md | 48 +- .../data_masking/src/custom_data_masking.py | 22 + .../src/output_custom_masking.json | 29 ++ .../src/payload_custom_masking.json | 34 ++ noxfile.py | 2 + .../test_erase_data_masking.py | 488 ++++++++++++++++++ .../test_unit_data_masking.py | 207 -------- .../test_base_functions.py | 30 ++ 10 files changed, 981 insertions(+), 256 deletions(-) create mode 100644 examples/data_masking/src/custom_data_masking.py create mode 100644 examples/data_masking/src/output_custom_masking.json create mode 100644 examples/data_masking/src/payload_custom_masking.json create mode 100644 tests/functional/data_masking/required_dependencies/test_erase_data_masking.py delete mode 100644 tests/unit/data_masking/_aws_encryption_sdk/test_unit_data_masking.py create mode 100644 tests/unit/data_masking/required_dependencies/test_base_functions.py diff --git a/aws_lambda_powertools/utilities/data_masking/base.py b/aws_lambda_powertools/utilities/data_masking/base.py index c5f49cfade8..c5fd6f274e7 100644 --- a/aws_lambda_powertools/utilities/data_masking/base.py +++ b/aws_lambda_powertools/utilities/data_masking/base.py @@ -9,7 +9,8 @@ import functools import logging import warnings -from typing import TYPE_CHECKING, Any, Callable, Mapping, Sequence, overload +from copy import deepcopy +from typing import TYPE_CHECKING, Any, Callable, Mapping, Sequence from jsonpath_ng.ext import parse @@ -18,6 +19,7 @@ DataMaskingUnsupportedTypeError, ) from aws_lambda_powertools.utilities.data_masking.provider import BaseProvider +from aws_lambda_powertools.warnings import PowertoolsUserWarning if TYPE_CHECKING: from numbers import Number @@ -67,11 +69,39 @@ def encrypt( provider_options: dict | None = None, **encryption_context: str, ) -> str: + """ + Encrypt data using the configured encryption provider. + + Parameters + ---------- + data : dict, Mapping, Sequence, or Number + The data to encrypt. + provider_options : dict, optional + Provider-specific options for encryption. + **encryption_context : str + Additional key-value pairs for encryption context. + + Returns + ------- + str + The encrypted data as a base64-encoded string. + + Example + -------- + + encryption_provider = AWSEncryptionSDKProvider(keys=[KMS_KEY_ARN]) + data_masker = DataMasking(provider=encryption_provider) + encrypted = data_masker.encrypt({"secret": "value"}) + """ return self._apply_action( data=data, fields=None, action=self.provider.encrypt, provider_options=provider_options or {}, + dynamic_mask=None, + custom_mask=None, + regex_pattern=None, + mask_format=None, **encryption_context, ) @@ -81,28 +111,91 @@ def decrypt( provider_options: dict | None = None, **encryption_context: str, ) -> Any: + """ + Decrypt data using the configured encryption provider. + + Parameters + ---------- + data : dict, Mapping, Sequence, or Number + The data to encrypt. + provider_options : dict, optional + Provider-specific options for encryption. + **encryption_context : str + Additional key-value pairs for encryption context. + + Returns + ------- + str + The encrypted data as a base64-encoded string. + + Example + -------- + + encryption_provider = AWSEncryptionSDKProvider(keys=[KMS_KEY_ARN]) + data_masker = DataMasking(provider=encryption_provider) + encrypted = data_masker.decrypt(encrypted_data) + """ + return self._apply_action( data=data, fields=None, action=self.provider.decrypt, provider_options=provider_options or {}, + dynamic_mask=None, + custom_mask=None, + regex_pattern=None, + mask_format=None, **encryption_context, ) - @overload - def erase(self, data, fields: None) -> str: ... - - @overload - def erase(self, data: list, fields: list[str]) -> list[str]: ... - - @overload - def erase(self, data: tuple, fields: list[str]) -> tuple[str]: ... + def erase( + self, + data: Any, + fields: list[str] | None = None, + *, + dynamic_mask: bool | None = None, + custom_mask: str | None = None, + regex_pattern: str | None = None, + mask_format: str | None = None, + masking_rules: dict | None = None, + ) -> Any: + """ + Erase or mask sensitive data in the input. - @overload - def erase(self, data: dict, fields: list[str]) -> dict: ... + Parameters + ---------- + data : Any + The data to be erased or masked. + fields : list of str, optional + List of field names to be erased or masked. + dynamic_mask : bool, optional + Whether to use dynamic masking. + custom_mask : str, optional + Custom mask to apply instead of the default. + regex_pattern : str, optional + Regular expression pattern for identifying data to mask. + mask_format : str, optional + Format string for the mask. + masking_rules : dict, optional + Dictionary of custom masking rules. - def erase(self, data: Sequence | Mapping, fields: list[str] | None = None) -> str | list[str] | tuple[str] | dict: - return self._apply_action(data=data, fields=fields, action=self.provider.erase) + Returns + ------- + Any + The data with sensitive information erased or masked. + """ + if masking_rules: + return self._apply_masking_rules(data=data, masking_rules=masking_rules) + else: + return self._apply_action( + data=data, + fields=fields, + action=self.provider.erase, + dynamic_mask=dynamic_mask, + custom_mask=custom_mask, + regex_pattern=regex_pattern, + mask_format=mask_format, + ) def _apply_action( self, @@ -110,8 +203,12 @@ def _apply_action( fields: list[str] | None, action: Callable, provider_options: dict | None = None, - **encryption_context: str, - ): + dynamic_mask: bool | None = None, + custom_mask: str | None = None, + regex_pattern: str | None = None, + mask_format: str | None = None, + **kwargs: Any, + ) -> Any: """ Helper method to determine whether to apply a given action to the entire input data or to specific fields if the 'fields' argument is specified. @@ -127,8 +224,6 @@ def _apply_action( and returns the modified value. provider_options : dict Provider specific keyword arguments to propagate; used as an escape hatch. - encryption_context: str - Encryption context to use in encrypt and decrypt operations. Returns ------- @@ -143,11 +238,23 @@ def _apply_action( fields=fields, action=action, provider_options=provider_options, - **encryption_context, + dynamic_mask=dynamic_mask, + custom_mask=custom_mask, + regex_pattern=regex_pattern, + mask_format=mask_format, + **kwargs, ) else: logger.debug(f"Running action {action.__name__} with the entire data") - return action(data=data, provider_options=provider_options, **encryption_context) + return action( + data=data, + provider_options=provider_options, + dynamic_mask=dynamic_mask, + custom_mask=custom_mask, + regex_pattern=regex_pattern, + mask_format=mask_format, + **kwargs, + ) def _apply_action_to_fields( self, @@ -155,6 +262,10 @@ def _apply_action_to_fields( fields: list, action: Callable, provider_options: dict | None = None, + dynamic_mask: bool | None = None, + custom_mask: str | None = None, + regex_pattern: str | None = None, + mask_format: str | None = None, **encryption_context: str, ) -> dict | str: """ @@ -201,8 +312,10 @@ def _apply_action_to_fields( new_dict = {'a': {'b': {'c': '*****'}}, 'x': {'y': '*****'}} ``` """ + if not fields: + raise ValueError("Fields parameter cannot be empty") - data_parsed: dict = self._normalize_data_to_parse(fields, data) + data_parsed: dict = self._normalize_data_to_parse(data) # For in-place updates, json_parse accepts a callback function # this function must receive 3 args: field_value, fields, field_name @@ -211,6 +324,10 @@ def _apply_action_to_fields( self._call_action, action=action, provider_options=provider_options, + dynamic_mask=dynamic_mask, + custom_mask=custom_mask, + regex_pattern=regex_pattern, + mask_format=mask_format, **encryption_context, # type: ignore[arg-type] ) @@ -232,12 +349,6 @@ def _apply_action_to_fields( # For in-place updates, json_parse accepts a callback function # that receives 3 args: field_value, fields, field_name # We create a partial callback to pre-populate known provider options (action, provider opts, enc ctx) - update_callback = functools.partial( - self._call_action, - action=action, - provider_options=provider_options, - **encryption_context, # type: ignore[arg-type] - ) json_parse.update( data_parsed, @@ -246,6 +357,59 @@ def _apply_action_to_fields( return data_parsed + def _apply_masking_rules(self, data: dict, masking_rules: dict) -> dict: + """ + Apply masking rules to data, supporting both simple field names and complex path expressions. + + Args: + data: The dictionary containing data to mask + masking_rules: Dictionary mapping field names or path expressions to masking rules + + Returns: + dict: The masked data dictionary + """ + result = deepcopy(data) + + for path, rule in masking_rules.items(): + try: + jsonpath_expr = parse(f"$.{path}") + matches = jsonpath_expr.find(result) + + if not matches: + warnings.warn(f"No matches found for path: {path}", stacklevel=2) + continue + + for match in matches: + try: + value = match.value + if value is not None: + masked_value = self.provider.erase(str(value), **rule) + match.full_path.update(result, masked_value) + + except Exception as e: + warnings.warn( + f"Error masking value for path {path}: {str(e)}", + category=PowertoolsUserWarning, + stacklevel=2, + ) + continue + + except Exception as e: + warnings.warn(f"Error processing path {path}: {str(e)}", category=PowertoolsUserWarning, stacklevel=2) + continue + + return result + + def _mask_nested_field(self, data: dict, field_path: str, mask_function): + keys = field_path.split(".") + current = data + for key in keys[:-1]: + current = current.get(key, {}) + if not isinstance(current, dict): + return + if keys[-1] in current: + current[keys[-1]] = self.provider.erase(current[keys[-1]], **mask_function) + @staticmethod def _call_action( field_value: Any, @@ -253,6 +417,10 @@ def _call_action( field_name: str, action: Callable, provider_options: dict[str, Any] | None = None, + dynamic_mask: bool | None = None, + custom_mask: str | None = None, + regex_pattern: str | None = None, + mask_format: str | None = None, **encryption_context, ) -> None: """ @@ -270,13 +438,18 @@ def _call_action( Returns: - fields[field_name]: Returns the processed field value """ - fields[field_name] = action(field_value, provider_options=provider_options, **encryption_context) + fields[field_name] = action( + field_value, + provider_options=provider_options, + dynamic_mask=dynamic_mask, + custom_mask=custom_mask, + regex_pattern=regex_pattern, + mask_format=mask_format, + **encryption_context, + ) return fields[field_name] - def _normalize_data_to_parse(self, fields: list, data: str | dict) -> dict: - if not fields: - raise ValueError("No fields specified.") - + def _normalize_data_to_parse(self, data: str | dict) -> dict: if isinstance(data, str): # Parse JSON string as dictionary data_parsed = self.json_deserializer(data) diff --git a/aws_lambda_powertools/utilities/data_masking/provider/base.py b/aws_lambda_powertools/utilities/data_masking/provider/base.py index 8751becfb2c..16fa22d16b8 100644 --- a/aws_lambda_powertools/utilities/data_masking/provider/base.py +++ b/aws_lambda_powertools/utilities/data_masking/provider/base.py @@ -2,10 +2,14 @@ import functools import json -from typing import Any, Callable, Iterable +import re +from typing import Any, Callable from aws_lambda_powertools.utilities.data_masking.constants import DATA_MASKING_STRING +PRESERVE_CHARS = set("-_. ") +_regex_cache = {} + class BaseProvider: """ @@ -24,7 +28,7 @@ def encrypt(self, data) -> str: def decrypt(self, data) -> Any: # Implementation logic for data decryption - def erase(self, data) -> str | Iterable: + def erase(self, data) -> Any | Iterable: # Implementation logic for data masking pass @@ -63,19 +67,123 @@ def decrypt(self, data, provider_options: dict | None = None, **encryption_conte """ raise NotImplementedError("Subclasses must implement decrypt()") - def erase(self, data, **kwargs) -> Iterable[str]: - """ - This method irreversibly erases data. - - If the data to be erased is of type `str`, `dict`, or `bytes`, - this method will return an erased string, i.e. "*****". - - If the data to be erased is of an iterable type like `list`, `tuple`, - or `set`, this method will return a new object of the same type as the - input data but with each element replaced by the string "*****". - """ - if isinstance(data, (str, dict, bytes)): - return DATA_MASKING_STRING + def erase( + self, + data: Any, + dynamic_mask: bool | None = None, + custom_mask: str | None = None, + regex_pattern: str | None = None, + mask_format: str | None = None, + masking_rules: dict | None = None, + **kwargs, + ) -> Any: + + result: Any = DATA_MASKING_STRING + + if not any([dynamic_mask, custom_mask, regex_pattern, mask_format, masking_rules]): + if isinstance(data, (str, int, float, dict, bytes)): + return DATA_MASKING_STRING + elif isinstance(data, (list, tuple, set)): + return type(data)([DATA_MASKING_STRING] * len(data)) + else: + return DATA_MASKING_STRING + + if isinstance(data, (str, int, float)): + result = self._mask_primitive(str(data), dynamic_mask, custom_mask, regex_pattern, mask_format) + elif isinstance(data, dict): + result = self._mask_dict( + data, + dynamic_mask, + custom_mask, + regex_pattern, + mask_format, + masking_rules, + ) elif isinstance(data, (list, tuple, set)): - return type(data)([DATA_MASKING_STRING] * len(data)) - return DATA_MASKING_STRING + result = self._mask_iterable( + data, + dynamic_mask, + custom_mask, + regex_pattern, + mask_format, + masking_rules, + ) + + return result + + def _mask_primitive( + self, + data: str, + dynamic_mask: bool | None, + custom_mask: str | None, + regex_pattern: str | None, + mask_format: str | None, + ) -> str: + if regex_pattern and mask_format: + return self._regex_mask(data, regex_pattern, mask_format) + elif custom_mask: + return self._pattern_mask(data, custom_mask) + + return self._custom_erase(data) + + def _mask_dict( + self, + data: dict, + dynamic_mask: bool | None, + custom_mask: str | None, + regex_pattern: str | None, + mask_format: str | None, + masking_rules: dict | None, + ) -> dict: + return { + k: self.erase( + v, + dynamic_mask=dynamic_mask, + custom_mask=custom_mask, + regex_pattern=regex_pattern, + mask_format=mask_format, + masking_rules=masking_rules, + ) + for k, v in data.items() + } + + def _mask_iterable( + self, + data: list | tuple | set, + dynamic_mask: bool | None, + custom_mask: str | None, + regex_pattern: str | None, + mask_format: str | None, + masking_rules: dict | None, + ) -> list | tuple | set: + masked_data = [ + self.erase( + item, + dynamic_mask=dynamic_mask, + custom_mask=custom_mask, + regex_pattern=regex_pattern, + mask_format=mask_format, + masking_rules=masking_rules, + ) + for item in data + ] + return type(data)(masked_data) + + def _pattern_mask(self, data: str, pattern: str) -> str: + """Apply pattern masking to string data.""" + return pattern[: len(data)] if len(pattern) >= len(data) else pattern + + def _regex_mask(self, data: str, regex_pattern: str, mask_format: str) -> str: + """Apply regex masking to string data.""" + try: + if regex_pattern not in _regex_cache: + _regex_cache[regex_pattern] = re.compile(regex_pattern) + return _regex_cache[regex_pattern].sub(mask_format, data) + except re.error: + return data + + def _custom_erase(self, data: str) -> str: + if not data: + return "" + + return "".join("*" if char not in PRESERVE_CHARS else char for char in data) diff --git a/docs/utilities/data_masking.md b/docs/utilities/data_masking.md index 162292e79a0..94e470aa965 100644 --- a/docs/utilities/data_masking.md +++ b/docs/utilities/data_masking.md @@ -43,7 +43,7 @@ stateDiagram-v2 ## Terminology -**Erasing** replaces sensitive information **irreversibly** with a non-sensitive placeholder _(`*****`)_. This operation replaces data in-memory, making it a one-way action. +**Erasing** replaces sensitive information **irreversibly** with a non-sensitive placeholder _(`*****`)_, or with a customized mask. This operation replaces data in-memory, making it a one-way action. **Encrypting** transforms plaintext into ciphertext using an encryption algorithm and a cryptographic key. It allows you to encrypt any sensitive data, so only allowed personnel to decrypt it. Learn more about encryption [here](https://aws.amazon.com/blogs/security/importance-of-encryption-and-how-aws-can-help/){target="_blank"}. @@ -117,6 +117,52 @@ Erasing will remove the original data and replace it with a `*****`. This means --8<-- "examples/data_masking/src/getting_started_erase_data_output.json" ``` +#### Custom masking + +The `erase` method also supports additional flags for more advanced and flexible masking: + +=== "dynamic_mask" + + (bool) Enables dynamic masking behavior when set to `True`, by maintaining the original length and structure of the text replacing with *. + + > Expression: `data_masker.erase(data, fields=["address.zip"], dynamic_mask=True)` + + > Field result: `'street': '*** **** **'` + +=== "custom_mask" + + (str) Specifies a simple pattern for masking data. This pattern is applied directly to the input string, replacing all the original characters. For example, with a `custom_mask` of "XX-XX" applied to "12345", the result would be "XX-XX". + + > Expression: `data_masker.erase(data, fields=["address.zip"], custom_mask="XX")` + + > Field result: `'zip': 'XX'` + +=== "regex_pattern & mask_format" + + (str) `regex_pattern` defines a regular expression pattern used to identify parts of the input string that should be masked. This allows for more complex and flexible masking rules. It's used in conjunction with `mask_format`. + `mask_format` specifies the format to use when replacing parts of the string matched by `regex_pattern`. It can include placeholders (like \1, \2) to refer to captured groups in the regex pattern, allowing some parts of the original string to be preserved. + + > Expression: `data_masker.erase(data, fields=["email"], regex_pattern=r"(.)(.*)(@.*)", mask_format=r"\1****\3")` + + > Field result: `'email': 'j****@example.com'` + +=== "masking_rules" + + (dict) Allows you to apply different masking rules (flags) for each data field. + ```python hl_lines="20" + --8<-- "examples/data_masking/src/custom_data_masking.py" + ``` +=== "Input example" + + ```json + --8<-- "examples/data_masking/src/payload_custom_masking.json" + ``` +=== "Masking rules output example" + + ```json hl_lines="4 5 10 21" + --8<-- "examples/data_masking/src/output_custom_masking.json" + ``` + ### Encrypting data ???+ note "About static typing and encryption" diff --git a/examples/data_masking/src/custom_data_masking.py b/examples/data_masking/src/custom_data_masking.py new file mode 100644 index 00000000000..7b96f6f379f --- /dev/null +++ b/examples/data_masking/src/custom_data_masking.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +from aws_lambda_powertools.utilities.data_masking import DataMasking +from aws_lambda_powertools.utilities.typing import LambdaContext + +data_masker = DataMasking() + + +def lambda_handler(event: dict, context: LambdaContext) -> dict: + data: dict = event.get("body", {}) + + # Masking rules for each field + masking_rules = { + "email": {"regex_pattern": "(.)(.*)(@.*)", "mask_format": r"\1****\3"}, + "age": {"dynamic_mask": True}, + "address.zip": {"custom_mask": "xxx"}, + "$.other_address[?(@.postcode > 12000)]": {"custom_mask": "Masked"}, + } + + result = data_masker.erase(data, masking_rules=masking_rules) + + return result diff --git a/examples/data_masking/src/output_custom_masking.json b/examples/data_masking/src/output_custom_masking.json new file mode 100644 index 00000000000..0571da99808 --- /dev/null +++ b/examples/data_masking/src/output_custom_masking.json @@ -0,0 +1,29 @@ +{ + "id": 1, + "name": "John Doe", + "age": "**", + "email": "j****@example.com", + "address": { + "street": "123 Main St", + "city": "Anytown", + "state": "CA", + "zip": "xxx", + "postcode": 12345, + "product": { + "name": "Car" + } + }, + "other_address": [ + { + "postcode": 11345, + "street": "123 Any Drive" + }, + "Masked" + ], + "company_address": { + "street": "456 ACME Ave", + "city": "Anytown", + "state": "CA", + "zip": "12345" + } +} \ No newline at end of file diff --git a/examples/data_masking/src/payload_custom_masking.json b/examples/data_masking/src/payload_custom_masking.json new file mode 100644 index 00000000000..d50b715ffa4 --- /dev/null +++ b/examples/data_masking/src/payload_custom_masking.json @@ -0,0 +1,34 @@ +{ + "body": { + "id": 1, + "name": "Jane Doe", + "age": 30, + "email": "janedoe@example.com", + "address": { + "street": "123 Main St", + "city": "Anytown", + "state": "CA", + "zip": "12345", + "postcode": 12345, + "product": { + "name": "Car" + } + }, + "other_address": [ + { + "postcode": 11345, + "street": "123 Any Drive" + }, + { + "postcode": 67890, + "street": "100 Main Street," + } + ], + "company_address": { + "street": "456 ACME Ave", + "city": "Anytown", + "state": "CA", + "zip": "12345" + } + } +} \ No newline at end of file diff --git a/noxfile.py b/noxfile.py index 7b73fd0dc59..4710bcbca2c 100644 --- a/noxfile.py +++ b/noxfile.py @@ -140,6 +140,8 @@ def test_with_aws_encryption_sdk_as_required_package(session: nox.Session): folders=[ f"{PREFIX_TESTS_FUNCTIONAL}/data_masking/_aws_encryption_sdk/", f"{PREFIX_TESTS_UNIT}/data_masking/_aws_encryption_sdk/", + f"{PREFIX_TESTS_FUNCTIONAL}/data_masking/required_dependencies/", + f"{PREFIX_TESTS_UNIT}/data_masking/required_dependencies/", ], extras="datamasking", ) diff --git a/tests/functional/data_masking/required_dependencies/test_erase_data_masking.py b/tests/functional/data_masking/required_dependencies/test_erase_data_masking.py new file mode 100644 index 00000000000..12ffd054376 --- /dev/null +++ b/tests/functional/data_masking/required_dependencies/test_erase_data_masking.py @@ -0,0 +1,488 @@ +import json + +import pytest + +from aws_lambda_powertools.utilities.data_masking.base import DataMasking +from aws_lambda_powertools.utilities.data_masking.constants import DATA_MASKING_STRING +from aws_lambda_powertools.utilities.data_masking.exceptions import ( + DataMaskingFieldNotFoundError, + DataMaskingUnsupportedTypeError, +) +from aws_lambda_powertools.warnings import PowertoolsUserWarning + + +@pytest.fixture +def data_masker() -> DataMasking: + return DataMasking() + + +def test_erase_int(data_masker): + # GIVEN an int data type + + # WHEN erase is called with no fields argument + erased_string = data_masker.erase(42) + + # THEN the result is the data masked + assert erased_string == DATA_MASKING_STRING + + +def test_erase_int_custom_mask(data_masker): + # GIVEN an int data type + + # WHEN erase is called with no fields argument + erased_string = data_masker.erase(42, custom_mask="XX") + + # THEN the result is the data masked + assert erased_string == "XX" + + +def test_erase_float(data_masker): + # GIVEN a float data type + + # WHEN erase is called with no fields argument + erased_string = data_masker.erase(4.2) + + # THEN the result is the data masked + assert erased_string == DATA_MASKING_STRING + + +def test_erase_bool(data_masker): + # GIVEN a bool data type + + # WHEN erase is called with no fields argument + erased_string = data_masker.erase(True) + + # THEN the result is the data masked + assert erased_string == DATA_MASKING_STRING + + +def test_erase_none(data_masker): + # GIVEN a None data type + + # WHEN erase is called with no fields argument + erased_string = data_masker.erase(None) + + # THEN the result is the data masked + assert erased_string == DATA_MASKING_STRING + + +def test_erase_str(data_masker): + # GIVEN a str data type + + # WHEN erase is called with no fields argument + erased_string = data_masker.erase("this is a string") + + # THEN the result is the data masked + assert erased_string == DATA_MASKING_STRING + + +def test_erase_list(data_masker): + # GIVEN a list data type + + # WHEN erase is called with no fields argument + erased_string = data_masker.erase([1, 2, "string", 3]) + + # THEN the result is the data masked, while maintaining type list + assert erased_string == [DATA_MASKING_STRING, DATA_MASKING_STRING, DATA_MASKING_STRING, DATA_MASKING_STRING] + + +def test_erase_dict(data_masker): + # GIVEN a dict data type + data = { + "a": { + "1": {"None": "hello", "four": "world"}, + "b": {"3": {"4": "goodbye", "e": "world"}}, + }, + } + + # WHEN erase is called with no fields argument + erased_string = data_masker.erase(data) + + # THEN the result is the data masked + assert erased_string == DATA_MASKING_STRING + + +def test_erase_dict_with_fields(data_masker): + # GIVEN a dict data type + data = { + "a": { + "1": {"None": "hello", "four": "world"}, + "b": {"3": {"4": "goodbye", "e": "world"}}, + }, + } + + # WHEN erase is called with a list of fields specified + erased_string = data_masker.erase(data, fields=["a.'1'.None", "a..'4'"]) + + # THEN the result is only the specified fields are erased + assert erased_string == { + "a": { + "1": {"None": DATA_MASKING_STRING, "four": "world"}, + "b": {"3": {"4": DATA_MASKING_STRING, "e": "world"}}, + }, + } + + +def test_erase_json_dict_with_fields(data_masker): + # GIVEN the data type is a json representation of a dictionary + data = json.dumps( + { + "a": { + "1": {"None": "hello", "four": "world"}, + "b": {"3": {"4": "goodbye", "e": "world"}}, + }, + }, + ) + + # WHEN erase is called with a list of fields specified + masked_json_string = data_masker.erase(data, fields=["a.'1'.None", "a..'4'"]) + + # THEN the result is only the specified fields are erased + assert masked_json_string == { + "a": { + "1": {"None": DATA_MASKING_STRING, "four": "world"}, + "b": {"3": {"4": DATA_MASKING_STRING, "e": "world"}}, + }, + } + + +def test_encrypt_not_implemented(data_masker): + # GIVEN DataMasking is not initialized with a Provider + + # WHEN attempting to call the encrypt method on the data + with pytest.raises(NotImplementedError): + # THEN the result is a NotImplementedError + data_masker.encrypt("hello world") + + +def test_decrypt_not_implemented(data_masker): + # GIVEN DataMasking is not initialized with a Provider + + # WHEN attempting to call the decrypt method on the data + with pytest.raises(NotImplementedError): + # THEN the result is a NotImplementedError + data_masker.decrypt("hello world") + + +def test_parsing_unsupported_data_type(data_masker): + # GIVEN an initialization of the DataMasking class + + # WHEN attempting to pass in a list of fields with input data that is not a dict + with pytest.raises(DataMaskingUnsupportedTypeError): + # THEN the result is a TypeError + data_masker.erase(42, ["this.field"]) + + +def test_parsing_with_empty_field(data_masker): + # GIVEN an initialization of the DataMasking class + + # WHEN attempting to pass in a list of fields with input data that is not a dict + with pytest.raises(ValueError): + # THEN the result is a TypeError + data_masker.erase(42, []) + + +def test_parsing_nonexistent_fields_with_raise_on_missing_field(): + # GIVEN a dict data type + + data_masker = DataMasking(raise_on_missing_field=True) + data = { + "3": { + "1": {"None": "hello", "four": "world"}, + "4": {"33": {"5": "goodbye", "e": "world"}}, + }, + } + + # WHEN attempting to pass in fields that do not exist in the input data + with pytest.raises(DataMaskingFieldNotFoundError): + # THEN the result is a KeyError + data_masker.erase(data, ["'3'..True"]) + + +def test_parsing_nonexistent_fields_warning_on_missing_field(): + # GIVEN a dict data type + + data_masker = DataMasking(raise_on_missing_field=False) + data = { + "3": { + "1": {"None": "hello", "four": "world"}, + "4": {"33": {"5": "goodbye", "e": "world"}}, + }, + } + + # WHEN erase is called with a non-existing field + with pytest.warns(UserWarning, match="Field or expression*"): + masked_json_string = data_masker.erase(data, fields=["non-existing"]) + + # THEN the "erased" payload is the same of the original + assert masked_json_string == data + + +def test_regex_mask(data_masker): + # GIVEN a str data type + data = "Hello! My name is John Doe" + + # WHEN erase is called with regex pattern and mask format + regex_pattern = r"\b[A-Z][a-z]+ [A-Z][a-z]+\b" + mask_format = "XXXX XXXX" + + result = data_masker.erase(data, regex_pattern=regex_pattern, mask_format=mask_format) + + # THEN the result is the regex part masked by the masked format + assert result == "Hello! My name is XXXX XXXX" + + +def test_regex_mask_with_cache(data_masker): + # GIVEN a str data type + data = "Hello! My name is John Doe" + data1 = "Hello! My name is John Xix" + + # WHEN erase is called with regex pattern and mask format + regex_pattern = r"\b[A-Z][a-z]+ [A-Z][a-z]+\b" + mask_format = "XXXX XXXX" + + # WHEN erasing twice to check the regex compiled and stored in the cache + result = data_masker.erase(data, regex_pattern=regex_pattern, mask_format=mask_format) + result1 = data_masker.erase(data1, regex_pattern=regex_pattern, mask_format=mask_format) + + # THEN the result is the regex part masked by the masked format + assert result == "Hello! My name is XXXX XXXX" + assert result1 == "Hello! My name is XXXX XXXX" + + +def test_erase_json_dict_with_fields_and_masks(data_masker): + # GIVEN the data type is a json representation of a dictionary + data = json.dumps( + { + "a": { + "1": {"None": "hello", "four": "world"}, + "b": {"3": {"4": "goodbye", "e": "world"}}, + }, + }, + ) + + # WHEN erase is called with a list of fields specified + masked_json_string = data_masker.erase(data, fields=["a.'1'.None", "a..'4'"], dynamic_mask=True) + + # THEN the result is only the specified fields are erased + assert masked_json_string == { + "a": { + "1": {"None": "*****", "four": "world"}, + "b": {"3": {"4": "*******", "e": "world"}}, + }, + } + + +def test_erase_json_dict_with_complex_masking_rules(data_masker): + # GIVEN the data type is a json representation of a dictionary with nested and filtered paths + data = { + "email": "johndoe@example.com", + "age": 30, + "address": {"zip": 13000, "street": "123 Main St", "details": {"name": "Home", "type": "Primary"}}, + } + + # WHEN erase is called with complex masking rules + masking_rules = { + "email": {"regex_pattern": "(.)(.*)(@.*)", "mask_format": r"\1****\3"}, + "age": {"dynamic_mask": True}, + "address.zip": {"custom_mask": "xxx"}, + } + + masked_json_string = data_masker.erase(data=data, masking_rules=masking_rules) + + # THEN the result should have all specified fields masked according to their rules + assert masked_json_string == { + "email": "j****@example.com", + "age": "**", + "address": {"zip": "xxx", "street": "123 Main St", "details": {"name": "Home", "type": "Primary"}}, + } + + +def test_dynamic_mask_with_string(data_masker): + # GIVEN the data type is a json representation of a dictionary with nested and filtered paths + data = "XYZEKDEDE" + + masked_json_string = data_masker.erase(data=data, dynamic_mask=True) + + # THEN the result should have all specified fields masked according to their rules + assert masked_json_string == "*********" + + +def test_no_matches_for_masking_rule(data_masker): + # GIVEN a dictionary without the expected field + data = {"name": "Ana"} + masking_rules = {"$.missing_field": {"dynamic_mask": True}} + + # WHEN applying the masking rule + with pytest.warns(UserWarning, match=r"No matches found *"): + result = data_masker.erase(data=data, masking_rules=masking_rules) + + # THEN the original data remains unchanged + assert result == data + + +def test_warning_during_masking_value(data_masker): + # GIVEN data and a masking rule + data = {"value": "test"} + + # Mock provider that raises an error + class MockProvider: + def erase(self, value, **kwargs): + raise ValueError("Mock error") + + data_masker.provider = MockProvider() + + # WHEN erase is called + with pytest.warns(expected_warning=PowertoolsUserWarning, match="Error masking value for path value: Mock error"): + masked_data = data_masker.erase(data, masking_rules={"value": {"rule": "value"}}) + + # THEN the original data should remain unchanged + assert masked_data["value"] == "test" + + +def test_mask_nested_field_success(data_masker): + # GIVEN nested data with a field to mask + data = {"user": {"contact": {"details": {"address": {"street": "123 Main St", "zip": "12345"}}}}} + + # WHEN masking a nested field with a masking rule + data_masked = data_masker.erase(data=data, fields=["user.contact.details.address.zip"], custom_mask="xxx") + + # THEN the nested field should be masked while other data remains unchanged + assert data_masked == {"user": {"contact": {"details": {"address": {"street": "123 Main St", "zip": "xxx"}}}}} + + +def test_erase_dictionary_with_masking_rules(data_masker): + # GIVEN a dictionary with nested sensitive data + data = {"user": {"name": "John Doe", "ssn": "123-45-6789", "address": {"street": "123 Main St", "zip": "12345"}}} + + # AND masking rules for specific fields + masking_rules = {"user.ssn": {"custom_mask": "XXX-XX-XXXX"}, "user.address.zip": {"custom_mask": "00000"}} + + # WHEN erase is called with masking rules + result = data_masker.erase(data, masking_rules=masking_rules) + + # THEN only the specified fields should be masked + assert result == { + "user": { + "name": "John Doe", # unchanged + "ssn": "XXX-XX-XXXX", # masked + "address": {"street": "123 Main St", "zip": "00000"}, # unchanged # masked + }, + } + + +def test_erase_dictionary_with_masking_rules_with_list(data_masker): + # GIVEN a dictionary with nested sensitive data + data = {"user": {"name": ["leandro", "powertools"]}} + + # AND masking rules for specific fields + masking_rules = {"user.name": {"custom_mask": "NO-NAME"}} + + # WHEN erase is called with masking rules + result = data_masker.erase(data, masking_rules=masking_rules) + + # THEN only the specified fields should be masked + assert result == { + "user": { + "name": "NO-NAME", + }, + } + + +def test_erase_list_with_custom_mask(data_masker): + # GIVEN a dictionary with nested sensitive data + data = {"user": {"name": ["leandro", "powertools"]}} + + # WHEN erase is called with masking rules + result = data_masker.erase(data, fields=["user.name"], dynamic_mask=True) + + # THEN only the specified fields should be masked + assert result == { + "user": { + "name": ["*******", "**********"], + }, + } + + +def test_erase_dictionary_with_global_mask(data_masker): + # GIVEN a dictionary with sensitive data + data = {"user": {"name": "John Doe", "ssn": "123-45-6789"}} + + # WHEN erase is called with a custom mask for all fields + result = data_masker.erase(data, custom_mask="REDACTED") + + # THEN all fields should use the custom mask + assert result == {"user": {"name": "REDACTED", "ssn": "REDACTED"}} + + +def test_erase_empty_dictionary(data_masker): + # GIVEN an empty dictionary + data = {} + + # WHEN erase is called + result = data_masker.erase(data, custom_mask="MASKED") + + # THEN an empty dictionary should be returned + assert result == {} + + +def test_erase_different_iterables_with_masking(data_masker): + # GIVEN different types of iterables + list_data = ["name", "phone", "email"] + tuple_data = ("name", "phone", "email") + set_data = {"name", "phone", "email"} + + # WHEN erase is called with a custom mask + masked_list = data_masker.erase(list_data, custom_mask="XXX") + masked_tuple = data_masker.erase(tuple_data, custom_mask="XXX") + masked_set = data_masker.erase(set_data, custom_mask="XXX") + + # THEN the masked data should maintain its original type + assert isinstance(masked_list, list) + assert isinstance(masked_tuple, tuple) + assert isinstance(masked_set, set) + + # AND all values should be masked + expected_values = {"XXX"} + assert set(masked_list) == expected_values + assert set(masked_tuple) == expected_values + assert masked_set == expected_values + + +def test_erase_handles_invalid_regex_pattern(data_masker): + # GIVEN a string and an invalid regex pattern + data = "test123" + + # WHEN masking with invalid regex + result = data_masker.erase( + data, + regex_pattern="[", + mask_format="X", # Invalid regex pattern that will raise re.error + ) + + # THEN original data should be returned + assert result == "test123" + + +def test_erase_handles_empty_string_with_dynamic_mask(data_masker): + # GIVEN an empty string + data = "" + + # WHEN erase is called with dynamic_mask + result = data_masker.erase(data, dynamic_mask=True) + + # THEN empty string should be returned + assert result == "" + + +def test_erase_dictionary_with_masking_rules_wrong_field(data_masker): + # GIVEN a dictionary with nested sensitive data + data = {"user": {"name": "John Doe", "ssn": "123-45-6789", "address": {"street": "123 Main St", "zip": "12345"}}} + + # AND masking rules for specific fields + masking_rules = {"user.ssn...": {"custom_mask": "XXX-XX-XXXX"}, "user.address.zip": {"custom_mask": "00000"}} + + # WHEN erase is called with wrong masking rules + # We must have a warning + with pytest.warns(expected_warning=PowertoolsUserWarning, match="Error processing path*"): + data_masker.erase(data, masking_rules=masking_rules) diff --git a/tests/unit/data_masking/_aws_encryption_sdk/test_unit_data_masking.py b/tests/unit/data_masking/_aws_encryption_sdk/test_unit_data_masking.py deleted file mode 100644 index 4fbbc188ceb..00000000000 --- a/tests/unit/data_masking/_aws_encryption_sdk/test_unit_data_masking.py +++ /dev/null @@ -1,207 +0,0 @@ -import json - -import pytest - -from aws_lambda_powertools.utilities.data_masking.base import DataMasking -from aws_lambda_powertools.utilities.data_masking.constants import DATA_MASKING_STRING -from aws_lambda_powertools.utilities.data_masking.exceptions import ( - DataMaskingFieldNotFoundError, - DataMaskingUnsupportedTypeError, -) - - -@pytest.fixture -def data_masker() -> DataMasking: - return DataMasking() - - -def test_erase_int(data_masker): - # GIVEN an int data type - - # WHEN erase is called with no fields argument - erased_string = data_masker.erase(42) - - # THEN the result is the data masked - assert erased_string == DATA_MASKING_STRING - - -def test_erase_float(data_masker): - # GIVEN a float data type - - # WHEN erase is called with no fields argument - erased_string = data_masker.erase(4.2) - - # THEN the result is the data masked - assert erased_string == DATA_MASKING_STRING - - -def test_erase_bool(data_masker): - # GIVEN a bool data type - - # WHEN erase is called with no fields argument - erased_string = data_masker.erase(True) - - # THEN the result is the data masked - assert erased_string == DATA_MASKING_STRING - - -def test_erase_none(data_masker): - # GIVEN a None data type - - # WHEN erase is called with no fields argument - erased_string = data_masker.erase(None) - - # THEN the result is the data masked - assert erased_string == DATA_MASKING_STRING - - -def test_erase_str(data_masker): - # GIVEN a str data type - - # WHEN erase is called with no fields argument - erased_string = data_masker.erase("this is a string") - - # THEN the result is the data masked - assert erased_string == DATA_MASKING_STRING - - -def test_erase_list(data_masker): - # GIVEN a list data type - - # WHEN erase is called with no fields argument - erased_string = data_masker.erase([1, 2, "string", 3]) - - # THEN the result is the data masked, while maintaining type list - assert erased_string == [DATA_MASKING_STRING, DATA_MASKING_STRING, DATA_MASKING_STRING, DATA_MASKING_STRING] - - -def test_erase_dict(data_masker): - # GIVEN a dict data type - data = { - "a": { - "1": {"None": "hello", "four": "world"}, - "b": {"3": {"4": "goodbye", "e": "world"}}, - }, - } - - # WHEN erase is called with no fields argument - erased_string = data_masker.erase(data) - - # THEN the result is the data masked - assert erased_string == DATA_MASKING_STRING - - -def test_erase_dict_with_fields(data_masker): - # GIVEN a dict data type - data = { - "a": { - "1": {"None": "hello", "four": "world"}, - "b": {"3": {"4": "goodbye", "e": "world"}}, - }, - } - - # WHEN erase is called with a list of fields specified - erased_string = data_masker.erase(data, fields=["a.'1'.None", "a..'4'"]) - - # THEN the result is only the specified fields are erased - assert erased_string == { - "a": { - "1": {"None": DATA_MASKING_STRING, "four": "world"}, - "b": {"3": {"4": DATA_MASKING_STRING, "e": "world"}}, - }, - } - - -def test_erase_json_dict_with_fields(data_masker): - # GIVEN the data type is a json representation of a dictionary - data = json.dumps( - { - "a": { - "1": {"None": "hello", "four": "world"}, - "b": {"3": {"4": "goodbye", "e": "world"}}, - }, - }, - ) - - # WHEN erase is called with a list of fields specified - masked_json_string = data_masker.erase(data, fields=["a.'1'.None", "a..'4'"]) - - # THEN the result is only the specified fields are erased - assert masked_json_string == { - "a": { - "1": {"None": DATA_MASKING_STRING, "four": "world"}, - "b": {"3": {"4": DATA_MASKING_STRING, "e": "world"}}, - }, - } - - -def test_encrypt_not_implemented(data_masker): - # GIVEN DataMasking is not initialized with a Provider - - # WHEN attempting to call the encrypt method on the data - with pytest.raises(NotImplementedError): - # THEN the result is a NotImplementedError - data_masker.encrypt("hello world") - - -def test_decrypt_not_implemented(data_masker): - # GIVEN DataMasking is not initialized with a Provider - - # WHEN attempting to call the decrypt method on the data - with pytest.raises(NotImplementedError): - # THEN the result is a NotImplementedError - data_masker.decrypt("hello world") - - -def test_parsing_unsupported_data_type(data_masker): - # GIVEN an initialization of the DataMasking class - - # WHEN attempting to pass in a list of fields with input data that is not a dict - with pytest.raises(DataMaskingUnsupportedTypeError): - # THEN the result is a TypeError - data_masker.erase(42, ["this.field"]) - - -def test_parsing_with_empty_field(data_masker): - # GIVEN an initialization of the DataMasking class - - # WHEN attempting to pass in a list of fields with input data that is not a dict - with pytest.raises(ValueError): - # THEN the result is a TypeError - data_masker.erase(42, []) - - -def test_parsing_nonexistent_fields_with_raise_on_missing_field(): - # GIVEN a dict data type - - data_masker = DataMasking(raise_on_missing_field=True) - data = { - "3": { - "1": {"None": "hello", "four": "world"}, - "4": {"33": {"5": "goodbye", "e": "world"}}, - }, - } - - # WHEN attempting to pass in fields that do not exist in the input data - with pytest.raises(DataMaskingFieldNotFoundError): - # THEN the result is a KeyError - data_masker.erase(data, ["'3'..True"]) - - -def test_parsing_nonexistent_fields_warning_on_missing_field(): - # GIVEN a dict data type - - data_masker = DataMasking(raise_on_missing_field=False) - data = { - "3": { - "1": {"None": "hello", "four": "world"}, - "4": {"33": {"5": "goodbye", "e": "world"}}, - }, - } - - # WHEN erase is called with a non-existing field - with pytest.warns(UserWarning, match="Field or expression*"): - masked_json_string = data_masker.erase(data, fields=["non-existing"]) - - # THEN the "erased" payload is the same of the original - assert masked_json_string == data diff --git a/tests/unit/data_masking/required_dependencies/test_base_functions.py b/tests/unit/data_masking/required_dependencies/test_base_functions.py new file mode 100644 index 00000000000..1af532967c7 --- /dev/null +++ b/tests/unit/data_masking/required_dependencies/test_base_functions.py @@ -0,0 +1,30 @@ +import pytest + +from aws_lambda_powertools.utilities.data_masking.base import DataMasking + + +@pytest.fixture +def data_masker() -> DataMasking: + return DataMasking() + + +def test_mask_nested_field_with_non_dict_value(data_masker): + # GIVEN nested data where a middle path component is not a dictionary + data = {"user": {"contact": "not_a_dict", "details": {"ssn": "123-45-6789"}}} # This will stop the traversal + + # WHEN attempting to mask a field through a path containing a non-dict value + data_masker._mask_nested_field(data, "user.contact.details.ssn", lambda x: "MASKED") + + # THEN the data should remain unchanged since traversal stopped at non-dict value + assert data == {"user": {"contact": "not_a_dict", "details": {"ssn": "123-45-6789"}}} + + +def test_mask_nested_field_success(data_masker): + # GIVEN nested data with a field to mask + data = {"user": {"contact": {"details": {"address": {"street": "123 Main St", "zip": "12345"}}}}} + + # WHEN masking a nested field with a masking rule + data_masker._mask_nested_field(data, "user.contact.details.address.zip", {"custom_mask": "xxx"}) + + # THEN the nested field should be masked while other data remains unchanged + assert data == {"user": {"contact": {"details": {"address": {"street": "123 Main St", "zip": "xxx"}}}}} From 46cdaa758ee2e08e528ef7d51bea55078e02c540 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 10:29:46 +0000 Subject: [PATCH 124/139] chore(ci): changelog rebuild (#6070) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- CHANGELOG.md | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5844ee79653..2ee352d2403 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,64 +35,71 @@ ## Features +* **event_source:** add class APIGatewayAuthorizerResponseWebSocket ([#6058](https://github.com/aws-powertools/powertools-lambda-python/issues/6058)) * **logger:** add clear_state method ([#5956](https://github.com/aws-powertools/powertools-lambda-python/issues/5956)) +* **metrics:** disable metrics flush via environment variables ([#6046](https://github.com/aws-powertools/powertools-lambda-python/issues/6046)) * **openapi:** enhance support for tuple return type validation ([#5997](https://github.com/aws-powertools/powertools-lambda-python/issues/5997)) ## Maintenance -* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) * **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) -* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) * **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) * **ci:** new pre-release 3.5.1a8 ([#6061](https://github.com/aws-powertools/powertools-lambda-python/issues/6061)) +* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) * **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) -* **ci:** new pre-release 3.5.1a7 ([#6044](https://github.com/aws-powertools/powertools-lambda-python/issues/6044)) * **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) +* **ci:** new pre-release 3.5.1a9 ([#6069](https://github.com/aws-powertools/powertools-lambda-python/issues/6069)) +* **ci:** new pre-release 3.5.1a7 ([#6044](https://github.com/aws-powertools/powertools-lambda-python/issues/6044)) * **ci:** new pre-release 3.5.1a5 ([#6026](https://github.com/aws-powertools/powertools-lambda-python/issues/6026)) * **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) +* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) * **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) * **ci:** new pre-release 3.5.1a6 ([#6033](https://github.com/aws-powertools/powertools-lambda-python/issues/6033)) -* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) -* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) -* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) -* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) * **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) * **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) -* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) -* **deps:** bump docker/setup-buildx-action from 3.8.0 to 3.9.0 ([#6042](https://github.com/aws-powertools/powertools-lambda-python/issues/6042)) -* **deps:** bump docker/setup-qemu-action from 3.3.0 to 3.4.0 ([#6043](https://github.com/aws-powertools/powertools-lambda-python/issues/6043)) * **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) * **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) +* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) +* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) +* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) +* **deps:** bump docker/setup-buildx-action from 3.8.0 to 3.9.0 ([#6042](https://github.com/aws-powertools/powertools-lambda-python/issues/6042)) +* **deps:** bump docker/setup-qemu-action from 3.3.0 to 3.4.0 ([#6043](https://github.com/aws-powertools/powertools-lambda-python/issues/6043)) +* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) +* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) * **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) * **deps:** bump squidfunk/mkdocs-material from `7e841df` to `c62453b` in /docs ([#6052](https://github.com/aws-powertools/powertools-lambda-python/issues/6052)) +* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.20 to 3.0.21 ([#6064](https://github.com/aws-powertools/powertools-lambda-python/issues/6064)) * **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) -* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) -* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.178.0a0 to 2.178.1a0 ([#6048](https://github.com/aws-powertools/powertools-lambda-python/issues/6048)) -* **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) +* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) * **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) +* **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) * **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) * **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) -* **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) +* **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) * **deps-dev:** bump cfn-lint from 1.23.1 to 1.24.0 ([#6030](https://github.com/aws-powertools/powertools-lambda-python/issues/6030)) * **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 ([#6031](https://github.com/aws-powertools/powertools-lambda-python/issues/6031)) * **deps-dev:** bump boto3-stubs from 1.36.12 to 1.36.14 ([#6029](https://github.com/aws-powertools/powertools-lambda-python/issues/6029)) +* **deps-dev:** bump ruff from 0.9.5 to 0.9.6 ([#6066](https://github.com/aws-powertools/powertools-lambda-python/issues/6066)) +* **deps-dev:** bump aws-cdk-lib from 2.177.0 to 2.178.0 ([#6038](https://github.com/aws-powertools/powertools-lambda-python/issues/6038)) +* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) * **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) * **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) -* **deps-dev:** bump mypy from 1.14.1 to 1.15.0 ([#6028](https://github.com/aws-powertools/powertools-lambda-python/issues/6028)) -* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) -* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) -* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) -* **deps-dev:** bump aws-cdk-lib from 2.177.0 to 2.178.0 ([#6038](https://github.com/aws-powertools/powertools-lambda-python/issues/6038)) * **deps-dev:** bump ruff from 0.9.4 to 0.9.5 ([#6039](https://github.com/aws-powertools/powertools-lambda-python/issues/6039)) -* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) +* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) * **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.177.0a0 to 2.178.0a0 ([#6041](https://github.com/aws-powertools/powertools-lambda-python/issues/6041)) +* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) * **deps-dev:** bump aws-cdk from 2.177.0 to 2.178.0 ([#6040](https://github.com/aws-powertools/powertools-lambda-python/issues/6040)) * **deps-dev:** bump aws-cdk from 2.178.0 to 2.178.1 ([#6053](https://github.com/aws-powertools/powertools-lambda-python/issues/6053)) * **deps-dev:** bump aws-cdk-lib from 2.178.0 to 2.178.1 ([#6047](https://github.com/aws-powertools/powertools-lambda-python/issues/6047)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.178.0a0 to 2.178.1a0 ([#6048](https://github.com/aws-powertools/powertools-lambda-python/issues/6048)) * **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.15 ([#6049](https://github.com/aws-powertools/powertools-lambda-python/issues/6049)) * **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.291 to 0.1.292 ([#6051](https://github.com/aws-powertools/powertools-lambda-python/issues/6051)) * **deps-dev:** bump mkdocstrings-python from 1.14.5 to 1.14.6 ([#6050](https://github.com/aws-powertools/powertools-lambda-python/issues/6050)) * **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.16 ([#6057](https://github.com/aws-powertools/powertools-lambda-python/issues/6057)) +* **deps-dev:** bump mkdocs-material from 9.6.2 to 9.6.3 ([#6065](https://github.com/aws-powertools/powertools-lambda-python/issues/6065)) +* **deps-dev:** bump coverage from 7.6.10 to 7.6.11 ([#6067](https://github.com/aws-powertools/powertools-lambda-python/issues/6067)) +* **deps-dev:** bump mypy from 1.14.1 to 1.15.0 ([#6028](https://github.com/aws-powertools/powertools-lambda-python/issues/6028)) * **docs:** enable privacy plugin in docs ([#6036](https://github.com/aws-powertools/powertools-lambda-python/issues/6036)) From 24aadb3b16f817124944717824a0db7ddd7eeaef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 11:35:38 +0000 Subject: [PATCH 125/139] chore(ci): bump version to 3.6.0 (#6071) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index 24a46d3940a..5c4a4e39ba8 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.5.1a9" +VERSION = "3.6.0" diff --git a/pyproject.toml b/pyproject.toml index 8a306eccade..5549221f886 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.5.1a9" +version = "3.6.0" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From d0024d245127a413a8bb3078ee22ba9ef6b71507 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 11:38:46 +0000 Subject: [PATCH 126/139] chore(ci): layer docs update (#6072) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- CHANGELOG.md | 102 +----- docs/includes/_layer_homepage_arm64.md | 290 ++++++++--------- docs/includes/_layer_homepage_x86.md | 300 +++++++++--------- docs/index.md | 4 +- examples/homepage/install/arm64/amplify.txt | 4 +- examples/homepage/install/arm64/cdk_arm64.py | 2 +- .../homepage/install/arm64/pulumi_arm64.py | 2 +- examples/homepage/install/arm64/sam.yaml | 2 +- .../homepage/install/arm64/serverless.yml | 2 +- examples/homepage/install/arm64/terraform.tf | 2 +- examples/homepage/install/x86_64/amplify.txt | 4 +- examples/homepage/install/x86_64/cdk_x86.py | 2 +- .../homepage/install/x86_64/pulumi_x86.py | 2 +- examples/homepage/install/x86_64/sam.yaml | 2 +- .../homepage/install/x86_64/serverless.yml | 2 +- examples/homepage/install/x86_64/terraform.tf | 2 +- examples/logger/sam/template.yaml | 2 +- examples/metrics/sam/template.yaml | 2 +- examples/metrics_datadog/sam/template.yaml | 2 +- examples/tracer/sam/template.yaml | 2 +- 20 files changed, 321 insertions(+), 411 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ee352d2403..95cf0932062 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,103 +4,12 @@ # Unreleased -## Bug Fixes - -* **docs:** typo in a service name in Event Handler ([#5944](https://github.com/aws-powertools/powertools-lambda-python/issues/5944)) -* **logger:** child logger must respect log level ([#5950](https://github.com/aws-powertools/powertools-lambda-python/issues/5950)) - -## Code Refactoring - -* **metrics:** Improve type annotations for metrics decorator ([#6000](https://github.com/aws-powertools/powertools-lambda-python/issues/6000)) -## Documentation - -* **api:** migrating the event handler utility to mkdocstrings ([#6023](https://github.com/aws-powertools/powertools-lambda-python/issues/6023)) -* **api:** migrating the metrics utility to mkdocstrings ([#6022](https://github.com/aws-powertools/powertools-lambda-python/issues/6022)) -* **api:** migrating the logger utility to mkdocstrings ([#6021](https://github.com/aws-powertools/powertools-lambda-python/issues/6021)) -* **api:** migrating the Middleware Factory utility to mkdocstrings ([#6019](https://github.com/aws-powertools/powertools-lambda-python/issues/6019)) -* **api:** migrating the tracer utility to mkdocstrings ([#6017](https://github.com/aws-powertools/powertools-lambda-python/issues/6017)) -* **api:** migrating the batch utility to mkdocstrings ([#6016](https://github.com/aws-powertools/powertools-lambda-python/issues/6016)) -* **api:** migrating the event source data classes utility to mkdocstrings ([#6015](https://github.com/aws-powertools/powertools-lambda-python/issues/6015)) -* **api:** migrating the data masking utility to mkdocstrings ([#6013](https://github.com/aws-powertools/powertools-lambda-python/issues/6013)) -* **api:** migrating the AppConfig utility to mkdocstrings ([#6008](https://github.com/aws-powertools/powertools-lambda-python/issues/6008)) -* **api:** migrating the idempotency utility to mkdocstrings ([#6007](https://github.com/aws-powertools/powertools-lambda-python/issues/6007)) -* **api:** migrating the jmespath utility to mkdocstrings ([#6006](https://github.com/aws-powertools/powertools-lambda-python/issues/6006)) -* **api:** migrating the parameters utility to mkdocstrings ([#6005](https://github.com/aws-powertools/powertools-lambda-python/issues/6005)) -* **api:** migrating the parser utility to mkdocstrings ([#6004](https://github.com/aws-powertools/powertools-lambda-python/issues/6004)) -* **api:** migrating the streaming utility to mkdocstrings ([#6003](https://github.com/aws-powertools/powertools-lambda-python/issues/6003)) -* **api:** migrating the typing utility to mkdocstrings ([#5996](https://github.com/aws-powertools/powertools-lambda-python/issues/5996)) -* **api:** migrating the validation utility to mkdocstrings ([#5972](https://github.com/aws-powertools/powertools-lambda-python/issues/5972)) -* **layer:** update layer version number - v3.5.0 ([#5952](https://github.com/aws-powertools/powertools-lambda-python/issues/5952)) - -## Features + +## [v3.6.0] - 2025-02-11 +## Maintenance -* **event_source:** add class APIGatewayAuthorizerResponseWebSocket ([#6058](https://github.com/aws-powertools/powertools-lambda-python/issues/6058)) -* **logger:** add clear_state method ([#5956](https://github.com/aws-powertools/powertools-lambda-python/issues/5956)) -* **metrics:** disable metrics flush via environment variables ([#6046](https://github.com/aws-powertools/powertools-lambda-python/issues/6046)) -* **openapi:** enhance support for tuple return type validation ([#5997](https://github.com/aws-powertools/powertools-lambda-python/issues/5997)) - -## Maintenance - -* **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) -* **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) -* **ci:** new pre-release 3.5.1a8 ([#6061](https://github.com/aws-powertools/powertools-lambda-python/issues/6061)) -* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) -* **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) -* **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) -* **ci:** new pre-release 3.5.1a9 ([#6069](https://github.com/aws-powertools/powertools-lambda-python/issues/6069)) -* **ci:** new pre-release 3.5.1a7 ([#6044](https://github.com/aws-powertools/powertools-lambda-python/issues/6044)) -* **ci:** new pre-release 3.5.1a5 ([#6026](https://github.com/aws-powertools/powertools-lambda-python/issues/6026)) -* **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) -* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) -* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) -* **ci:** new pre-release 3.5.1a6 ([#6033](https://github.com/aws-powertools/powertools-lambda-python/issues/6033)) -* **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) -* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) -* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) -* **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) -* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) -* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) -* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) -* **deps:** bump docker/setup-buildx-action from 3.8.0 to 3.9.0 ([#6042](https://github.com/aws-powertools/powertools-lambda-python/issues/6042)) -* **deps:** bump docker/setup-qemu-action from 3.3.0 to 3.4.0 ([#6043](https://github.com/aws-powertools/powertools-lambda-python/issues/6043)) -* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) -* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) -* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) -* **deps:** bump squidfunk/mkdocs-material from `7e841df` to `c62453b` in /docs ([#6052](https://github.com/aws-powertools/powertools-lambda-python/issues/6052)) -* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.20 to 3.0.21 ([#6064](https://github.com/aws-powertools/powertools-lambda-python/issues/6064)) -* **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) -* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) -* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) -* **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) -* **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) -* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) -* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) -* **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) -* **deps-dev:** bump cfn-lint from 1.23.1 to 1.24.0 ([#6030](https://github.com/aws-powertools/powertools-lambda-python/issues/6030)) -* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 ([#6031](https://github.com/aws-powertools/powertools-lambda-python/issues/6031)) -* **deps-dev:** bump boto3-stubs from 1.36.12 to 1.36.14 ([#6029](https://github.com/aws-powertools/powertools-lambda-python/issues/6029)) -* **deps-dev:** bump ruff from 0.9.5 to 0.9.6 ([#6066](https://github.com/aws-powertools/powertools-lambda-python/issues/6066)) -* **deps-dev:** bump aws-cdk-lib from 2.177.0 to 2.178.0 ([#6038](https://github.com/aws-powertools/powertools-lambda-python/issues/6038)) -* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) -* **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) -* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) -* **deps-dev:** bump ruff from 0.9.4 to 0.9.5 ([#6039](https://github.com/aws-powertools/powertools-lambda-python/issues/6039)) -* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) -* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.177.0a0 to 2.178.0a0 ([#6041](https://github.com/aws-powertools/powertools-lambda-python/issues/6041)) -* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) -* **deps-dev:** bump aws-cdk from 2.177.0 to 2.178.0 ([#6040](https://github.com/aws-powertools/powertools-lambda-python/issues/6040)) -* **deps-dev:** bump aws-cdk from 2.178.0 to 2.178.1 ([#6053](https://github.com/aws-powertools/powertools-lambda-python/issues/6053)) -* **deps-dev:** bump aws-cdk-lib from 2.178.0 to 2.178.1 ([#6047](https://github.com/aws-powertools/powertools-lambda-python/issues/6047)) -* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.178.0a0 to 2.178.1a0 ([#6048](https://github.com/aws-powertools/powertools-lambda-python/issues/6048)) -* **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.15 ([#6049](https://github.com/aws-powertools/powertools-lambda-python/issues/6049)) -* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.291 to 0.1.292 ([#6051](https://github.com/aws-powertools/powertools-lambda-python/issues/6051)) -* **deps-dev:** bump mkdocstrings-python from 1.14.5 to 1.14.6 ([#6050](https://github.com/aws-powertools/powertools-lambda-python/issues/6050)) -* **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.16 ([#6057](https://github.com/aws-powertools/powertools-lambda-python/issues/6057)) -* **deps-dev:** bump mkdocs-material from 9.6.2 to 9.6.3 ([#6065](https://github.com/aws-powertools/powertools-lambda-python/issues/6065)) -* **deps-dev:** bump coverage from 7.6.10 to 7.6.11 ([#6067](https://github.com/aws-powertools/powertools-lambda-python/issues/6067)) -* **deps-dev:** bump mypy from 1.14.1 to 1.15.0 ([#6028](https://github.com/aws-powertools/powertools-lambda-python/issues/6028)) -* **docs:** enable privacy plugin in docs ([#6036](https://github.com/aws-powertools/powertools-lambda-python/issues/6036)) +* version bump @@ -6039,7 +5948,8 @@ * Merge pull request [#5](https://github.com/aws-powertools/powertools-lambda-python/issues/5) from jfuss/feat/python38 -[Unreleased]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.5.0...HEAD +[Unreleased]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.6.0...HEAD +[v3.6.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.5.0...v3.6.0 [v3.5.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.4.1...v3.5.0 [v3.4.1]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.4.0...v3.4.1 [v3.4.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.3.0...v3.4.0 diff --git a/docs/includes/_layer_homepage_arm64.md b/docs/includes/_layer_homepage_arm64.md index b6d57fed27d..d5c0658d85b 100644 --- a/docs/includes/_layer_homepage_arm64.md +++ b/docs/includes/_layer_homepage_arm64.md @@ -5,168 +5,168 @@ | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:7**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:8**{: .copyMe}:clipboard: | === "Python 3.10" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:7**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:8**{: .copyMe}:clipboard: | === "Python 3.11" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:7**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:8**{: .copyMe}:clipboard: | === "Python 3.12" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8**{: .copyMe}:clipboard: | === "Python 3.13" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:7**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:8**{: .copyMe}:clipboard: | diff --git a/docs/includes/_layer_homepage_x86.md b/docs/includes/_layer_homepage_x86.md index 2fddfd4cbda..3baac0ed73f 100644 --- a/docs/includes/_layer_homepage_x86.md +++ b/docs/includes/_layer_homepage_x86.md @@ -5,173 +5,173 @@ | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:7**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:8**{: .copyMe}:clipboard: | === "Python 3.10" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:7**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:8**{: .copyMe}:clipboard: | === "Python 3.11" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:7**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:8**{: .copyMe}:clipboard: | === "Python 3.12" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8**{: .copyMe}:clipboard: | === "Python 3.13" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:7**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:8**{: .copyMe}:clipboard: | diff --git a/docs/index.md b/docs/index.md index 4f5c165f287..4ab5b89a701 100644 --- a/docs/index.md +++ b/docs/index.md @@ -205,7 +205,7 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc You can use AWS CLI to generate a pre-signed URL to download the contents of our Lambda Layer. ```bash title="AWS CLI command to download Lambda Layer content" - aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 --region eu-west-1 + aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8 --region eu-west-1 ``` You'll find the pre-signed URL under `Location` key as part of the CLI command output. @@ -319,7 +319,7 @@ In this context, `[aws-sdk]` is an alias to the `boto3` package. Due to dependen The pre-signed URL to download this Lambda Layer will be within `Location` key in the CLI output. The CLI output will also contain the Powertools for AWS Lambda version it contains. ```bash title="AWS CLI command to download Lambda Layer content" -aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 --region eu-west-1 +aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8 --region eu-west-1 ``` #### SAR diff --git a/examples/homepage/install/arm64/amplify.txt b/examples/homepage/install/arm64/amplify.txt index 58180d6debd..ff67821547c 100644 --- a/examples/homepage/install/arm64/amplify.txt +++ b/examples/homepage/install/arm64/amplify.txt @@ -6,7 +6,7 @@ ? Do you want to configure advanced settings? Yes ... ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8 ❯ amplify push -y @@ -17,5 +17,5 @@ General information - Name: ? Which setting do you want to update? Lambda layers configuration ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8 ? Do you want to edit the local lambda function now? No diff --git a/examples/homepage/install/arm64/cdk_arm64.py b/examples/homepage/install/arm64/cdk_arm64.py index 933d8e9b709..f5c6e86d23b 100644 --- a/examples/homepage/install/arm64/cdk_arm64.py +++ b/examples/homepage/install/arm64/cdk_arm64.py @@ -10,7 +10,7 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: powertools_layer = aws_lambda.LayerVersion.from_layer_version_arn( self, id="lambda-powertools", - layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7", + layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8", ) aws_lambda.Function( self, diff --git a/examples/homepage/install/arm64/pulumi_arm64.py b/examples/homepage/install/arm64/pulumi_arm64.py index 69aa28b8ada..ffd5d418c06 100644 --- a/examples/homepage/install/arm64/pulumi_arm64.py +++ b/examples/homepage/install/arm64/pulumi_arm64.py @@ -22,7 +22,7 @@ pulumi.Output.concat( "arn:aws:lambda:", aws.get_region_output().name, - ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7", + ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8", ), ], tracing_config={"mode": "Active"}, diff --git a/examples/homepage/install/arm64/sam.yaml b/examples/homepage/install/arm64/sam.yaml index 8f66f7b2654..346103eae5b 100644 --- a/examples/homepage/install/arm64/sam.yaml +++ b/examples/homepage/install/arm64/sam.yaml @@ -9,4 +9,4 @@ Resources: Runtime: python3.12 Handler: app.lambda_handler Layers: - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8 diff --git a/examples/homepage/install/arm64/serverless.yml b/examples/homepage/install/arm64/serverless.yml index 41814b8953a..17ffbe0b396 100644 --- a/examples/homepage/install/arm64/serverless.yml +++ b/examples/homepage/install/arm64/serverless.yml @@ -10,4 +10,4 @@ functions: handler: lambda_function.lambda_handler architecture: arm64 layers: - - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7 + - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8 diff --git a/examples/homepage/install/arm64/terraform.tf b/examples/homepage/install/arm64/terraform.tf index 938f1a7e0eb..ae0ec997e0f 100644 --- a/examples/homepage/install/arm64/terraform.tf +++ b/examples/homepage/install/arm64/terraform.tf @@ -34,7 +34,7 @@ resource "aws_lambda_function" "test_lambda" { role = aws_iam_role.iam_for_lambda.arn handler = "index.test" runtime = "python3.12" - layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:7"] + layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:8"] architectures = ["arm64"] source_code_hash = filebase64sha256("lambda_function_payload.zip") diff --git a/examples/homepage/install/x86_64/amplify.txt b/examples/homepage/install/x86_64/amplify.txt index 545cb731d19..cd459142400 100644 --- a/examples/homepage/install/x86_64/amplify.txt +++ b/examples/homepage/install/x86_64/amplify.txt @@ -6,7 +6,7 @@ ? Do you want to configure advanced settings? Yes ... ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8 ❯ amplify push -y @@ -17,5 +17,5 @@ General information - Name: ? Which setting do you want to update? Lambda layers configuration ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8 ? Do you want to edit the local lambda function now? No diff --git a/examples/homepage/install/x86_64/cdk_x86.py b/examples/homepage/install/x86_64/cdk_x86.py index c42687f00ca..64a6f93f9b0 100644 --- a/examples/homepage/install/x86_64/cdk_x86.py +++ b/examples/homepage/install/x86_64/cdk_x86.py @@ -10,7 +10,7 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: powertools_layer = aws_lambda.LayerVersion.from_layer_version_arn( self, id="lambda-powertools", - layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7", + layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8", ) aws_lambda.Function( self, diff --git a/examples/homepage/install/x86_64/pulumi_x86.py b/examples/homepage/install/x86_64/pulumi_x86.py index 8093a4d067c..bea06c0ba9a 100644 --- a/examples/homepage/install/x86_64/pulumi_x86.py +++ b/examples/homepage/install/x86_64/pulumi_x86.py @@ -22,7 +22,7 @@ pulumi.Output.concat( "arn:aws:lambda:", aws.get_region_output().name, - ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7", + ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8", ), ], tracing_config={"mode": "Active"}, diff --git a/examples/homepage/install/x86_64/sam.yaml b/examples/homepage/install/x86_64/sam.yaml index 59bc71c2474..7efd0867320 100644 --- a/examples/homepage/install/x86_64/sam.yaml +++ b/examples/homepage/install/x86_64/sam.yaml @@ -8,4 +8,4 @@ Resources: Runtime: python3.12 Handler: app.lambda_handler Layers: - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8 diff --git a/examples/homepage/install/x86_64/serverless.yml b/examples/homepage/install/x86_64/serverless.yml index 850fcf36bac..bcb3a2dfd48 100644 --- a/examples/homepage/install/x86_64/serverless.yml +++ b/examples/homepage/install/x86_64/serverless.yml @@ -10,4 +10,4 @@ functions: handler: lambda_function.lambda_handler architecture: arm64 layers: - - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 + - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8 diff --git a/examples/homepage/install/x86_64/terraform.tf b/examples/homepage/install/x86_64/terraform.tf index a1a37fb475a..db4aca07a99 100644 --- a/examples/homepage/install/x86_64/terraform.tf +++ b/examples/homepage/install/x86_64/terraform.tf @@ -34,7 +34,7 @@ resource "aws_lambda_function" "test_lambda" { role = aws_iam_role.iam_for_lambda.arn handler = "index.test" runtime = "python3.12" - layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7"] + layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } diff --git a/examples/logger/sam/template.yaml b/examples/logger/sam/template.yaml index ede8c940ad8..0a4adc87a22 100644 --- a/examples/logger/sam/template.yaml +++ b/examples/logger/sam/template.yaml @@ -14,7 +14,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8 Resources: LoggerLambdaHandlerExample: diff --git a/examples/metrics/sam/template.yaml b/examples/metrics/sam/template.yaml index 2d57768fc88..4638ad59af4 100644 --- a/examples/metrics/sam/template.yaml +++ b/examples/metrics/sam/template.yaml @@ -15,7 +15,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8 Resources: CaptureLambdaHandlerExample: diff --git a/examples/metrics_datadog/sam/template.yaml b/examples/metrics_datadog/sam/template.yaml index 99d1fc35874..2458a0c498f 100644 --- a/examples/metrics_datadog/sam/template.yaml +++ b/examples/metrics_datadog/sam/template.yaml @@ -20,7 +20,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8 # Find the latest Layer version in the Datadog official documentation # Datadog SDK diff --git a/examples/tracer/sam/template.yaml b/examples/tracer/sam/template.yaml index 8091369bb84..0907a7425b8 100644 --- a/examples/tracer/sam/template.yaml +++ b/examples/tracer/sam/template.yaml @@ -13,7 +13,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:7 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:8 Resources: CaptureLambdaHandlerExample: From df0d1e21f17e2068b7259ad80d34000993802348 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 11 Feb 2025 13:54:59 +0000 Subject: [PATCH 127/139] fix(security): fix encryption_context handling in data masking operations (#6074) Enforcing encryption context --- .../utilities/data_masking/base.py | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/aws_lambda_powertools/utilities/data_masking/base.py b/aws_lambda_powertools/utilities/data_masking/base.py index c5fd6f274e7..3eed26045c2 100644 --- a/aws_lambda_powertools/utilities/data_masking/base.py +++ b/aws_lambda_powertools/utilities/data_masking/base.py @@ -207,7 +207,7 @@ def _apply_action( custom_mask: str | None = None, regex_pattern: str | None = None, mask_format: str | None = None, - **kwargs: Any, + **encryption_context: Any, ) -> Any: """ Helper method to determine whether to apply a given action to the entire input data @@ -242,19 +242,24 @@ def _apply_action( custom_mask=custom_mask, regex_pattern=regex_pattern, mask_format=mask_format, - **kwargs, ) else: logger.debug(f"Running action {action.__name__} with the entire data") - return action( - data=data, - provider_options=provider_options, - dynamic_mask=dynamic_mask, - custom_mask=custom_mask, - regex_pattern=regex_pattern, - mask_format=mask_format, - **kwargs, - ) + if action.__name__ == "erase": + return action( + data=data, + provider_options=provider_options, + dynamic_mask=dynamic_mask, + custom_mask=custom_mask, + regex_pattern=regex_pattern, + mask_format=mask_format, + ) + else: + return action( + data=data, + provider_options=provider_options, + **encryption_context, + ) def _apply_action_to_fields( self, From a20240c04c4723afa33739ed5be2e7b8180aad54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 18:32:27 -0300 Subject: [PATCH 128/139] chore(deps-dev): bump boto3-stubs from 1.36.16 to 1.36.17 (#6078) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.16 to 1.36.17. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 168d83758ca..b1cf845c534 100644 --- a/poetry.lock +++ b/poetry.lock @@ -439,13 +439,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.16" -description = "Type annotations for boto3 1.36.16 generated with mypy-boto3-builder 8.9.0" +version = "1.36.17" +description = "Type annotations for boto3 1.36.17 generated with mypy-boto3-builder 8.9.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.16-py3-none-any.whl", hash = "sha256:43ac9229ac239de16c37087a6fed145a1afda95c926cebfd4c292c29aab43720"}, - {file = "boto3_stubs-1.36.16.tar.gz", hash = "sha256:9fe8b6dc3d6b33ccc4241bd7e281f11525a45743a6b0bf4da93554b9a47f07d1"}, + {file = "boto3_stubs-1.36.17-py3-none-any.whl", hash = "sha256:4605dc8c65fdb577a9bfa3f2a320f8de4a8353590035a891584ff05f28991c07"}, + {file = "boto3_stubs-1.36.17.tar.gz", hash = "sha256:6bdb71f80e50be5dd0b91fcf9852eebdced9217f49b1973d6b30c77c283f7b00"}, ] [package.dependencies] @@ -512,7 +512,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.16)"] +boto3 = ["boto3 (==1.36.17)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From f704595077745692198435130cf8f63665907890 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 18:44:27 -0300 Subject: [PATCH 129/139] chore(deps-dev): bump mkdocstrings-python from 1.14.6 to 1.15.0 (#6079) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [mkdocstrings-python](https://github.com/mkdocstrings/python) from 1.14.6 to 1.15.0. - [Release notes](https://github.com/mkdocstrings/python/releases) - [Changelog](https://github.com/mkdocstrings/python/blob/main/CHANGELOG.md) - [Commits](https://github.com/mkdocstrings/python/compare/1.14.6...1.15.0) --- updated-dependencies: - dependency-name: mkdocstrings-python dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index b1cf845c534..527328b5c85 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2516,13 +2516,13 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.14.6" +version = "1.15.0" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" files = [ - {file = "mkdocstrings_python-1.14.6-py3-none-any.whl", hash = "sha256:e0ca11b49ac0f23070afb566245f4ff80ea1700e03c9dbc143d70dbf1cae074e"}, - {file = "mkdocstrings_python-1.14.6.tar.gz", hash = "sha256:3fb6589491614422d781dacca085c0c5a53a7063af37a2fea5864e24e378b03e"}, + {file = "mkdocstrings_python-1.15.0-py3-none-any.whl", hash = "sha256:77aced1bb28840d7d3510f77353319eeb450961880d87f9c53fdab331ba0120d"}, + {file = "mkdocstrings_python-1.15.0.tar.gz", hash = "sha256:2bfecbbe1252c67281408a6567d59545f4979931110f01ab625aa8c227c06edc"}, ] [package.dependencies] From 808b2625cf5d6e84c0294c645bc40bef431d4ca5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 19:12:24 -0300 Subject: [PATCH 130/139] chore(deps-dev): bump coverage from 7.6.11 to 7.6.12 (#6080) Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.6.11 to 7.6.12. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.6.11...7.6.12) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 122 +++++++++++++++++++++++++++------------------------- 1 file changed, 64 insertions(+), 58 deletions(-) diff --git a/poetry.lock b/poetry.lock index 527328b5c85..909f38cb3f5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1266,68 +1266,74 @@ typeguard = ">=2.13.3,<2.14.0" [[package]] name = "coverage" -version = "7.6.11" +version = "7.6.12" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eafea49da254a8289bed3fab960f808b322eda5577cb17a3733014928bbfbebd"}, - {file = "coverage-7.6.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a3f7cbbcb4ad95067a6525f83a6fc78d9cbc1e70f8abaeeaeaa72ef34f48fc3"}, - {file = "coverage-7.6.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de6b079b39246a7da9a40cfa62d5766bd52b4b7a88cf5a82ec4c45bf6e152306"}, - {file = "coverage-7.6.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60d4ad09dfc8c36c4910685faafcb8044c84e4dae302e86c585b3e2e7778726c"}, - {file = "coverage-7.6.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e433b6e3a834a43dae2889adc125f3fa4c66668df420d8e49bc4ee817dd7a70"}, - {file = "coverage-7.6.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ac5d92e2cc121a13270697e4cb37e1eb4511ac01d23fe1b6c097facc3b46489e"}, - {file = "coverage-7.6.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5128f3ba694c0a1bde55fc480090392c336236c3e1a10dad40dc1ab17c7675ff"}, - {file = "coverage-7.6.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:397489c611b76302dfa1d9ea079e138dddc4af80fc6819d5f5119ec8ca6c0e47"}, - {file = "coverage-7.6.11-cp310-cp310-win32.whl", hash = "sha256:c7719a5e1dc93883a6b319bc0374ecd46fb6091ed659f3fbe281ab991634b9b0"}, - {file = "coverage-7.6.11-cp310-cp310-win_amd64.whl", hash = "sha256:c27df03730059118b8a923cfc8b84b7e9976742560af528242f201880879c1da"}, - {file = "coverage-7.6.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:532fe139691af134aa8b54ed60dd3c806aa81312d93693bd2883c7b61592c840"}, - {file = "coverage-7.6.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0b0f272901a5172090c0802053fbc503cdc3fa2612720d2669a98a7384a7bec"}, - {file = "coverage-7.6.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4bda710139ea646890d1c000feb533caff86904a0e0638f85e967c28cb8eec50"}, - {file = "coverage-7.6.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a165b09e7d5f685bf659063334a9a7b1a2d57b531753d3e04bd442b3cfe5845b"}, - {file = "coverage-7.6.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ff136607689c1c87f43d24203b6d2055b42030f352d5176f9c8b204d4235ef27"}, - {file = "coverage-7.6.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:050172741de03525290e67f0161ae5f7f387c88fca50d47fceb4724ceaa591d2"}, - {file = "coverage-7.6.11-cp311-cp311-win32.whl", hash = "sha256:27700d859be68e4fb2e7bf774cf49933dcac6f81a9bc4c13bd41735b8d26a53b"}, - {file = "coverage-7.6.11-cp311-cp311-win_amd64.whl", hash = "sha256:cd4839813b09ab1dd1be1bbc74f9a7787615f931f83952b6a9af1b2d3f708bf7"}, - {file = "coverage-7.6.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dbb1a822fd858d9853333a7c95d4e70dde9a79e65893138ce32c2ec6457d7a36"}, - {file = "coverage-7.6.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61c834cbb80946d6ebfddd9b393a4c46bec92fcc0fa069321fcb8049117f76ea"}, - {file = "coverage-7.6.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a46d56e99a31d858d6912d31ffa4ede6a325c86af13139539beefca10a1234ce"}, - {file = "coverage-7.6.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b48db06f53d1864fea6dbd855e6d51d41c0f06c212c3004511c0bdc6847b297"}, - {file = "coverage-7.6.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6ff5be3b1853e0862da9d349fe87f869f68e63a25f7c37ce1130b321140f963"}, - {file = "coverage-7.6.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be05bde21d5e6eefbc3a6de6b9bee2b47894b8945342e8663192809c4d1f08ce"}, - {file = "coverage-7.6.11-cp312-cp312-win32.whl", hash = "sha256:e3b746fa0ffc5b6b8856529de487da8b9aeb4fb394bb58de6502ef45f3434f12"}, - {file = "coverage-7.6.11-cp312-cp312-win_amd64.whl", hash = "sha256:ac476e6d0128fb7919b3fae726de72b28b5c9644cb4b579e4a523d693187c551"}, - {file = "coverage-7.6.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c86f4c7a6d1a54a24d804d9684d96e36a62d3ef7c0d7745ae2ea39e3e0293251"}, - {file = "coverage-7.6.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7eb0504bb307401fd08bc5163a351df301438b3beb88a4fa044681295bbefc67"}, - {file = "coverage-7.6.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca95d40900cf614e07f00cee8c2fad0371df03ca4d7a80161d84be2ec132b7a4"}, - {file = "coverage-7.6.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db4b1a69976b1b02acda15937538a1d3fe10b185f9d99920b17a740a0a102e06"}, - {file = "coverage-7.6.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf96beb05d004e4c51cd846fcdf9eee9eb2681518524b66b2e7610507944c2f"}, - {file = "coverage-7.6.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:08e5fb93576a6b054d3d326242af5ef93daaac9bb52bc25f12ccbc3fa94227cd"}, - {file = "coverage-7.6.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25575cd5a7d2acc46b42711e8aff826027c0e4f80fb38028a74f31ac22aae69d"}, - {file = "coverage-7.6.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8fa4fffd90ee92f62ff7404b4801b59e8ea8502e19c9bf2d3241ce745b52926c"}, - {file = "coverage-7.6.11-cp313-cp313-win32.whl", hash = "sha256:0d03c9452d9d1ccfe5d3a5df0427705022a49b356ac212d529762eaea5ef97b4"}, - {file = "coverage-7.6.11-cp313-cp313-win_amd64.whl", hash = "sha256:fd2fffc8ce8692ce540103dff26279d2af22d424516ddebe2d7e4d6dbb3816b2"}, - {file = "coverage-7.6.11-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:5e7ac966ab110bd94ee844f2643f196d78fde1cd2450399116d3efdd706e19f5"}, - {file = "coverage-7.6.11-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ba27a0375c5ef4d2a7712f829265102decd5ff78b96d342ac2fa555742c4f4f"}, - {file = "coverage-7.6.11-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2778be4f574b39ec9dcd9e5e13644f770351ee0990a0ecd27e364aba95af89b"}, - {file = "coverage-7.6.11-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5edc16712187139ab635a2e644cc41fc239bc6d245b16124045743130455c652"}, - {file = "coverage-7.6.11-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6ff122a0a10a30121d9f0cb3fbd03a6fe05861e4ec47adb9f25e9245aabc19"}, - {file = "coverage-7.6.11-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ff562952f15eff27247a4c4b03e45ce8a82e3fb197de6a7c54080f9d4ba07845"}, - {file = "coverage-7.6.11-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4f21e3617f48d683f30cf2a6c8b739c838e600cb1454fe6b2eb486ac2bce8fbd"}, - {file = "coverage-7.6.11-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6d60577673ba48d8ae8e362e61fd4ad1a640293ffe8991d11c86f195479100b7"}, - {file = "coverage-7.6.11-cp313-cp313t-win32.whl", hash = "sha256:13100f98497086b359bf56fc035a762c674de8ef526daa389ac8932cb9bff1e0"}, - {file = "coverage-7.6.11-cp313-cp313t-win_amd64.whl", hash = "sha256:2c81e53782043b323bd34c7de711ed9b4673414eb517eaf35af92185b873839c"}, - {file = "coverage-7.6.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ff52b4e2ac0080c96e506819586c4b16cdbf46724bda90d308a7330a73cc8521"}, - {file = "coverage-7.6.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f4679fcc9eb9004fdd1b00231ef1ec7167168071bebc4d66327e28c1979b4449"}, - {file = "coverage-7.6.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90de4e9ca4489e823138bd13098af9ac8028cc029f33f60098b5c08c675c7bda"}, - {file = "coverage-7.6.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c96a142057d83ee993eaf71629ca3fb952cda8afa9a70af4132950c2bd3deb9"}, - {file = "coverage-7.6.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:476f29a258b9cd153f2be5bf5f119d670d2806363595263917bddc167d6e5cce"}, - {file = "coverage-7.6.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:09d03f48d9025b8a6a116cddcb6c7b8ce80e4fb4c31dd2e124a7c377036ad58e"}, - {file = "coverage-7.6.11-cp39-cp39-win32.whl", hash = "sha256:bb35ae9f134fbd9cf7302a9654d5a1e597c974202678082dcc569eb39a8cde03"}, - {file = "coverage-7.6.11-cp39-cp39-win_amd64.whl", hash = "sha256:f382004fa4c93c01016d9226b9d696a08c53f6818b7ad59b4e96cb67e863353a"}, - {file = "coverage-7.6.11-pp39.pp310-none-any.whl", hash = "sha256:adc2d941c0381edfcf3897f94b9f41b1e504902fab78a04b1677f2f72afead4b"}, - {file = "coverage-7.6.11-py3-none-any.whl", hash = "sha256:f0f334ae844675420164175bf32b04e18a81fe57ad8eb7e0cfd4689d681ffed7"}, - {file = "coverage-7.6.11.tar.gz", hash = "sha256:e642e6a46a04e992ebfdabed79e46f478ec60e2c528e1e1a074d63800eda4286"}, + {file = "coverage-7.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8"}, + {file = "coverage-7.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e"}, + {file = "coverage-7.6.12-cp310-cp310-win32.whl", hash = "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425"}, + {file = "coverage-7.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa"}, + {file = "coverage-7.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015"}, + {file = "coverage-7.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba"}, + {file = "coverage-7.6.12-cp311-cp311-win32.whl", hash = "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f"}, + {file = "coverage-7.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558"}, + {file = "coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad"}, + {file = "coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a"}, + {file = "coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95"}, + {file = "coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288"}, + {file = "coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1"}, + {file = "coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53c56358d470fa507a2b6e67a68fd002364d23c83741dbc4c2e0680d80ca227e"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64cbb1a3027c79ca6310bf101014614f6e6e18c226474606cf725238cf5bc2d4"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79cac3390bfa9836bb795be377395f28410811c9066bc4eefd8015258a7578c6"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9b148068e881faa26d878ff63e79650e208e95cf1c22bd3f77c3ca7b1d9821a3"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8bec2ac5da793c2685ce5319ca9bcf4eee683b8a1679051f8e6ec04c4f2fd7dc"}, + {file = "coverage-7.6.12-cp313-cp313-win32.whl", hash = "sha256:200e10beb6ddd7c3ded322a4186313d5ca9e63e33d8fab4faa67ef46d3460af3"}, + {file = "coverage-7.6.12-cp313-cp313-win_amd64.whl", hash = "sha256:2b996819ced9f7dbb812c701485d58f261bef08f9b85304d41219b1496b591ef"}, + {file = "coverage-7.6.12-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:299cf973a7abff87a30609879c10df0b3bfc33d021e1adabc29138a48888841e"}, + {file = "coverage-7.6.12-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4b467a8c56974bf06e543e69ad803c6865249d7a5ccf6980457ed2bc50312703"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2458f275944db8129f95d91aee32c828a408481ecde3b30af31d552c2ce284a0"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a9d8be07fb0832636a0f72b80d2a652fe665e80e720301fb22b191c3434d924"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d47376a4f445e9743f6c83291e60adb1b127607a3618e3185bbc8091f0467b"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b95574d06aa9d2bd6e5cc35a5bbe35696342c96760b69dc4287dbd5abd4ad51d"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ecea0c38c9079570163d663c0433a9af4094a60aafdca491c6a3d248c7432827"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9"}, + {file = "coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3"}, + {file = "coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f"}, + {file = "coverage-7.6.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e7575ab65ca8399c8c4f9a7d61bbd2d204c8b8e447aab9d355682205c9dd948d"}, + {file = "coverage-7.6.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8161d9fbc7e9fe2326de89cd0abb9f3599bccc1287db0aba285cb68d204ce929"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a1e465f398c713f1b212400b4e79a09829cd42aebd360362cd89c5bdc44eb87"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f25d8b92a4e31ff1bd873654ec367ae811b3a943583e05432ea29264782dc32c"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a936309a65cc5ca80fa9f20a442ff9e2d06927ec9a4f54bcba9c14c066323f2"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aa6f302a3a0b5f240ee201297fff0bbfe2fa0d415a94aeb257d8b461032389bd"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f973643ef532d4f9be71dd88cf7588936685fdb576d93a79fe9f65bc337d9d73"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:78f5243bb6b1060aed6213d5107744c19f9571ec76d54c99cc15938eb69e0e86"}, + {file = "coverage-7.6.12-cp39-cp39-win32.whl", hash = "sha256:69e62c5034291c845fc4df7f8155e8544178b6c774f97a99e2734b05eb5bed31"}, + {file = "coverage-7.6.12-cp39-cp39-win_amd64.whl", hash = "sha256:b01a840ecc25dce235ae4c1b6a0daefb2a203dba0e6e980637ee9c2f6ee0df57"}, + {file = "coverage-7.6.12-pp39.pp310-none-any.whl", hash = "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf"}, + {file = "coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953"}, + {file = "coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2"}, ] [package.dependencies] From 903b7ce1138d5fc093ae02210c97cb95721d3775 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 19:24:29 -0300 Subject: [PATCH 131/139] chore(deps): bump aws-actions/configure-aws-credentials from 4.0.3 to 4.1.0 (#6082) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore(deps): bump aws-actions/configure-aws-credentials Bumps [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) from 4.0.3 to 4.1.0. - [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases) - [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-actions/configure-aws-credentials/compare/4fc4975a852c8cd99761e2de1f4ba73402e44dd9...ececac1a45f3b08a01d2dd070d28d111c5fe6722) --- updated-dependencies: - dependency-name: aws-actions/configure-aws-credentials dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- .github/workflows/bootstrap_region.yml | 4 ++-- .github/workflows/dispatch_analytics.yml | 2 +- .github/workflows/layer_govcloud.yml | 6 +++--- .github/workflows/layer_govcloud_python313.yml | 6 +++--- .github/workflows/layer_govcloud_verify.yml | 6 +++--- .github/workflows/layer_rename.yml | 4 ++-- .github/workflows/reusable_deploy_v2_layer_stack.yml | 2 +- .github/workflows/reusable_deploy_v2_sar.yml | 4 ++-- .github/workflows/reusable_deploy_v3_layer_stack.yml | 2 +- .github/workflows/reusable_deploy_v3_sar.yml | 4 ++-- .github/workflows/reusable_publish_docs.yml | 2 +- .github/workflows/run-e2e-tests.yml | 2 +- .github/workflows/update_ssm.yml | 2 +- 13 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/bootstrap_region.yml b/.github/workflows/bootstrap_region.yml index 349a00fa38c..360df641cb9 100644 --- a/.github/workflows/bootstrap_region.yml +++ b/.github/workflows/bootstrap_region.yml @@ -45,7 +45,7 @@ jobs: steps: - id: credentials name: AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: ${{ inputs.region }} role-to-assume: ${{ secrets.REGION_IAM_ROLE }} @@ -91,7 +91,7 @@ jobs: steps: - id: credentials name: AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: us-east-1 role-to-assume: ${{ secrets.REGION_IAM_ROLE }} diff --git a/.github/workflows/dispatch_analytics.yml b/.github/workflows/dispatch_analytics.yml index 0d9612f5643..da298227055 100644 --- a/.github/workflows/dispatch_analytics.yml +++ b/.github/workflows/dispatch_analytics.yml @@ -43,7 +43,7 @@ jobs: statuses: read steps: - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: eu-central-1 role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} diff --git a/.github/workflows/layer_govcloud.yml b/.github/workflows/layer_govcloud.yml index b58475b22b7..bc9b21b13aa 100644 --- a/.github/workflows/layer_govcloud.yml +++ b/.github/workflows/layer_govcloud.yml @@ -59,7 +59,7 @@ jobs: environment: Prod (Readonly) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-east-1 @@ -116,7 +116,7 @@ jobs: SHA=$(jq -r '.Content.CodeSha256' '${{ matrix.layer }}_${{ matrix.arch }}.json') test "$(openssl dgst -sha256 -binary ${{ matrix.layer }}_${{ matrix.arch }}.zip | openssl enc -base64)" == "$SHA" && echo "SHA OK: ${SHA}" || exit 1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-east-1 @@ -185,7 +185,7 @@ jobs: SHA=$(jq -r '.Content.CodeSha256' '${{ matrix.layer }}_${{ matrix.arch }}.json') test "$(openssl dgst -sha256 -binary ${{ matrix.layer }}_${{ matrix.arch }}.zip | openssl enc -base64)" == "$SHA" && echo "SHA OK: ${SHA}" || exit 1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-west-1 diff --git a/.github/workflows/layer_govcloud_python313.yml b/.github/workflows/layer_govcloud_python313.yml index e7aa8896631..b1ab8aa79c1 100644 --- a/.github/workflows/layer_govcloud_python313.yml +++ b/.github/workflows/layer_govcloud_python313.yml @@ -55,7 +55,7 @@ jobs: environment: Prod (Readonly) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-east-1 @@ -108,7 +108,7 @@ jobs: SHA=$(jq -r '.Content.CodeSha256' '${{ matrix.layer }}_${{ matrix.arch }}.json') test "$(openssl dgst -sha256 -binary ${{ matrix.layer }}_${{ matrix.arch }}.zip | openssl enc -base64)" == "$SHA" && echo "SHA OK: ${SHA}" || exit 1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-east-1 @@ -173,7 +173,7 @@ jobs: SHA=$(jq -r '.Content.CodeSha256' '${{ matrix.layer }}_${{ matrix.arch }}.json') test "$(openssl dgst -sha256 -binary ${{ matrix.layer }}_${{ matrix.arch }}.zip | openssl enc -base64)" == "$SHA" && echo "SHA OK: ${SHA}" || exit 1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-west-1 diff --git a/.github/workflows/layer_govcloud_verify.yml b/.github/workflows/layer_govcloud_verify.yml index 2313dfc3fdd..2e853c12ab9 100644 --- a/.github/workflows/layer_govcloud_verify.yml +++ b/.github/workflows/layer_govcloud_verify.yml @@ -39,7 +39,7 @@ jobs: environment: Prod (Readonly) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-east-1 @@ -69,7 +69,7 @@ jobs: environment: GovCloud Prod (East) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-east-1 @@ -100,7 +100,7 @@ jobs: environment: GovCloud Prod (West) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-gov-east-1 diff --git a/.github/workflows/layer_rename.yml b/.github/workflows/layer_rename.yml index bfe3ffa817c..4360a7d0668 100644 --- a/.github/workflows/layer_rename.yml +++ b/.github/workflows/layer_rename.yml @@ -56,7 +56,7 @@ jobs: environment: layer-prod steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} aws-region: us-east-1 @@ -140,7 +140,7 @@ jobs: SHA=$(jq -r '.Content.CodeSha256' ${{ matrix.layer }}_x86_64.json) test $(openssl dgst -sha256 -binary ${{ matrix.layer }}_x86_64.zip | openssl enc -base64) == $SHA && echo "SHA OK: ${SHA}" || exit 1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} aws-region: ${{ matrix.region }} diff --git a/.github/workflows/reusable_deploy_v2_layer_stack.yml b/.github/workflows/reusable_deploy_v2_layer_stack.yml index c973a589991..f54c2a91448 100644 --- a/.github/workflows/reusable_deploy_v2_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v2_layer_stack.yml @@ -153,7 +153,7 @@ jobs: - name: Install poetry run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: ${{ matrix.region }} role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} diff --git a/.github/workflows/reusable_deploy_v2_sar.yml b/.github/workflows/reusable_deploy_v2_sar.yml index 64158f630bf..238064c9271 100644 --- a/.github/workflows/reusable_deploy_v2_sar.yml +++ b/.github/workflows/reusable_deploy_v2_sar.yml @@ -90,7 +90,7 @@ jobs: artifact_name: ${{ inputs.source_code_artifact_name }} - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: ${{ env.AWS_REGION }} role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} @@ -101,7 +101,7 @@ jobs: # we then jump to our specific SAR Account with the correctly scoped IAM Role # this allows us to have a single trail when a release occurs for a given layer (beta+prod+SAR beta+SAR prod) - name: AWS credentials SAR role - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 id: aws-credentials-sar-role with: aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }} diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml index a9348f48169..f5e720b8eb2 100644 --- a/.github/workflows/reusable_deploy_v3_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml @@ -157,7 +157,7 @@ jobs: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 pipx inject poetry git+https://github.com/python-poetry/poetry-plugin-export@8c83d26603ca94f2e203bfded7b6d7f530960e06 # v1.8.0 - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: ${{ matrix.region }} role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} diff --git a/.github/workflows/reusable_deploy_v3_sar.yml b/.github/workflows/reusable_deploy_v3_sar.yml index 61a3a4cae51..977bc32aa64 100644 --- a/.github/workflows/reusable_deploy_v3_sar.yml +++ b/.github/workflows/reusable_deploy_v3_sar.yml @@ -87,7 +87,7 @@ jobs: - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: ${{ env.AWS_REGION }} role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} @@ -98,7 +98,7 @@ jobs: # we then jump to our specific SAR Account with the correctly scoped IAM Role # this allows us to have a single trail when a release occurs for a given layer (beta+prod+SAR beta+SAR prod) - name: AWS credentials SAR role - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 id: aws-credentials-sar-role with: aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }} diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index e16feab9415..4df56da81a0 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -79,7 +79,7 @@ jobs: poetry run mike set-default --push latest - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: us-east-1 role-to-assume: ${{ secrets.AWS_DOCS_ROLE_ARN }} diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 555f7b7a2af..d2e2cdc551b 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -72,7 +72,7 @@ jobs: - name: Install dependencies run: make dev-quality-code - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_TEST_ROLE_ARN }} aws-region: ${{ env.AWS_DEFAULT_REGION }} diff --git a/.github/workflows/update_ssm.yml b/.github/workflows/update_ssm.yml index 7ff47695015..4207ebed1f8 100644 --- a/.github/workflows/update_ssm.yml +++ b/.github/workflows/update_ssm.yml @@ -66,7 +66,7 @@ jobs: run: | echo 'CONVERTED_REGION=${{ matrix.region }}' | tr 'a-z\-' 'A-Z_' >> "$GITHUB_OUTPUT" - id: creds - uses: aws-actions/configure-aws-credentials@4fc4975a852c8cd99761e2de1f4ba73402e44dd9 # v4.0.3 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: ${{ matrix.region }} role-to-assume: ${{ secrets[format('{0}', steps.transform.outputs.CONVERTED_REGION)] }} From 86dcb1b98256ec8b0666c0d5d33a43aff36d1521 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 08:27:42 +0000 Subject: [PATCH 132/139] chore(ci): new pre-release 3.6.1a0 (#6084) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.6.1a0/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.6.1a0/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index 5c4a4e39ba8..8a41fa223d8 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.6.0" +VERSION = "3.6.1a0" diff --git a/provenance/3.6.1a0/multiple.intoto.jsonl b/provenance/3.6.1a0/multiple.intoto.jsonl new file mode 100644 index 00000000000..45ba9b9585b --- /dev/null +++ b/provenance/3.6.1a0/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjYuMWEwLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiNTViMmVhNTJjNTc2OWM1OTNhMmE1NmUwMmQ3NGUyNTM5MjdjMjIyYTJhZWJkZDBmZTg5ZjA5ZGE3ZGMyNmNhZSJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjYuMWEwLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2NjU5NTE0YWIzOTgxM2ExNWEyMWVlNTk2ZTVkNzI1ZmM2ZmY5OThkZWU1NWQwMmIwMmE4ZmExYTFjYmViNzViIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiMTIyOWFhMWZhMDFiYWQyMTk1YWE2Y2FkMDQ4NGQ2NzljMzg1YTg5NSJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwOCwiZm9ya3NfY291bnQiOjQwOCwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo1OCwib3Blbl9pc3N1ZXNfY291bnQiOjU4LCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDItMTJUMDA6MTQ6NDVaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjg4MjQ1LCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5ODIsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDItMTJUMDQ6MTY6MDBaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5ODIsIndhdGNoZXJzX2NvdW50IjoyOTgyLCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzI4MDY3MjQwNSIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTc0IiwiZ2l0aHViX3NoYTEiOiIxMjI5YWExZmEwMWJhZDIxOTVhYTZjYWQwNDg0ZDY3OWMzODVhODk1In19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMjgwNjcyNDA1LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiIxMjI5YWExZmEwMWJhZDIxOTVhYTZjYWQwNDg0ZDY3OWMzODVhODk1In19XX19","signatures":[{"keyid":"","sig":"MEUCIFBvjWO1bCzaERSedIbxr09rTqcY+ASxeeUNdtvndfJ7AiEAjUOFDCwFZlSr25srpZ16/gD7xoRsI1u2HXTSi/3DuVI=","cert":"-----BEGIN CERTIFICATE-----\nMIIHZzCCBuygAwIBAgIUS73bzM0DTGELXrBF0O/a7Fh00/4wCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMjEyMDgwNzI0WhcNMjUwMjEyMDgxNzI0WjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEe6k76laXzQnTsVWjRGYC2LmEmm+S0LHolYQG\nvCV+Ml9xZw/Ovmm7GynK6sLpEmutvFCreEtze9824Xvpl46LUKOCBgswggYHMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUIQ30\n/LlraYfySCvBkN3iRTvv+tMwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCgxMjI5\nYWExZmEwMWJhZDIxOTVhYTZjYWQwNDg0ZDY3OWMzODVhODk1MBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDCgxMjI5YWExZmEwMWJhZDIxOTVhYTZjYWQwNDg0ZDY3OWMzODVhODk1MCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoMTIy\nOWFhMWZhMDFiYWQyMTk1YWE2Y2FkMDQ4NGQ2NzljMzg1YTg5NTAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMyODA2NzI0MDUvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlPky0FEAAAQDAEcwRQIgTj+oQEbL9Py5O+FAwqvm\njmbPneDzQ2u96I9JwPzYs4UCIQDxh4wck8xAJX8pcCWTAAEWFM9dE40mq/yBdPJ1\nBdXJlzAKBggqhkjOPQQDAwNpADBmAjEA3b7ncJVwfsr/jOzi+znbGBXrrinJFyBX\niS3NHqYOdiys11KhVvKw7p1YQdnaPNTEAjEAovIwCYswJ5KMABYv80hITMbAclQu\n+BjcWZaQj0WgqK7kLd778C1eUhCLJDrnLh9r\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 5549221f886..fb586682b04 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.6.0" +version = "3.6.1a0" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From 4298754dac6c2d54b137ee2f9060c3cd86feb698 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:52:19 +0000 Subject: [PATCH 133/139] chore(ci): changelog rebuild (#6085) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95cf0932062..021a46597c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,120 @@ # Unreleased +## Bug Fixes + +* **security:** fix encryption_context handling in data masking operations ([#6074](https://github.com/aws-powertools/powertools-lambda-python/issues/6074)) + +## Maintenance + +* **ci:** new pre-release 3.6.1a0 ([#6084](https://github.com/aws-powertools/powertools-lambda-python/issues/6084)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.3 to 4.1.0 ([#6082](https://github.com/aws-powertools/powertools-lambda-python/issues/6082)) +* **deps-dev:** bump coverage from 7.6.11 to 7.6.12 ([#6080](https://github.com/aws-powertools/powertools-lambda-python/issues/6080)) +* **deps-dev:** bump mkdocstrings-python from 1.14.6 to 1.15.0 ([#6079](https://github.com/aws-powertools/powertools-lambda-python/issues/6079)) +* **deps-dev:** bump boto3-stubs from 1.36.16 to 1.36.17 ([#6078](https://github.com/aws-powertools/powertools-lambda-python/issues/6078)) + ## [v3.6.0] - 2025-02-11 +## Bug Fixes + +* **docs:** typo in a service name in Event Handler ([#5944](https://github.com/aws-powertools/powertools-lambda-python/issues/5944)) +* **logger:** child logger must respect log level ([#5950](https://github.com/aws-powertools/powertools-lambda-python/issues/5950)) + +## Code Refactoring + +* **metrics:** Improve type annotations for metrics decorator ([#6000](https://github.com/aws-powertools/powertools-lambda-python/issues/6000)) + +## Documentation + +* **api:** migrating the event handler utility to mkdocstrings ([#6023](https://github.com/aws-powertools/powertools-lambda-python/issues/6023)) +* **api:** migrating the metrics utility to mkdocstrings ([#6022](https://github.com/aws-powertools/powertools-lambda-python/issues/6022)) +* **api:** migrating the logger utility to mkdocstrings ([#6021](https://github.com/aws-powertools/powertools-lambda-python/issues/6021)) +* **api:** migrating the Middleware Factory utility to mkdocstrings ([#6019](https://github.com/aws-powertools/powertools-lambda-python/issues/6019)) +* **api:** migrating the tracer utility to mkdocstrings ([#6017](https://github.com/aws-powertools/powertools-lambda-python/issues/6017)) +* **api:** migrating the batch utility to mkdocstrings ([#6016](https://github.com/aws-powertools/powertools-lambda-python/issues/6016)) +* **api:** migrating the event source data classes utility to mkdocstrings ([#6015](https://github.com/aws-powertools/powertools-lambda-python/issues/6015)) +* **api:** migrating the data masking utility to mkdocstrings ([#6013](https://github.com/aws-powertools/powertools-lambda-python/issues/6013)) +* **api:** migrating the AppConfig utility to mkdocstrings ([#6008](https://github.com/aws-powertools/powertools-lambda-python/issues/6008)) +* **api:** migrating the idempotency utility to mkdocstrings ([#6007](https://github.com/aws-powertools/powertools-lambda-python/issues/6007)) +* **api:** migrating the jmespath utility to mkdocstrings ([#6006](https://github.com/aws-powertools/powertools-lambda-python/issues/6006)) +* **api:** migrating the parameters utility to mkdocstrings ([#6005](https://github.com/aws-powertools/powertools-lambda-python/issues/6005)) +* **api:** migrating the parser utility to mkdocstrings ([#6004](https://github.com/aws-powertools/powertools-lambda-python/issues/6004)) +* **api:** migrating the streaming utility to mkdocstrings ([#6003](https://github.com/aws-powertools/powertools-lambda-python/issues/6003)) +* **api:** migrating the typing utility to mkdocstrings ([#5996](https://github.com/aws-powertools/powertools-lambda-python/issues/5996)) +* **api:** migrating the validation utility to mkdocstrings ([#5972](https://github.com/aws-powertools/powertools-lambda-python/issues/5972)) +* **layer:** update layer version number - v3.5.0 ([#5952](https://github.com/aws-powertools/powertools-lambda-python/issues/5952)) + +## Features + +* **data-masking:** add custom mask functionalities ([#5837](https://github.com/aws-powertools/powertools-lambda-python/issues/5837)) +* **event_source:** add class APIGatewayAuthorizerResponseWebSocket ([#6058](https://github.com/aws-powertools/powertools-lambda-python/issues/6058)) +* **logger:** add clear_state method ([#5956](https://github.com/aws-powertools/powertools-lambda-python/issues/5956)) +* **metrics:** disable metrics flush via environment variables ([#6046](https://github.com/aws-powertools/powertools-lambda-python/issues/6046)) +* **openapi:** enhance support for tuple return type validation ([#5997](https://github.com/aws-powertools/powertools-lambda-python/issues/5997)) + ## Maintenance * version bump +* **ci:** new pre-release 3.5.1a9 ([#6069](https://github.com/aws-powertools/powertools-lambda-python/issues/6069)) +* **ci:** new pre-release 3.5.1a0 ([#5945](https://github.com/aws-powertools/powertools-lambda-python/issues/5945)) +* **ci:** new pre-release 3.5.1a1 ([#5954](https://github.com/aws-powertools/powertools-lambda-python/issues/5954)) +* **ci:** new pre-release 3.5.1a8 ([#6061](https://github.com/aws-powertools/powertools-lambda-python/issues/6061)) +* **ci:** install & configure mkdocstrings plugin ([#5959](https://github.com/aws-powertools/powertools-lambda-python/issues/5959)) +* **ci:** new pre-release 3.5.1a2 ([#5970](https://github.com/aws-powertools/powertools-lambda-python/issues/5970)) +* **ci:** new pre-release 3.5.1a3 ([#5998](https://github.com/aws-powertools/powertools-lambda-python/issues/5998)) +* **ci:** new pre-release 3.5.1a7 ([#6044](https://github.com/aws-powertools/powertools-lambda-python/issues/6044)) +* **ci:** new pre-release 3.5.1a4 ([#6018](https://github.com/aws-powertools/powertools-lambda-python/issues/6018)) +* **ci:** remove pdoc3 library ([#6024](https://github.com/aws-powertools/powertools-lambda-python/issues/6024)) +* **ci:** new pre-release 3.5.1a5 ([#6026](https://github.com/aws-powertools/powertools-lambda-python/issues/6026)) +* **ci:** add new script to bump Lambda layer version ([#6001](https://github.com/aws-powertools/powertools-lambda-python/issues/6001)) +* **ci:** new pre-release 3.5.1a6 ([#6033](https://github.com/aws-powertools/powertools-lambda-python/issues/6033)) +* **deps:** bump squidfunk/mkdocs-material from `471695f` to `7e841df` in /docs ([#6012](https://github.com/aws-powertools/powertools-lambda-python/issues/6012)) +* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.20 to 3.0.21 ([#6064](https://github.com/aws-powertools/powertools-lambda-python/issues/6064)) +* **deps:** bump actions/setup-python from 5.3.0 to 5.4.0 ([#5960](https://github.com/aws-powertools/powertools-lambda-python/issues/5960)) +* **deps:** bump docker/setup-qemu-action from 3.2.0 to 3.3.0 ([#5961](https://github.com/aws-powertools/powertools-lambda-python/issues/5961)) +* **deps:** bump codecov/codecov-action from 5.1.2 to 5.3.1 ([#5964](https://github.com/aws-powertools/powertools-lambda-python/issues/5964)) +* **deps:** bump squidfunk/mkdocs-material from `7e841df` to `c62453b` in /docs ([#6052](https://github.com/aws-powertools/powertools-lambda-python/issues/6052)) +* **deps:** bump actions/setup-node from 4.1.0 to 4.2.0 ([#5963](https://github.com/aws-powertools/powertools-lambda-python/issues/5963)) +* **deps:** bump actions/upload-artifact from 4.5.0 to 4.6.0 ([#5962](https://github.com/aws-powertools/powertools-lambda-python/issues/5962)) +* **deps:** bump release-drafter/release-drafter from 6.0.0 to 6.1.0 ([#5976](https://github.com/aws-powertools/powertools-lambda-python/issues/5976)) +* **deps:** bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.18 to 3.0.20 ([#5977](https://github.com/aws-powertools/powertools-lambda-python/issues/5977)) +* **deps:** bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 ([#5980](https://github.com/aws-powertools/powertools-lambda-python/issues/5980)) +* **deps:** bump docker/setup-buildx-action from 3.8.0 to 3.9.0 ([#6042](https://github.com/aws-powertools/powertools-lambda-python/issues/6042)) +* **deps:** bump docker/setup-qemu-action from 3.3.0 to 3.4.0 ([#6043](https://github.com/aws-powertools/powertools-lambda-python/issues/6043)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#5975](https://github.com/aws-powertools/powertools-lambda-python/issues/5975)) +* **deps:** bump squidfunk/mkdocs-material from `41942f7` to `471695f` in /docs ([#5979](https://github.com/aws-powertools/powertools-lambda-python/issues/5979)) +* **deps:** bump actions/setup-go from 5.2.0 to 5.3.0 ([#5978](https://github.com/aws-powertools/powertools-lambda-python/issues/5978)) +* **deps-dev:** bump aws-cdk from 2.178.0 to 2.178.1 ([#6053](https://github.com/aws-powertools/powertools-lambda-python/issues/6053)) +* **deps-dev:** bump mkdocstrings-python from 1.13.0 to 1.14.2 ([#6011](https://github.com/aws-powertools/powertools-lambda-python/issues/6011)) +* **deps-dev:** bump mkdocs-material from 9.6.1 to 9.6.2 ([#6009](https://github.com/aws-powertools/powertools-lambda-python/issues/6009)) +* **deps-dev:** bump aws-cdk-lib from 2.178.0 to 2.178.1 ([#6047](https://github.com/aws-powertools/powertools-lambda-python/issues/6047)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.178.0a0 to 2.178.1a0 ([#6048](https://github.com/aws-powertools/powertools-lambda-python/issues/6048)) +* **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.15 ([#6049](https://github.com/aws-powertools/powertools-lambda-python/issues/6049)) +* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.11 ([#6010](https://github.com/aws-powertools/powertools-lambda-python/issues/6010)) +* **deps-dev:** bump boto3-stubs from 1.36.10 to 1.36.12 ([#6014](https://github.com/aws-powertools/powertools-lambda-python/issues/6014)) +* **deps-dev:** bump ruff from 0.9.5 to 0.9.6 ([#6066](https://github.com/aws-powertools/powertools-lambda-python/issues/6066)) +* **deps-dev:** bump mkdocstrings-python from 1.14.2 to 1.14.4 ([#6025](https://github.com/aws-powertools/powertools-lambda-python/issues/6025)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.177.0a0 to 2.178.0a0 ([#6041](https://github.com/aws-powertools/powertools-lambda-python/issues/6041)) +* **deps-dev:** bump mkdocs-material from 9.5.50 to 9.6.1 ([#5966](https://github.com/aws-powertools/powertools-lambda-python/issues/5966)) +* **deps-dev:** bump black from 24.10.0 to 25.1.0 ([#5968](https://github.com/aws-powertools/powertools-lambda-python/issues/5968)) +* **deps-dev:** bump ruff from 0.9.3 to 0.9.4 ([#5969](https://github.com/aws-powertools/powertools-lambda-python/issues/5969)) +* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.291 to 0.1.292 ([#6051](https://github.com/aws-powertools/powertools-lambda-python/issues/6051)) +* **deps-dev:** bump cfn-lint from 1.22.7 to 1.23.1 ([#5967](https://github.com/aws-powertools/powertools-lambda-python/issues/5967)) +* **deps-dev:** bump mkdocstrings-python from 1.14.5 to 1.14.6 ([#6050](https://github.com/aws-powertools/powertools-lambda-python/issues/6050)) +* **deps-dev:** bump isort from 5.13.2 to 6.0.0 ([#5965](https://github.com/aws-powertools/powertools-lambda-python/issues/5965)) +* **deps-dev:** bump ruff from 0.9.4 to 0.9.5 ([#6039](https://github.com/aws-powertools/powertools-lambda-python/issues/6039)) +* **deps-dev:** bump aws-cdk-lib from 2.177.0 to 2.178.0 ([#6038](https://github.com/aws-powertools/powertools-lambda-python/issues/6038)) +* **deps-dev:** bump mypy from 1.14.1 to 1.15.0 ([#6028](https://github.com/aws-powertools/powertools-lambda-python/issues/6028)) +* **deps-dev:** bump mkdocstrings-python from 1.14.4 to 1.14.5 ([#6032](https://github.com/aws-powertools/powertools-lambda-python/issues/6032)) +* **deps-dev:** bump cfn-lint from 1.23.1 to 1.24.0 ([#6030](https://github.com/aws-powertools/powertools-lambda-python/issues/6030)) +* **deps-dev:** bump boto3-stubs from 1.36.14 to 1.36.16 ([#6057](https://github.com/aws-powertools/powertools-lambda-python/issues/6057)) +* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.290 to 0.1.291 ([#6031](https://github.com/aws-powertools/powertools-lambda-python/issues/6031)) +* **deps-dev:** bump boto3-stubs from 1.36.12 to 1.36.14 ([#6029](https://github.com/aws-powertools/powertools-lambda-python/issues/6029)) +* **deps-dev:** bump mkdocs-material from 9.6.2 to 9.6.3 ([#6065](https://github.com/aws-powertools/powertools-lambda-python/issues/6065)) +* **deps-dev:** bump coverage from 7.6.10 to 7.6.11 ([#6067](https://github.com/aws-powertools/powertools-lambda-python/issues/6067)) +* **deps-dev:** bump aws-cdk from 2.177.0 to 2.178.0 ([#6040](https://github.com/aws-powertools/powertools-lambda-python/issues/6040)) +* **docs:** enable privacy plugin in docs ([#6036](https://github.com/aws-powertools/powertools-lambda-python/issues/6036)) From dcfcd0918ae1e03fb33fb73436864b2bf43137c3 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 12 Feb 2025 16:11:48 +0000 Subject: [PATCH 134/139] docs(roadmap): update roadmap (#6077) * Adding roadmap * Roadmap --- docs/roadmap.md | 208 ++++++------------------------------------------ 1 file changed, 26 insertions(+), 182 deletions(-) diff --git a/docs/roadmap.md b/docs/roadmap.md index de77ce8bb6b..530f45e9dca 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,11 +1,11 @@ -# Overview +## Overview Our public roadmap outlines the high level direction we are working towards. We update this document when our priorities change: security and stability are our top priority. -!!! info "See our [current iteration cycle](https://github.com/orgs/aws-powertools/projects/3/views/14?query=is%3Aopen+sort%3Aupdated-desc){target="_blank"} for the most up-to-date information." +!!! info "For most up-to-date information, see our [board of activities](https://github.com/orgs/aws-powertools/projects/3?query=sort%3Aupdated-desc+is%3Aopen){target="_blank"}." -## Key areas +### Key areas Security and operational excellence take precedence above all else. This means bug fixing, stability, customer's support, and internal compliance may delay one or more key areas below. @@ -13,114 +13,26 @@ Security and operational excellence take precedence above all else. This means b You can help us prioritize by [upvoting existing feature requests](https://github.com/aws-powertools/powertools-lambda-python/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Afeature-request), leaving a comment on what use cases it could unblock for you, and by joining our discussions on Discord. -### Observability providers +#### New features and utilities (p0) -We want to extend Tracer, Metrics, and Logger to support any [AWS Lambda certified observability partner](https://go.aws/3HtU6CZ){target="_blank"}, along with OpenTelemetry. +We will create new features and utilities to solve practical problems developers face when building serverless applications. -At launch, we will support Datadog since it's [most requested observability provider](https://github.com/aws-powertools/powertools-lambda-python/issues/1433). OpenTelemetry will be a fast follow-up as we need to decide on a stable solution to cold start penalty. +- [ ] [Ability to buffer logs](https://github.com/aws-powertools/powertools-lambda-typescript/discussions/3410){target="_blank"} +- [ ] Async event handlers to streamline complex event-driven workflows across SQS, EventBridge -!!! tip "Help us identify which observability providers we should integrate next. Open [feature request](https://github.com/aws-powertools/powertools-lambda-python/issues/new?assignees=&labels=feature-request%2Ctriage&projects=&template=feature_request.yml&title=Feature+request%3A+TITLE){target="_blank"} or by voting `+1` in existing issues" +#### Powertools toolchain (p1) -**Major updates** +To improve Lambda development workflows and tooling capabilities, we aim to demonstrate how to simplify complex packaging methods, enable OpenAPI code generation for multiple Lambda functions, and introduce profiling tools to evaluate Powertools for AWS Lambda (Python) code implementation, tracking memory consumption and computational performance. -* [x] [Document how customers can use any provider with Logger](https://docs.powertools.aws.dev/lambda/python/latest/core/logger/#observability-providers) -* [x] [Extend Metrics to add support for any Provider](https://github.com/aws-powertools/powertools-lambda-python/pull/2194) -* [ ] [Extend Tracer to add support for any Provider](https://github.com/aws-powertools/powertools-lambda-python/pull/2342#issuecomment-2061734362) -* [ ] Investigate alternative solution to OpenTelemetry cold start performance +- [ ] Create a comprehensive "Recipes" section with Lambda packaging tutorials for tools like uv, poetry, pants, providing clear, practical build strategies. +- [ ] Enable OpenAPI generation capabilities to create specifications across multiple Lambda functions, eliminating LambdaLith architectural constraints. -### Lambda Layer in GovCloud +#### Support for async (p2) -We want to investigate security and scaling requirements for these special regions, so they're in sync for every release. +Python's serverless ecosystem is increasingly adopting asynchronous programming to deliver more efficient, non-blocking applications. -!!! note "Help us prioritize it by reaching out to your AWS representatives or [via email](mailto:aws-powertools-maintainers@amazon.com)." - -**Major updates** - -* [x] Gather agencies and customers name to prioritize it -* [x] Investigate security requirements for special regions -* [x] Create additional infrastructure for special regions -* [x] AppSec review -* [x] Update CDK Layer construct to include regions -* [x] Distribution sign-off -* [ ] Distribute latest version -* [ ] Update Layer section with new AWS Accounts - -### V3 - -We are in the process of planning the roadmap for v3. As always, [our approach](./versioning.md){target="_blank"} includes providing sufficient advance notice, a comprehensive upgrade guide, and minimizing breaking changes to facilitate a smooth transition (e.g., it took ~7 months from v2 to surpass v1 downloads). - -For example, these are on our mind but not settled yet until we have a public tracker to discuss what these means in detail. - -* **Parser**: Drop Pydantic v1 -* **Parser**: Deserialize Amazon DynamoDB data types automatically (like Event Source Data Classes) -* **Parameters**: Increase default `max_age` for `get_secret` -* **Event Source Data Classes**: Return sane defaults for any property that has `Optional[]` returns -* **Batch**: Stop at first error for Amazon DynamoDB Streams and Amazon Kinesis Data Streams (e.g., `stop_on_failure=True`) - -**Major updates** - -* [ ] Create an issue to track breaking changes we consider making -* [ ] Create a v3 branch to allow early experimentation -* [ ] Create workflows to allow pre-releases -* [ ] Create a mechanism to keep ideas for breaking change somewhere regardless of v3 - -### Revamp Event Handler - -Event Handler provides lightweight routing for both [**REST**: Amazon API Gateway, Amazon Elastic Load Balancer and AWS Lambda Function URL](./core/event_handler/api_gateway.md), and [**GraphQL**: AWS AppSync](./core/event_handler/appsync.md). - - -Based on customers feedback, we want to provide [middleware authoring support](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/#middleware) for cross-cutting concerns. For REST APIs, we are also looking into auto-generate [OpenAPI Schemas](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/#data-validation) and a [SwaggerUI route](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/#enabling-swaggerui). For GraphQL, we are working on supporting batch invocations (N+1 problem) along with partial failure support. - - -**Major updates** - -* [x] [Agree on experience for middleware support](https://github.com/aws-powertools/powertools-lambda-python/issues/953#issuecomment-1450223155) -* [x] [RFC to outline initial thoughts on OpenAPI integration](https://github.com/aws-powertools/powertools-lambda-python/issues/2421) -* [x] [MVP for REST middleware](./core/event_handler/api_gateway.md#middleware) -* [x] [MVP for OpenAPI and SwaggerUI](https://github.com/aws-powertools/powertools-lambda-python/pull/3109) -* [ ] [MVP for AppSync Batch invoke and partial failure support](https://github.com/aws-powertools/powertools-lambda-python/pull/1998) - -### Authentication (SigV4) - -[During customers interview](https://github.com/aws-powertools/powertools-lambda-python#connect){target="_blank"}, we hear that signing requests using [AWS SigV4](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html){target="_blank"} could be easier. - -Since JWT is a close second, this new utility would cover higher level functions to sign and verify requests more easily. - -**Major updates** - -* [x] [Issue to outline challenges](https://github.com/aws-powertools/powertools-lambda-python/issues/2493), alternative solutions and desired experience -* [ ] [MVP for AWS SigV4](https://github.com/aws-powertools/powertools-lambda-python/pull/2435) - -### Office hours - -We heard from [customers](https://github.com/aws-powertools/powertools-lambda-python#connect){target="_blank"} that Powertools for AWS Lambda and its community can move faster than they are able to catch up. While documentation and release notes take these into account, they notice they don't always know advanced tricks, or what other customers tend to do in similar situations. - -We want to run a monthly office hours to start addressing that, and learn from customers how they're using Powertools and whether or not they need a closer support. - -Timezones being tricky, we plan to experiment with an afternoon slot in Central European that would also cover Middle East, US east coast, and South America. Depending on attendance, we plan to A/B test an Asia friendly one too. - -**Major updates** - -* [x] Decide whether to use Amazon Chime or Zoom (we had audio setup issues on Discord) -* [ ] Experiment running monthly roadmap review as an open call - * [ ] Settle on monthly roadmap review agenda - * [ ] Invite Discord community - * [ ] Update roadmap page with Discord event - -### Enhanced operational metrics - -[Through customers interview](https://github.com/aws-powertools/powertools-lambda-python#connect){target="_blank"}, [Discord](https://discord.gg/B8zZKbbyET){target="_blank" rel="nofollow"}, and [1:1 customer enablement](https://github.com/aws-powertools/powertools-lambda-python#connect){target="_blank"}, we noticed customers often create the same set of custom operational metrics. - -We want to make this easier by extending certain utilities to accept a `metrics` instance and metrics configuration (what metrics to create). It would be opt-in due to costs associated with creating metrics. - -!!! question "Got ideas for custom metrics? Open up a [feature request](https://github.com/aws-powertools/powertools-lambda-python/issues/new?assignees=&labels=feature-request%2Ctriage&projects=&template=feature_request.yml&title=Feature+request%3A+TITLE)" - -**Major updates** - -* [ ] RFC to outline metrics for Batch (_e.g., Failed items, Batch size_) -* [ ] RFC to outline metrics for Feature flags (_e.g., matched rules_) -* [ ] RFC to outline metrics for Event Handler (_e.g., validation errors_ ) -* [ ] RFC to outline metrics for Idempotency (_e.g., cache hit_) +- [ ] Add support for aioboto3 or other tool, enabling efficient, non-blocking AWS service interactions in Lambda functions. +- [ ] Write a PoC with Event Handler support for async. ## Roadmap status definition @@ -134,11 +46,11 @@ graph LR Within our [public board](https://github.com/orgs/aws-powertools/projects/3/views/1?query=is%3Aopen+sort%3Aupdated-desc){target="_blank"}, you'll see the following values in the `Status` column: -* **Ideas**. Incoming and existing feature requests that are not being actively considered yet. These will be reviewed when bandwidth permits. -* **Backlog**. Accepted feature requests or enhancements that we want to work on. -* **Working on it**. Features or enhancements we're currently either researching or implementing it. -* **Coming soon**. Any feature, enhancement, or bug fixes that have been merged and are coming in the next release. -* **Shipped**. Features or enhancements that are now available in the most recent release. +- **Ideas**. Incoming and existing feature requests that are not being actively considered yet. These will be reviewed when bandwidth permits. +- **Backlog**. Accepted feature requests or enhancements that we want to work on. +- **Working on it**. Features or enhancements we're currently either researching or implementing it. +- **Coming soon**. Any feature, enhancement, or bug fixes that have been merged and are coming in the next release. +- **Shipped**. Features or enhancements that are now available in the most recent release. > Tasks or issues with empty `Status` will be categorized in upcoming review cycles. @@ -160,12 +72,12 @@ graph LR Our end-to-end mechanism follows four major steps: -* **Feature Request**. Ideas start with a [feature request](https://github.com/aws-powertools/powertools-lambda-python/issues/new?assignees=&labels=feature-request%2Ctriage&template=feature_request.yml&title=Feature+request%3A+TITLE){target="_blank"} to outline their use case at a high level. For complex use cases, maintainers might ask for/write a RFC. - * Maintainers review requests based on [project tenets](index.md#tenets){target="_blank"}, customers reaction (👍), and use cases. -* **Request-for-comments (RFC)**. Design proposals use our [RFC issue template](https://github.com/aws-powertools/powertools-lambda-python/issues/new?assignees=&labels=RFC%2Ctriage&template=rfc.yml&title=RFC%3A+TITLE){target="_blank"} to describe its implementation, challenges, developer experience, dependencies, and alternative solutions. - * This helps refine the initial idea with community feedback before a decision is made. -* **Decision**. After carefully reviewing and discussing them, maintainers make a final decision on whether to start implementation, defer or reject it, and update everyone with the next steps. -* **Implementation**. For approved features, maintainers give priority to the original authors for implementation unless it is a sensitive task that is best handled by maintainers. +- **Feature Request**. Ideas start with a [feature request](https://github.com/aws-powertools/powertools-lambda-python/issues/new?assignees=&labels=feature-request%2Ctriage&template=feature_request.yml&title=Feature+request%3A+TITLE){target="_blank"} to outline their use case at a high level. For complex use cases, maintainers might ask for/write a RFC. + - Maintainers review requests based on [project tenets](index.md#tenets){target="_blank"}, customers reaction (👍), and use cases. +- **Request-for-comments (RFC)**. Design proposals use our [RFC issue template](https://github.com/aws-powertools/powertools-lambda-python/issues/new?assignees=&labels=RFC%2Ctriage&template=rfc.yml&title=RFC%3A+TITLE){target="_blank"} to describe its implementation, challenges, developer experience, dependencies, and alternative solutions. + - This helps refine the initial idea with community feedback before a decision is made. +- **Decision**. After carefully reviewing and discussing them, maintainers make a final decision on whether to start implementation, defer or reject it, and update everyone with the next steps. +- **Implementation**. For approved features, maintainers give priority to the original authors for implementation unless it is a sensitive task that is best handled by maintainers. ???+ info "See [Maintainers](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/MAINTAINERS.md){target="_blank"} document to understand how we triage issues and pull requests, labels and governance." @@ -188,71 +100,3 @@ A: Because job zero is security and operational stability, we can't provide spec **Q: How can I provide feedback or ask for more information?** A: For existing features, you can directly comment on issues. For anything else, please open an issue. - -## Launched - -### Setting Parameters and Secrets - -> [Docs](./utilities/parameters.md#setting-parameters) - -As of today, the [Parameters](./utilities/parameters.md){target="_blank"} feature is used to retrieve data, not to create or update existing parameters. Based on community feedback, we plan to enhance Parameters to allow set operations. - -**Major updates** - -* [x] [RFC](https://github.com/aws-powertools/powertools-lambda-python/issues/3040) -* [x] [MVP](https://github.com/aws-powertools/powertools-lambda-python/pull/2858) - -### Amazon Bedrock Agent Event Handler - -> [Docs](./core/event_handler/bedrock_agents.md) - -Based on [customers](https://github.com/aws-powertools/powertools-lambda-python#connect){target="_blank"} at re:Invent 2023, we will add a new Event Handler resolver to improve authoring and maintenance of Amazon Bedrock Agents. - -**Major updates** - -* [x] [Event Source Data Classes support](https://github.com/aws-powertools/powertools-lambda-python/pull/3262) -* [x] [Pydantic model _(Parser)_ support](https://github.com/aws-powertools/powertools-lambda-python/pull/3286) -* [x] [MVP Event Handler](https://github.com/aws-powertools/powertools-lambda-python/pull/3285) -* [x] [New feature documentation](https://github.com/aws-powertools/powertools-lambda-python/pull/3602) -* [x] [Video to walkthrough](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/bedrock_agents/#video-walkthrough) use cases for anyone new to LLM Agents -* [ ] Launch amplifier (_e.g., What's New, Blog post_) - -### Sensitive Data Masking - -> [Docs](./utilities/data_masking.md) - -Data Masking will be a new utility to mask/unmask sensitive data using encryption providers. It's the second most voted feature request (behind [Observability Providers](#observability-providers)). - -**Major updates** - -* [x] [RFC to agree on design and MVP](https://github.com/aws-powertools/powertools-lambda-python/issues/1858) -* [x] [POC with AWS KMS as the default provider](https://github.com/aws-powertools/powertools-lambda-python/pull/2197) -* [x] User-guide documentation and include when not to use it (e.g., when to use SNS data policy, CloudWatch Logs data policy) -* [x] Decide whether to use Encryption SDK to bring their own provider or a simply a contract (e.g., `ItsDangerous`) - -### Deprecate Python 3.7 support - -AWS Lambda will officially block updates to Lambda functions using Python 3.7 support. We will drop support as soon as [that is official](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-support-policy){target="_blank"}. - -**Major updates** - -* [x] [Drop Python 3.7 support](https://github.com/aws-powertools/powertools-lambda-python/pull/3638) -* [x] [Add documentation banner](https://github.com/aws-powertools/powertools-lambda-python/pull/3618) -* [x] [Publish versioning policy docs](https://github.com/aws-powertools/powertools-lambda-python/pull/3682) - -## Dropped - -### Lambda Layer in release notes - -> **Reason**: We are looking at more accessible alternatives based on customer feedback (e.g., AWS System Manager public parameters) - -We want to publish a JSON with a map of region and Lambda Layer ARN as a GitHub Release Note asset. - -As of V2, we prioritize Lambda Layers being available before release notes are out. This is due to x86_64 and ARM64 compilation for smaller binaries and extra speed. - -This means we have room to include a JSON map for Lambda Layers and facilitate automation for customers wanting the latest version as soon as it's available. - -**Major updates** - -* [x] Create secure mechanism to upload signed assets to GitHub Release Notes -* [ ] Create feature request to agree on JSON structure and asset name From f73668b3dabfaa4f4b7d89f0adb7a5bd87ed336d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 10:29:44 +0000 Subject: [PATCH 135/139] chore(deps): bump squidfunk/mkdocs-material from `c62453b` to `f5bcec4` in /docs (#6087) chore(deps): bump squidfunk/mkdocs-material in /docs Bumps squidfunk/mkdocs-material from `c62453b` to `f5bcec4`. --- updated-dependencies: - dependency-name: squidfunk/mkdocs-material dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index 46941467a98..e2be06baafa 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # v9.1.18 -FROM squidfunk/mkdocs-material@sha256:c62453b1ba229982c6325a71165c1a3007c11bd3dd470e7a1446c5783bd145b4 +FROM squidfunk/mkdocs-material@sha256:f5bcec4e71c138bcb89c0dccb633c830f54a0218e1aefedaade952b61b908d00 # pip-compile --generate-hashes --output-file=requirements.txt requirements.in COPY requirements.txt /tmp/ RUN pip install --require-hashes -r /tmp/requirements.txt From a403dc82d3aeada11c5e0d90d752dc3cd83adf30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 10:30:31 +0000 Subject: [PATCH 136/139] chore(deps-dev): bump aws-cdk from 2.178.1 to 2.178.2 (#6089) Bumps [aws-cdk](https://github.com/aws/aws-cdk/tree/HEAD/packages/aws-cdk) from 2.178.1 to 2.178.2. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/v2.178.2/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/commits/v2.178.2/packages/aws-cdk) --- updated-dependencies: - dependency-name: aws-cdk dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ad8c05249dc..dcadab9b6c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,13 @@ "package-lock.json": "^1.0.0" }, "devDependencies": { - "aws-cdk": "^2.178.1" + "aws-cdk": "^2.178.2" } }, "node_modules/aws-cdk": { - "version": "2.178.1", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.178.1.tgz", - "integrity": "sha512-64z9ARFI90jhX6sfjqqJghGxkfh1T4STxY3ccuRY8OxzAK1FY6XLjKBxSyXi9jJFa3v9nN57x7W32u4hZDj6gw==", + "version": "2.178.2", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.178.2.tgz", + "integrity": "sha512-ojMCMnBGinvDUD6+BOOlUOB9pjsYXoQdFVbf4bvi3dy3nwn557r0j6qDUcJMeikzPJ6YWzfAdL0fYxBZg4xcOg==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 2698f422ad5..772a31af971 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "aws-lambda-powertools-python-e2e", "version": "1.0.0", "devDependencies": { - "aws-cdk": "^2.178.1" + "aws-cdk": "^2.178.2" }, "dependencies": { "package-lock.json": "^1.0.0" From eb53fe08a70a19af02027177f61fd974a54bbffc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 10:31:03 +0000 Subject: [PATCH 137/139] chore(ci): new pre-release 3.6.1a1 (#6090) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.6.1a1/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.6.1a1/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index 8a41fa223d8..7637a8b4009 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.6.1a0" +VERSION = "3.6.1a1" diff --git a/provenance/3.6.1a1/multiple.intoto.jsonl b/provenance/3.6.1a1/multiple.intoto.jsonl new file mode 100644 index 00000000000..c4393731d39 --- /dev/null +++ b/provenance/3.6.1a1/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjYuMWExLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiMDFkODZmM2FlZGRlNzU0MTUwYmFkZWRiNzZmYzA3MWU5MTRlZGU5MTc2OTgyODEyMDVjMTgxMDExODNlZmY5OSJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjYuMWExLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI3MjZmNjljMmZkZTU2ZjgzZjM0NmM3ZDMzZDllMTVlYjBjZDczZWE3Njk5YWRmN2NjMTliODZjMWZiZmQ2NGViIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiY2Q5Y2E2ZjA2ZDRmYWIyODU2YWM5YzY0NGFjOGFjNmI3NmY3ZmUxMyJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwOCwiZm9ya3NfY291bnQiOjQwOCwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo2MCwib3Blbl9pc3N1ZXNfY291bnQiOjYwLCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDItMTJUMjA6MzM6MDNaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjg4Mjk0LCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5ODIsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDItMTJUMTY6MTE6NTZaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5ODIsIndhdGNoZXJzX2NvdW50IjoyOTgyLCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzMwMzAyNjgyOCIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTc1IiwiZ2l0aHViX3NoYTEiOiJjZDljYTZmMDZkNGZhYjI4NTZhYzljNjQ0YWM4YWM2Yjc2ZjdmZTEzIn19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzMzAzMDI2ODI4LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiJjZDljYTZmMDZkNGZhYjI4NTZhYzljNjQ0YWM4YWM2Yjc2ZjdmZTEzIn19XX19","signatures":[{"keyid":"","sig":"MEYCIQDF7k5lS3nEfZiZGr7PQyeaVW98vfP3ur+/vNBh8HrsWwIhALKLsBefAFZMADmG1b5KGN3nNFEkkV3ej/udWJd/eAVf","cert":"-----BEGIN CERTIFICATE-----\nMIIHZjCCBuygAwIBAgIUAM72LcaePN8mSE0x79g9px43qaMwCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMjEzMDgwNzIzWhcNMjUwMjEzMDgxNzIzWjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEboCJjcMocC1imtl/yjf9+55DLn8ydORpIeTy\nRKBoKyY1liXm490w5ia5QmAXpwYIXCS4RmnxqurBZNi5h95D36OCBgswggYHMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUBDSy\nvF67LdwK0SFBGSAYXSAyTvwwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChjZDlj\nYTZmMDZkNGZhYjI4NTZhYzljNjQ0YWM4YWM2Yjc2ZjdmZTEzMBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDChjZDljYTZmMDZkNGZhYjI4NTZhYzljNjQ0YWM4YWM2Yjc2ZjdmZTEzMCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoY2Q5\nY2E2ZjA2ZDRmYWIyODU2YWM5YzY0NGFjOGFjNmI3NmY3ZmUxMzAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTMzMDMwMjY4MjgvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlP5ZKDYAAAQDAEcwRQIhALyTY24bYf5RXmCAE7TS\n34rOlm6Yx+NK14EmACG8HVvEAiA6F47X0BsjikWZ6+pkOxg5/aIXmL5fmWTfOSEV\nprlGNDAKBggqhkjOPQQDAwNoADBlAjEAkjdvJChkGxavxmUrOx+oZ4uw6InPr1TC\nUzMPejbGlZSCE1hR2+h0r+MFGkfNlFuFAjByI3+HTRw08Vdcb1zsVhRWGiiK5Tk1\nYBFJTNXZ7Ijajewv5k3qDkxLwRod9nJOizI=\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index fb586682b04..a1ece1a624a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.6.1a0" +version = "3.6.1a1" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From ac1e0f169fc5536d020fa74cbf89078bbe9fc72b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 10:31:29 +0000 Subject: [PATCH 138/139] chore(ci): changelog rebuild (#6091) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 021a46597c1..5121d5b05be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ * **security:** fix encryption_context handling in data masking operations ([#6074](https://github.com/aws-powertools/powertools-lambda-python/issues/6074)) +## Documentation + +* **roadmap:** update roadmap ([#6077](https://github.com/aws-powertools/powertools-lambda-python/issues/6077)) + ## Maintenance * **ci:** new pre-release 3.6.1a0 ([#6084](https://github.com/aws-powertools/powertools-lambda-python/issues/6084)) From c4f31cc5e7692a15686525033211e4308f8bee7d Mon Sep 17 00:00:00 2001 From: sinofseven Date: Sat, 15 Feb 2025 18:43:00 +0900 Subject: [PATCH 139/139] add test for secrets_manager.py --- .../async_execution/routes/secrets_manager.py | 10 ++- .../_routes/test_secrets_manager.py | 86 +++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py b/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py index d8eaa06e261..88fc059bb93 100644 --- a/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py +++ b/aws_lambda_powertools/event_handler/async_execution/routes/secrets_manager.py @@ -29,8 +29,14 @@ def match(self, event: dict[str, Any]) -> tuple[Callable, SecretsManagerEvent] | if not secret_id: return None - elif self.secret_id and self.secret_id == secret_id: - return self.func, SecretsManagerEvent(event) + elif self.secret_id and self.secret_name_prefix: + part = secret_id.split(":") + secret_name = part[-1] + if self.secret_id == secret_id and secret_name.find(self.secret_name_prefix) == 0: + return self.func, SecretsManagerEvent(event) + elif self.secret_id: + if self.secret_id == secret_id: + return self.func, SecretsManagerEvent(event) elif self.secret_name_prefix: part = secret_id.split(":") secret_name = part[-1] diff --git a/tests/unit/event_handler/_async_execution/_routes/test_secrets_manager.py b/tests/unit/event_handler/_async_execution/_routes/test_secrets_manager.py index 5eb47eec2f2..cbe5496d989 100644 --- a/tests/unit/event_handler/_async_execution/_routes/test_secrets_manager.py +++ b/tests/unit/event_handler/_async_execution/_routes/test_secrets_manager.py @@ -1,10 +1,96 @@ import pytest from aws_lambda_powertools.event_handler.async_execution.routes.secrets_manager import SecretsManagerRoute +from aws_lambda_powertools.utilities.data_classes.secrets_manager_event import SecretsManagerEvent from tests.functional.utils import load_event class TestSecretsManagerRoute: + def test_constructor_error(self): + with pytest.raises(ValueError): + SecretsManagerRoute(func=lambda _: None) + + @pytest.mark.parametrize( + "event_name, option_constructor, is_match", + [ + # with secret_id and secret_name_prefix + # match all + ( + "secretsManagerEvent.json", + { + "func": lambda *_: None, + "secret_id": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3", + "secret_name_prefix": "MyTestDatabaseSecret", + }, + True, + ), + # with secret_id and secret_name_prefix + # match 1, unmatch 1 + ( + "secretsManagerEvent.json", + { + "func": lambda *_: None, + "secret_id": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3", + "secret_name_prefix": "MyTestDatabaseSecretV2", + }, + False, + ), + ( + "secretsManagerEvent.json", + { + "func": lambda *_: None, + "secret_id": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-999999", + "secret_name_prefix": "MyTestDatabaseSecret", + }, + False, + ), + # with secret_id and secret_name_prefix + # unmatch all + ( + "secretsManagerEvent.json", + { + "func": lambda *_: None, + "secret_id": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-999999", + "secret_name_prefix": "MyTestDatabaseSecretV2", + }, + False, + ), + # with secret_id + ( + "secretsManagerEvent.json", + { + "func": lambda *_: None, + "secret_id": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3", + }, + True, + ), + ( + "secretsManagerEvent.json", + { + "func": lambda *_: None, + "secret_id": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-999999", + }, + False, + ), + # with secret_name_prefix + ("secretsManagerEvent.json", {"func": lambda *_: None, "secret_name_prefix": "MyTestDatabaseSecret"}, True), + ( + "secretsManagerEvent.json", + {"func": lambda *_: None, "secret_name_prefix": "MyTestDatabaseSecretV2"}, + False, + ), + ], + ) + def test_match(self, event_name, option_constructor, is_match): + event = load_event(file_name=event_name) + route = SecretsManagerRoute(**option_constructor) + actual = route.match(event=event) + if is_match: + expected = (route.func, SecretsManagerEvent(event)) + assert actual == expected + else: + assert actual is None + @pytest.mark.parametrize( "event_name", [