aws-lambda-powertools 2.36.0__tar.gz → 2.38.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/PKG-INFO +2 -2
  2. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/THIRD-PARTY-LICENSES +24 -0
  3. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/api_gateway.py +187 -25
  4. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/bedrock_agent.py +15 -0
  5. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +1 -1
  6. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/compat.py +1 -1
  7. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/models.py +2 -1
  8. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +1 -1
  9. aws_lambda_powertools-2.38.0/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +13 -0
  10. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +37 -6
  11. aws_lambda_powertools-2.38.0/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +158 -0
  12. aws_lambda_powertools-2.38.0/aws_lambda_powertools/logging/constants.py +5 -0
  13. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/exceptions.py +4 -0
  14. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/formatter.py +6 -0
  15. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/logger.py +37 -10
  16. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/utils.py +16 -4
  17. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/constants.py +2 -1
  18. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/version.py +1 -1
  19. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/types.py +2 -2
  20. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +1 -1
  21. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/alb_event.py +1 -1
  22. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +15 -4
  23. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +46 -45
  24. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +18 -2
  25. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +1 -1
  26. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/common.py +10 -4
  27. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +18 -2
  28. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/s3_event.py +7 -7
  29. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +18 -2
  30. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +38 -4
  31. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +7 -0
  32. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +11 -5
  33. aws_lambda_powertools-2.38.0/aws_lambda_powertools/utilities/data_masking/__init__.py +5 -0
  34. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/base.py +0 -4
  35. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/__init__.py +4 -0
  36. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/base.py +12 -2
  37. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/config.py +5 -0
  38. aws_lambda_powertools-2.38.0/aws_lambda_powertools/utilities/idempotency/hook.py +13 -0
  39. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/compat.py +2 -2
  40. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/s3.py +1 -1
  41. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/sqs.py +1 -0
  42. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/parser.py +10 -9
  43. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/pyproject.toml +25 -24
  44. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/setup.py +2 -2
  45. aws_lambda_powertools-2.36.0/aws_lambda_powertools/utilities/data_masking/__init__.py +0 -11
  46. aws_lambda_powertools-2.36.0/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
  47. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/LICENSE +0 -0
  48. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/README.md +0 -0
  49. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/__init__.py +0 -0
  50. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/__init__.py +0 -0
  51. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/appsync.py +0 -0
  52. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/content_types.py +0 -0
  53. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
  54. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
  55. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
  56. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
  57. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
  58. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/__init__.py +0 -0
  59. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
  60. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
  61. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
  62. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
  63. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
  64. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js +0 -0
  65. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css +0 -0
  66. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
  67. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/router.py +0 -0
  68. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/types.py +0 -0
  69. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/util.py +0 -0
  70. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
  71. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/exceptions/__init__.py +0 -0
  72. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/__init__.py +0 -0
  73. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
  74. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/filters.py +0 -0
  75. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
  76. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
  77. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/lambda_context.py +0 -0
  78. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/types.py +0 -0
  79. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/__init__.py +0 -0
  80. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/base.py +0 -0
  81. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/exceptions.py +0 -0
  82. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/functions.py +0 -0
  83. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/metric.py +0 -0
  84. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/metrics.py +0 -0
  85. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
  86. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/base.py +0 -0
  87. {aws_lambda_powertools-2.36.0/aws_lambda_powertools/event_handler/openapi/swagger_ui → aws_lambda_powertools-2.38.0/aws_lambda_powertools/metrics/provider/cloudwatch_emf}/__init__.py +0 -0
  88. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +0 -0
  89. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
  90. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
  91. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
  92. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
  93. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
  94. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
  95. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +0 -0
  96. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +0 -0
  97. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
  98. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/types.py +0 -0
  99. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
  100. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
  101. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
  102. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/package_logger.py +0 -0
  103. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/py.typed +0 -0
  104. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/__init__.py +0 -0
  105. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/cache_dict.py +0 -0
  106. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/cookies.py +0 -0
  107. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/functions.py +0 -0
  108. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
  109. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/json_encoder.py +0 -0
  110. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/lazy_import.py +0 -0
  111. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/types.py +0 -0
  112. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/user_agent.py +0 -0
  113. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/tracing/__init__.py +0 -0
  114. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/tracing/base.py +0 -0
  115. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/tracing/extensions.py +0 -0
  116. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/tracing/tracer.py +0 -0
  117. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/__init__.py +0 -0
  118. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
  119. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/base.py +0 -0
  120. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
  121. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
  122. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
  123. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
  124. {aws_lambda_powertools-2.36.0/aws_lambda_powertools/metrics/provider/cloudwatch_emf → aws_lambda_powertools-2.38.0/aws_lambda_powertools/utilities/data_classes/appsync}/__init__.py +0 -0
  125. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py +0 -0
  126. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
  127. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py +0 -0
  128. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py +0 -0
  129. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py +0 -0
  130. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py +0 -0
  131. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +0 -0
  132. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py +0 -0
  133. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py +0 -0
  134. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +0 -0
  135. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
  136. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
  137. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
  138. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
  139. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py +0 -0
  140. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
  141. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py +0 -0
  142. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
  143. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
  144. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
  145. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/constants.py +0 -0
  146. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/exceptions.py +0 -0
  147. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/provider/__init__.py +0 -0
  148. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/provider/base.py +0 -0
  149. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/__init__.py +0 -0
  150. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +0 -0
  151. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
  152. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
  153. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
  154. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
  155. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
  156. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
  157. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
  158. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
  159. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
  160. {aws_lambda_powertools-2.36.0/aws_lambda_powertools/utilities/data_classes/appsync → aws_lambda_powertools-2.38.0/aws_lambda_powertools/utilities/idempotency/persistence}/__init__.py +0 -0
  161. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
  162. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +0 -0
  163. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
  164. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +0 -0
  165. {aws_lambda_powertools-2.36.0/aws_lambda_powertools/utilities/idempotency/persistence → aws_lambda_powertools-2.38.0/aws_lambda_powertools/utilities/idempotency/serialization}/__init__.py +0 -0
  166. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
  167. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
  168. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
  169. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
  170. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
  171. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
  172. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
  173. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
  174. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
  175. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
  176. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
  177. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
  178. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/secrets.py +0 -0
  179. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
  180. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
  181. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
  182. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
  183. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
  184. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
  185. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
  186. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
  187. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
  188. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
  189. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
  190. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
  191. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
  192. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
  193. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
  194. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
  195. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
  196. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
  197. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
  198. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
  199. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
  200. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
  201. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
  202. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
  203. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
  204. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
  205. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
  206. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
  207. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
  208. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
  209. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
  210. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
  211. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
  212. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
  213. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/s3_batch_operation.py +0 -0
  214. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
  215. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
  216. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
  217. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
  218. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
  219. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
  220. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
  221. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/types.py +0 -0
  222. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/serialization.py +0 -0
  223. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
  224. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
  225. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
  226. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
  227. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
  228. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
  229. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
  230. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
  231. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
  232. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
  233. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
  234. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/typing/lambda_client_context_mobile_client.py +0 -0
  235. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
  236. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
  237. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
  238. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/validation/base.py +0 -0
  239. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
  240. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
  241. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.38.0}/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.36.0
3
+ Version: 2.38.0
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
@@ -34,7 +34,7 @@ Requires-Dist: fastjsonschema (>=2.14.5,<3.0.0) ; extra == "validation" or extra
34
34
  Requires-Dist: jsonpath-ng (>=1.6.0,<2.0.0) ; extra == "datamasking"
35
35
  Requires-Dist: pydantic (>=1.8.2,<2.0.0) ; extra == "parser" or extra == "all"
36
36
  Requires-Dist: redis (>=4.4,<6.0) ; extra == "redis"
37
- Requires-Dist: typing-extensions (>=4.6.2,<5.0.0)
37
+ Requires-Dist: typing-extensions (>=4.11.0,<5.0.0)
38
38
  Project-URL: Documentation, https://docs.powertools.aws.dev/lambda/python/
39
39
  Project-URL: Issue tracker, https://github.com/aws-powertools/powertools-lambda-python/issues
40
40
  Project-URL: Repository, https://github.com/aws-powertools/powertools-lambda-python
@@ -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
@@ -34,7 +34,6 @@ from aws_lambda_powertools.event_handler import content_types
34
34
  from aws_lambda_powertools.event_handler.exceptions import NotFoundError, ServiceError
35
35
  from aws_lambda_powertools.event_handler.openapi.constants import DEFAULT_API_VERSION, DEFAULT_OPENAPI_VERSION
36
36
  from aws_lambda_powertools.event_handler.openapi.exceptions import RequestValidationError
37
- from aws_lambda_powertools.event_handler.openapi.swagger_ui.html import generate_swagger_html
38
37
  from aws_lambda_powertools.event_handler.openapi.types import (
39
38
  COMPONENT_REF_PREFIX,
40
39
  METHODS_WITH_BODY,
@@ -83,10 +82,14 @@ if TYPE_CHECKING:
83
82
  Contact,
84
83
  License,
85
84
  OpenAPI,
85
+ SecurityScheme,
86
86
  Server,
87
87
  Tag,
88
88
  )
89
89
  from aws_lambda_powertools.event_handler.openapi.params import Dependant
90
+ from aws_lambda_powertools.event_handler.openapi.swagger_ui.oauth2 import (
91
+ OAuth2Config,
92
+ )
90
93
  from aws_lambda_powertools.event_handler.openapi.types import (
91
94
  TypeModelOrEnum,
92
95
  )
@@ -282,6 +285,7 @@ class Route:
282
285
  tags: Optional[List[str]],
283
286
  operation_id: Optional[str],
284
287
  include_in_schema: bool,
288
+ security: Optional[List[Dict[str, List[str]]]],
285
289
  middlewares: Optional[List[Callable[..., Response]]],
286
290
  ):
287
291
  """
@@ -317,6 +321,8 @@ class Route:
317
321
  The OpenAPI operationId for this route
318
322
  include_in_schema: bool
319
323
  Whether or not to include this route in the OpenAPI schema
324
+ security: List[Dict[str, List[str]]], optional
325
+ The OpenAPI security for this route
320
326
  middlewares: Optional[List[Callable[..., Response]]]
321
327
  The list of route middlewares to be called in order.
322
328
  """
@@ -339,6 +345,7 @@ class Route:
339
345
  self.response_description = response_description
340
346
  self.tags = tags or []
341
347
  self.include_in_schema = include_in_schema
348
+ self.security = security
342
349
  self.middlewares = middlewares or []
343
350
  self.operation_id = operation_id or self._generate_operation_id()
344
351
 
@@ -486,6 +493,10 @@ class Route:
486
493
  )
487
494
  parameters.extend(operation_params)
488
495
 
496
+ # Add security if present
497
+ if self.security:
498
+ operation["security"] = self.security
499
+
489
500
  # Add the parameters to the OpenAPI operation
490
501
  if parameters:
491
502
  all_parameters = {(param["in"], param["name"]): param for param in parameters}
@@ -885,6 +896,7 @@ class BaseRouter(ABC):
885
896
  tags: Optional[List[str]] = None,
886
897
  operation_id: Optional[str] = None,
887
898
  include_in_schema: bool = True,
899
+ security: Optional[List[Dict[str, List[str]]]] = None,
888
900
  middlewares: Optional[List[Callable[..., Any]]] = None,
889
901
  ):
890
902
  raise NotImplementedError()
@@ -943,6 +955,7 @@ class BaseRouter(ABC):
943
955
  tags: Optional[List[str]] = None,
944
956
  operation_id: Optional[str] = None,
945
957
  include_in_schema: bool = True,
958
+ security: Optional[List[Dict[str, List[str]]]] = None,
946
959
  middlewares: Optional[List[Callable[..., Any]]] = None,
947
960
  ):
948
961
  """Get route decorator with GET `method`
@@ -980,6 +993,7 @@ class BaseRouter(ABC):
980
993
  tags,
981
994
  operation_id,
982
995
  include_in_schema,
996
+ security,
983
997
  middlewares,
984
998
  )
985
999
 
@@ -996,6 +1010,7 @@ class BaseRouter(ABC):
996
1010
  tags: Optional[List[str]] = None,
997
1011
  operation_id: Optional[str] = None,
998
1012
  include_in_schema: bool = True,
1013
+ security: Optional[List[Dict[str, List[str]]]] = None,
999
1014
  middlewares: Optional[List[Callable[..., Any]]] = None,
1000
1015
  ):
1001
1016
  """Post route decorator with POST `method`
@@ -1034,6 +1049,7 @@ class BaseRouter(ABC):
1034
1049
  tags,
1035
1050
  operation_id,
1036
1051
  include_in_schema,
1052
+ security,
1037
1053
  middlewares,
1038
1054
  )
1039
1055
 
@@ -1050,6 +1066,7 @@ class BaseRouter(ABC):
1050
1066
  tags: Optional[List[str]] = None,
1051
1067
  operation_id: Optional[str] = None,
1052
1068
  include_in_schema: bool = True,
1069
+ security: Optional[List[Dict[str, List[str]]]] = None,
1053
1070
  middlewares: Optional[List[Callable[..., Any]]] = None,
1054
1071
  ):
1055
1072
  """Put route decorator with PUT `method`
@@ -1088,6 +1105,7 @@ class BaseRouter(ABC):
1088
1105
  tags,
1089
1106
  operation_id,
1090
1107
  include_in_schema,
1108
+ security,
1091
1109
  middlewares,
1092
1110
  )
1093
1111
 
@@ -1104,6 +1122,7 @@ class BaseRouter(ABC):
1104
1122
  tags: Optional[List[str]] = None,
1105
1123
  operation_id: Optional[str] = None,
1106
1124
  include_in_schema: bool = True,
1125
+ security: Optional[List[Dict[str, List[str]]]] = None,
1107
1126
  middlewares: Optional[List[Callable[..., Any]]] = None,
1108
1127
  ):
1109
1128
  """Delete route decorator with DELETE `method`
@@ -1141,6 +1160,7 @@ class BaseRouter(ABC):
1141
1160
  tags,
1142
1161
  operation_id,
1143
1162
  include_in_schema,
1163
+ security,
1144
1164
  middlewares,
1145
1165
  )
1146
1166
 
@@ -1157,6 +1177,7 @@ class BaseRouter(ABC):
1157
1177
  tags: Optional[List[str]] = None,
1158
1178
  operation_id: Optional[str] = None,
1159
1179
  include_in_schema: bool = True,
1180
+ security: Optional[List[Dict[str, List[str]]]] = None,
1160
1181
  middlewares: Optional[List[Callable]] = None,
1161
1182
  ):
1162
1183
  """Patch route decorator with PATCH `method`
@@ -1197,6 +1218,64 @@ class BaseRouter(ABC):
1197
1218
  tags,
1198
1219
  operation_id,
1199
1220
  include_in_schema,
1221
+ security,
1222
+ middlewares,
1223
+ )
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,
1200
1279
  middlewares,
1201
1280
  )
1202
1281
 
@@ -1419,6 +1498,8 @@ class ApiGatewayResolver(BaseRouter):
1419
1498
  terms_of_service: Optional[str] = None,
1420
1499
  contact: Optional["Contact"] = None,
1421
1500
  license_info: Optional["License"] = None,
1501
+ security_schemes: Optional[Dict[str, "SecurityScheme"]] = None,
1502
+ security: Optional[List[Dict[str, List[str]]]] = None,
1422
1503
  ) -> "OpenAPI":
1423
1504
  """
1424
1505
  Returns the OpenAPI schema as a pydantic model.
@@ -1445,6 +1526,10 @@ class ApiGatewayResolver(BaseRouter):
1445
1526
  The contact information for the exposed API.
1446
1527
  license_info: License, optional
1447
1528
  The license information for the exposed API.
1529
+ security_schemes: Dict[str, "SecurityScheme"]], optional
1530
+ A declaration of the security schemes available to be used in the specification.
1531
+ security: List[Dict[str, List[str]]], optional
1532
+ A declaration of which security mechanisms are applied globally across the API.
1448
1533
 
1449
1534
  Returns
1450
1535
  -------
@@ -1457,25 +1542,12 @@ class ApiGatewayResolver(BaseRouter):
1457
1542
  get_compat_model_name_map,
1458
1543
  get_definitions,
1459
1544
  )
1460
- from aws_lambda_powertools.event_handler.openapi.models import OpenAPI, PathItem, Server, Tag
1461
- from aws_lambda_powertools.event_handler.openapi.pydantic_loader import PYDANTIC_V2
1545
+ from aws_lambda_powertools.event_handler.openapi.models import OpenAPI, PathItem, Tag
1462
1546
  from aws_lambda_powertools.event_handler.openapi.types import (
1463
1547
  COMPONENT_REF_TEMPLATE,
1464
1548
  )
1465
1549
 
1466
- # Pydantic V2 has no support for OpenAPI schema 3.0
1467
- if PYDANTIC_V2 and not openapi_version.startswith("3.1"):
1468
- warnings.warn(
1469
- "You are using Pydantic v2, which is incompatible with OpenAPI schema 3.0. Forcing OpenAPI 3.1",
1470
- stacklevel=2,
1471
- )
1472
- openapi_version = "3.1.0"
1473
- elif not PYDANTIC_V2 and not openapi_version.startswith("3.0"):
1474
- warnings.warn(
1475
- "You are using Pydantic v1, which is incompatible with OpenAPI schema 3.1. Forcing OpenAPI 3.0",
1476
- stacklevel=2,
1477
- )
1478
- openapi_version = "3.0.3"
1550
+ openapi_version = self._determine_openapi_version(openapi_version)
1479
1551
 
1480
1552
  # Start with the bare minimum required for a valid OpenAPI schema
1481
1553
  info: Dict[str, Any] = {"title": title, "version": version}
@@ -1490,13 +1562,12 @@ class ApiGatewayResolver(BaseRouter):
1490
1562
 
1491
1563
  info.update({field: value for field, value in optional_fields.items() if value})
1492
1564
 
1493
- output: Dict[str, Any] = {"openapi": openapi_version, "info": info}
1494
- if servers:
1495
- output["servers"] = servers
1496
- else:
1497
- # If the servers property is not provided, or is an empty array, the default value would be a Server Object
1498
- # with an url value of /.
1499
- output["servers"] = [Server(url="/")]
1565
+ output: Dict[str, Any] = {
1566
+ "openapi": openapi_version,
1567
+ "info": info,
1568
+ "servers": self._get_openapi_servers(servers),
1569
+ "security": self._get_openapi_security(security, security_schemes),
1570
+ }
1500
1571
 
1501
1572
  components: Dict[str, Dict[str, Any]] = {}
1502
1573
  paths: Dict[str, Dict[str, Any]] = {}
@@ -1534,6 +1605,8 @@ class ApiGatewayResolver(BaseRouter):
1534
1605
 
1535
1606
  if definitions:
1536
1607
  components["schemas"] = {k: definitions[k] for k in sorted(definitions)}
1608
+ if security_schemes:
1609
+ components["securitySchemes"] = security_schemes
1537
1610
  if components:
1538
1611
  output["components"] = components
1539
1612
  if tags:
@@ -1543,6 +1616,50 @@ class ApiGatewayResolver(BaseRouter):
1543
1616
 
1544
1617
  return OpenAPI(**output)
1545
1618
 
1619
+ @staticmethod
1620
+ def _get_openapi_servers(servers: Optional[List["Server"]]) -> List["Server"]:
1621
+ from aws_lambda_powertools.event_handler.openapi.models import Server
1622
+
1623
+ # If the 'servers' property is not provided or is an empty array,
1624
+ # the default behavior is to return a Server Object with a URL value of "/".
1625
+ return servers if servers else [Server(url="/")]
1626
+
1627
+ @staticmethod
1628
+ def _get_openapi_security(
1629
+ security: Optional[List[Dict[str, List[str]]]],
1630
+ security_schemes: Optional[Dict[str, "SecurityScheme"]],
1631
+ ) -> Optional[List[Dict[str, List[str]]]]:
1632
+ if not security:
1633
+ return None
1634
+
1635
+ if not security_schemes:
1636
+ raise ValueError("security_schemes must be provided if security is provided")
1637
+
1638
+ # Check if all keys in security are present in the security_schemes
1639
+ if any(key not in security_schemes for sec in security for key in sec):
1640
+ raise ValueError("Some security schemes not found in security_schemes")
1641
+
1642
+ return security
1643
+
1644
+ @staticmethod
1645
+ def _determine_openapi_version(openapi_version):
1646
+ from aws_lambda_powertools.event_handler.openapi.pydantic_loader import PYDANTIC_V2
1647
+
1648
+ # Pydantic V2 has no support for OpenAPI schema 3.0
1649
+ if PYDANTIC_V2 and not openapi_version.startswith("3.1"): # pragma: no cover
1650
+ warnings.warn(
1651
+ "You are using Pydantic v2, which is incompatible with OpenAPI schema 3.0. Forcing OpenAPI 3.1",
1652
+ stacklevel=2,
1653
+ )
1654
+ openapi_version = "3.1.0"
1655
+ elif not PYDANTIC_V2 and not openapi_version.startswith("3.0"): # pragma: no cover
1656
+ warnings.warn(
1657
+ "You are using Pydantic v1, which is incompatible with OpenAPI schema 3.1. Forcing OpenAPI 3.0",
1658
+ stacklevel=2,
1659
+ )
1660
+ openapi_version = "3.0.3"
1661
+ return openapi_version
1662
+
1546
1663
  def get_openapi_json_schema(
1547
1664
  self,
1548
1665
  *,
@@ -1556,6 +1673,8 @@ class ApiGatewayResolver(BaseRouter):
1556
1673
  terms_of_service: Optional[str] = None,
1557
1674
  contact: Optional["Contact"] = None,
1558
1675
  license_info: Optional["License"] = None,
1676
+ security_schemes: Optional[Dict[str, "SecurityScheme"]] = None,
1677
+ security: Optional[List[Dict[str, List[str]]]] = None,
1559
1678
  ) -> str:
1560
1679
  """
1561
1680
  Returns the OpenAPI schema as a JSON serializable dict
@@ -1582,6 +1701,10 @@ class ApiGatewayResolver(BaseRouter):
1582
1701
  The contact information for the exposed API.
1583
1702
  license_info: License, optional
1584
1703
  The license information for the exposed API.
1704
+ security_schemes: Dict[str, "SecurityScheme"]], optional
1705
+ A declaration of the security schemes available to be used in the specification.
1706
+ security: List[Dict[str, List[str]]], optional
1707
+ A declaration of which security mechanisms are applied globally across the API.
1585
1708
 
1586
1709
  Returns
1587
1710
  -------
@@ -1602,6 +1725,8 @@ class ApiGatewayResolver(BaseRouter):
1602
1725
  terms_of_service=terms_of_service,
1603
1726
  contact=contact,
1604
1727
  license_info=license_info,
1728
+ security_schemes=security_schemes,
1729
+ security=security,
1605
1730
  ),
1606
1731
  by_alias=True,
1607
1732
  exclude_none=True,
@@ -1625,6 +1750,10 @@ class ApiGatewayResolver(BaseRouter):
1625
1750
  swagger_base_url: Optional[str] = None,
1626
1751
  middlewares: Optional[List[Callable[..., Response]]] = None,
1627
1752
  compress: bool = False,
1753
+ security_schemes: Optional[Dict[str, "SecurityScheme"]] = None,
1754
+ security: Optional[List[Dict[str, List[str]]]] = None,
1755
+ oauth2_config: Optional["OAuth2Config"] = None,
1756
+ persist_authorization: bool = False,
1628
1757
  ):
1629
1758
  """
1630
1759
  Returns the OpenAPI schema as a JSON serializable dict
@@ -1659,12 +1788,36 @@ class ApiGatewayResolver(BaseRouter):
1659
1788
  List of middlewares to be used for the swagger route.
1660
1789
  compress: bool, default = False
1661
1790
  Whether or not to enable gzip compression swagger route.
1791
+ security_schemes: Dict[str, "SecurityScheme"], optional
1792
+ A declaration of the security schemes available to be used in the specification.
1793
+ security: List[Dict[str, List[str]]], optional
1794
+ A declaration of which security mechanisms are applied globally across the API.
1795
+ oauth2_config: OAuth2Config, optional
1796
+ The OAuth2 configuration for the Swagger UI.
1797
+ persist_authorization: bool, optional
1798
+ Whether to persist authorization data on browser close/refresh.
1662
1799
  """
1663
1800
  from aws_lambda_powertools.event_handler.openapi.compat import model_json
1664
1801
  from aws_lambda_powertools.event_handler.openapi.models import Server
1802
+ from aws_lambda_powertools.event_handler.openapi.swagger_ui import (
1803
+ generate_oauth2_redirect_html,
1804
+ generate_swagger_html,
1805
+ )
1665
1806
 
1666
1807
  @self.get(path, middlewares=middlewares, include_in_schema=False, compress=compress)
1667
1808
  def swagger_handler():
1809
+ query_params = self.current_event.query_string_parameters or {}
1810
+
1811
+ # Check for query parameters; if "format" is specified as "oauth2-redirect",
1812
+ # send the oauth2-redirect HTML stanza so OAuth2 can be used
1813
+ # Source: https://github.com/swagger-api/swagger-ui/blob/master/dist/oauth2-redirect.html
1814
+ if query_params.get("format") == "oauth2-redirect":
1815
+ return Response(
1816
+ status_code=200,
1817
+ content_type="text/html",
1818
+ body=generate_oauth2_redirect_html(),
1819
+ )
1820
+
1668
1821
  base_path = self._get_base_path()
1669
1822
 
1670
1823
  if swagger_base_url:
@@ -1690,6 +1843,8 @@ class ApiGatewayResolver(BaseRouter):
1690
1843
  terms_of_service=terms_of_service,
1691
1844
  contact=contact,
1692
1845
  license_info=license_info,
1846
+ security_schemes=security_schemes,
1847
+ security=security,
1693
1848
  )
1694
1849
 
1695
1850
  # The .replace('</', '<\\/') part is necessary to prevent a potential issue where the JSON string contains
@@ -1705,7 +1860,6 @@ class ApiGatewayResolver(BaseRouter):
1705
1860
  # Check for query parameters; if "format" is specified as "json",
1706
1861
  # respond with the JSON used in the OpenAPI spec
1707
1862
  # Example: https://www.example.com/swagger?format=json
1708
- query_params = self.current_event.query_string_parameters or {}
1709
1863
  if query_params.get("format") == "json":
1710
1864
  return Response(
1711
1865
  status_code=200,
@@ -1719,6 +1873,8 @@ class ApiGatewayResolver(BaseRouter):
1719
1873
  swagger_js,
1720
1874
  swagger_css,
1721
1875
  swagger_base_url,
1876
+ oauth2_config,
1877
+ persist_authorization,
1722
1878
  )
1723
1879
 
1724
1880
  return Response(
@@ -1741,6 +1897,7 @@ class ApiGatewayResolver(BaseRouter):
1741
1897
  tags: Optional[List[str]] = None,
1742
1898
  operation_id: Optional[str] = None,
1743
1899
  include_in_schema: bool = True,
1900
+ security: Optional[List[Dict[str, List[str]]]] = None,
1744
1901
  middlewares: Optional[List[Callable[..., Any]]] = None,
1745
1902
  ):
1746
1903
  """Route decorator includes parameter `method`"""
@@ -1767,6 +1924,7 @@ class ApiGatewayResolver(BaseRouter):
1767
1924
  tags,
1768
1925
  operation_id,
1769
1926
  include_in_schema,
1927
+ security,
1770
1928
  middlewares,
1771
1929
  )
1772
1930
 
@@ -2038,7 +2196,7 @@ class ApiGatewayResolver(BaseRouter):
2038
2196
 
2039
2197
  def exception_handler(self, exc_class: Union[Type[Exception], List[Type[Exception]]]):
2040
2198
  def register_exception_handler(func: Callable):
2041
- if isinstance(exc_class, list):
2199
+ if isinstance(exc_class, list): # pragma: no cover
2042
2200
  for exp in exc_class:
2043
2201
  self._exception_handlers[exp] = func
2044
2202
  else:
@@ -2218,6 +2376,7 @@ class Router(BaseRouter):
2218
2376
  tags: Optional[List[str]] = None,
2219
2377
  operation_id: Optional[str] = None,
2220
2378
  include_in_schema: bool = True,
2379
+ security: Optional[List[Dict[str, List[str]]]] = None,
2221
2380
  middlewares: Optional[List[Callable[..., Any]]] = None,
2222
2381
  ):
2223
2382
  def register_route(func: Callable):
@@ -2239,6 +2398,7 @@ class Router(BaseRouter):
2239
2398
  frozen_tags,
2240
2399
  operation_id,
2241
2400
  include_in_schema,
2401
+ security,
2242
2402
  )
2243
2403
 
2244
2404
  # Collate Middleware for routes
@@ -2318,6 +2478,7 @@ class APIGatewayRestResolver(ApiGatewayResolver):
2318
2478
  tags: Optional[List[str]] = None,
2319
2479
  operation_id: Optional[str] = None,
2320
2480
  include_in_schema: bool = True,
2481
+ security: Optional[List[Dict[str, List[str]]]] = None,
2321
2482
  middlewares: Optional[List[Callable[..., Any]]] = None,
2322
2483
  ):
2323
2484
  # NOTE: see #1552 for more context.
@@ -2334,6 +2495,7 @@ class APIGatewayRestResolver(ApiGatewayResolver):
2334
2495
  tags,
2335
2496
  operation_id,
2336
2497
  include_in_schema,
2498
+ security,
2337
2499
  middlewares,
2338
2500
  )
2339
2501
 
@@ -102,6 +102,8 @@ class BedrockAgentResolver(ApiGatewayResolver):
102
102
  include_in_schema: bool = True,
103
103
  middlewares: Optional[List[Callable[..., Any]]] = None,
104
104
  ) -> Callable[[Callable[..., Any]], Callable[..., Any]]:
105
+ security = None
106
+
105
107
  return super(BedrockAgentResolver, self).get(
106
108
  rule,
107
109
  cors,
@@ -114,6 +116,7 @@ class BedrockAgentResolver(ApiGatewayResolver):
114
116
  tags,
115
117
  operation_id,
116
118
  include_in_schema,
119
+ security,
117
120
  middlewares,
118
121
  )
119
122
 
@@ -134,6 +137,8 @@ class BedrockAgentResolver(ApiGatewayResolver):
134
137
  include_in_schema: bool = True,
135
138
  middlewares: Optional[List[Callable[..., Any]]] = None,
136
139
  ):
140
+ security = None
141
+
137
142
  return super().post(
138
143
  rule,
139
144
  cors,
@@ -146,6 +151,7 @@ class BedrockAgentResolver(ApiGatewayResolver):
146
151
  tags,
147
152
  operation_id,
148
153
  include_in_schema,
154
+ security,
149
155
  middlewares,
150
156
  )
151
157
 
@@ -166,6 +172,8 @@ class BedrockAgentResolver(ApiGatewayResolver):
166
172
  include_in_schema: bool = True,
167
173
  middlewares: Optional[List[Callable[..., Any]]] = None,
168
174
  ):
175
+ security = None
176
+
169
177
  return super().put(
170
178
  rule,
171
179
  cors,
@@ -178,6 +186,7 @@ class BedrockAgentResolver(ApiGatewayResolver):
178
186
  tags,
179
187
  operation_id,
180
188
  include_in_schema,
189
+ security,
181
190
  middlewares,
182
191
  )
183
192
 
@@ -198,6 +207,8 @@ class BedrockAgentResolver(ApiGatewayResolver):
198
207
  include_in_schema: bool = True,
199
208
  middlewares: Optional[List[Callable]] = None,
200
209
  ):
210
+ security = None
211
+
201
212
  return super().patch(
202
213
  rule,
203
214
  cors,
@@ -210,6 +221,7 @@ class BedrockAgentResolver(ApiGatewayResolver):
210
221
  tags,
211
222
  operation_id,
212
223
  include_in_schema,
224
+ security,
213
225
  middlewares,
214
226
  )
215
227
 
@@ -230,6 +242,8 @@ class BedrockAgentResolver(ApiGatewayResolver):
230
242
  include_in_schema: bool = True,
231
243
  middlewares: Optional[List[Callable[..., Any]]] = None,
232
244
  ):
245
+ security = None
246
+
233
247
  return super().delete(
234
248
  rule,
235
249
  cors,
@@ -242,6 +256,7 @@ class BedrockAgentResolver(ApiGatewayResolver):
242
256
  tags,
243
257
  operation_id,
244
258
  include_in_schema,
259
+ security,
245
260
  middlewares,
246
261
  )
247
262
 
@@ -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
@@ -441,12 +441,13 @@ class SecurityBase(BaseModel):
441
441
  description: Optional[str] = None
442
442
 
443
443
  if PYDANTIC_V2:
444
- model_config = {"extra": "allow"}
444
+ model_config = {"extra": "allow", "populate_by_name": True}
445
445
 
446
446
  else:
447
447
 
448
448
  class Config:
449
449
  extra = "allow"
450
+ allow_population_by_field_name = True
450
451
 
451
452
 
452
453
  class APIKeyIn(Enum):
@@ -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
@@ -0,0 +1,13 @@
1
+ from aws_lambda_powertools.event_handler.openapi.swagger_ui.html import (
2
+ generate_swagger_html,
3
+ )
4
+ from aws_lambda_powertools.event_handler.openapi.swagger_ui.oauth2 import (
5
+ OAuth2Config,
6
+ generate_oauth2_redirect_html,
7
+ )
8
+
9
+ __all__ = [
10
+ "generate_swagger_html",
11
+ "generate_oauth2_redirect_html",
12
+ "OAuth2Config",
13
+ ]