aws-lambda-powertools 2.37.0__tar.gz → 2.38.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 (240) hide show
  1. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/PKG-INFO +1 -1
  2. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/THIRD-PARTY-LICENSES +24 -0
  3. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/api_gateway.py +64 -3
  4. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +1 -1
  5. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/compat.py +1 -1
  6. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +1 -1
  7. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +4 -0
  8. aws_lambda_powertools-2.38.1/aws_lambda_powertools/logging/constants.py +5 -0
  9. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/logger.py +6 -3
  10. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/utils.py +16 -4
  11. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/constants.py +2 -1
  12. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/version.py +1 -1
  13. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/batch/types.py +2 -2
  14. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/alb_event.py +1 -1
  15. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +46 -45
  16. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +1 -1
  17. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/common.py +1 -1
  18. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/s3_event.py +7 -7
  19. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +2 -2
  20. aws_lambda_powertools-2.38.1/aws_lambda_powertools/utilities/data_masking/__init__.py +5 -0
  21. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_masking/base.py +0 -4
  22. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/compat.py +2 -2
  23. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/s3.py +1 -1
  24. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/parser.py +10 -9
  25. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/pyproject.toml +20 -19
  26. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/setup.py +1 -1
  27. aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/data_masking/__init__.py +0 -11
  28. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/LICENSE +0 -0
  29. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/README.md +0 -0
  30. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/__init__.py +0 -0
  31. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/__init__.py +0 -0
  32. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/appsync.py +0 -0
  33. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/bedrock_agent.py +0 -0
  34. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/content_types.py +0 -0
  35. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
  36. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
  37. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
  38. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
  39. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
  40. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/__init__.py +0 -0
  41. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
  42. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
  43. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
  44. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
  45. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/models.py +0 -0
  46. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
  47. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +0 -0
  48. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +0 -0
  49. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js +0 -0
  50. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css +0 -0
  51. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
  52. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/router.py +0 -0
  53. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/types.py +0 -0
  54. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/util.py +0 -0
  55. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
  56. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/exceptions/__init__.py +0 -0
  57. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/__init__.py +0 -0
  58. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
  59. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/exceptions.py +0 -0
  60. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/filters.py +0 -0
  61. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/formatter.py +0 -0
  62. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
  63. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
  64. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/lambda_context.py +0 -0
  65. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/logging/types.py +0 -0
  66. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/__init__.py +0 -0
  67. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/base.py +0 -0
  68. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/exceptions.py +0 -0
  69. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/functions.py +0 -0
  70. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/metric.py +0 -0
  71. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/metrics.py +0 -0
  72. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
  73. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/base.py +0 -0
  74. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/__init__.py +0 -0
  75. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +0 -0
  76. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
  77. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
  78. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
  79. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
  80. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
  81. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
  82. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +0 -0
  83. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +0 -0
  84. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
  85. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/metrics/types.py +0 -0
  86. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
  87. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
  88. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
  89. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/package_logger.py +0 -0
  90. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/py.typed +0 -0
  91. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/__init__.py +0 -0
  92. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/cache_dict.py +0 -0
  93. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/cookies.py +0 -0
  94. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/functions.py +0 -0
  95. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
  96. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/json_encoder.py +0 -0
  97. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/lazy_import.py +0 -0
  98. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/types.py +0 -0
  99. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/shared/user_agent.py +0 -0
  100. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/tracing/__init__.py +0 -0
  101. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/tracing/base.py +0 -0
  102. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/tracing/extensions.py +0 -0
  103. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/tracing/tracer.py +0 -0
  104. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/__init__.py +0 -0
  105. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
  106. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/batch/base.py +0 -0
  107. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
  108. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
  109. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
  110. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
  111. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +0 -0
  112. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +0 -0
  113. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/appsync/__init__.py +0 -0
  114. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py +0 -0
  115. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
  116. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +0 -0
  117. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py +0 -0
  118. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py +0 -0
  119. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py +0 -0
  120. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py +0 -0
  121. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +0 -0
  122. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py +0 -0
  123. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py +0 -0
  124. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +0 -0
  125. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
  126. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
  127. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +0 -0
  128. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
  129. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
  130. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py +0 -0
  131. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
  132. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py +0 -0
  133. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +0 -0
  134. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
  135. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
  136. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +0 -0
  137. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
  138. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +0 -0
  139. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_masking/constants.py +0 -0
  140. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_masking/exceptions.py +0 -0
  141. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_masking/provider/__init__.py +0 -0
  142. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_masking/provider/base.py +0 -0
  143. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_masking/provider/kms/__init__.py +0 -0
  144. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +0 -0
  145. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
  146. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
  147. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
  148. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
  149. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
  150. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
  151. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
  152. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/__init__.py +0 -0
  153. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/base.py +0 -0
  154. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/config.py +0 -0
  155. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
  156. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/hook.py +0 -0
  157. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
  158. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/persistence/__init__.py +0 -0
  159. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
  160. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +0 -0
  161. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
  162. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +0 -0
  163. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
  164. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
  165. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
  166. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
  167. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
  168. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
  169. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
  170. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
  171. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
  172. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
  173. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
  174. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
  175. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
  176. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parameters/secrets.py +0 -0
  177. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
  178. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
  179. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
  180. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
  181. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
  182. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
  183. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
  184. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
  185. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
  186. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
  187. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
  188. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
  189. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
  190. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
  191. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
  192. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
  193. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
  194. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
  195. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
  196. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
  197. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
  198. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
  199. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
  200. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
  201. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
  202. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
  203. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
  204. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
  205. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
  206. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
  207. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
  208. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
  209. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
  210. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
  211. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/s3_batch_operation.py +0 -0
  212. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
  213. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
  214. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
  215. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
  216. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/sqs.py +0 -0
  217. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
  218. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
  219. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
  220. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/parser/types.py +0 -0
  221. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/serialization.py +0 -0
  222. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
  223. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
  224. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
  225. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
  226. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
  227. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
  228. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
  229. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
  230. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
  231. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
  232. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
  233. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/typing/lambda_client_context_mobile_client.py +0 -0
  234. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
  235. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
  236. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
  237. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/validation/base.py +0 -0
  238. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
  239. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
  240. {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.1}/aws_lambda_powertools/utilities/validation/validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aws-lambda-powertools
3
- Version: 2.37.0
3
+ Version: 2.38.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
@@ -1,3 +1,27 @@
1
+ ** FastAPI - https://github.com/tiangolo/fastapi/ - Used in the OpenAPI feature
2
+
3
+ The MIT License (MIT)
4
+
5
+ Copyright (c) 2018 Sebastián Ramírez
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in
15
+ all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ THE SOFTWARE.
24
+
1
25
  ** Tensorflow - https://github.com/tensorflow/tensorflow/
2
26
 
3
27
  Apache License
@@ -1222,6 +1222,63 @@ class BaseRouter(ABC):
1222
1222
  middlewares,
1223
1223
  )
1224
1224
 
1225
+ def head(
1226
+ self,
1227
+ rule: str,
1228
+ cors: Optional[bool] = None,
1229
+ compress: bool = False,
1230
+ cache_control: Optional[str] = None,
1231
+ summary: Optional[str] = None,
1232
+ description: Optional[str] = None,
1233
+ responses: Optional[Dict[int, OpenAPIResponse]] = None,
1234
+ response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
1235
+ tags: Optional[List[str]] = None,
1236
+ operation_id: Optional[str] = None,
1237
+ include_in_schema: bool = True,
1238
+ security: Optional[List[Dict[str, List[str]]]] = None,
1239
+ middlewares: Optional[List[Callable]] = None,
1240
+ ):
1241
+ """Head route decorator with HEAD `method`
1242
+
1243
+ Examples
1244
+ --------
1245
+ Simple example with a custom lambda handler using the Tracer capture_lambda_handler decorator
1246
+
1247
+ ```python
1248
+ from aws_lambda_powertools import Tracer
1249
+ from aws_lambda_powertools.event_handler import APIGatewayRestResolver, Response, content_types
1250
+
1251
+ tracer = Tracer()
1252
+ app = APIGatewayRestResolver()
1253
+
1254
+ @app.head("/head-call")
1255
+ def simple_head():
1256
+ return Response(status_code=200,
1257
+ content_type=content_types.APPLICATION_JSON,
1258
+ headers={"Content-Length": "123"})
1259
+
1260
+ @tracer.capture_lambda_handler
1261
+ def lambda_handler(event, context):
1262
+ return app.resolve(event, context)
1263
+ ```
1264
+ """
1265
+ return self.route(
1266
+ rule,
1267
+ "HEAD",
1268
+ cors,
1269
+ compress,
1270
+ cache_control,
1271
+ summary,
1272
+ description,
1273
+ responses,
1274
+ response_description,
1275
+ tags,
1276
+ operation_id,
1277
+ include_in_schema,
1278
+ security,
1279
+ middlewares,
1280
+ )
1281
+
1225
1282
  def _push_processed_stack_frame(self, frame: str):
1226
1283
  """
1227
1284
  Add Current Middleware to the Middleware Stack Frames
@@ -1589,13 +1646,13 @@ class ApiGatewayResolver(BaseRouter):
1589
1646
  from aws_lambda_powertools.event_handler.openapi.pydantic_loader import PYDANTIC_V2
1590
1647
 
1591
1648
  # Pydantic V2 has no support for OpenAPI schema 3.0
1592
- if PYDANTIC_V2 and not openapi_version.startswith("3.1"):
1649
+ if PYDANTIC_V2 and not openapi_version.startswith("3.1"): # pragma: no cover
1593
1650
  warnings.warn(
1594
1651
  "You are using Pydantic v2, which is incompatible with OpenAPI schema 3.0. Forcing OpenAPI 3.1",
1595
1652
  stacklevel=2,
1596
1653
  )
1597
1654
  openapi_version = "3.1.0"
1598
- elif not PYDANTIC_V2 and not openapi_version.startswith("3.0"):
1655
+ elif not PYDANTIC_V2 and not openapi_version.startswith("3.0"): # pragma: no cover
1599
1656
  warnings.warn(
1600
1657
  "You are using Pydantic v1, which is incompatible with OpenAPI schema 3.1. Forcing OpenAPI 3.0",
1601
1658
  stacklevel=2,
@@ -1696,6 +1753,7 @@ class ApiGatewayResolver(BaseRouter):
1696
1753
  security_schemes: Optional[Dict[str, "SecurityScheme"]] = None,
1697
1754
  security: Optional[List[Dict[str, List[str]]]] = None,
1698
1755
  oauth2_config: Optional["OAuth2Config"] = None,
1756
+ persist_authorization: bool = False,
1699
1757
  ):
1700
1758
  """
1701
1759
  Returns the OpenAPI schema as a JSON serializable dict
@@ -1736,6 +1794,8 @@ class ApiGatewayResolver(BaseRouter):
1736
1794
  A declaration of which security mechanisms are applied globally across the API.
1737
1795
  oauth2_config: OAuth2Config, optional
1738
1796
  The OAuth2 configuration for the Swagger UI.
1797
+ persist_authorization: bool, optional
1798
+ Whether to persist authorization data on browser close/refresh.
1739
1799
  """
1740
1800
  from aws_lambda_powertools.event_handler.openapi.compat import model_json
1741
1801
  from aws_lambda_powertools.event_handler.openapi.models import Server
@@ -1814,6 +1874,7 @@ class ApiGatewayResolver(BaseRouter):
1814
1874
  swagger_css,
1815
1875
  swagger_base_url,
1816
1876
  oauth2_config,
1877
+ persist_authorization,
1817
1878
  )
1818
1879
 
1819
1880
  return Response(
@@ -2135,7 +2196,7 @@ class ApiGatewayResolver(BaseRouter):
2135
2196
 
2136
2197
  def exception_handler(self, exc_class: Union[Type[Exception], List[Type[Exception]]]):
2137
2198
  def register_exception_handler(func: Callable):
2138
- if isinstance(exc_class, list):
2199
+ if isinstance(exc_class, list): # pragma: no cover
2139
2200
  for exp in exc_class:
2140
2201
  self._exception_handlers[exp] = func
2141
2202
  else:
@@ -410,7 +410,7 @@ def _normalize_multi_query_string_with_param(
410
410
  return resolved_query_string
411
411
 
412
412
 
413
- def _normalize_multi_header_values_with_param(headers: Optional[Dict[str, str]], params: Sequence[ModelField]):
413
+ def _normalize_multi_header_values_with_param(headers: Dict[str, Any], params: Sequence[ModelField]):
414
414
  """
415
415
  Extract and normalize resolved_headers_field
416
416
 
@@ -40,7 +40,7 @@ sequence_types = tuple(sequence_annotation_to_type.keys())
40
40
 
41
41
  RequestErrorModel: Type[BaseModel] = create_model("Request")
42
42
 
43
- if PYDANTIC_V2:
43
+ if PYDANTIC_V2: # pragma: no cover # false positive; dropping in v3
44
44
  from pydantic import TypeAdapter, ValidationError
45
45
  from pydantic._internal._typing_extra import eval_type_lenient
46
46
  from pydantic.fields import FieldInfo
@@ -3,4 +3,4 @@ try:
3
3
 
4
4
  PYDANTIC_V2 = PYDANTIC_VERSION.startswith("2.")
5
5
  except ImportError:
6
- PYDANTIC_V2 = False
6
+ PYDANTIC_V2 = False # pragma: no cover # false positive; dropping in v3
@@ -10,6 +10,7 @@ def generate_swagger_html(
10
10
  swagger_css: str,
11
11
  swagger_base_url: str,
12
12
  oauth2_config: Optional[OAuth2Config],
13
+ persist_authorization: bool = False,
13
14
  ) -> str:
14
15
  """
15
16
  Generate Swagger UI HTML page
@@ -28,6 +29,8 @@ def generate_swagger_html(
28
29
  The base URL for Swagger UI
29
30
  oauth2_config: OAuth2Config, optional
30
31
  The OAuth2 configuration.
32
+ persist_authorization: bool, optional
33
+ Whether to persist authorization data on browser close/refresh.
31
34
  """
32
35
 
33
36
  # If Swagger base URL is present, generate HTML content with linked CSS and JavaScript files
@@ -86,6 +89,7 @@ def generate_swagger_html(
86
89
  SwaggerUIBundle.plugins.DownloadUrl
87
90
  ],
88
91
  withCredentials: true,
92
+ persistAuthorization: {str(persist_authorization).lower()},
89
93
  oauth2RedirectUrl: baseUrl + "?format=oauth2-redirect",
90
94
  }}
91
95
 
@@ -0,0 +1,5 @@
1
+ # logger.powertools_handler is set with Powertools Logger handler; useful when there are many handlers
2
+ LOGGER_ATTRIBUTE_POWERTOOLS_HANDLER = "powertools_handler"
3
+ # logger.init attribute is set when Logger has been configured
4
+ LOGGER_ATTRIBUTE_PRECONFIGURED = "init"
5
+ LOGGER_ATTRIBUTE_HANDLER = "logger_handler"
@@ -22,6 +22,9 @@ from typing import (
22
22
  overload,
23
23
  )
24
24
 
25
+ from aws_lambda_powertools.logging.constants import (
26
+ LOGGER_ATTRIBUTE_PRECONFIGURED,
27
+ )
25
28
  from aws_lambda_powertools.shared import constants
26
29
  from aws_lambda_powertools.shared.functions import (
27
30
  extract_event_from_common_models,
@@ -264,7 +267,7 @@ class Logger:
264
267
 
265
268
  # Prevent __getattr__ from shielding unknown attribute errors in type checkers
266
269
  # https://github.com/aws-powertools/powertools-lambda-python/issues/1660
267
- if not TYPE_CHECKING:
270
+ if not TYPE_CHECKING: # pragma: no cover
268
271
 
269
272
  def __getattr__(self, name):
270
273
  # Proxy attributes not found to actual logger to support backward compatibility
@@ -292,7 +295,7 @@ class Logger:
292
295
  # a) multiple handlers being attached
293
296
  # b) different sampling mechanisms
294
297
  # c) multiple messages from being logged as handlers can be duplicated
295
- is_logger_preconfigured = getattr(self._logger, "init", False)
298
+ is_logger_preconfigured = getattr(self._logger, LOGGER_ATTRIBUTE_PRECONFIGURED, False)
296
299
  if self.child or is_logger_preconfigured:
297
300
  return
298
301
 
@@ -613,7 +616,7 @@ class Logger:
613
616
 
614
617
  # Mode 1
615
618
  log_keys = {**self._default_log_keys, **keys}
616
- is_logger_preconfigured = getattr(self._logger, "init", False)
619
+ is_logger_preconfigured = getattr(self._logger, LOGGER_ATTRIBUTE_PRECONFIGURED, False)
617
620
  if not is_logger_preconfigured:
618
621
  formatter = self.logger_formatter or LambdaPowertoolsFormatter(**formatter_options, **log_keys)
619
622
  self.registered_handler.setFormatter(formatter)
@@ -9,6 +9,7 @@ PACKAGE_LOGGER = "aws_lambda_powertools"
9
9
  def copy_config_to_registered_loggers(
10
10
  source_logger: Logger,
11
11
  log_level: Optional[Union[int, str]] = None,
12
+ ignore_log_level=False,
12
13
  exclude: Optional[Set[str]] = None,
13
14
  include: Optional[Set[str]] = None,
14
15
  ) -> None:
@@ -16,10 +17,13 @@ def copy_config_to_registered_loggers(
16
17
 
17
18
  Parameters
18
19
  ----------
20
+ ignore_log_level
19
21
  source_logger : Logger
20
22
  Powertools for AWS Lambda (Python) Logger to copy configuration from
21
23
  log_level : Union[int, str], optional
22
24
  Logging level to set to registered loggers, by default uses source_logger logging level
25
+ ignore_log_level: bool
26
+ Whether to not touch log levels for discovered loggers. log_level param is disregarded when this is set.
23
27
  include : Optional[Set[str]], optional
24
28
  List of logger names to include, by default all registered loggers are included
25
29
  exclude : Optional[Set[str]], optional
@@ -54,7 +58,7 @@ def copy_config_to_registered_loggers(
54
58
 
55
59
  registered_loggers = _find_registered_loggers(source_logger, loggers, filter_func)
56
60
  for logger in registered_loggers:
57
- _configure_logger(source_logger, logger, level)
61
+ _configure_logger(source_logger=source_logger, logger=logger, level=level, ignore_log_level=ignore_log_level)
58
62
 
59
63
 
60
64
  def _include_registered_loggers_filter(loggers: Set[str]):
@@ -78,13 +82,21 @@ def _find_registered_loggers(
78
82
  return root_loggers
79
83
 
80
84
 
81
- def _configure_logger(source_logger: Logger, logger: logging.Logger, level: Union[int, str]) -> None:
85
+ def _configure_logger(
86
+ source_logger: Logger,
87
+ logger: logging.Logger,
88
+ level: Union[int, str],
89
+ ignore_log_level: bool = False,
90
+ ) -> None:
91
+ # customers may not want to copy the same log level from Logger to discovered loggers
92
+ if not ignore_log_level:
93
+ logger.setLevel(level)
94
+ source_logger.debug(f"Logger {logger} reconfigured to use logging level {level}")
95
+
82
96
  logger.handlers = []
83
- logger.setLevel(level)
84
97
  logger.propagate = False # ensure we don't propagate logs to existing loggers, #1073
85
98
  source_logger.append_keys(name="%(name)s") # include logger name, see #1267
86
99
 
87
- source_logger.debug(f"Logger {logger} reconfigured to use logging level {level}")
88
100
  for source_handler in source_logger.handlers:
89
101
  logger.addHandler(source_handler)
90
102
  source_logger.debug(f"Logger {logger} reconfigured to use {source_handler}")
@@ -9,6 +9,7 @@ MIDDLEWARE_FACTORY_TRACE_ENV: str = "POWERTOOLS_TRACE_MIDDLEWARES"
9
9
  INVALID_XRAY_NAME_CHARACTERS = r"[?;*()!$~^<>]"
10
10
 
11
11
  # Logger constants
12
+ # maintenance: future major version should start having localized `constants.py` to ease future modularization
12
13
  LOGGER_LOG_SAMPLING_RATE: str = "POWERTOOLS_LOGGER_SAMPLE_RATE"
13
14
  LOGGER_LOG_EVENT_ENV: str = "POWERTOOLS_LOGGER_LOG_EVENT"
14
15
  LOGGER_LOG_DEDUPLICATION_ENV: str = "POWERTOOLS_LOG_DEDUPLICATION_DISABLED"
@@ -61,7 +62,7 @@ POWERTOOLS_DEBUG_ENV: str = "POWERTOOLS_DEBUG"
61
62
 
62
63
  # JSON constants
63
64
  PRETTY_INDENT: int = 4
64
- COMPACT_INDENT = None
65
+ COMPACT_INDENT: None = None
65
66
 
66
67
  # Idempotency constants
67
68
  IDEMPOTENCY_DISABLED_ENV: str = "POWERTOOLS_IDEMPOTENCY_DISABLED"
@@ -1,3 +1,3 @@
1
1
  """Exposes version constant to avoid circular dependencies."""
2
2
 
3
- VERSION = "2.37.0"
3
+ VERSION = "2.38.1"
@@ -7,7 +7,7 @@ has_pydantic = "pydantic" in sys.modules
7
7
 
8
8
  # For IntelliSense and Mypy to work, we need to account for possible SQS subclasses
9
9
  # We need them as subclasses as we must access their message ID or sequence number metadata via dot notation
10
- if has_pydantic:
10
+ if has_pydantic: # pragma: no cover
11
11
  from aws_lambda_powertools.utilities.parser.models import DynamoDBStreamRecordModel, SqsRecordModel
12
12
  from aws_lambda_powertools.utilities.parser.models import (
13
13
  KinesisDataStreamRecord as KinesisDataStreamRecordModel,
@@ -17,7 +17,7 @@ if has_pydantic:
17
17
  Union[Type[SqsRecordModel], Type[DynamoDBStreamRecordModel], Type[KinesisDataStreamRecordModel]]
18
18
  ]
19
19
  BatchSqsTypeModel = Optional[Type[SqsRecordModel]]
20
- else:
20
+ else: # pragma: no cover
21
21
  BatchTypeModels = "BatchTypeModels" # type: ignore
22
22
  BatchSqsTypeModel = "BatchSqsTypeModel" # type: ignore
23
23
 
@@ -43,7 +43,7 @@ class ALBEvent(BaseProxyEvent):
43
43
  return super().resolved_query_string_parameters
44
44
 
45
45
  @property
46
- def resolved_headers_field(self) -> Optional[Dict[str, Any]]:
46
+ def resolved_headers_field(self) -> Dict[str, Any]:
47
47
  headers: Dict[str, Any] = {}
48
48
 
49
49
  if self.multi_value_headers:
@@ -15,18 +15,18 @@ from aws_lambda_powertools.utilities.data_classes.common import (
15
15
 
16
16
  class APIGatewayEventAuthorizer(DictWrapper):
17
17
  @property
18
- def claims(self) -> Optional[Dict[str, Any]]:
19
- return self.get("claims")
18
+ def claims(self) -> Dict[str, Any]:
19
+ return self.get("claims") or {} # key might exist but can be `null`
20
20
 
21
21
  @property
22
- def scopes(self) -> Optional[List[str]]:
23
- return self.get("scopes")
22
+ def scopes(self) -> List[str]:
23
+ return self.get("scopes") or [] # key might exist but can be `null`
24
24
 
25
25
  @property
26
- def principal_id(self) -> Optional[str]:
26
+ def principal_id(self) -> str:
27
27
  """The principal user identification associated with the token sent by the client and returned from an
28
28
  API Gateway Lambda authorizer (formerly known as a custom authorizer)"""
29
- return self.get("principalId")
29
+ return self.get("principalId") or "" # key might exist but can be `null`
30
30
 
31
31
  @property
32
32
  def integration_latency(self) -> Optional[int]:
@@ -91,7 +91,8 @@ class APIGatewayEventRequestContext(BaseRequestContext):
91
91
 
92
92
  @property
93
93
  def authorizer(self) -> APIGatewayEventAuthorizer:
94
- return APIGatewayEventAuthorizer(self._data["requestContext"]["authorizer"])
94
+ authz_data = self._data.get("requestContext", {}).get("authorizer", {})
95
+ return APIGatewayEventAuthorizer(authz_data)
95
96
 
96
97
 
97
98
  class APIGatewayProxyEvent(BaseProxyEvent):
@@ -112,11 +113,11 @@ class APIGatewayProxyEvent(BaseProxyEvent):
112
113
 
113
114
  @property
114
115
  def multi_value_headers(self) -> Dict[str, List[str]]:
115
- return self.get("multiValueHeaders") or {}
116
+ return self.get("multiValueHeaders") or {} # key might exist but can be `null`
116
117
 
117
118
  @property
118
119
  def multi_value_query_string_parameters(self) -> Dict[str, List[str]]:
119
- return self.get("multiValueQueryStringParameters") or {}
120
+ return self.get("multiValueQueryStringParameters") or {} # key might exist but can be `null`
120
121
 
121
122
  @property
122
123
  def resolved_query_string_parameters(self) -> Dict[str, List[str]]:
@@ -126,7 +127,7 @@ class APIGatewayProxyEvent(BaseProxyEvent):
126
127
  return super().resolved_query_string_parameters
127
128
 
128
129
  @property
129
- def resolved_headers_field(self) -> Optional[Dict[str, Any]]:
130
+ def resolved_headers_field(self) -> Dict[str, Any]:
130
131
  headers: Dict[str, Any] = {}
131
132
 
132
133
  if self.multi_value_headers:
@@ -154,72 +155,72 @@ class APIGatewayProxyEvent(BaseProxyEvent):
154
155
 
155
156
  class RequestContextV2AuthorizerIam(DictWrapper):
156
157
  @property
157
- def access_key(self) -> Optional[str]:
158
+ def access_key(self) -> str:
158
159
  """The IAM user access key associated with the request."""
159
- return self.get("accessKey")
160
+ return self.get("accessKey") or "" # key might exist but can be `null`
160
161
 
161
162
  @property
162
- def account_id(self) -> Optional[str]:
163
+ def account_id(self) -> str:
163
164
  """The AWS account ID associated with the request."""
164
- return self.get("accountId")
165
+ return self.get("accountId") or "" # key might exist but can be `null`
165
166
 
166
167
  @property
167
- def caller_id(self) -> Optional[str]:
168
+ def caller_id(self) -> str:
168
169
  """The principal identifier of the caller making the request."""
169
- return self.get("callerId")
170
+ return self.get("callerId") or "" # key might exist but can be `null`
170
171
 
171
172
  def _cognito_identity(self) -> Dict:
172
- return self.get("cognitoIdentity", {}) or {} # not available in FunctionURL
173
+ return self.get("cognitoIdentity") or {} # not available in FunctionURL; key might exist but can be `null`
173
174
 
174
175
  @property
175
- def cognito_amr(self) -> Optional[List[str]]:
176
+ def cognito_amr(self) -> List[str]:
176
177
  """This represents how the user was authenticated.
177
178
  AMR stands for Authentication Methods References as per the openid spec"""
178
- return self._cognito_identity().get("amr")
179
+ return self._cognito_identity().get("amr", [])
179
180
 
180
181
  @property
181
- def cognito_identity_id(self) -> Optional[str]:
182
+ def cognito_identity_id(self) -> str:
182
183
  """The Amazon Cognito identity ID of the caller making the request.
183
184
  Available only if the request was signed with Amazon Cognito credentials."""
184
- return self._cognito_identity().get("identityId")
185
+ return self._cognito_identity().get("identityId", "")
185
186
 
186
187
  @property
187
- def cognito_identity_pool_id(self) -> Optional[str]:
188
+ def cognito_identity_pool_id(self) -> str:
188
189
  """The Amazon Cognito identity pool ID of the caller making the request.
189
190
  Available only if the request was signed with Amazon Cognito credentials."""
190
- return self._cognito_identity().get("identityPoolId")
191
+ return self._cognito_identity().get("identityPoolId") or "" # key might exist but can be `null`
191
192
 
192
193
  @property
193
- def principal_org_id(self) -> Optional[str]:
194
+ def principal_org_id(self) -> str:
194
195
  """The AWS organization ID."""
195
- return self.get("principalOrgId")
196
+ return self.get("principalOrgId") or "" # key might exist but can be `null`
196
197
 
197
198
  @property
198
- def user_arn(self) -> Optional[str]:
199
+ def user_arn(self) -> str:
199
200
  """The Amazon Resource Name (ARN) of the effective user identified after authentication."""
200
- return self.get("userArn")
201
+ return self.get("userArn") or "" # key might exist but can be `null`
201
202
 
202
203
  @property
203
- def user_id(self) -> Optional[str]:
204
+ def user_id(self) -> str:
204
205
  """The IAM user ID of the effective user identified after authentication."""
205
- return self.get("userId")
206
+ return self.get("userId") or "" # key might exist but can be `null`
206
207
 
207
208
 
208
209
  class RequestContextV2Authorizer(DictWrapper):
209
210
  @property
210
- def jwt_claim(self) -> Optional[Dict[str, Any]]:
211
- jwt = self.get("jwt") or {} # not available in FunctionURL
212
- return jwt.get("claims")
211
+ def jwt_claim(self) -> Dict[str, Any]:
212
+ jwt = self.get("jwt") or {} # not available in FunctionURL; key might exist but can be `null`
213
+ return jwt.get("claims") or {} # key might exist but can be `null`
213
214
 
214
215
  @property
215
- def jwt_scopes(self) -> Optional[List[str]]:
216
- jwt = self.get("jwt") or {} # not available in FunctionURL
217
- return jwt.get("scopes")
216
+ def jwt_scopes(self) -> List[str]:
217
+ jwt = self.get("jwt") or {} # not available in FunctionURL; key might exist but can be `null`
218
+ return jwt.get("scopes", [])
218
219
 
219
220
  @property
220
- def get_lambda(self) -> Optional[Dict[str, Any]]:
221
+ def get_lambda(self) -> Dict[str, Any]:
221
222
  """Lambda authorization context details"""
222
- return self.get("lambda")
223
+ return self.get("lambda") or {} # key might exist but can be `null`
223
224
 
224
225
  def get_context(self) -> Dict[str, Any]:
225
226
  """Retrieve the authorization context details injected by a Lambda Authorizer.
@@ -238,20 +239,20 @@ class RequestContextV2Authorizer(DictWrapper):
238
239
  Dict[str, Any]
239
240
  A dictionary containing Lambda authorization context details.
240
241
  """
241
- return self.get("lambda", {}) or {}
242
+ return self.get_lambda
242
243
 
243
244
  @property
244
- def iam(self) -> Optional[RequestContextV2AuthorizerIam]:
245
+ def iam(self) -> RequestContextV2AuthorizerIam:
245
246
  """IAM authorization details used for making the request."""
246
- iam = self.get("iam")
247
- return None if iam is None else RequestContextV2AuthorizerIam(iam)
247
+ iam = self.get("iam") or {} # key might exist but can be `null`
248
+ return RequestContextV2AuthorizerIam(iam)
248
249
 
249
250
 
250
251
  class RequestContextV2(BaseRequestContextV2):
251
252
  @property
252
- def authorizer(self) -> Optional[RequestContextV2Authorizer]:
253
- authorizer = self["requestContext"].get("authorizer")
254
- return None if authorizer is None else RequestContextV2Authorizer(authorizer)
253
+ def authorizer(self) -> RequestContextV2Authorizer:
254
+ ctx = self.get("requestContext") or {} # key might exist but can be `null`
255
+ return RequestContextV2Authorizer(ctx.get("authorizer", {}))
255
256
 
256
257
 
257
258
  class APIGatewayProxyEventV2(BaseProxyEvent):
@@ -319,7 +320,7 @@ class APIGatewayProxyEventV2(BaseProxyEvent):
319
320
  return HttpApiHeadersSerializer()
320
321
 
321
322
  @property
322
- def resolved_headers_field(self) -> Optional[Dict[str, Any]]:
323
+ def resolved_headers_field(self) -> Dict[str, Any]:
323
324
  if self.headers is not None:
324
325
  headers = {key.lower(): value.split(",") if "," in value else value for key, value in self.headers.items()}
325
326
  return headers
@@ -111,7 +111,7 @@ class BedrockAgentEvent(BaseProxyEvent):
111
111
  return {x["name"]: x["value"] for x in self["parameters"]} if self.get("parameters") else None
112
112
 
113
113
  @property
114
- def resolved_headers_field(self) -> Optional[Dict[str, Any]]:
114
+ def resolved_headers_field(self) -> Dict[str, Any]:
115
115
  return {}
116
116
 
117
117
  @cached_property
@@ -124,7 +124,7 @@ class BaseProxyEvent(DictWrapper):
124
124
  return {}
125
125
 
126
126
  @property
127
- def resolved_headers_field(self) -> Optional[Dict[str, Any]]:
127
+ def resolved_headers_field(self) -> Dict[str, Any]:
128
128
  """
129
129
  This property determines the appropriate header to be used
130
130
  as a trusted source for validating OpenAPI.
@@ -32,14 +32,14 @@ class S3EventBridgeNotificationObject(DictWrapper):
32
32
  return unquote_plus(self["key"])
33
33
 
34
34
  @property
35
- def size(self) -> str:
36
- """Object size"""
37
- return self["size"]
35
+ def size(self) -> Optional[int]:
36
+ """Object size. Object deletion event doesn't contain size."""
37
+ return self.get("size")
38
38
 
39
39
  @property
40
40
  def etag(self) -> str:
41
- """Object etag"""
42
- return self["etag"]
41
+ """Object etag. Object deletion event doesn't contain etag; we default to empty string"""
42
+ return self.get("etag", "") # type: ignore[return-value] # false positive
43
43
 
44
44
  @property
45
45
  def version_id(self) -> str:
@@ -178,8 +178,8 @@ class S3Object(DictWrapper):
178
178
 
179
179
  @property
180
180
  def etag(self) -> str:
181
- """object eTag"""
182
- return self["s3"]["object"]["eTag"]
181
+ """Object eTag. Object deletion event doesn't contain eTag; we default to empty string"""
182
+ return self["s3"]["object"].get("eTag", "")
183
183
 
184
184
  @property
185
185
  def version_id(self) -> Optional[str]:
@@ -145,7 +145,7 @@ class VPCLatticeEvent(VPCLatticeEventBase):
145
145
  return self["query_string_parameters"]
146
146
 
147
147
  @property
148
- def resolved_headers_field(self) -> Optional[Dict[str, Any]]:
148
+ def resolved_headers_field(self) -> Dict[str, Any]:
149
149
  if self.headers is not None:
150
150
  headers = {key.lower(): value.split(",") if "," in value else value for key, value in self.headers.items()}
151
151
  return headers
@@ -272,7 +272,7 @@ class VPCLatticeEventV2(VPCLatticeEventBase):
272
272
  return None
273
273
 
274
274
  @property
275
- def resolved_headers_field(self) -> Optional[Dict[str, str]]:
275
+ def resolved_headers_field(self) -> Dict[str, str]:
276
276
  if self.headers is not None:
277
277
  return {key.lower(): value for key, value in self.headers.items()}
278
278
 
@@ -0,0 +1,5 @@
1
+ from aws_lambda_powertools.utilities.data_masking.base import DataMasking
2
+
3
+ __all__ = [
4
+ "DataMasking",
5
+ ]
@@ -19,10 +19,6 @@ logger = logging.getLogger(__name__)
19
19
 
20
20
  class DataMasking:
21
21
  """
22
- Note: This utility is currently in a Non-General Availability (Non-GA) phase and may have limitations.
23
- Please DON'T USE THIS utility in production environments.
24
- Keep in mind that when we transition to General Availability (GA), there might be breaking changes introduced.
25
-
26
22
  The DataMasking class orchestrates erasing, encrypting, and decrypting
27
23
  for the base provider.
28
24
 
@@ -22,7 +22,7 @@ def disable_pydantic_v2_warning():
22
22
 
23
23
  version = __version__.split(".")
24
24
 
25
- if int(version[0]) == 2:
25
+ if int(version[0]) == 2: # pragma: no cover # dropping in v3
26
26
  import warnings
27
27
 
28
28
  from pydantic import PydanticDeprecatedSince20, PydanticDeprecationWarning
@@ -30,5 +30,5 @@ def disable_pydantic_v2_warning():
30
30
  warnings.filterwarnings("ignore", category=PydanticDeprecationWarning)
31
31
  warnings.filterwarnings("ignore", category=PydanticDeprecatedSince20)
32
32
 
33
- except ImportError:
33
+ except ImportError: # pragma: no cover # false positive; dropping in v3
34
34
  pass