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.
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/PKG-INFO +2 -2
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/api_gateway.py +125 -24
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/bedrock_agent.py +15 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/models.py +2 -1
- aws_lambda_powertools-2.37.0/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +13 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +33 -6
- aws_lambda_powertools-2.37.0/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +158 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/formatter.py +6 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/logger.py +3 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/version.py +1 -1
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +1 -1
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +18 -2
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/common.py +9 -3
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +18 -2
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +18 -2
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +38 -4
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +7 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +9 -3
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/__init__.py +4 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/base.py +12 -2
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/config.py +5 -0
- aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/idempotency/hook.py +13 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/sqs.py +1 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/pyproject.toml +15 -15
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/setup.py +2 -2
- aws_lambda_powertools-2.36.0/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/LICENSE +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/README.md +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/THIRD-PARTY-LICENSES +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/appsync.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/content_types.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/compat.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +0 -0
- {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
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/router.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/types.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/util.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/exceptions/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/filters.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/lambda_context.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/types.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/logging/utils.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/functions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/metric.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/metrics.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/base.py +0 -0
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/metrics/types.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/package_logger.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/py.typed +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/cache_dict.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/constants.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/cookies.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/functions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/json_encoder.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/lazy_import.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/types.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/shared/user_agent.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/extensions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/tracing/tracer.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/batch/types.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/alb_event.py +0 -0
- {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
- {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
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/s3_event.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/constants.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/__init__.py +0 -0
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +0 -0
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/secrets.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/compat.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3_batch_operation.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/parser.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/parser/types.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/serialization.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
- {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
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/base.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
- {aws_lambda_powertools-2.36.0 → aws_lambda_powertools-2.37.0}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
- {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.
|
|
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.
|
|
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,
|
|
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
|
-
|
|
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] = {
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
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):
|
aws_lambda_powertools-2.37.0/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py
ADDED
|
@@ -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
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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()
|