aws-lambda-powertools 2.28.1__tar.gz → 2.29.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/PKG-INFO +1 -1
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/api_gateway.py +1 -1
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/formatter.py +1 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/metrics.py +5 -2
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/base.py +3 -2
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +3 -2
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +3 -2
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +3 -2
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/middleware_factory/factory.py +2 -2
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/functions.py +82 -5
- aws_lambda_powertools-2.29.1/aws_lambda_powertools/shared/json_encoder.py +26 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/version.py +1 -1
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +38 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/idempotency.py +3 -1
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/parser.py +9 -4
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/validation/validator.py +2 -1
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/pyproject.toml +16 -16
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/setup.py +1 -1
- aws_lambda_powertools-2.28.1/aws_lambda_powertools/shared/json_encoder.py +0 -16
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/LICENSE +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/README.md +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/THIRD-PARTY-LICENSES +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/appsync.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/content_types.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/compat.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/models.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/router.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/types.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/exceptions/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/compat.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/filters.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/lambda_context.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/logger.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/types.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/utils.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/functions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/metric.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/types.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/package_logger.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/py.typed +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/cache_dict.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/constants.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/cookies.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/lazy_import.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/types.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/user_agent.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/tracing/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/tracing/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/tracing/extensions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/tracing/tracer.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/constants.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/provider/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/provider/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/provider/kms/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/provider/kms/aws_encryption_sdk.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/types.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/alb_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/appsync/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/common.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/s3_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/config.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/persistence/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/secrets.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/compat.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/s3.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/sqs.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/types.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/serialization.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/typing/lambda_client_context_mobile_client.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/validation/base.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
- {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: aws-lambda-powertools
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.29.1
|
|
4
4
|
Summary: Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity.
|
|
5
5
|
Home-page: https://github.com/aws-powertools/powertools-lambda-python
|
|
6
6
|
License: MIT
|
|
@@ -709,7 +709,7 @@ class ResponseBuilder(Generic[ResponseEventT]):
|
|
|
709
709
|
def __init__(
|
|
710
710
|
self,
|
|
711
711
|
response: Response,
|
|
712
|
-
serializer: Callable[[Any], str] = json.dumps,
|
|
712
|
+
serializer: Callable[[Any], str] = partial(json.dumps, separators=(",", ":"), cls=Encoder),
|
|
713
713
|
route: Optional[Route] = None,
|
|
714
714
|
):
|
|
715
715
|
self.response = response
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# NOTE: keeps for compatibility
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
|
-
from typing import Any,
|
|
4
|
+
from typing import Any, Dict
|
|
5
5
|
|
|
6
6
|
from aws_lambda_powertools.metrics.base import MetricResolution, MetricUnit
|
|
7
7
|
from aws_lambda_powertools.metrics.provider.cloudwatch_emf.cloudwatch import AmazonCloudWatchEMFProvider
|
|
8
8
|
from aws_lambda_powertools.metrics.provider.cloudwatch_emf.types import CloudWatchEMFOutput
|
|
9
|
+
from aws_lambda_powertools.shared.types import AnyCallableT
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class Metrics:
|
|
@@ -129,16 +130,18 @@ class Metrics:
|
|
|
129
130
|
|
|
130
131
|
def log_metrics(
|
|
131
132
|
self,
|
|
132
|
-
lambda_handler:
|
|
133
|
+
lambda_handler: AnyCallableT | None = None,
|
|
133
134
|
capture_cold_start_metric: bool = False,
|
|
134
135
|
raise_on_empty_metrics: bool = False,
|
|
135
136
|
default_dimensions: Dict[str, str] | None = None,
|
|
137
|
+
**kwargs,
|
|
136
138
|
):
|
|
137
139
|
return self.provider.log_metrics(
|
|
138
140
|
lambda_handler=lambda_handler,
|
|
139
141
|
capture_cold_start_metric=capture_cold_start_metric,
|
|
140
142
|
raise_on_empty_metrics=raise_on_empty_metrics,
|
|
141
143
|
default_dimensions=default_dimensions,
|
|
144
|
+
**kwargs,
|
|
142
145
|
)
|
|
143
146
|
|
|
144
147
|
def set_default_dimensions(self, **dimensions) -> None:
|
|
@@ -3,9 +3,10 @@ from __future__ import annotations
|
|
|
3
3
|
import functools
|
|
4
4
|
import logging
|
|
5
5
|
from abc import ABC, abstractmethod
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
8
|
from aws_lambda_powertools.metrics.provider import cold_start
|
|
9
|
+
from aws_lambda_powertools.shared.types import AnyCallableT
|
|
9
10
|
from aws_lambda_powertools.utilities.typing import LambdaContext
|
|
10
11
|
|
|
11
12
|
logger = logging.getLogger(__name__)
|
|
@@ -140,7 +141,7 @@ class BaseProvider(ABC):
|
|
|
140
141
|
|
|
141
142
|
def log_metrics(
|
|
142
143
|
self,
|
|
143
|
-
lambda_handler:
|
|
144
|
+
lambda_handler: AnyCallableT | None = None,
|
|
144
145
|
capture_cold_start_metric: bool = False,
|
|
145
146
|
raise_on_empty_metrics: bool = False,
|
|
146
147
|
**kwargs,
|
|
@@ -7,7 +7,7 @@ import numbers
|
|
|
7
7
|
import os
|
|
8
8
|
import warnings
|
|
9
9
|
from collections import defaultdict
|
|
10
|
-
from typing import Any,
|
|
10
|
+
from typing import Any, Dict, List
|
|
11
11
|
|
|
12
12
|
from aws_lambda_powertools.metrics.base import single_metric
|
|
13
13
|
from aws_lambda_powertools.metrics.exceptions import MetricValueError, SchemaValidationError
|
|
@@ -22,6 +22,7 @@ from aws_lambda_powertools.metrics.provider.cloudwatch_emf.types import CloudWat
|
|
|
22
22
|
from aws_lambda_powertools.metrics.types import MetricNameUnitResolution
|
|
23
23
|
from aws_lambda_powertools.shared import constants
|
|
24
24
|
from aws_lambda_powertools.shared.functions import resolve_env_var_choice
|
|
25
|
+
from aws_lambda_powertools.shared.types import AnyCallableT
|
|
25
26
|
from aws_lambda_powertools.utilities.typing import LambdaContext
|
|
26
27
|
|
|
27
28
|
logger = logging.getLogger(__name__)
|
|
@@ -334,7 +335,7 @@ class AmazonCloudWatchEMFProvider(BaseProvider):
|
|
|
334
335
|
|
|
335
336
|
def log_metrics(
|
|
336
337
|
self,
|
|
337
|
-
lambda_handler:
|
|
338
|
+
lambda_handler: AnyCallableT | None = None,
|
|
338
339
|
capture_cold_start_metric: bool = False,
|
|
339
340
|
raise_on_empty_metrics: bool = False,
|
|
340
341
|
**kwargs,
|
|
@@ -7,13 +7,14 @@ import os
|
|
|
7
7
|
import re
|
|
8
8
|
import time
|
|
9
9
|
import warnings
|
|
10
|
-
from typing import Any,
|
|
10
|
+
from typing import Any, Dict, List
|
|
11
11
|
|
|
12
12
|
from aws_lambda_powertools.metrics.exceptions import MetricValueError, SchemaValidationError
|
|
13
13
|
from aws_lambda_powertools.metrics.provider import BaseProvider
|
|
14
14
|
from aws_lambda_powertools.metrics.provider.datadog.warnings import DatadogDataValidationWarning
|
|
15
15
|
from aws_lambda_powertools.shared import constants
|
|
16
16
|
from aws_lambda_powertools.shared.functions import resolve_env_var_choice
|
|
17
|
+
from aws_lambda_powertools.shared.types import AnyCallableT
|
|
17
18
|
from aws_lambda_powertools.utilities.typing import LambdaContext
|
|
18
19
|
|
|
19
20
|
METRIC_NAME_REGEX = re.compile(r"^[a-zA-Z0-9_.]+$")
|
|
@@ -226,7 +227,7 @@ class DatadogProvider(BaseProvider):
|
|
|
226
227
|
|
|
227
228
|
def log_metrics(
|
|
228
229
|
self,
|
|
229
|
-
lambda_handler:
|
|
230
|
+
lambda_handler: AnyCallableT | None = None,
|
|
230
231
|
capture_cold_start_metric: bool = False,
|
|
231
232
|
raise_on_empty_metrics: bool = False,
|
|
232
233
|
**kwargs,
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# NOTE: keeps for compatibility
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
|
-
from typing import Any,
|
|
4
|
+
from typing import Any, Dict, List
|
|
5
5
|
|
|
6
6
|
from aws_lambda_powertools.metrics.provider.datadog.datadog import DatadogProvider
|
|
7
|
+
from aws_lambda_powertools.shared.types import AnyCallableT
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class DatadogMetrics:
|
|
@@ -90,7 +91,7 @@ class DatadogMetrics:
|
|
|
90
91
|
|
|
91
92
|
def log_metrics(
|
|
92
93
|
self,
|
|
93
|
-
lambda_handler:
|
|
94
|
+
lambda_handler: AnyCallableT | None = None,
|
|
94
95
|
capture_cold_start_metric: bool = False,
|
|
95
96
|
raise_on_empty_metrics: bool = False,
|
|
96
97
|
default_tags: Dict[str, Any] | None = None,
|
|
@@ -124,9 +124,9 @@ def lambda_handler_decorator(decorator: Optional[Callable] = None, trace_executi
|
|
|
124
124
|
)
|
|
125
125
|
|
|
126
126
|
@functools.wraps(func)
|
|
127
|
-
def wrapper(event, context):
|
|
127
|
+
def wrapper(event, context, **handler_kwargs):
|
|
128
128
|
try:
|
|
129
|
-
middleware = functools.partial(decorator, func, event, context, **kwargs)
|
|
129
|
+
middleware = functools.partial(decorator, func, event, context, **kwargs, **handler_kwargs)
|
|
130
130
|
if trace_execution:
|
|
131
131
|
tracer = Tracer(auto_patch=False)
|
|
132
132
|
with tracer.provider.in_subsegment(name=f"## {decorator.__qualname__}"):
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import base64
|
|
4
|
-
import dataclasses
|
|
5
4
|
import itertools
|
|
6
5
|
import logging
|
|
7
6
|
import os
|
|
@@ -168,8 +167,86 @@ def extract_event_from_common_models(data: Any) -> Dict | Any:
|
|
|
168
167
|
return data.raw_event
|
|
169
168
|
|
|
170
169
|
# Is it a Pydantic Model?
|
|
171
|
-
if
|
|
172
|
-
return data
|
|
170
|
+
if is_pydantic(data):
|
|
171
|
+
return pydantic_to_dict(data)
|
|
173
172
|
|
|
174
|
-
# Is it a Dataclass?
|
|
175
|
-
|
|
173
|
+
# Is it a Dataclass?
|
|
174
|
+
if is_dataclass(data):
|
|
175
|
+
return dataclass_to_dict(data)
|
|
176
|
+
|
|
177
|
+
# Return as is
|
|
178
|
+
return data
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def is_pydantic(data) -> bool:
|
|
182
|
+
"""Whether data is a Pydantic model by checking common field available in v1/v2
|
|
183
|
+
|
|
184
|
+
Parameters
|
|
185
|
+
----------
|
|
186
|
+
data: BaseModel
|
|
187
|
+
Pydantic model
|
|
188
|
+
|
|
189
|
+
Returns
|
|
190
|
+
-------
|
|
191
|
+
bool
|
|
192
|
+
Whether it's a Pydantic model
|
|
193
|
+
"""
|
|
194
|
+
return getattr(data, "json", False)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def is_dataclass(data) -> bool:
|
|
198
|
+
"""Whether data is a dataclass
|
|
199
|
+
|
|
200
|
+
Parameters
|
|
201
|
+
----------
|
|
202
|
+
data: dataclass
|
|
203
|
+
Dataclass obj
|
|
204
|
+
|
|
205
|
+
Returns
|
|
206
|
+
-------
|
|
207
|
+
bool
|
|
208
|
+
Whether it's a Dataclass
|
|
209
|
+
"""
|
|
210
|
+
return getattr(data, "__dataclass_fields__", False)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def pydantic_to_dict(data) -> dict:
|
|
214
|
+
"""Dump Pydantic model v1 and v2 as dict.
|
|
215
|
+
|
|
216
|
+
Note we use lazy import since Pydantic is an optional dependency.
|
|
217
|
+
|
|
218
|
+
Parameters
|
|
219
|
+
----------
|
|
220
|
+
data: BaseModel
|
|
221
|
+
Pydantic model
|
|
222
|
+
|
|
223
|
+
Returns
|
|
224
|
+
-------
|
|
225
|
+
|
|
226
|
+
dict:
|
|
227
|
+
Pydantic model serialized to dict
|
|
228
|
+
"""
|
|
229
|
+
from aws_lambda_powertools.event_handler.openapi.compat import _model_dump
|
|
230
|
+
|
|
231
|
+
return _model_dump(data)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def dataclass_to_dict(data) -> dict:
|
|
235
|
+
"""Dump standard dataclass as dict.
|
|
236
|
+
|
|
237
|
+
Note we use lazy import to prevent bloating other code parts.
|
|
238
|
+
|
|
239
|
+
Parameters
|
|
240
|
+
----------
|
|
241
|
+
data: dataclass
|
|
242
|
+
Dataclass
|
|
243
|
+
|
|
244
|
+
Returns
|
|
245
|
+
-------
|
|
246
|
+
|
|
247
|
+
dict:
|
|
248
|
+
Pydantic model serialized to dict
|
|
249
|
+
"""
|
|
250
|
+
import dataclasses
|
|
251
|
+
|
|
252
|
+
return dataclasses.asdict(data)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import decimal
|
|
2
|
+
import json
|
|
3
|
+
import math
|
|
4
|
+
|
|
5
|
+
from aws_lambda_powertools.shared.functions import dataclass_to_dict, is_dataclass, is_pydantic, pydantic_to_dict
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Encoder(json.JSONEncoder):
|
|
9
|
+
"""Custom JSON encoder to allow for serialization of Decimals, Pydantic and Dataclasses.
|
|
10
|
+
|
|
11
|
+
It's similar to the serializer used by Lambda internally.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def default(self, obj):
|
|
15
|
+
if isinstance(obj, decimal.Decimal):
|
|
16
|
+
if obj.is_nan():
|
|
17
|
+
return math.nan
|
|
18
|
+
return str(obj)
|
|
19
|
+
|
|
20
|
+
if is_pydantic(obj):
|
|
21
|
+
return pydantic_to_dict(obj)
|
|
22
|
+
|
|
23
|
+
if is_dataclass(obj):
|
|
24
|
+
return dataclass_to_dict(obj)
|
|
25
|
+
|
|
26
|
+
return super().default(obj)
|
|
@@ -33,6 +33,25 @@ class APIGatewayEventAuthorizer(DictWrapper):
|
|
|
33
33
|
"""The authorizer latency in ms."""
|
|
34
34
|
return self.get("integrationLatency")
|
|
35
35
|
|
|
36
|
+
def get_context(self) -> Dict[str, Any]:
|
|
37
|
+
"""Retrieve the authorization context details injected by a Lambda Authorizer.
|
|
38
|
+
|
|
39
|
+
Example
|
|
40
|
+
--------
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
ctx: dict = request_context.authorizer.get_context()
|
|
44
|
+
|
|
45
|
+
tenant_id = ctx.get("tenant_id")
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
--------
|
|
50
|
+
Dict[str, Any]
|
|
51
|
+
A dictionary containing Lambda authorization context details.
|
|
52
|
+
"""
|
|
53
|
+
return self._data
|
|
54
|
+
|
|
36
55
|
|
|
37
56
|
class APIGatewayEventRequestContext(BaseRequestContext):
|
|
38
57
|
@property
|
|
@@ -184,6 +203,25 @@ class RequestContextV2Authorizer(DictWrapper):
|
|
|
184
203
|
"""Lambda authorization context details"""
|
|
185
204
|
return self.get("lambda")
|
|
186
205
|
|
|
206
|
+
def get_context(self) -> Dict[str, Any]:
|
|
207
|
+
"""Retrieve the authorization context details injected by a Lambda Authorizer.
|
|
208
|
+
|
|
209
|
+
Example
|
|
210
|
+
--------
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
ctx: dict = request_context.authorizer.get_context()
|
|
214
|
+
|
|
215
|
+
tenant_id = ctx.get("tenant_id")
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
--------
|
|
220
|
+
Dict[str, Any]
|
|
221
|
+
A dictionary containing Lambda authorization context details.
|
|
222
|
+
"""
|
|
223
|
+
return self.get("lambda", {}) or {}
|
|
224
|
+
|
|
187
225
|
@property
|
|
188
226
|
def iam(self) -> Optional[RequestContextV2AuthorizerIam]:
|
|
189
227
|
"""IAM authorization details used for making the request."""
|
|
@@ -66,7 +66,7 @@ def idempotent(
|
|
|
66
66
|
"""
|
|
67
67
|
|
|
68
68
|
if os.getenv(constants.IDEMPOTENCY_DISABLED_ENV):
|
|
69
|
-
return handler(event, context)
|
|
69
|
+
return handler(event, context, **kwargs)
|
|
70
70
|
|
|
71
71
|
config = config or IdempotencyConfig()
|
|
72
72
|
config.register_lambda_context(context)
|
|
@@ -91,6 +91,7 @@ def idempotent_function(
|
|
|
91
91
|
persistence_store: BasePersistenceLayer,
|
|
92
92
|
config: Optional[IdempotencyConfig] = None,
|
|
93
93
|
output_serializer: Optional[Union[BaseIdempotencySerializer, Type[BaseIdempotencyModelSerializer]]] = None,
|
|
94
|
+
**kwargs: Any,
|
|
94
95
|
) -> Any:
|
|
95
96
|
"""
|
|
96
97
|
Decorator to handle idempotency of any function
|
|
@@ -136,6 +137,7 @@ def idempotent_function(
|
|
|
136
137
|
persistence_store=persistence_store,
|
|
137
138
|
config=config,
|
|
138
139
|
output_serializer=output_serializer,
|
|
140
|
+
**kwargs,
|
|
139
141
|
),
|
|
140
142
|
)
|
|
141
143
|
|
|
@@ -15,11 +15,12 @@ logger = logging.getLogger(__name__)
|
|
|
15
15
|
|
|
16
16
|
@lambda_handler_decorator
|
|
17
17
|
def event_parser(
|
|
18
|
-
handler: Callable[
|
|
18
|
+
handler: Callable[..., EventParserReturnType],
|
|
19
19
|
event: Dict[str, Any],
|
|
20
20
|
context: LambdaContext,
|
|
21
21
|
model: Optional[Type[Model]] = None,
|
|
22
22
|
envelope: Optional[Type[Envelope]] = None,
|
|
23
|
+
**kwargs: Any,
|
|
23
24
|
) -> EventParserReturnType:
|
|
24
25
|
"""Lambda handler decorator to parse & validate events using Pydantic models
|
|
25
26
|
|
|
@@ -93,9 +94,13 @@ def event_parser(
|
|
|
93
94
|
"or as the type hint of `event` in the handler that it wraps",
|
|
94
95
|
)
|
|
95
96
|
|
|
96
|
-
|
|
97
|
+
if envelope:
|
|
98
|
+
parsed_event = parse(event=event, model=model, envelope=envelope)
|
|
99
|
+
else:
|
|
100
|
+
parsed_event = parse(event=event, model=model)
|
|
101
|
+
|
|
97
102
|
logger.debug(f"Calling handler {handler.__name__}")
|
|
98
|
-
return handler(parsed_event, context)
|
|
103
|
+
return handler(parsed_event, context, **kwargs)
|
|
99
104
|
|
|
100
105
|
|
|
101
106
|
@overload
|
|
@@ -104,7 +109,7 @@ def parse(event: Dict[str, Any], model: Type[Model]) -> Model:
|
|
|
104
109
|
|
|
105
110
|
|
|
106
111
|
@overload
|
|
107
|
-
def parse(event: Dict[str, Any], model: Type[Model], envelope: Type[Envelope]):
|
|
112
|
+
def parse(event: Dict[str, Any], model: Type[Model], envelope: Type[Envelope]) -> Model:
|
|
108
113
|
... # pragma: no cover
|
|
109
114
|
|
|
110
115
|
|
|
@@ -20,6 +20,7 @@ def validator(
|
|
|
20
20
|
outbound_formats: Optional[Dict] = None,
|
|
21
21
|
envelope: str = "",
|
|
22
22
|
jmespath_options: Optional[Dict] = None,
|
|
23
|
+
**kwargs: Any,
|
|
23
24
|
) -> Any:
|
|
24
25
|
"""Lambda handler decorator to validate incoming/outbound data using a JSON Schema
|
|
25
26
|
|
|
@@ -128,7 +129,7 @@ def validator(
|
|
|
128
129
|
logger.debug("Validating inbound event")
|
|
129
130
|
validate_data_against_schema(data=event, schema=inbound_schema, formats=inbound_formats)
|
|
130
131
|
|
|
131
|
-
response = handler(event, context)
|
|
132
|
+
response = handler(event, context, **kwargs)
|
|
132
133
|
|
|
133
134
|
if outbound_schema:
|
|
134
135
|
logger.debug("Validating outbound event")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "aws_lambda_powertools"
|
|
3
|
-
version = "2.
|
|
3
|
+
version = "2.29.1"
|
|
4
4
|
description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity."
|
|
5
5
|
authors = ["Amazon Web Services"]
|
|
6
6
|
include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"]
|
|
@@ -63,32 +63,32 @@ xenon = "^0.9.1"
|
|
|
63
63
|
mkdocs-git-revision-date-plugin = "^0.3.2"
|
|
64
64
|
mike = "^1.1.2"
|
|
65
65
|
pytest-xdist = "^3.5.0"
|
|
66
|
-
aws-cdk-lib = "^2.
|
|
66
|
+
aws-cdk-lib = "^2.111.0"
|
|
67
67
|
"aws-cdk.aws-apigatewayv2-alpha" = "^2.38.1-alpha.0"
|
|
68
68
|
"aws-cdk.aws-apigatewayv2-integrations-alpha" = "^2.38.1-alpha.0"
|
|
69
69
|
"aws-cdk.aws-apigatewayv2-authorizers-alpha" = "^2.38.1-alpha.0"
|
|
70
70
|
pytest-benchmark = "^4.0.0"
|
|
71
|
-
mypy-boto3-appconfig = "^1.
|
|
72
|
-
mypy-boto3-cloudformation = "^1.
|
|
73
|
-
mypy-boto3-cloudwatch = "^1.
|
|
74
|
-
mypy-boto3-dynamodb = "^1.
|
|
75
|
-
mypy-boto3-lambda = "^1.
|
|
76
|
-
mypy-boto3-logs = "^1.
|
|
77
|
-
mypy-boto3-secretsmanager = "^1.
|
|
78
|
-
mypy-boto3-ssm = "^1.
|
|
79
|
-
mypy-boto3-s3 = "^1.
|
|
80
|
-
mypy-boto3-xray = "^1.
|
|
71
|
+
mypy-boto3-appconfig = "^1.33.0"
|
|
72
|
+
mypy-boto3-cloudformation = "^1.33.8"
|
|
73
|
+
mypy-boto3-cloudwatch = "^1.33.11"
|
|
74
|
+
mypy-boto3-dynamodb = "^1.33.0"
|
|
75
|
+
mypy-boto3-lambda = "^1.33.0"
|
|
76
|
+
mypy-boto3-logs = "^1.33.0"
|
|
77
|
+
mypy-boto3-secretsmanager = "^1.33.0"
|
|
78
|
+
mypy-boto3-ssm = "^1.33.0"
|
|
79
|
+
mypy-boto3-s3 = "^1.33.2"
|
|
80
|
+
mypy-boto3-xray = "^1.33.0"
|
|
81
81
|
types-requests = "^2.31.0"
|
|
82
82
|
typing-extensions = "^4.6.2"
|
|
83
83
|
mkdocs-material = "^9.2.7"
|
|
84
84
|
filelock = "^3.12.2"
|
|
85
85
|
checksumdir = "^1.2.0"
|
|
86
|
-
mypy-boto3-appconfigdata = "^1.
|
|
86
|
+
mypy-boto3-appconfigdata = "^1.33.0"
|
|
87
87
|
ijson = "^3.2.2"
|
|
88
88
|
typed-ast = { version = "^1.5.5", python = "< 3.8"}
|
|
89
89
|
hvac = "^1.2.1"
|
|
90
90
|
aws-requests-auth = "^0.4.3"
|
|
91
|
-
datadog-lambda = "^5.
|
|
91
|
+
datadog-lambda = "^5.85.0"
|
|
92
92
|
|
|
93
93
|
[tool.poetry.extras]
|
|
94
94
|
parser = ["pydantic"]
|
|
@@ -101,12 +101,12 @@ datadog = ["datadog-lambda"]
|
|
|
101
101
|
datamasking-aws-sdk = ["aws-encryption-sdk"]
|
|
102
102
|
|
|
103
103
|
[tool.poetry.group.dev.dependencies]
|
|
104
|
-
cfn-lint = "0.83.
|
|
104
|
+
cfn-lint = "0.83.4"
|
|
105
105
|
mypy = "^1.1.1"
|
|
106
106
|
types-python-dateutil = "^2.8.19.6"
|
|
107
107
|
httpx = ">=0.23.3,<0.25.0"
|
|
108
108
|
sentry-sdk = "^1.22.2"
|
|
109
|
-
ruff = ">=0.0.272,<0.1.
|
|
109
|
+
ruff = ">=0.0.272,<0.1.8"
|
|
110
110
|
retry2 = "^0.9.5"
|
|
111
111
|
pytest-socket = "^0.6.0"
|
|
112
112
|
|
|
@@ -57,7 +57,7 @@ extras_require = \
|
|
|
57
57
|
|
|
58
58
|
setup_kwargs = {
|
|
59
59
|
'name': 'aws-lambda-powertools',
|
|
60
|
-
'version': '2.
|
|
60
|
+
'version': '2.29.1',
|
|
61
61
|
'description': 'Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity.',
|
|
62
62
|
'long_description': '<!-- markdownlint-disable MD013 MD041 MD043 -->\n# Powertools for AWS Lambda (Python)\n\n[](https://github.com/aws-powertools/powertools-lambda-python/actions/workflows/python_build.yml)\n[](https://app.codecov.io/gh/aws-powertools/powertools-lambda-python)\n   [](https://api.securityscorecards.dev/projects/github.com/aws-powertools/powertools-lambda-python) [](https://discord.gg/B8zZKbbyET)\n\nPowertools for AWS Lambda (Python) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/python/latest/#features).\n\n> Also available in [Java](https://github.com/aws-powertools/powertools-lambda-java), [Typescript](https://github.com/aws-powertools/powertools-lambda-typescript), and [.NET](https://github.com/aws-powertools/powertools-lambda-dotnet).\n\n**[📜Documentation](https://docs.powertools.aws.dev/lambda/python/)** | **[🐍PyPi](https://pypi.org/project/aws-lambda-powertools/)** | **[Roadmap](https://docs.powertools.aws.dev/lambda/python/latest/roadmap/)** | **[Detailed blog post](https://aws.amazon.com/blogs/opensource/simplifying-serverless-best-practices-with-lambda-powertools/)**\n\n> **An AWS Developer Acceleration (DevAx) initiative by Specialist Solution Architects | <aws-devax-open-source@amazon.com>**\n\n\n\n## Features\n\n* **[Tracing](https://docs.powertools.aws.dev/lambda/python/latest/core/tracer/)** - Decorators and utilities to trace Lambda function handlers, and both synchronous and asynchronous functions\n* **[Logging](https://docs.powertools.aws.dev/lambda/python/latest/core/logger/)** - Structured logging made easier, and decorator to enrich structured logging with key Lambda context details\n* **[Metrics](https://docs.powertools.aws.dev/lambda/python/latest/core/metrics/)** - Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF)\n* **[Event handler: AppSync](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/appsync/)** - AWS AppSync event handler for Lambda Direct Resolver and Amplify GraphQL Transformer function\n* **[Event handler: API Gateway and ALB](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/)** - Amazon API Gateway REST/HTTP API and ALB event handler for Lambda functions invoked using Proxy integration\n* **[Bring your own middleware](https://docs.powertools.aws.dev/lambda/python/latest/utilities/middleware_factory/)** - Decorator factory to create your own middleware to run logic before, and after each Lambda invocation\n* **[Parameters utility](https://docs.powertools.aws.dev/lambda/python/latest/utilities/parameters/)** - Retrieve and cache parameter values from Parameter Store, Secrets Manager, or DynamoDB\n* **[Batch processing](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/)** - Handle partial failures for AWS SQS batch processing\n* **[Typing](https://docs.powertools.aws.dev/lambda/python/latest/utilities/typing/)** - Static typing classes to speedup development in your IDE\n* **[Validation](https://docs.powertools.aws.dev/lambda/python/latest/utilities/validation/)** - JSON Schema validator for inbound events and responses\n* **[Event source data classes](https://docs.powertools.aws.dev/lambda/python/latest/utilities/data_classes/)** - Data classes describing the schema of common Lambda event triggers\n* **[Parser](https://docs.powertools.aws.dev/lambda/python/latest/utilities/parser/)** - Data parsing and deep validation using Pydantic\n* **[Idempotency](https://docs.powertools.aws.dev/lambda/python/latest/utilities/idempotency/)** - Convert your Lambda functions into idempotent operations which are safe to retry\n* **[Feature Flags](https://docs.powertools.aws.dev/lambda/python/latest/utilities/feature_flags/)** - A simple rule engine to evaluate when one or multiple features should be enabled depending on the input\n* **[Streaming](https://docs.powertools.aws.dev/lambda/python/latest/utilities/streaming/)** - Streams datasets larger than the available memory as streaming data.\n\n### Installation\n\nWith [pip](https://pip.pypa.io/en/latest/index.html) installed, run: ``pip install aws-lambda-powertools``\n\n## Tutorial and Examples\n\n* [Tutorial](https://docs.powertools.aws.dev/lambda/python/latest/tutorial)\n* [Serverless Shopping cart](https://github.com/aws-samples/aws-serverless-shopping-cart)\n* [Serverless Airline](https://github.com/aws-samples/aws-serverless-airline-booking)\n* [Serverless E-commerce platform](https://github.com/aws-samples/aws-serverless-ecommerce-platform)\n* [Serverless GraphQL Nanny Booking Api](https://github.com/trey-rosius/babysitter_api)\n\n## How to support Powertools for AWS Lambda (Python)?\n\n### Becoming a reference customer\n\nKnowing which companies are using this library is important to help prioritize the project internally. If your company is using Powertools for AWS Lambda (Python), you can request to have your name and logo added to the README file by raising a [Support Powertools for AWS Lambda (Python) (become a reference)](https://github.com/aws-powertools/powertools-lambda-python/issues/new?assignees=&labels=customer-reference&template=support_powertools.yml&title=%5BSupport+Lambda+Powertools%5D%3A+%3Cyour+organization+name%3E) issue.\n\nThe following companies, among others, use Powertools:\n\n* [Capital One](https://www.capitalone.com/)\n* [CPQi (Exadel Financial Services)](https://cpqi.com/)\n* [CloudZero](https://www.cloudzero.com/)\n* [CyberArk](https://www.cyberark.com/)\n* [globaldatanet](https://globaldatanet.com/)\n* [IMS](https://ims.tech/)\n* [Jit Security](https://www.jit.io/)\n* [Propellor.ai](https://www.propellor.ai/)\n* [TopSport](https://www.topsport.com.au/)\n* [Trek10](https://www.trek10.com/)\n* [Vertex Pharmaceuticals](https://www.vrtx.com/)\n\n### Sharing your work\n\nShare what you did with Powertools for AWS Lambda (Python) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has already shared about Powertools for AWS Lambda (Python) [here](https://docs.powertools.aws.dev/lambda/python/latest/we_made_this/).\n\n### Using Lambda Layer or SAR\n\nThis helps us understand who uses Powertools for AWS Lambda (Python) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer), you can add Powertools for AWS Lambda (Python) as a dev dependency (or as part of your virtual env) to not impact the development process.\n\n## Credits\n\n* Structured logging initial implementation from [aws-lambda-logging](https://gitlab.com/hadrien/aws_lambda_logging)\n* Powertools for AWS Lambda (Python) idea [DAZN Powertools](https://github.com/getndazn/dazn-lambda-powertools/)\n\n## Connect\n\n* **Powertools for AWS Lambda on Discord**: `#python` - **[Invite link](https://discord.gg/B8zZKbbyET)**\n* **Email**: <aws-lambda-powertools-feedback@amazon.com>\n\n## Security disclosures\n\nIf you think you’ve found a potential security issue, please do not post it in the Issues. Instead, please follow the instructions [here](https://aws.amazon.com/security/vulnerability-reporting/) or [email AWS security directly](mailto:aws-security@amazon.com).\n\n## License\n\nThis library is licensed under the MIT-0 License. See the LICENSE file.\n',
|
|
63
63
|
'author': 'Amazon Web Services',
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import decimal
|
|
2
|
-
import json
|
|
3
|
-
import math
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class Encoder(json.JSONEncoder):
|
|
7
|
-
"""
|
|
8
|
-
Custom JSON encoder to allow for serialization of Decimals, similar to the serializer used by Lambda internally.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
def default(self, obj):
|
|
12
|
-
if isinstance(obj, decimal.Decimal):
|
|
13
|
-
if obj.is_nan():
|
|
14
|
-
return math.nan
|
|
15
|
-
return str(obj)
|
|
16
|
-
return super().default(obj)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|