aws-lambda-powertools 2.35.1__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 (243) hide show
  1. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/PKG-INFO +2 -2
  2. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/api_gateway.py +176 -56
  3. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/bedrock_agent.py +15 -0
  4. {aws_lambda_powertools-2.35.1 → 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.35.1 → 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.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/types.py +1 -1
  9. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/formatter.py +6 -0
  10. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/logger.py +4 -1
  11. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/base.py +32 -1
  12. aws_lambda_powertools-2.37.0/aws_lambda_powertools/metrics/functions.py +137 -0
  13. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/metrics.py +13 -0
  14. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +29 -1
  15. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/constants.py +41 -33
  16. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/functions.py +5 -7
  17. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/version.py +1 -1
  18. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/tracer.py +14 -7
  19. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/exceptions.py +16 -0
  20. aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +114 -0
  21. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/__init__.py +14 -0
  22. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +1 -1
  23. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +15 -4
  24. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +18 -2
  25. aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py +243 -0
  26. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/common.py +17 -8
  27. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +18 -2
  28. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +18 -2
  29. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +38 -4
  30. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +7 -0
  31. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +9 -3
  32. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/__init__.py +4 -0
  33. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/base.py +12 -2
  34. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/config.py +5 -0
  35. aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/idempotency/hook.py +13 -0
  36. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/__init__.py +4 -2
  37. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/base.py +6 -0
  38. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/exceptions.py +8 -0
  39. aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/parameters/secrets.py +444 -0
  40. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/ssm.py +209 -4
  41. aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/parameters/types.py +20 -0
  42. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/sqs.py +1 -0
  43. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/pyproject.toml +25 -25
  44. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/setup.py +2 -2
  45. aws_lambda_powertools-2.35.1/aws_lambda_powertools/metrics/functions.py +0 -71
  46. aws_lambda_powertools-2.35.1/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -92
  47. aws_lambda_powertools-2.35.1/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
  48. aws_lambda_powertools-2.35.1/aws_lambda_powertools/utilities/parameters/secrets.py +0 -184
  49. aws_lambda_powertools-2.35.1/aws_lambda_powertools/utilities/parameters/types.py +0 -3
  50. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/LICENSE +0 -0
  51. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/README.md +0 -0
  52. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/THIRD-PARTY-LICENSES +0 -0
  53. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/__init__.py +0 -0
  54. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/__init__.py +0 -0
  55. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/appsync.py +0 -0
  56. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/content_types.py +0 -0
  57. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
  58. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
  59. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
  60. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
  61. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +0 -0
  62. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
  63. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/__init__.py +0 -0
  64. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/compat.py +0 -0
  65. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
  66. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
  67. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
  68. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
  69. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
  70. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +0 -0
  71. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js +0 -0
  72. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css +0 -0
  73. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/router.py +0 -0
  74. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/types.py +0 -0
  75. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/util.py +0 -0
  76. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
  77. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/exceptions/__init__.py +0 -0
  78. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/__init__.py +0 -0
  79. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
  80. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/exceptions.py +0 -0
  81. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/filters.py +0 -0
  82. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
  83. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
  84. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/lambda_context.py +0 -0
  85. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/types.py +0 -0
  86. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/utils.py +0 -0
  87. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/__init__.py +0 -0
  88. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/exceptions.py +0 -0
  89. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/metric.py +0 -0
  90. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
  91. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/base.py +0 -0
  92. {aws_lambda_powertools-2.35.1/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
  93. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
  94. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
  95. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
  96. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
  97. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
  98. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
  99. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +0 -0
  100. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +0 -0
  101. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
  102. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/types.py +0 -0
  103. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
  104. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
  105. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
  106. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/package_logger.py +0 -0
  107. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/py.typed +0 -0
  108. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/__init__.py +0 -0
  109. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/cache_dict.py +0 -0
  110. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/cookies.py +0 -0
  111. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
  112. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/json_encoder.py +0 -0
  113. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/lazy_import.py +0 -0
  114. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/types.py +0 -0
  115. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/user_agent.py +0 -0
  116. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/__init__.py +0 -0
  117. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/base.py +0 -0
  118. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/extensions.py +0 -0
  119. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/__init__.py +0 -0
  120. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
  121. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/base.py +0 -0
  122. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
  123. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/types.py +0 -0
  124. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/alb_event.py +0 -0
  125. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +0 -0
  126. {aws_lambda_powertools-2.35.1/aws_lambda_powertools/metrics/provider/cloudwatch_emf → aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/data_classes/appsync}/__init__.py +0 -0
  127. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py +0 -0
  128. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
  129. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py +0 -0
  130. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +0 -0
  131. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py +0 -0
  132. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py +0 -0
  133. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +0 -0
  134. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py +0 -0
  135. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py +0 -0
  136. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +0 -0
  137. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
  138. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
  139. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
  140. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
  141. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py +0 -0
  142. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
  143. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py +0 -0
  144. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/s3_event.py +0 -0
  145. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
  146. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
  147. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
  148. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/__init__.py +0 -0
  149. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/base.py +0 -0
  150. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/constants.py +0 -0
  151. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/exceptions.py +0 -0
  152. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/__init__.py +0 -0
  153. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/base.py +0 -0
  154. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/__init__.py +0 -0
  155. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +0 -0
  156. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
  157. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
  158. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
  159. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
  160. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
  161. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
  162. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
  163. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
  164. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
  165. {aws_lambda_powertools-2.35.1/aws_lambda_powertools/utilities/data_classes/appsync → aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/idempotency/persistence}/__init__.py +0 -0
  166. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
  167. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +0 -0
  168. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
  169. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +0 -0
  170. {aws_lambda_powertools-2.35.1/aws_lambda_powertools/utilities/idempotency/persistence → aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/idempotency/serialization}/__init__.py +0 -0
  171. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
  172. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
  173. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
  174. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
  175. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
  176. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
  177. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
  178. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
  179. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
  180. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
  181. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/compat.py +0 -0
  182. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
  183. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
  184. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
  185. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
  186. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
  187. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
  188. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
  189. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
  190. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
  191. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
  192. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
  193. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
  194. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
  195. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
  196. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
  197. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
  198. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
  199. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
  200. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
  201. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
  202. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
  203. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
  204. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
  205. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
  206. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
  207. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
  208. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
  209. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
  210. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
  211. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
  212. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
  213. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3.py +0 -0
  214. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3_batch_operation.py +0 -0
  215. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
  216. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
  217. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
  218. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
  219. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
  220. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
  221. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/parser.py +0 -0
  222. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
  223. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/types.py +0 -0
  224. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/serialization.py +0 -0
  225. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
  226. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
  227. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
  228. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
  229. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
  230. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
  231. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
  232. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
  233. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
  234. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
  235. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
  236. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_client_context_mobile_client.py +0 -0
  237. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
  238. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
  239. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
  240. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/base.py +0 -0
  241. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
  242. {aws_lambda_powertools-2.35.1 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
  243. {aws_lambda_powertools-2.35.1 → 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.35.1
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}
@@ -503,6 +514,18 @@ class Route:
503
514
  if request_body_oai:
504
515
  operation["requestBody"] = request_body_oai
505
516
 
517
+ # Validation failure response (422) will always be part of the schema
518
+ operation_responses: Dict[int, OpenAPIResponse] = {
519
+ 422: {
520
+ "description": "Validation Error",
521
+ "content": {
522
+ "application/json": {
523
+ "schema": {"$ref": COMPONENT_REF_PREFIX + "HTTPValidationError"},
524
+ },
525
+ },
526
+ },
527
+ }
528
+
506
529
  # Add the response to the OpenAPI operation
507
530
  if self.responses:
508
531
  for status_code in list(self.responses):
@@ -549,45 +572,34 @@ class Route:
549
572
 
550
573
  response["content"][content_type] = new_payload
551
574
 
552
- operation["responses"] = self.responses
575
+ # Merge the user provided response with the default responses
576
+ operation_responses[status_code] = response
553
577
  else:
554
578
  # Set the default 200 response
555
- responses = operation.setdefault("responses", {})
556
- success_response = responses.setdefault(200, {})
557
- success_response["description"] = self.response_description or _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION
558
- success_response["content"] = {"application/json": {"schema": {}}}
559
- json_response = success_response["content"].setdefault("application/json", {})
560
-
561
- # Add the response schema to the OpenAPI 200 response
562
- json_response.update(
563
- self._openapi_operation_return(
564
- param=dependant.return_param,
565
- model_name_map=model_name_map,
566
- field_mapping=field_mapping,
567
- ),
579
+ response_schema = self._openapi_operation_return(
580
+ param=dependant.return_param,
581
+ model_name_map=model_name_map,
582
+ field_mapping=field_mapping,
568
583
  )
569
584
 
570
- # Add validation failure response (422)
571
- operation["responses"][422] = {
572
- "description": "Validation Error",
573
- "content": {
574
- "application/json": {
575
- "schema": {"$ref": COMPONENT_REF_PREFIX + "HTTPValidationError"},
576
- },
577
- },
585
+ # Add the response schema to the OpenAPI 200 response
586
+ operation_responses[200] = {
587
+ "description": self.response_description or _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
588
+ "content": {"application/json": response_schema},
578
589
  }
579
590
 
580
- # Add the validation error schema to the definitions, but only if it hasn't been added yet
581
- if "ValidationError" not in definitions:
582
- definitions.update(
583
- {
584
- "ValidationError": validation_error_definition,
585
- "HTTPValidationError": validation_error_response_definition,
586
- },
587
- )
588
-
591
+ operation["responses"] = operation_responses
589
592
  path[self.method.lower()] = operation
590
593
 
594
+ # Add the validation error schema to the definitions, but only if it hasn't been added yet
595
+ if "ValidationError" not in definitions:
596
+ definitions.update(
597
+ {
598
+ "ValidationError": validation_error_definition,
599
+ "HTTPValidationError": validation_error_response_definition,
600
+ },
601
+ )
602
+
591
603
  # Generate the response schema
592
604
  return path, definitions
593
605
 
@@ -884,6 +896,7 @@ class BaseRouter(ABC):
884
896
  tags: Optional[List[str]] = None,
885
897
  operation_id: Optional[str] = None,
886
898
  include_in_schema: bool = True,
899
+ security: Optional[List[Dict[str, List[str]]]] = None,
887
900
  middlewares: Optional[List[Callable[..., Any]]] = None,
888
901
  ):
889
902
  raise NotImplementedError()
@@ -942,6 +955,7 @@ class BaseRouter(ABC):
942
955
  tags: Optional[List[str]] = None,
943
956
  operation_id: Optional[str] = None,
944
957
  include_in_schema: bool = True,
958
+ security: Optional[List[Dict[str, List[str]]]] = None,
945
959
  middlewares: Optional[List[Callable[..., Any]]] = None,
946
960
  ):
947
961
  """Get route decorator with GET `method`
@@ -979,6 +993,7 @@ class BaseRouter(ABC):
979
993
  tags,
980
994
  operation_id,
981
995
  include_in_schema,
996
+ security,
982
997
  middlewares,
983
998
  )
984
999
 
@@ -995,6 +1010,7 @@ class BaseRouter(ABC):
995
1010
  tags: Optional[List[str]] = None,
996
1011
  operation_id: Optional[str] = None,
997
1012
  include_in_schema: bool = True,
1013
+ security: Optional[List[Dict[str, List[str]]]] = None,
998
1014
  middlewares: Optional[List[Callable[..., Any]]] = None,
999
1015
  ):
1000
1016
  """Post route decorator with POST `method`
@@ -1033,6 +1049,7 @@ class BaseRouter(ABC):
1033
1049
  tags,
1034
1050
  operation_id,
1035
1051
  include_in_schema,
1052
+ security,
1036
1053
  middlewares,
1037
1054
  )
1038
1055
 
@@ -1049,6 +1066,7 @@ class BaseRouter(ABC):
1049
1066
  tags: Optional[List[str]] = None,
1050
1067
  operation_id: Optional[str] = None,
1051
1068
  include_in_schema: bool = True,
1069
+ security: Optional[List[Dict[str, List[str]]]] = None,
1052
1070
  middlewares: Optional[List[Callable[..., Any]]] = None,
1053
1071
  ):
1054
1072
  """Put route decorator with PUT `method`
@@ -1087,6 +1105,7 @@ class BaseRouter(ABC):
1087
1105
  tags,
1088
1106
  operation_id,
1089
1107
  include_in_schema,
1108
+ security,
1090
1109
  middlewares,
1091
1110
  )
1092
1111
 
@@ -1103,6 +1122,7 @@ class BaseRouter(ABC):
1103
1122
  tags: Optional[List[str]] = None,
1104
1123
  operation_id: Optional[str] = None,
1105
1124
  include_in_schema: bool = True,
1125
+ security: Optional[List[Dict[str, List[str]]]] = None,
1106
1126
  middlewares: Optional[List[Callable[..., Any]]] = None,
1107
1127
  ):
1108
1128
  """Delete route decorator with DELETE `method`
@@ -1140,6 +1160,7 @@ class BaseRouter(ABC):
1140
1160
  tags,
1141
1161
  operation_id,
1142
1162
  include_in_schema,
1163
+ security,
1143
1164
  middlewares,
1144
1165
  )
1145
1166
 
@@ -1156,6 +1177,7 @@ class BaseRouter(ABC):
1156
1177
  tags: Optional[List[str]] = None,
1157
1178
  operation_id: Optional[str] = None,
1158
1179
  include_in_schema: bool = True,
1180
+ security: Optional[List[Dict[str, List[str]]]] = None,
1159
1181
  middlewares: Optional[List[Callable]] = None,
1160
1182
  ):
1161
1183
  """Patch route decorator with PATCH `method`
@@ -1196,6 +1218,7 @@ class BaseRouter(ABC):
1196
1218
  tags,
1197
1219
  operation_id,
1198
1220
  include_in_schema,
1221
+ security,
1199
1222
  middlewares,
1200
1223
  )
1201
1224
 
@@ -1418,6 +1441,8 @@ class ApiGatewayResolver(BaseRouter):
1418
1441
  terms_of_service: Optional[str] = None,
1419
1442
  contact: Optional["Contact"] = None,
1420
1443
  license_info: Optional["License"] = None,
1444
+ security_schemes: Optional[Dict[str, "SecurityScheme"]] = None,
1445
+ security: Optional[List[Dict[str, List[str]]]] = None,
1421
1446
  ) -> "OpenAPI":
1422
1447
  """
1423
1448
  Returns the OpenAPI schema as a pydantic model.
@@ -1444,6 +1469,10 @@ class ApiGatewayResolver(BaseRouter):
1444
1469
  The contact information for the exposed API.
1445
1470
  license_info: License, optional
1446
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.
1447
1476
 
1448
1477
  Returns
1449
1478
  -------
@@ -1456,25 +1485,12 @@ class ApiGatewayResolver(BaseRouter):
1456
1485
  get_compat_model_name_map,
1457
1486
  get_definitions,
1458
1487
  )
1459
- from aws_lambda_powertools.event_handler.openapi.models import OpenAPI, PathItem, Server, Tag
1460
- 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
1461
1489
  from aws_lambda_powertools.event_handler.openapi.types import (
1462
1490
  COMPONENT_REF_TEMPLATE,
1463
1491
  )
1464
1492
 
1465
- # Pydantic V2 has no support for OpenAPI schema 3.0
1466
- if PYDANTIC_V2 and not openapi_version.startswith("3.1"):
1467
- warnings.warn(
1468
- "You are using Pydantic v2, which is incompatible with OpenAPI schema 3.0. Forcing OpenAPI 3.1",
1469
- stacklevel=2,
1470
- )
1471
- openapi_version = "3.1.0"
1472
- elif not PYDANTIC_V2 and not openapi_version.startswith("3.0"):
1473
- warnings.warn(
1474
- "You are using Pydantic v1, which is incompatible with OpenAPI schema 3.1. Forcing OpenAPI 3.0",
1475
- stacklevel=2,
1476
- )
1477
- openapi_version = "3.0.3"
1493
+ openapi_version = self._determine_openapi_version(openapi_version)
1478
1494
 
1479
1495
  # Start with the bare minimum required for a valid OpenAPI schema
1480
1496
  info: Dict[str, Any] = {"title": title, "version": version}
@@ -1489,13 +1505,12 @@ class ApiGatewayResolver(BaseRouter):
1489
1505
 
1490
1506
  info.update({field: value for field, value in optional_fields.items() if value})
1491
1507
 
1492
- output: Dict[str, Any] = {"openapi": openapi_version, "info": info}
1493
- if servers:
1494
- output["servers"] = servers
1495
- else:
1496
- # If the servers property is not provided, or is an empty array, the default value would be a Server Object
1497
- # with an url value of /.
1498
- 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
+ }
1499
1514
 
1500
1515
  components: Dict[str, Dict[str, Any]] = {}
1501
1516
  paths: Dict[str, Dict[str, Any]] = {}
@@ -1533,6 +1548,8 @@ class ApiGatewayResolver(BaseRouter):
1533
1548
 
1534
1549
  if definitions:
1535
1550
  components["schemas"] = {k: definitions[k] for k in sorted(definitions)}
1551
+ if security_schemes:
1552
+ components["securitySchemes"] = security_schemes
1536
1553
  if components:
1537
1554
  output["components"] = components
1538
1555
  if tags:
@@ -1542,6 +1559,50 @@ class ApiGatewayResolver(BaseRouter):
1542
1559
 
1543
1560
  return OpenAPI(**output)
1544
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
+
1545
1606
  def get_openapi_json_schema(
1546
1607
  self,
1547
1608
  *,
@@ -1555,6 +1616,8 @@ class ApiGatewayResolver(BaseRouter):
1555
1616
  terms_of_service: Optional[str] = None,
1556
1617
  contact: Optional["Contact"] = None,
1557
1618
  license_info: Optional["License"] = None,
1619
+ security_schemes: Optional[Dict[str, "SecurityScheme"]] = None,
1620
+ security: Optional[List[Dict[str, List[str]]]] = None,
1558
1621
  ) -> str:
1559
1622
  """
1560
1623
  Returns the OpenAPI schema as a JSON serializable dict
@@ -1581,6 +1644,10 @@ class ApiGatewayResolver(BaseRouter):
1581
1644
  The contact information for the exposed API.
1582
1645
  license_info: License, optional
1583
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.
1584
1651
 
1585
1652
  Returns
1586
1653
  -------
@@ -1601,6 +1668,8 @@ class ApiGatewayResolver(BaseRouter):
1601
1668
  terms_of_service=terms_of_service,
1602
1669
  contact=contact,
1603
1670
  license_info=license_info,
1671
+ security_schemes=security_schemes,
1672
+ security=security,
1604
1673
  ),
1605
1674
  by_alias=True,
1606
1675
  exclude_none=True,
@@ -1623,6 +1692,10 @@ class ApiGatewayResolver(BaseRouter):
1623
1692
  license_info: Optional["License"] = None,
1624
1693
  swagger_base_url: Optional[str] = None,
1625
1694
  middlewares: Optional[List[Callable[..., Response]]] = None,
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,
1626
1699
  ):
1627
1700
  """
1628
1701
  Returns the OpenAPI schema as a JSON serializable dict
@@ -1655,12 +1728,36 @@ class ApiGatewayResolver(BaseRouter):
1655
1728
  The base url for the swagger UI. If not provided, we will serve a recent version of the Swagger UI.
1656
1729
  middlewares: List[Callable[..., Response]], optional
1657
1730
  List of middlewares to be used for the swagger route.
1731
+ compress: bool, default = False
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.
1658
1739
  """
1659
1740
  from aws_lambda_powertools.event_handler.openapi.compat import model_json
1660
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
+ )
1661
1746
 
1662
- @self.get(path, middlewares=middlewares, include_in_schema=False)
1747
+ @self.get(path, middlewares=middlewares, include_in_schema=False, compress=compress)
1663
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
+
1664
1761
  base_path = self._get_base_path()
1665
1762
 
1666
1763
  if swagger_base_url:
@@ -1686,6 +1783,8 @@ class ApiGatewayResolver(BaseRouter):
1686
1783
  terms_of_service=terms_of_service,
1687
1784
  contact=contact,
1688
1785
  license_info=license_info,
1786
+ security_schemes=security_schemes,
1787
+ security=security,
1689
1788
  )
1690
1789
 
1691
1790
  # The .replace('</', '<\\/') part is necessary to prevent a potential issue where the JSON string contains
@@ -1701,7 +1800,6 @@ class ApiGatewayResolver(BaseRouter):
1701
1800
  # Check for query parameters; if "format" is specified as "json",
1702
1801
  # respond with the JSON used in the OpenAPI spec
1703
1802
  # Example: https://www.example.com/swagger?format=json
1704
- query_params = self.current_event.query_string_parameters or {}
1705
1803
  if query_params.get("format") == "json":
1706
1804
  return Response(
1707
1805
  status_code=200,
@@ -1715,6 +1813,7 @@ class ApiGatewayResolver(BaseRouter):
1715
1813
  swagger_js,
1716
1814
  swagger_css,
1717
1815
  swagger_base_url,
1816
+ oauth2_config,
1718
1817
  )
1719
1818
 
1720
1819
  return Response(
@@ -1737,6 +1836,7 @@ class ApiGatewayResolver(BaseRouter):
1737
1836
  tags: Optional[List[str]] = None,
1738
1837
  operation_id: Optional[str] = None,
1739
1838
  include_in_schema: bool = True,
1839
+ security: Optional[List[Dict[str, List[str]]]] = None,
1740
1840
  middlewares: Optional[List[Callable[..., Any]]] = None,
1741
1841
  ):
1742
1842
  """Route decorator includes parameter `method`"""
@@ -1763,6 +1863,7 @@ class ApiGatewayResolver(BaseRouter):
1763
1863
  tags,
1764
1864
  operation_id,
1765
1865
  include_in_schema,
1866
+ security,
1766
1867
  middlewares,
1767
1868
  )
1768
1869
 
@@ -2130,6 +2231,9 @@ class ApiGatewayResolver(BaseRouter):
2130
2231
  logger.debug("Appending Router middlewares into App middlewares.")
2131
2232
  self._router_middlewares = self._router_middlewares + router._router_middlewares
2132
2233
 
2234
+ logger.debug("Appending Router exception_handler into App exception_handler.")
2235
+ self._exception_handlers.update(router._exception_handlers)
2236
+
2133
2237
  # use pointer to allow context clearance after event is processed e.g., resolve(evt, ctx)
2134
2238
  router.context = self.context
2135
2239
 
@@ -2195,6 +2299,7 @@ class Router(BaseRouter):
2195
2299
  self._routes_with_middleware: Dict[tuple, List[Callable]] = {}
2196
2300
  self.api_resolver: Optional[BaseRouter] = None
2197
2301
  self.context = {} # early init as customers might add context before event resolution
2302
+ self._exception_handlers: Dict[Type, Callable] = {}
2198
2303
 
2199
2304
  def route(
2200
2305
  self,
@@ -2210,6 +2315,7 @@ class Router(BaseRouter):
2210
2315
  tags: Optional[List[str]] = None,
2211
2316
  operation_id: Optional[str] = None,
2212
2317
  include_in_schema: bool = True,
2318
+ security: Optional[List[Dict[str, List[str]]]] = None,
2213
2319
  middlewares: Optional[List[Callable[..., Any]]] = None,
2214
2320
  ):
2215
2321
  def register_route(func: Callable):
@@ -2231,6 +2337,7 @@ class Router(BaseRouter):
2231
2337
  frozen_tags,
2232
2338
  operation_id,
2233
2339
  include_in_schema,
2340
+ security,
2234
2341
  )
2235
2342
 
2236
2343
  # Collate Middleware for routes
@@ -2249,6 +2356,17 @@ class Router(BaseRouter):
2249
2356
 
2250
2357
  return register_route
2251
2358
 
2359
+ def exception_handler(self, exc_class: Union[Type[Exception], List[Type[Exception]]]):
2360
+ def register_exception_handler(func: Callable):
2361
+ if isinstance(exc_class, list):
2362
+ for exp in exc_class:
2363
+ self._exception_handlers[exp] = func
2364
+ else:
2365
+ self._exception_handlers[exc_class] = func
2366
+ return func
2367
+
2368
+ return register_exception_handler
2369
+
2252
2370
 
2253
2371
  class APIGatewayRestResolver(ApiGatewayResolver):
2254
2372
  current_event: APIGatewayProxyEvent
@@ -2299,6 +2417,7 @@ class APIGatewayRestResolver(ApiGatewayResolver):
2299
2417
  tags: Optional[List[str]] = None,
2300
2418
  operation_id: Optional[str] = None,
2301
2419
  include_in_schema: bool = True,
2420
+ security: Optional[List[Dict[str, List[str]]]] = None,
2302
2421
  middlewares: Optional[List[Callable[..., Any]]] = None,
2303
2422
  ):
2304
2423
  # NOTE: see #1552 for more context.
@@ -2315,6 +2434,7 @@ class APIGatewayRestResolver(ApiGatewayResolver):
2315
2434
  tags,
2316
2435
  operation_id,
2317
2436
  include_in_schema,
2437
+ security,
2318
2438
  middlewares,
2319
2439
  )
2320
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
+ ]