aws-lambda-powertools 3.14.1a5__tar.gz → 3.15.0__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-3.14.1a5 → aws_lambda_powertools-3.15.0}/PKG-INFO +5 -1
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/api_gateway.py +1 -1
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/version.py +1 -1
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +45 -13
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/__init__.py +9 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/consumer_records.py +144 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/deserializer/__init__.py +0 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/deserializer/avro.py +71 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/deserializer/base.py +52 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/deserializer/default.py +46 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/deserializer/deserializer.py +107 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/deserializer/json.py +53 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/deserializer/protobuf.py +117 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/exceptions.py +22 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/kafka_consumer.py +60 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/schema_config.py +83 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/serialization/__init__.py +0 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/serialization/base.py +56 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/serialization/custom_dict.py +22 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/serialization/dataclass.py +25 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/serialization/pydantic.py +26 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/serialization/serialization.py +65 -0
- aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/serialization/types.py +3 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/kafka.py +7 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/pyproject.toml +8 -2
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/setup.py +6 -1
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/LICENSE +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/README.md +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/THIRD-PARTY-LICENSES +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/appsync.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/bedrock_agent.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/bedrock_agent_function.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/content_types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/events_appsync/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/events_appsync/_registry.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/events_appsync/appsync_events.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/events_appsync/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/events_appsync/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/events_appsync/functions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/events_appsync/router.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/events_appsync/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/exception_handling.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/graphql_appsync/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/graphql_appsync/_registry.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/graphql_appsync/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/graphql_appsync/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/graphql_appsync/router.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/compat.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/config.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/models.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/router.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/util.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/exceptions/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/buffer/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/buffer/cache.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/buffer/config.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/buffer/functions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/constants.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/filters.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/formatter.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/lambda_context.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/logger.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/logging/utils.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/functions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/metric.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/metrics.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/metrics/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/package_logger.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/py.typed +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/cache_dict.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/constants.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/cookies.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/dynamodb_deserializer.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/functions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/json_encoder.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/lazy_import.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/shared/user_agent.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/tracing/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/tracing/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/tracing/extensions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/tracing/tracer.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/batch/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/batch/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/alb_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_websocket_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/appsync/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_events_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_function_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/cloudformation_custom_resource_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/code_deploy_lifecycle_hook_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/common.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/iot_registry_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/s3_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/transfer_family_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_masking/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_masking/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_masking/constants.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_masking/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_masking/provider/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_masking/provider/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/feature_flags/constants.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/feature_flags/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/config.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/hook.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/persistence/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/persistence/cache.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/serialization/functions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parameters/constants.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parameters/secrets.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw_websocket.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/functions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/apigw_websocket.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/appsync.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/s3.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/s3_batch_operation.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/sqs.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/transfer_family.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/parser.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/parser/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/serialization.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/constants.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/streaming/types.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/typing/lambda_client_context_mobile_client.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/validation/base.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/utilities/validation/validator.py +0 -0
- {aws_lambda_powertools-3.14.1a5 → aws_lambda_powertools-3.15.0}/aws_lambda_powertools/warnings/__init__.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: aws_lambda_powertools
|
3
|
-
Version: 3.
|
3
|
+
Version: 3.15.0
|
4
4
|
Summary: Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity.
|
5
5
|
License: MIT
|
6
6
|
Keywords: aws_lambda_powertools,aws,tracing,logging,lambda,powertools,feature_flags,idempotency,middleware
|
@@ -21,11 +21,14 @@ Provides-Extra: all
|
|
21
21
|
Provides-Extra: aws-sdk
|
22
22
|
Provides-Extra: datadog
|
23
23
|
Provides-Extra: datamasking
|
24
|
+
Provides-Extra: kafka-consumer-avro
|
25
|
+
Provides-Extra: kafka-consumer-protobuf
|
24
26
|
Provides-Extra: parser
|
25
27
|
Provides-Extra: redis
|
26
28
|
Provides-Extra: tracer
|
27
29
|
Provides-Extra: validation
|
28
30
|
Provides-Extra: valkey
|
31
|
+
Requires-Dist: avro (>=1.12.0,<2.0.0) ; extra == "kafka-consumer-avro"
|
29
32
|
Requires-Dist: aws-encryption-sdk (>=3.1.1,<5.0.0) ; extra == "all" or extra == "datamasking"
|
30
33
|
Requires-Dist: aws-xray-sdk (>=2.8.0,<3.0.0) ; extra == "tracer" or extra == "all"
|
31
34
|
Requires-Dist: boto3 (>=1.34.32,<2.0.0) ; extra == "aws-sdk"
|
@@ -33,6 +36,7 @@ Requires-Dist: datadog-lambda (>=6.106.0,<7.0.0) ; extra == "datadog"
|
|
33
36
|
Requires-Dist: fastjsonschema (>=2.14.5,<3.0.0) ; extra == "validation" or extra == "all"
|
34
37
|
Requires-Dist: jmespath (>=1.0.1,<2.0.0)
|
35
38
|
Requires-Dist: jsonpath-ng (>=1.6.0,<2.0.0) ; extra == "all" or extra == "datamasking"
|
39
|
+
Requires-Dist: protobuf (>=6.30.2,<7.0.0) ; extra == "kafka-consumer-protobuf"
|
36
40
|
Requires-Dist: pydantic (>=2.4.0,<3.0.0) ; extra == "parser" or extra == "all"
|
37
41
|
Requires-Dist: pydantic-settings (>=2.6.1,<3.0.0) ; extra == "all"
|
38
42
|
Requires-Dist: redis (>=4.4,<7.0) ; extra == "redis"
|
@@ -407,7 +407,7 @@ class Route:
|
|
407
407
|
|
408
408
|
# OpenAPI spec only understands paths with { }. So we'll have to convert Powertools' < >.
|
409
409
|
# https://swagger.io/specification/#path-templating
|
410
|
-
self.openapi_path = re.sub(r"<(.*?)>", lambda m: f"{{{''.join(m.group(1))}}}", self.path)
|
410
|
+
self.openapi_path = re.sub(r"<(.*?)>", lambda m: f"{{{''.join(m.group(1))}}}", self.path) # type: ignore[arg-type]
|
411
411
|
|
412
412
|
self.rule = rule
|
413
413
|
self.func = func
|
@@ -10,7 +10,19 @@ if TYPE_CHECKING:
|
|
10
10
|
from collections.abc import Iterator
|
11
11
|
|
12
12
|
|
13
|
-
class
|
13
|
+
class KafkaEventRecordSchemaMetadata(DictWrapper):
|
14
|
+
@property
|
15
|
+
def data_format(self) -> str | None:
|
16
|
+
"""The data format of the Kafka record."""
|
17
|
+
return self.get("dataFormat", None)
|
18
|
+
|
19
|
+
@property
|
20
|
+
def schema_id(self) -> str | None:
|
21
|
+
"""The schema id of the Kafka record."""
|
22
|
+
return self.get("schemaId", None)
|
23
|
+
|
24
|
+
|
25
|
+
class KafkaEventRecordBase(DictWrapper):
|
14
26
|
@property
|
15
27
|
def topic(self) -> str:
|
16
28
|
"""The Kafka topic."""
|
@@ -36,6 +48,24 @@ class KafkaEventRecord(DictWrapper):
|
|
36
48
|
"""The Kafka record timestamp type."""
|
37
49
|
return self["timestampType"]
|
38
50
|
|
51
|
+
@property
|
52
|
+
def key_schema_metadata(self) -> KafkaEventRecordSchemaMetadata | None:
|
53
|
+
"""The metadata of the Key Kafka record."""
|
54
|
+
return (
|
55
|
+
None if self.get("keySchemaMetadata") is None else KafkaEventRecordSchemaMetadata(self["keySchemaMetadata"])
|
56
|
+
)
|
57
|
+
|
58
|
+
@property
|
59
|
+
def value_schema_metadata(self) -> KafkaEventRecordSchemaMetadata | None:
|
60
|
+
"""The metadata of the Value Kafka record."""
|
61
|
+
return (
|
62
|
+
None
|
63
|
+
if self.get("valueSchemaMetadata") is None
|
64
|
+
else KafkaEventRecordSchemaMetadata(self["valueSchemaMetadata"])
|
65
|
+
)
|
66
|
+
|
67
|
+
|
68
|
+
class KafkaEventRecord(KafkaEventRecordBase):
|
39
69
|
@property
|
40
70
|
def key(self) -> str | None:
|
41
71
|
"""
|
@@ -83,18 +113,7 @@ class KafkaEventRecord(DictWrapper):
|
|
83
113
|
return CaseInsensitiveDict((k, bytes(v)) for chunk in self.headers for k, v in chunk.items())
|
84
114
|
|
85
115
|
|
86
|
-
class
|
87
|
-
"""Self-managed or MSK Apache Kafka event trigger
|
88
|
-
Documentation:
|
89
|
-
--------------
|
90
|
-
- https://docs.aws.amazon.com/lambda/latest/dg/with-kafka.html
|
91
|
-
- https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html
|
92
|
-
"""
|
93
|
-
|
94
|
-
def __init__(self, data: dict[str, Any]):
|
95
|
-
super().__init__(data)
|
96
|
-
self._records: Iterator[KafkaEventRecord] | None = None
|
97
|
-
|
116
|
+
class KafkaEventBase(DictWrapper):
|
98
117
|
@property
|
99
118
|
def event_source(self) -> str:
|
100
119
|
"""The AWS service from which the Kafka event record originated."""
|
@@ -115,6 +134,19 @@ class KafkaEvent(DictWrapper):
|
|
115
134
|
"""The decoded Kafka bootstrap URL."""
|
116
135
|
return self.bootstrap_servers.split(",")
|
117
136
|
|
137
|
+
|
138
|
+
class KafkaEvent(KafkaEventBase):
|
139
|
+
"""Self-managed or MSK Apache Kafka event trigger
|
140
|
+
Documentation:
|
141
|
+
--------------
|
142
|
+
- https://docs.aws.amazon.com/lambda/latest/dg/with-kafka.html
|
143
|
+
- https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html
|
144
|
+
"""
|
145
|
+
|
146
|
+
def __init__(self, data: dict[str, Any]):
|
147
|
+
super().__init__(data)
|
148
|
+
self._records: Iterator[KafkaEventRecord] | None = None
|
149
|
+
|
118
150
|
@property
|
119
151
|
def records(self) -> Iterator[KafkaEventRecord]:
|
120
152
|
"""The Kafka records."""
|
@@ -0,0 +1,9 @@
|
|
1
|
+
from aws_lambda_powertools.utilities.kafka.consumer_records import ConsumerRecords
|
2
|
+
from aws_lambda_powertools.utilities.kafka.kafka_consumer import kafka_consumer
|
3
|
+
from aws_lambda_powertools.utilities.kafka.schema_config import SchemaConfig
|
4
|
+
|
5
|
+
__all__ = [
|
6
|
+
"kafka_consumer",
|
7
|
+
"ConsumerRecords",
|
8
|
+
"SchemaConfig",
|
9
|
+
]
|
@@ -0,0 +1,144 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from functools import cached_property
|
4
|
+
from typing import TYPE_CHECKING, Any
|
5
|
+
|
6
|
+
from aws_lambda_powertools.utilities.data_classes.common import CaseInsensitiveDict
|
7
|
+
from aws_lambda_powertools.utilities.data_classes.kafka_event import KafkaEventBase, KafkaEventRecordBase
|
8
|
+
from aws_lambda_powertools.utilities.kafka.deserializer.deserializer import get_deserializer
|
9
|
+
from aws_lambda_powertools.utilities.kafka.serialization.serialization import serialize_to_output_type
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from collections.abc import Iterator
|
13
|
+
|
14
|
+
from aws_lambda_powertools.utilities.kafka.schema_config import SchemaConfig
|
15
|
+
|
16
|
+
|
17
|
+
class ConsumerRecordRecords(KafkaEventRecordBase):
|
18
|
+
"""
|
19
|
+
A Kafka Consumer Record
|
20
|
+
"""
|
21
|
+
|
22
|
+
def __init__(self, data: dict[str, Any], schema_config: SchemaConfig | None = None):
|
23
|
+
super().__init__(data)
|
24
|
+
self.schema_config = schema_config
|
25
|
+
|
26
|
+
@cached_property
|
27
|
+
def key(self) -> Any:
|
28
|
+
key = self.get("key")
|
29
|
+
|
30
|
+
# Return None if key doesn't exist
|
31
|
+
if not key:
|
32
|
+
return None
|
33
|
+
|
34
|
+
# Determine schema type and schema string
|
35
|
+
schema_type = None
|
36
|
+
schema_str = None
|
37
|
+
output_serializer = None
|
38
|
+
|
39
|
+
if self.schema_config and self.schema_config.key_schema_type:
|
40
|
+
schema_type = self.schema_config.key_schema_type
|
41
|
+
schema_str = self.schema_config.key_schema
|
42
|
+
output_serializer = self.schema_config.key_output_serializer
|
43
|
+
|
44
|
+
# Always use get_deserializer if None it will default to DEFAULT
|
45
|
+
deserializer = get_deserializer(schema_type, schema_str)
|
46
|
+
deserialized_value = deserializer.deserialize(key)
|
47
|
+
|
48
|
+
# Apply output serializer if specified
|
49
|
+
if output_serializer:
|
50
|
+
return serialize_to_output_type(deserialized_value, output_serializer)
|
51
|
+
|
52
|
+
return deserialized_value
|
53
|
+
|
54
|
+
@cached_property
|
55
|
+
def value(self) -> Any:
|
56
|
+
value = self["value"]
|
57
|
+
|
58
|
+
# Determine schema type and schema string
|
59
|
+
schema_type = None
|
60
|
+
schema_str = None
|
61
|
+
output_serializer = None
|
62
|
+
|
63
|
+
if self.schema_config and self.schema_config.value_schema_type:
|
64
|
+
schema_type = self.schema_config.value_schema_type
|
65
|
+
schema_str = self.schema_config.value_schema
|
66
|
+
output_serializer = self.schema_config.value_output_serializer
|
67
|
+
|
68
|
+
# Always use get_deserializer if None it will default to DEFAULT
|
69
|
+
deserializer = get_deserializer(schema_type, schema_str)
|
70
|
+
deserialized_value = deserializer.deserialize(value)
|
71
|
+
|
72
|
+
# Apply output serializer if specified
|
73
|
+
if output_serializer:
|
74
|
+
return serialize_to_output_type(deserialized_value, output_serializer)
|
75
|
+
|
76
|
+
return deserialized_value
|
77
|
+
|
78
|
+
@property
|
79
|
+
def original_value(self) -> str:
|
80
|
+
"""The original (base64 encoded) Kafka record value."""
|
81
|
+
return self["value"]
|
82
|
+
|
83
|
+
@property
|
84
|
+
def original_key(self) -> str | None:
|
85
|
+
"""
|
86
|
+
The original (base64 encoded) Kafka record key.
|
87
|
+
|
88
|
+
This key is optional; if not provided,
|
89
|
+
a round-robin algorithm will be used to determine
|
90
|
+
the partition for the message.
|
91
|
+
"""
|
92
|
+
|
93
|
+
return self.get("key")
|
94
|
+
|
95
|
+
@property
|
96
|
+
def original_headers(self) -> list[dict[str, list[int]]]:
|
97
|
+
"""The raw Kafka record headers."""
|
98
|
+
return self["headers"]
|
99
|
+
|
100
|
+
@cached_property
|
101
|
+
def headers(self) -> dict[str, bytes]:
|
102
|
+
"""Decodes the headers as a single dictionary."""
|
103
|
+
return CaseInsensitiveDict((k, bytes(v)) for chunk in self.original_headers for k, v in chunk.items())
|
104
|
+
|
105
|
+
|
106
|
+
class ConsumerRecords(KafkaEventBase):
|
107
|
+
"""Self-managed or MSK Apache Kafka event trigger
|
108
|
+
Documentation:
|
109
|
+
--------------
|
110
|
+
- https://docs.aws.amazon.com/lambda/latest/dg/with-kafka.html
|
111
|
+
- https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html
|
112
|
+
"""
|
113
|
+
|
114
|
+
def __init__(self, data: dict[str, Any], schema_config: SchemaConfig | None = None):
|
115
|
+
super().__init__(data)
|
116
|
+
self._records: Iterator[ConsumerRecordRecords] | None = None
|
117
|
+
self.schema_config = schema_config
|
118
|
+
|
119
|
+
@property
|
120
|
+
def records(self) -> Iterator[ConsumerRecordRecords]:
|
121
|
+
"""The Kafka records."""
|
122
|
+
for chunk in self["records"].values():
|
123
|
+
for record in chunk:
|
124
|
+
yield ConsumerRecordRecords(data=record, schema_config=self.schema_config)
|
125
|
+
|
126
|
+
@property
|
127
|
+
def record(self) -> ConsumerRecordRecords:
|
128
|
+
"""
|
129
|
+
Returns the next Kafka record using an iterator.
|
130
|
+
|
131
|
+
Returns
|
132
|
+
-------
|
133
|
+
ConsumerRecordRecords
|
134
|
+
The next Kafka record.
|
135
|
+
|
136
|
+
Raises
|
137
|
+
------
|
138
|
+
StopIteration
|
139
|
+
If there are no more records available.
|
140
|
+
|
141
|
+
"""
|
142
|
+
if self._records is None:
|
143
|
+
self._records = self.records
|
144
|
+
return next(self._records)
|
File without changes
|
@@ -0,0 +1,71 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import io
|
4
|
+
|
5
|
+
from avro.io import BinaryDecoder, DatumReader
|
6
|
+
from avro.schema import parse as parse_schema
|
7
|
+
|
8
|
+
from aws_lambda_powertools.utilities.kafka.deserializer.base import DeserializerBase
|
9
|
+
from aws_lambda_powertools.utilities.kafka.exceptions import (
|
10
|
+
KafkaConsumerAvroSchemaParserError,
|
11
|
+
KafkaConsumerDeserializationError,
|
12
|
+
)
|
13
|
+
|
14
|
+
|
15
|
+
class AvroDeserializer(DeserializerBase):
|
16
|
+
"""
|
17
|
+
Deserializer for Apache Avro formatted data.
|
18
|
+
|
19
|
+
This class provides functionality to deserialize Avro binary data using
|
20
|
+
a provided Avro schema definition.
|
21
|
+
"""
|
22
|
+
|
23
|
+
def __init__(self, schema_str: str):
|
24
|
+
try:
|
25
|
+
self.parsed_schema = parse_schema(schema_str)
|
26
|
+
self.reader = DatumReader(self.parsed_schema)
|
27
|
+
except Exception as e:
|
28
|
+
raise KafkaConsumerAvroSchemaParserError(
|
29
|
+
f"Invalid Avro schema. Please ensure the provided avro schema is valid: {type(e).__name__}: {str(e)}",
|
30
|
+
) from e
|
31
|
+
|
32
|
+
def deserialize(self, data: bytes | str) -> object:
|
33
|
+
"""
|
34
|
+
Deserialize Avro binary data to a Python dictionary.
|
35
|
+
|
36
|
+
Parameters
|
37
|
+
----------
|
38
|
+
data : bytes or str
|
39
|
+
The Avro binary data to deserialize. If provided as a string,
|
40
|
+
it will be decoded to bytes first.
|
41
|
+
|
42
|
+
Returns
|
43
|
+
-------
|
44
|
+
dict[str, Any]
|
45
|
+
Deserialized data as a dictionary.
|
46
|
+
|
47
|
+
Raises
|
48
|
+
------
|
49
|
+
KafkaConsumerDeserializationError
|
50
|
+
When the data cannot be deserialized according to the schema,
|
51
|
+
typically due to data format incompatibility.
|
52
|
+
|
53
|
+
Examples
|
54
|
+
--------
|
55
|
+
>>> deserializer = AvroDeserializer(schema_str)
|
56
|
+
>>> avro_data = b'...' # binary Avro data
|
57
|
+
>>> try:
|
58
|
+
... result = deserializer.deserialize(avro_data)
|
59
|
+
... # Process the deserialized data
|
60
|
+
... except KafkaConsumerDeserializationError as e:
|
61
|
+
... print(f"Failed to deserialize: {e}")
|
62
|
+
"""
|
63
|
+
try:
|
64
|
+
value = self._decode_input(data)
|
65
|
+
bytes_reader = io.BytesIO(value)
|
66
|
+
decoder = BinaryDecoder(bytes_reader)
|
67
|
+
return self.reader.read(decoder)
|
68
|
+
except Exception as e:
|
69
|
+
raise KafkaConsumerDeserializationError(
|
70
|
+
f"Error trying to deserialize avro data - {type(e).__name__}: {str(e)}",
|
71
|
+
) from e
|
@@ -0,0 +1,52 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import base64
|
4
|
+
from abc import ABC, abstractmethod
|
5
|
+
from typing import Any
|
6
|
+
|
7
|
+
|
8
|
+
class DeserializerBase(ABC):
|
9
|
+
"""
|
10
|
+
Abstract base class for deserializers.
|
11
|
+
|
12
|
+
This class defines the interface for all deserializers in the Kafka consumer utility
|
13
|
+
and provides a common method for decoding input data.
|
14
|
+
|
15
|
+
Methods
|
16
|
+
-------
|
17
|
+
deserialize(data)
|
18
|
+
Abstract method that must be implemented by subclasses to deserialize data.
|
19
|
+
_decode_input(data)
|
20
|
+
Helper method to decode input data to bytes.
|
21
|
+
|
22
|
+
Examples
|
23
|
+
--------
|
24
|
+
>>> class MyDeserializer(DeserializerBase):
|
25
|
+
... def deserialize(self, data: bytes | str) -> dict[str, Any]:
|
26
|
+
... value = self._decode_input(data)
|
27
|
+
... # Custom deserialization logic here
|
28
|
+
... return {"key": "value"}
|
29
|
+
"""
|
30
|
+
|
31
|
+
@abstractmethod
|
32
|
+
def deserialize(self, data: str) -> dict[str, Any] | str | object:
|
33
|
+
"""
|
34
|
+
Deserialize input data to a Python dictionary.
|
35
|
+
|
36
|
+
This abstract method must be implemented by subclasses to provide
|
37
|
+
specific deserialization logic.
|
38
|
+
|
39
|
+
Parameters
|
40
|
+
----------
|
41
|
+
data : str
|
42
|
+
The data to deserialize, it's always a base64 encoded string
|
43
|
+
|
44
|
+
Returns
|
45
|
+
-------
|
46
|
+
dict[str, Any]
|
47
|
+
The deserialized data as a dictionary.
|
48
|
+
"""
|
49
|
+
raise NotImplementedError("Subclasses must implement the deserialize method")
|
50
|
+
|
51
|
+
def _decode_input(self, data: bytes | str) -> bytes:
|
52
|
+
return base64.b64decode(data)
|
@@ -0,0 +1,46 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import base64
|
4
|
+
|
5
|
+
from aws_lambda_powertools.utilities.kafka.deserializer.base import DeserializerBase
|
6
|
+
|
7
|
+
|
8
|
+
class DefaultDeserializer(DeserializerBase):
|
9
|
+
"""
|
10
|
+
A default deserializer that performs base64 decode + binary decode on the input data.
|
11
|
+
|
12
|
+
This deserializer simply returns the input data with base64 decode, which is useful when
|
13
|
+
no customized deserialization is needed or when handling raw data formats.
|
14
|
+
"""
|
15
|
+
|
16
|
+
def deserialize(self, data: bytes | str) -> str:
|
17
|
+
"""
|
18
|
+
Return the input data base64 decoded.
|
19
|
+
|
20
|
+
This method implements the deserialize interface and performs base64 decode.
|
21
|
+
|
22
|
+
Parameters
|
23
|
+
----------
|
24
|
+
data : bytes or str
|
25
|
+
The input data to "deserialize".
|
26
|
+
|
27
|
+
Returns
|
28
|
+
-------
|
29
|
+
dict[str, Any]
|
30
|
+
The input data base64 decoded.
|
31
|
+
|
32
|
+
Example
|
33
|
+
--------
|
34
|
+
>>> deserializer = NoOpDeserializer()
|
35
|
+
>>>
|
36
|
+
>>> # With string input
|
37
|
+
>>> string_data = "Hello, world!"
|
38
|
+
>>> result = deserializer.deserialize(string_data)
|
39
|
+
>>> print(result == string_data) # Output: True
|
40
|
+
>>>
|
41
|
+
>>> # With bytes input
|
42
|
+
>>> bytes_data = b"Binary data"
|
43
|
+
>>> result = deserializer.deserialize(bytes_data)
|
44
|
+
>>> print(result == bytes_data) # Output: True
|
45
|
+
"""
|
46
|
+
return base64.b64decode(data).decode("utf-8")
|
aws_lambda_powertools-3.15.0/aws_lambda_powertools/utilities/kafka/deserializer/deserializer.py
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import hashlib
|
4
|
+
from typing import TYPE_CHECKING, Any
|
5
|
+
|
6
|
+
from aws_lambda_powertools.utilities.kafka.deserializer.default import DefaultDeserializer
|
7
|
+
from aws_lambda_powertools.utilities.kafka.deserializer.json import JsonDeserializer
|
8
|
+
|
9
|
+
if TYPE_CHECKING:
|
10
|
+
from aws_lambda_powertools.utilities.kafka.deserializer.base import DeserializerBase
|
11
|
+
|
12
|
+
# Cache for deserializers
|
13
|
+
_deserializer_cache: dict[str, DeserializerBase] = {}
|
14
|
+
|
15
|
+
|
16
|
+
def _get_cache_key(schema_type: str | object, schema_value: Any) -> str:
|
17
|
+
if schema_value is None:
|
18
|
+
return str(schema_type)
|
19
|
+
|
20
|
+
if isinstance(schema_value, str):
|
21
|
+
# For string schemas like Avro, hash the content
|
22
|
+
schema_hash = hashlib.md5(schema_value.encode("utf-8"), usedforsecurity=False).hexdigest()
|
23
|
+
else:
|
24
|
+
# For objects like Protobuf, use the object id
|
25
|
+
schema_hash = str(id(schema_value))
|
26
|
+
|
27
|
+
return f"{schema_type}_{schema_hash}"
|
28
|
+
|
29
|
+
|
30
|
+
def get_deserializer(schema_type: str | object, schema_value: Any) -> DeserializerBase:
|
31
|
+
"""
|
32
|
+
Factory function to get the appropriate deserializer based on schema type.
|
33
|
+
|
34
|
+
This function creates and returns a deserializer instance that corresponds to the
|
35
|
+
specified schema type. It handles lazy imports for optional dependencies.
|
36
|
+
|
37
|
+
Parameters
|
38
|
+
----------
|
39
|
+
schema_type : str
|
40
|
+
The type of schema to use for deserialization.
|
41
|
+
Supported values are: "AVRO", "PROTOBUF", "JSON", or any other value for no-op.
|
42
|
+
schema_value : Any
|
43
|
+
The schema definition to use for deserialization. The format depends on the
|
44
|
+
schema_type:
|
45
|
+
- For "AVRO": A string containing the Avro schema definition
|
46
|
+
- For "PROTOBUF": A object containing the Protobuf schema definition
|
47
|
+
- For "JSON": Not used (can be None)
|
48
|
+
- For other types: Not used (can be None)
|
49
|
+
|
50
|
+
Returns
|
51
|
+
-------
|
52
|
+
DeserializerBase
|
53
|
+
An instance of a deserializer that implements the DeserializerBase interface.
|
54
|
+
|
55
|
+
Examples
|
56
|
+
--------
|
57
|
+
>>> # Get an Avro deserializer
|
58
|
+
>>> avro_schema = '''
|
59
|
+
... {
|
60
|
+
... "type": "record",
|
61
|
+
... "name": "User",
|
62
|
+
... "fields": [
|
63
|
+
... {"name": "name", "type": "string"},
|
64
|
+
... {"name": "age", "type": "int"}
|
65
|
+
... ]
|
66
|
+
... }
|
67
|
+
... '''
|
68
|
+
>>> deserializer = get_deserializer("AVRO", avro_schema)
|
69
|
+
>>>
|
70
|
+
>>> # Get a JSON deserializer
|
71
|
+
>>> json_deserializer = get_deserializer("JSON", None)
|
72
|
+
>>>
|
73
|
+
>>> # Get a no-op deserializer for raw data
|
74
|
+
>>> no_op_deserializer = get_deserializer("RAW", None)
|
75
|
+
"""
|
76
|
+
|
77
|
+
# Generate a cache key based on schema type and value
|
78
|
+
cache_key = _get_cache_key(schema_type, schema_value)
|
79
|
+
|
80
|
+
# Check if we already have this deserializer in cache
|
81
|
+
if cache_key in _deserializer_cache:
|
82
|
+
return _deserializer_cache[cache_key]
|
83
|
+
|
84
|
+
deserializer: DeserializerBase
|
85
|
+
|
86
|
+
if schema_type == "AVRO":
|
87
|
+
# Import here to avoid dependency if not used
|
88
|
+
from aws_lambda_powertools.utilities.kafka.deserializer.avro import AvroDeserializer
|
89
|
+
|
90
|
+
deserializer = AvroDeserializer(schema_value)
|
91
|
+
elif schema_type == "PROTOBUF":
|
92
|
+
# Import here to avoid dependency if not used
|
93
|
+
from aws_lambda_powertools.utilities.kafka.deserializer.protobuf import ProtobufDeserializer
|
94
|
+
|
95
|
+
deserializer = ProtobufDeserializer(schema_value)
|
96
|
+
elif schema_type == "JSON":
|
97
|
+
deserializer = JsonDeserializer()
|
98
|
+
|
99
|
+
else:
|
100
|
+
# Default to no-op deserializer
|
101
|
+
deserializer = DefaultDeserializer()
|
102
|
+
|
103
|
+
# Store in cache for future use
|
104
|
+
_deserializer_cache[cache_key] = deserializer
|
105
|
+
|
106
|
+
# Default to default deserializer that is base64 decode + bytes decoded
|
107
|
+
return deserializer
|
@@ -0,0 +1,53 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import base64
|
4
|
+
import json
|
5
|
+
|
6
|
+
from aws_lambda_powertools.utilities.kafka.deserializer.base import DeserializerBase
|
7
|
+
from aws_lambda_powertools.utilities.kafka.exceptions import KafkaConsumerDeserializationError
|
8
|
+
|
9
|
+
|
10
|
+
class JsonDeserializer(DeserializerBase):
|
11
|
+
"""
|
12
|
+
Deserializer for JSON formatted data.
|
13
|
+
|
14
|
+
This class provides functionality to deserialize JSON data from bytes or string
|
15
|
+
into Python dictionaries.
|
16
|
+
"""
|
17
|
+
|
18
|
+
def deserialize(self, data: bytes | str) -> dict:
|
19
|
+
"""
|
20
|
+
Deserialize JSON data to a Python dictionary.
|
21
|
+
|
22
|
+
Parameters
|
23
|
+
----------
|
24
|
+
data : bytes or str
|
25
|
+
The JSON data to deserialize. If provided as bytes, it will be decoded as UTF-8.
|
26
|
+
If provided as a string, it's assumed to be base64-encoded and will be decoded first.
|
27
|
+
|
28
|
+
Returns
|
29
|
+
-------
|
30
|
+
dict
|
31
|
+
Deserialized data as a dictionary.
|
32
|
+
|
33
|
+
Raises
|
34
|
+
------
|
35
|
+
KafkaConsumerDeserializationError
|
36
|
+
When the data cannot be deserialized as valid JSON.
|
37
|
+
|
38
|
+
Examples
|
39
|
+
--------
|
40
|
+
>>> deserializer = JsonDeserializer()
|
41
|
+
>>> json_data = '{"key": "value", "number": 123}'
|
42
|
+
>>> try:
|
43
|
+
... result = deserializer.deserialize(json_data)
|
44
|
+
... print(result["key"]) # Output: value
|
45
|
+
... except KafkaConsumerDeserializationError as e:
|
46
|
+
... print(f"Failed to deserialize: {e}")
|
47
|
+
"""
|
48
|
+
try:
|
49
|
+
return json.loads(base64.b64decode(data).decode("utf-8"))
|
50
|
+
except Exception as e:
|
51
|
+
raise KafkaConsumerDeserializationError(
|
52
|
+
f"Error trying to deserialize json data - {type(e).__name__}: {str(e)}",
|
53
|
+
) from e
|