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.
Files changed (231) hide show
  1. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/PKG-INFO +1 -1
  2. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/api_gateway.py +1 -1
  3. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/formatter.py +1 -0
  4. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/metrics.py +5 -2
  5. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/base.py +3 -2
  6. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +3 -2
  7. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +3 -2
  8. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +3 -2
  9. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/middleware_factory/factory.py +2 -2
  10. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/functions.py +82 -5
  11. aws_lambda_powertools-2.29.1/aws_lambda_powertools/shared/json_encoder.py +26 -0
  12. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/version.py +1 -1
  13. {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
  14. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/idempotency.py +3 -1
  15. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/parser.py +9 -4
  16. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/validation/validator.py +2 -1
  17. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/pyproject.toml +16 -16
  18. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/setup.py +1 -1
  19. aws_lambda_powertools-2.28.1/aws_lambda_powertools/shared/json_encoder.py +0 -16
  20. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/LICENSE +0 -0
  21. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/README.md +0 -0
  22. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/THIRD-PARTY-LICENSES +0 -0
  23. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/__init__.py +0 -0
  24. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/__init__.py +0 -0
  25. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/appsync.py +0 -0
  26. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/bedrock_agent.py +0 -0
  27. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/content_types.py +0 -0
  28. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
  29. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
  30. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
  31. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
  32. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +0 -0
  33. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
  34. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/__init__.py +0 -0
  35. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/compat.py +0 -0
  36. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
  37. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
  38. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
  39. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
  40. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/models.py +0 -0
  41. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
  42. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +0 -0
  43. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +0 -0
  44. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +0 -0
  45. {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
  46. {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
  47. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
  48. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/router.py +0 -0
  49. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/types.py +0 -0
  50. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
  51. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/exceptions/__init__.py +0 -0
  52. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/__init__.py +0 -0
  53. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/compat.py +0 -0
  54. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
  55. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/exceptions.py +0 -0
  56. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/filters.py +0 -0
  57. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
  58. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
  59. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/lambda_context.py +0 -0
  60. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/logger.py +0 -0
  61. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/types.py +0 -0
  62. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/logging/utils.py +0 -0
  63. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/__init__.py +0 -0
  64. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/base.py +0 -0
  65. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/exceptions.py +0 -0
  66. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/functions.py +0 -0
  67. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/metric.py +0 -0
  68. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
  69. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/__init__.py +0 -0
  70. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
  71. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
  72. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
  73. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
  74. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
  75. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
  76. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
  77. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/metrics/types.py +0 -0
  78. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
  79. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
  80. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/package_logger.py +0 -0
  81. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/py.typed +0 -0
  82. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/__init__.py +0 -0
  83. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/cache_dict.py +0 -0
  84. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/constants.py +0 -0
  85. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/cookies.py +0 -0
  86. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
  87. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/lazy_import.py +0 -0
  88. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/types.py +0 -0
  89. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/shared/user_agent.py +0 -0
  90. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/tracing/__init__.py +0 -0
  91. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/tracing/base.py +0 -0
  92. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/tracing/extensions.py +0 -0
  93. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/tracing/tracer.py +0 -0
  94. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/__init__.py +0 -0
  95. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/__init__.py +0 -0
  96. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/base.py +0 -0
  97. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/constants.py +0 -0
  98. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/provider/__init__.py +0 -0
  99. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/provider/base.py +0 -0
  100. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/_data_masking/provider/kms/__init__.py +0 -0
  101. {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
  102. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
  103. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/base.py +0 -0
  104. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
  105. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
  106. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
  107. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/batch/types.py +0 -0
  108. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
  109. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +0 -0
  110. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/alb_event.py +0 -0
  111. {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
  112. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/appsync/__init__.py +0 -0
  113. {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
  114. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
  115. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +0 -0
  116. {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
  117. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +0 -0
  118. {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
  119. {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
  120. {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
  121. {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
  122. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/common.py +0 -0
  123. {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
  124. {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
  125. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
  126. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
  127. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +0 -0
  128. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
  129. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
  130. {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
  131. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
  132. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/s3_event.py +0 -0
  133. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +0 -0
  134. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
  135. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
  136. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +0 -0
  137. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
  138. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +0 -0
  139. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +0 -0
  140. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
  141. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
  142. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
  143. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
  144. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
  145. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
  146. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
  147. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/__init__.py +0 -0
  148. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/base.py +0 -0
  149. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/config.py +0 -0
  150. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
  151. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/persistence/__init__.py +0 -0
  152. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
  153. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
  154. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
  155. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
  156. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
  157. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
  158. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
  159. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
  160. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
  161. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
  162. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
  163. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
  164. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
  165. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
  166. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
  167. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/secrets.py +0 -0
  168. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
  169. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
  170. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
  171. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/compat.py +0 -0
  172. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
  173. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
  174. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
  175. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
  176. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
  177. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
  178. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
  179. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
  180. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
  181. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
  182. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
  183. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
  184. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
  185. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
  186. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
  187. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
  188. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
  189. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
  190. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
  191. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
  192. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
  193. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
  194. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
  195. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
  196. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
  197. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
  198. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
  199. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
  200. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
  201. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
  202. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
  203. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/s3.py +0 -0
  204. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
  205. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
  206. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
  207. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
  208. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/sqs.py +0 -0
  209. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
  210. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
  211. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
  212. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/parser/types.py +0 -0
  213. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/serialization.py +0 -0
  214. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
  215. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
  216. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
  217. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
  218. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
  219. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
  220. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
  221. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
  222. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
  223. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
  224. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
  225. {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
  226. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
  227. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
  228. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
  229. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/validation/base.py +0 -0
  230. {aws_lambda_powertools-2.28.1 → aws_lambda_powertools-2.29.1}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
  231. {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.28.1
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
@@ -133,6 +133,7 @@ class LambdaPowertoolsFormatter(BasePowertoolsFormatter):
133
133
  default=self.json_default,
134
134
  separators=(",", ":"),
135
135
  indent=self.json_indent,
136
+ ensure_ascii=False, # see #3474
136
137
  )
137
138
 
138
139
  self.datefmt = datefmt
@@ -1,11 +1,12 @@
1
1
  # NOTE: keeps for compatibility
2
2
  from __future__ import annotations
3
3
 
4
- from typing import Any, Callable, Dict, Optional
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: Callable[[Dict, Any], Any] | Optional[Callable[[Dict, Any, Optional[Dict]], Any]] = None,
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, Callable, Dict, Optional
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: Callable[[Dict, Any], Any] | Optional[Callable[[Dict, Any, Optional[Dict]], Any]] = None,
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, Callable, Dict, List, Optional
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: Callable[[Dict, Any], Any] | Optional[Callable[[Dict, Any, Optional[Dict]], Any]] = None,
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, Callable, Dict, List, Optional
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: Callable[[Dict, Any], Any] | Optional[Callable[[Dict, Any, Optional[Dict]], Any]] = None,
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, Callable, Dict, List, Optional
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: Callable[[Dict, Any], Any] | Optional[Callable[[Dict, Any, Optional[Dict]], Any]] = None,
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 callable(getattr(data, "dict", None)):
172
- return data.dict()
170
+ if is_pydantic(data):
171
+ return pydantic_to_dict(data)
173
172
 
174
- # Is it a Dataclass? If not return as is
175
- return dataclasses.asdict(data) if dataclasses.is_dataclass(data) else data
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)
@@ -1,3 +1,3 @@
1
1
  """Exposes version constant to avoid circular dependencies."""
2
2
 
3
- VERSION = "2.28.1"
3
+ VERSION = "2.29.1"
@@ -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[[Any, LambdaContext], EventParserReturnType],
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
- parsed_event = parse(event=event, model=model, envelope=envelope) if envelope else parse(event=event, model=model)
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.28.1"
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.110.1"
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.29.0"
72
- mypy-boto3-cloudformation = "^1.29.3"
73
- mypy-boto3-cloudwatch = "^1.29.0"
74
- mypy-boto3-dynamodb = "^1.29.0"
75
- mypy-boto3-lambda = "^1.29.2"
76
- mypy-boto3-logs = "^1.29.0"
77
- mypy-boto3-secretsmanager = "^1.29.0"
78
- mypy-boto3-ssm = "^1.29.2"
79
- mypy-boto3-s3 = "^1.29.5"
80
- mypy-boto3-xray = "^1.29.0"
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.29.0"
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.83.0"
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.3"
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.7"
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.28.1',
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[![Build](https://github.com/aws-powertools/powertools-lambda-python/actions/workflows/quality_check.yml/badge.svg)](https://github.com/aws-powertools/powertools-lambda-python/actions/workflows/python_build.yml)\n[![codecov.io](https://codecov.io/github/aws-powertools/powertools-lambda-python/branch/develop/graphs/badge.svg)](https://app.codecov.io/gh/aws-powertools/powertools-lambda-python)\n![PythonSupport](https://img.shields.io/static/v1?label=python&message=%203.7|%203.8|%203.9|%203.10|%203.11&color=blue?style=flat-square&logo=python) ![PyPI version](https://badge.fury.io/py/aws-lambda-powertools.svg) ![PyPi monthly downloads](https://img.shields.io/pypi/dm/aws-lambda-powertools) [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/aws-powertools/powertools-lambda-python/badge)](https://api.securityscorecards.dev/projects/github.com/aws-powertools/powertools-lambda-python) [![Join our Discord](https://dcbadge.vercel.app/api/server/B8zZKbbyET)](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![hero-image](https://user-images.githubusercontent.com/3340292/198254617-d0fdb672-86a6-4988-8a40-adf437135e0a.png)\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)