aws-lambda-powertools 2.36.0__tar.gz → 2.37.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 (239) hide show
  1. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/PKG-INFO +2 -2
  2. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/api_gateway.py +125 -24
  3. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/bedrock_agent.py +15 -0
  4. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/models.py +2 -1
  5. aws_lambda_powertools-2.37.0/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +13 -0
  6. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +33 -6
  7. aws_lambda_powertools-2.37.0/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +158 -0
  8. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/formatter.py +6 -0
  9. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/logger.py +3 -0
  10. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/version.py +1 -1
  11. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +1 -1
  12. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +15 -4
  13. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +18 -2
  14. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/common.py +9 -3
  15. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +18 -2
  16. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +18 -2
  17. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +38 -4
  18. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +7 -0
  19. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +9 -3
  20. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/__init__.py +4 -0
  21. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/base.py +12 -2
  22. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/config.py +5 -0
  23. aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/idempotency/hook.py +13 -0
  24. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/sqs.py +1 -0
  25. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/pyproject.toml +15 -15
  26. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/setup.py +2 -2
  27. aws_lambda_powertools-2.36.0/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
  28. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/LICENSE +0 -0
  29. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/README.md +0 -0
  30. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/THIRD-PARTY-LICENSES +0 -0
  31. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/__init__.py +0 -0
  32. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/__init__.py +0 -0
  33. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/appsync.py +0 -0
  34. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/content_types.py +0 -0
  35. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
  36. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
  37. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
  38. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
  39. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +0 -0
  40. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
  41. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/__init__.py +0 -0
  42. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/compat.py +0 -0
  43. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
  44. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
  45. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
  46. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
  47. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
  48. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +0 -0
  49. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js +0 -0
  50. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css +0 -0
  51. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
  52. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/router.py +0 -0
  53. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/types.py +0 -0
  54. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/util.py +0 -0
  55. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
  56. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/exceptions/__init__.py +0 -0
  57. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/__init__.py +0 -0
  58. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
  59. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/exceptions.py +0 -0
  60. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/filters.py +0 -0
  61. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
  62. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
  63. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/lambda_context.py +0 -0
  64. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/types.py +0 -0
  65. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/utils.py +0 -0
  66. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/__init__.py +0 -0
  67. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/base.py +0 -0
  68. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/exceptions.py +0 -0
  69. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/functions.py +0 -0
  70. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/metric.py +0 -0
  71. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/metrics.py +0 -0
  72. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
  73. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/base.py +0 -0
  74. {aws_lambda_powertools-2.36.0/aws_lambda_powertools/event_handler/openapi/swagger_ui → aws_lambda_powertools-2.37.0/aws_lambda_powertools/metrics/provider/cloudwatch_emf}/__init__.py +0 -0
  75. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +0 -0
  76. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
  77. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
  78. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
  79. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
  80. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
  81. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
  82. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +0 -0
  83. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +0 -0
  84. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
  85. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/types.py +0 -0
  86. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
  87. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
  88. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
  89. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/package_logger.py +0 -0
  90. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/py.typed +0 -0
  91. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/__init__.py +0 -0
  92. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/cache_dict.py +0 -0
  93. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/constants.py +0 -0
  94. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/cookies.py +0 -0
  95. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/functions.py +0 -0
  96. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
  97. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/json_encoder.py +0 -0
  98. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/lazy_import.py +0 -0
  99. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/types.py +0 -0
  100. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/user_agent.py +0 -0
  101. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/__init__.py +0 -0
  102. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/base.py +0 -0
  103. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/extensions.py +0 -0
  104. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/tracer.py +0 -0
  105. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/__init__.py +0 -0
  106. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
  107. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/base.py +0 -0
  108. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
  109. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
  110. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
  111. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/types.py +0 -0
  112. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
  113. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/alb_event.py +0 -0
  114. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +0 -0
  115. {aws_lambda_powertools-2.36.0/aws_lambda_powertools/metrics/provider/cloudwatch_emf → aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/data_classes/appsync}/__init__.py +0 -0
  116. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py +0 -0
  117. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
  118. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py +0 -0
  119. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +0 -0
  120. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py +0 -0
  121. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py +0 -0
  122. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py +0 -0
  123. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +0 -0
  124. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py +0 -0
  125. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py +0 -0
  126. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +0 -0
  127. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
  128. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
  129. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
  130. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
  131. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py +0 -0
  132. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
  133. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py +0 -0
  134. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/s3_event.py +0 -0
  135. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
  136. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
  137. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
  138. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/__init__.py +0 -0
  139. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/base.py +0 -0
  140. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/constants.py +0 -0
  141. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/exceptions.py +0 -0
  142. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/__init__.py +0 -0
  143. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/base.py +0 -0
  144. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/__init__.py +0 -0
  145. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +0 -0
  146. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
  147. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
  148. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
  149. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
  150. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
  151. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
  152. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
  153. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
  154. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
  155. {aws_lambda_powertools-2.36.0/aws_lambda_powertools/utilities/data_classes/appsync → aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/idempotency/persistence}/__init__.py +0 -0
  156. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
  157. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +0 -0
  158. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
  159. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +0 -0
  160. {aws_lambda_powertools-2.36.0/aws_lambda_powertools/utilities/idempotency/persistence → aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/idempotency/serialization}/__init__.py +0 -0
  161. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
  162. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
  163. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
  164. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
  165. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
  166. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
  167. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
  168. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
  169. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
  170. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
  171. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
  172. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
  173. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/secrets.py +0 -0
  174. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
  175. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
  176. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
  177. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/compat.py +0 -0
  178. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
  179. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
  180. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
  181. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
  182. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
  183. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
  184. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
  185. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
  186. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
  187. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
  188. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
  189. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
  190. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
  191. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
  192. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
  193. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
  194. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
  195. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
  196. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
  197. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
  198. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
  199. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
  200. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
  201. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
  202. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
  203. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
  204. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
  205. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
  206. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
  207. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
  208. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
  209. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3.py +0 -0
  210. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3_batch_operation.py +0 -0
  211. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
  212. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
  213. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
  214. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
  215. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
  216. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
  217. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/parser.py +0 -0
  218. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
  219. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/types.py +0 -0
  220. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/serialization.py +0 -0
  221. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
  222. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
  223. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
  224. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
  225. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
  226. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
  227. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
  228. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
  229. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
  230. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
  231. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
  232. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_client_context_mobile_client.py +0 -0
  233. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
  234. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
  235. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
  236. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/base.py +0 -0
  237. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
  238. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
  239. {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.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.37.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
@@ -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,7 @@ class BaseRouter(ABC):
1197
1218
  tags,
1198
1219
  operation_id,
1199
1220
  include_in_schema,
1221
+ security,
1200
1222
  middlewares,
1201
1223
  )
1202
1224
 
@@ -1419,6 +1441,8 @@ class ApiGatewayResolver(BaseRouter):
1419
1441
  terms_of_service: Optional[str] = None,
1420
1442
  contact: Optional["Contact"] = None,
1421
1443
  license_info: Optional["License"] = None,
1444
+ security_schemes: Optional[Dict[str, "SecurityScheme"]] = None,
1445
+ security: Optional[List[Dict[str, List[str]]]] = None,
1422
1446
  ) -> "OpenAPI":
1423
1447
  """
1424
1448
  Returns the OpenAPI schema as a pydantic model.
@@ -1445,6 +1469,10 @@ class ApiGatewayResolver(BaseRouter):
1445
1469
  The contact information for the exposed API.
1446
1470
  license_info: License, optional
1447
1471
  The license information for the exposed API.
1472
+ security_schemes: Dict[str, "SecurityScheme"]], optional
1473
+ A declaration of the security schemes available to be used in the specification.
1474
+ security: List[Dict[str, List[str]]], optional
1475
+ A declaration of which security mechanisms are applied globally across the API.
1448
1476
 
1449
1477
  Returns
1450
1478
  -------
@@ -1457,25 +1485,12 @@ class ApiGatewayResolver(BaseRouter):
1457
1485
  get_compat_model_name_map,
1458
1486
  get_definitions,
1459
1487
  )
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
1488
+ from aws_lambda_powertools.event_handler.openapi.models import OpenAPI, PathItem, Tag
1462
1489
  from aws_lambda_powertools.event_handler.openapi.types import (
1463
1490
  COMPONENT_REF_TEMPLATE,
1464
1491
  )
1465
1492
 
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"
1493
+ openapi_version = self._determine_openapi_version(openapi_version)
1479
1494
 
1480
1495
  # Start with the bare minimum required for a valid OpenAPI schema
1481
1496
  info: Dict[str, Any] = {"title": title, "version": version}
@@ -1490,13 +1505,12 @@ class ApiGatewayResolver(BaseRouter):
1490
1505
 
1491
1506
  info.update({field: value for field, value in optional_fields.items() if value})
1492
1507
 
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="/")]
1508
+ output: Dict[str, Any] = {
1509
+ "openapi": openapi_version,
1510
+ "info": info,
1511
+ "servers": self._get_openapi_servers(servers),
1512
+ "security": self._get_openapi_security(security, security_schemes),
1513
+ }
1500
1514
 
1501
1515
  components: Dict[str, Dict[str, Any]] = {}
1502
1516
  paths: Dict[str, Dict[str, Any]] = {}
@@ -1534,6 +1548,8 @@ class ApiGatewayResolver(BaseRouter):
1534
1548
 
1535
1549
  if definitions:
1536
1550
  components["schemas"] = {k: definitions[k] for k in sorted(definitions)}
1551
+ if security_schemes:
1552
+ components["securitySchemes"] = security_schemes
1537
1553
  if components:
1538
1554
  output["components"] = components
1539
1555
  if tags:
@@ -1543,6 +1559,50 @@ class ApiGatewayResolver(BaseRouter):
1543
1559
 
1544
1560
  return OpenAPI(**output)
1545
1561
 
1562
+ @staticmethod
1563
+ def _get_openapi_servers(servers: Optional[List["Server"]]) -> List["Server"]:
1564
+ from aws_lambda_powertools.event_handler.openapi.models import Server
1565
+
1566
+ # If the 'servers' property is not provided or is an empty array,
1567
+ # the default behavior is to return a Server Object with a URL value of "/".
1568
+ return servers if servers else [Server(url="/")]
1569
+
1570
+ @staticmethod
1571
+ def _get_openapi_security(
1572
+ security: Optional[List[Dict[str, List[str]]]],
1573
+ security_schemes: Optional[Dict[str, "SecurityScheme"]],
1574
+ ) -> Optional[List[Dict[str, List[str]]]]:
1575
+ if not security:
1576
+ return None
1577
+
1578
+ if not security_schemes:
1579
+ raise ValueError("security_schemes must be provided if security is provided")
1580
+
1581
+ # Check if all keys in security are present in the security_schemes
1582
+ if any(key not in security_schemes for sec in security for key in sec):
1583
+ raise ValueError("Some security schemes not found in security_schemes")
1584
+
1585
+ return security
1586
+
1587
+ @staticmethod
1588
+ def _determine_openapi_version(openapi_version):
1589
+ from aws_lambda_powertools.event_handler.openapi.pydantic_loader import PYDANTIC_V2
1590
+
1591
+ # Pydantic V2 has no support for OpenAPI schema 3.0
1592
+ if PYDANTIC_V2 and not openapi_version.startswith("3.1"):
1593
+ warnings.warn(
1594
+ "You are using Pydantic v2, which is incompatible with OpenAPI schema 3.0. Forcing OpenAPI 3.1",
1595
+ stacklevel=2,
1596
+ )
1597
+ openapi_version = "3.1.0"
1598
+ elif not PYDANTIC_V2 and not openapi_version.startswith("3.0"):
1599
+ warnings.warn(
1600
+ "You are using Pydantic v1, which is incompatible with OpenAPI schema 3.1. Forcing OpenAPI 3.0",
1601
+ stacklevel=2,
1602
+ )
1603
+ openapi_version = "3.0.3"
1604
+ return openapi_version
1605
+
1546
1606
  def get_openapi_json_schema(
1547
1607
  self,
1548
1608
  *,
@@ -1556,6 +1616,8 @@ class ApiGatewayResolver(BaseRouter):
1556
1616
  terms_of_service: Optional[str] = None,
1557
1617
  contact: Optional["Contact"] = None,
1558
1618
  license_info: Optional["License"] = None,
1619
+ security_schemes: Optional[Dict[str, "SecurityScheme"]] = None,
1620
+ security: Optional[List[Dict[str, List[str]]]] = None,
1559
1621
  ) -> str:
1560
1622
  """
1561
1623
  Returns the OpenAPI schema as a JSON serializable dict
@@ -1582,6 +1644,10 @@ class ApiGatewayResolver(BaseRouter):
1582
1644
  The contact information for the exposed API.
1583
1645
  license_info: License, optional
1584
1646
  The license information for the exposed API.
1647
+ security_schemes: Dict[str, "SecurityScheme"]], optional
1648
+ A declaration of the security schemes available to be used in the specification.
1649
+ security: List[Dict[str, List[str]]], optional
1650
+ A declaration of which security mechanisms are applied globally across the API.
1585
1651
 
1586
1652
  Returns
1587
1653
  -------
@@ -1602,6 +1668,8 @@ class ApiGatewayResolver(BaseRouter):
1602
1668
  terms_of_service=terms_of_service,
1603
1669
  contact=contact,
1604
1670
  license_info=license_info,
1671
+ security_schemes=security_schemes,
1672
+ security=security,
1605
1673
  ),
1606
1674
  by_alias=True,
1607
1675
  exclude_none=True,
@@ -1625,6 +1693,9 @@ class ApiGatewayResolver(BaseRouter):
1625
1693
  swagger_base_url: Optional[str] = None,
1626
1694
  middlewares: Optional[List[Callable[..., Response]]] = None,
1627
1695
  compress: bool = False,
1696
+ security_schemes: Optional[Dict[str, "SecurityScheme"]] = None,
1697
+ security: Optional[List[Dict[str, List[str]]]] = None,
1698
+ oauth2_config: Optional["OAuth2Config"] = None,
1628
1699
  ):
1629
1700
  """
1630
1701
  Returns the OpenAPI schema as a JSON serializable dict
@@ -1659,12 +1730,34 @@ class ApiGatewayResolver(BaseRouter):
1659
1730
  List of middlewares to be used for the swagger route.
1660
1731
  compress: bool, default = False
1661
1732
  Whether or not to enable gzip compression swagger route.
1733
+ security_schemes: Dict[str, "SecurityScheme"], optional
1734
+ A declaration of the security schemes available to be used in the specification.
1735
+ security: List[Dict[str, List[str]]], optional
1736
+ A declaration of which security mechanisms are applied globally across the API.
1737
+ oauth2_config: OAuth2Config, optional
1738
+ The OAuth2 configuration for the Swagger UI.
1662
1739
  """
1663
1740
  from aws_lambda_powertools.event_handler.openapi.compat import model_json
1664
1741
  from aws_lambda_powertools.event_handler.openapi.models import Server
1742
+ from aws_lambda_powertools.event_handler.openapi.swagger_ui import (
1743
+ generate_oauth2_redirect_html,
1744
+ generate_swagger_html,
1745
+ )
1665
1746
 
1666
1747
  @self.get(path, middlewares=middlewares, include_in_schema=False, compress=compress)
1667
1748
  def swagger_handler():
1749
+ query_params = self.current_event.query_string_parameters or {}
1750
+
1751
+ # Check for query parameters; if "format" is specified as "oauth2-redirect",
1752
+ # send the oauth2-redirect HTML stanza so OAuth2 can be used
1753
+ # Source: https://github.com/swagger-api/swagger-ui/blob/master/dist/oauth2-redirect.html
1754
+ if query_params.get("format") == "oauth2-redirect":
1755
+ return Response(
1756
+ status_code=200,
1757
+ content_type="text/html",
1758
+ body=generate_oauth2_redirect_html(),
1759
+ )
1760
+
1668
1761
  base_path = self._get_base_path()
1669
1762
 
1670
1763
  if swagger_base_url:
@@ -1690,6 +1783,8 @@ class ApiGatewayResolver(BaseRouter):
1690
1783
  terms_of_service=terms_of_service,
1691
1784
  contact=contact,
1692
1785
  license_info=license_info,
1786
+ security_schemes=security_schemes,
1787
+ security=security,
1693
1788
  )
1694
1789
 
1695
1790
  # The .replace('</', '<\\/') part is necessary to prevent a potential issue where the JSON string contains
@@ -1705,7 +1800,6 @@ class ApiGatewayResolver(BaseRouter):
1705
1800
  # Check for query parameters; if "format" is specified as "json",
1706
1801
  # respond with the JSON used in the OpenAPI spec
1707
1802
  # Example: https://www.example.com/swagger?format=json
1708
- query_params = self.current_event.query_string_parameters or {}
1709
1803
  if query_params.get("format") == "json":
1710
1804
  return Response(
1711
1805
  status_code=200,
@@ -1719,6 +1813,7 @@ class ApiGatewayResolver(BaseRouter):
1719
1813
  swagger_js,
1720
1814
  swagger_css,
1721
1815
  swagger_base_url,
1816
+ oauth2_config,
1722
1817
  )
1723
1818
 
1724
1819
  return Response(
@@ -1741,6 +1836,7 @@ class ApiGatewayResolver(BaseRouter):
1741
1836
  tags: Optional[List[str]] = None,
1742
1837
  operation_id: Optional[str] = None,
1743
1838
  include_in_schema: bool = True,
1839
+ security: Optional[List[Dict[str, List[str]]]] = None,
1744
1840
  middlewares: Optional[List[Callable[..., Any]]] = None,
1745
1841
  ):
1746
1842
  """Route decorator includes parameter `method`"""
@@ -1767,6 +1863,7 @@ class ApiGatewayResolver(BaseRouter):
1767
1863
  tags,
1768
1864
  operation_id,
1769
1865
  include_in_schema,
1866
+ security,
1770
1867
  middlewares,
1771
1868
  )
1772
1869
 
@@ -2218,6 +2315,7 @@ class Router(BaseRouter):
2218
2315
  tags: Optional[List[str]] = None,
2219
2316
  operation_id: Optional[str] = None,
2220
2317
  include_in_schema: bool = True,
2318
+ security: Optional[List[Dict[str, List[str]]]] = None,
2221
2319
  middlewares: Optional[List[Callable[..., Any]]] = None,
2222
2320
  ):
2223
2321
  def register_route(func: Callable):
@@ -2239,6 +2337,7 @@ class Router(BaseRouter):
2239
2337
  frozen_tags,
2240
2338
  operation_id,
2241
2339
  include_in_schema,
2340
+ security,
2242
2341
  )
2243
2342
 
2244
2343
  # Collate Middleware for routes
@@ -2318,6 +2417,7 @@ class APIGatewayRestResolver(ApiGatewayResolver):
2318
2417
  tags: Optional[List[str]] = None,
2319
2418
  operation_id: Optional[str] = None,
2320
2419
  include_in_schema: bool = True,
2420
+ security: Optional[List[Dict[str, List[str]]]] = None,
2321
2421
  middlewares: Optional[List[Callable[..., Any]]] = None,
2322
2422
  ):
2323
2423
  # NOTE: see #1552 for more context.
@@ -2334,6 +2434,7 @@ class APIGatewayRestResolver(ApiGatewayResolver):
2334
2434
  tags,
2335
2435
  operation_id,
2336
2436
  include_in_schema,
2437
+ security,
2337
2438
  middlewares,
2338
2439
  )
2339
2440
 
@@ -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
 
@@ -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):
@@ -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
+ ]
@@ -1,4 +1,16 @@
1
- def generate_swagger_html(spec: str, path: str, swagger_js: str, swagger_css: str, swagger_base_url: str) -> str:
1
+ from typing import Optional
2
+
3
+ from aws_lambda_powertools.event_handler.openapi.swagger_ui.oauth2 import OAuth2Config
4
+
5
+
6
+ def generate_swagger_html(
7
+ spec: str,
8
+ path: str,
9
+ swagger_js: str,
10
+ swagger_css: str,
11
+ swagger_base_url: str,
12
+ oauth2_config: Optional[OAuth2Config],
13
+ ) -> str:
2
14
  """
3
15
  Generate Swagger UI HTML page
4
16
 
@@ -8,10 +20,14 @@ def generate_swagger_html(spec: str, path: str, swagger_js: str, swagger_css: st
8
20
  The OpenAPI spec
9
21
  path: str
10
22
  The path to the Swagger documentation
11
- js_url: str
12
- The URL to the Swagger UI JavaScript file
13
- css_url: str
14
- The URL to the Swagger UI CSS file
23
+ swagger_js: str
24
+ Swagger UI JavaScript source code or URL
25
+ swagger_css: str
26
+ Swagger UI CSS source code or URL
27
+ swagger_base_url: str
28
+ The base URL for Swagger UI
29
+ oauth2_config: OAuth2Config, optional
30
+ The OAuth2 configuration.
15
31
  """
16
32
 
17
33
  # If Swagger base URL is present, generate HTML content with linked CSS and JavaScript files
@@ -23,6 +39,11 @@ def generate_swagger_html(spec: str, path: str, swagger_js: str, swagger_css: st
23
39
  swagger_css_content = f"<style>{swagger_css}</style>"
24
40
  swagger_js_content = f"<script>{swagger_js}</script>"
25
41
 
42
+ # Prepare oauth2 config
43
+ oauth2_content = (
44
+ f"ui.initOAuth({oauth2_config.json(exclude_none=True, exclude_unset=True)});" if oauth2_config else ""
45
+ )
46
+
26
47
  return f"""
27
48
  <!DOCTYPE html>
28
49
  <html>
@@ -45,6 +66,9 @@ def generate_swagger_html(spec: str, path: str, swagger_js: str, swagger_css: st
45
66
  {swagger_js_content}
46
67
 
47
68
  <script>
69
+ var currentUrl = new URL(window.location.href);
70
+ var baseUrl = currentUrl.protocol + "//" + currentUrl.host + currentUrl.pathname;
71
+
48
72
  var swaggerUIOptions = {{
49
73
  dom_id: "#swagger-ui",
50
74
  docExpansion: "list",
@@ -60,11 +84,14 @@ def generate_swagger_html(spec: str, path: str, swagger_js: str, swagger_css: st
60
84
  ],
61
85
  plugins: [
62
86
  SwaggerUIBundle.plugins.DownloadUrl
63
- ]
87
+ ],
88
+ withCredentials: true,
89
+ oauth2RedirectUrl: baseUrl + "?format=oauth2-redirect",
64
90
  }}
65
91
 
66
92
  var ui = SwaggerUIBundle(swaggerUIOptions)
67
93
  ui.specActions.updateUrl('{path}?format=json');
94
+ {oauth2_content}
68
95
  </script>
69
96
  </html>
70
97
  """.strip()