aws-lambda-powertools 2.37.0__tar.gz → 2.38.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/PKG-INFO +1 -1
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/THIRD-PARTY-LICENSES +24 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/api_gateway.py +64 -3
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +1 -1
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/compat.py +1 -1
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +1 -1
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +4 -0
- aws_lambda_powertools-2.38.0/aws_lambda_powertools/logging/constants.py +5 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/exceptions.py +4 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/logger.py +34 -10
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/utils.py +16 -4
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/constants.py +2 -1
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/version.py +1 -1
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/types.py +2 -2
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/alb_event.py +1 -1
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +46 -45
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +1 -1
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/common.py +1 -1
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/s3_event.py +7 -7
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +2 -2
- aws_lambda_powertools-2.38.0/aws_lambda_powertools/utilities/data_masking/__init__.py +5 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/base.py +0 -4
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/compat.py +2 -2
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/s3.py +1 -1
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/parser.py +10 -9
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/pyproject.toml +20 -19
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/setup.py +1 -1
- aws_lambda_powertools-2.37.0/aws_lambda_powertools/utilities/data_masking/__init__.py +0 -11
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/LICENSE +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/README.md +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/appsync.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/content_types.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/models.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/router.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/types.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/util.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/exceptions/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/filters.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/formatter.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/lambda_context.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/types.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/functions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/metric.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/metrics.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/metrics/types.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/package_logger.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/py.typed +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/cache_dict.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/cookies.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/functions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/json_encoder.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/lazy_import.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/types.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/shared/user_agent.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/tracing/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/tracing/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/tracing/extensions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/tracing/tracer.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/appsync/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/constants.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/provider/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/provider/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/config.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/hook.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/persistence/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/secrets.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/s3_batch_operation.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/sqs.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/parser/types.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/serialization.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/typing/lambda_client_context_mobile_client.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/validation/base.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
- {aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/utilities/validation/validator.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: aws-lambda-powertools
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.38.0
|
|
4
4
|
Summary: Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity.
|
|
5
5
|
Home-page: https://github.com/aws-powertools/powertools-lambda-python
|
|
6
6
|
License: MIT
|
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
** FastAPI - https://github.com/tiangolo/fastapi/ - Used in the OpenAPI feature
|
|
2
|
+
|
|
3
|
+
The MIT License (MIT)
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2018 Sebastián Ramírez
|
|
6
|
+
|
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
in the Software without restriction, including without limitation the rights
|
|
10
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
furnished to do so, subject to the following conditions:
|
|
13
|
+
|
|
14
|
+
The above copyright notice and this permission notice shall be included in
|
|
15
|
+
all copies or substantial portions of the Software.
|
|
16
|
+
|
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
|
+
THE SOFTWARE.
|
|
24
|
+
|
|
1
25
|
** Tensorflow - https://github.com/tensorflow/tensorflow/
|
|
2
26
|
|
|
3
27
|
Apache License
|
|
@@ -1222,6 +1222,63 @@ class BaseRouter(ABC):
|
|
|
1222
1222
|
middlewares,
|
|
1223
1223
|
)
|
|
1224
1224
|
|
|
1225
|
+
def head(
|
|
1226
|
+
self,
|
|
1227
|
+
rule: str,
|
|
1228
|
+
cors: Optional[bool] = None,
|
|
1229
|
+
compress: bool = False,
|
|
1230
|
+
cache_control: Optional[str] = None,
|
|
1231
|
+
summary: Optional[str] = None,
|
|
1232
|
+
description: Optional[str] = None,
|
|
1233
|
+
responses: Optional[Dict[int, OpenAPIResponse]] = None,
|
|
1234
|
+
response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
|
|
1235
|
+
tags: Optional[List[str]] = None,
|
|
1236
|
+
operation_id: Optional[str] = None,
|
|
1237
|
+
include_in_schema: bool = True,
|
|
1238
|
+
security: Optional[List[Dict[str, List[str]]]] = None,
|
|
1239
|
+
middlewares: Optional[List[Callable]] = None,
|
|
1240
|
+
):
|
|
1241
|
+
"""Head route decorator with HEAD `method`
|
|
1242
|
+
|
|
1243
|
+
Examples
|
|
1244
|
+
--------
|
|
1245
|
+
Simple example with a custom lambda handler using the Tracer capture_lambda_handler decorator
|
|
1246
|
+
|
|
1247
|
+
```python
|
|
1248
|
+
from aws_lambda_powertools import Tracer
|
|
1249
|
+
from aws_lambda_powertools.event_handler import APIGatewayRestResolver, Response, content_types
|
|
1250
|
+
|
|
1251
|
+
tracer = Tracer()
|
|
1252
|
+
app = APIGatewayRestResolver()
|
|
1253
|
+
|
|
1254
|
+
@app.head("/head-call")
|
|
1255
|
+
def simple_head():
|
|
1256
|
+
return Response(status_code=200,
|
|
1257
|
+
content_type=content_types.APPLICATION_JSON,
|
|
1258
|
+
headers={"Content-Length": "123"})
|
|
1259
|
+
|
|
1260
|
+
@tracer.capture_lambda_handler
|
|
1261
|
+
def lambda_handler(event, context):
|
|
1262
|
+
return app.resolve(event, context)
|
|
1263
|
+
```
|
|
1264
|
+
"""
|
|
1265
|
+
return self.route(
|
|
1266
|
+
rule,
|
|
1267
|
+
"HEAD",
|
|
1268
|
+
cors,
|
|
1269
|
+
compress,
|
|
1270
|
+
cache_control,
|
|
1271
|
+
summary,
|
|
1272
|
+
description,
|
|
1273
|
+
responses,
|
|
1274
|
+
response_description,
|
|
1275
|
+
tags,
|
|
1276
|
+
operation_id,
|
|
1277
|
+
include_in_schema,
|
|
1278
|
+
security,
|
|
1279
|
+
middlewares,
|
|
1280
|
+
)
|
|
1281
|
+
|
|
1225
1282
|
def _push_processed_stack_frame(self, frame: str):
|
|
1226
1283
|
"""
|
|
1227
1284
|
Add Current Middleware to the Middleware Stack Frames
|
|
@@ -1589,13 +1646,13 @@ class ApiGatewayResolver(BaseRouter):
|
|
|
1589
1646
|
from aws_lambda_powertools.event_handler.openapi.pydantic_loader import PYDANTIC_V2
|
|
1590
1647
|
|
|
1591
1648
|
# Pydantic V2 has no support for OpenAPI schema 3.0
|
|
1592
|
-
if PYDANTIC_V2 and not openapi_version.startswith("3.1"):
|
|
1649
|
+
if PYDANTIC_V2 and not openapi_version.startswith("3.1"): # pragma: no cover
|
|
1593
1650
|
warnings.warn(
|
|
1594
1651
|
"You are using Pydantic v2, which is incompatible with OpenAPI schema 3.0. Forcing OpenAPI 3.1",
|
|
1595
1652
|
stacklevel=2,
|
|
1596
1653
|
)
|
|
1597
1654
|
openapi_version = "3.1.0"
|
|
1598
|
-
elif not PYDANTIC_V2 and not openapi_version.startswith("3.0"):
|
|
1655
|
+
elif not PYDANTIC_V2 and not openapi_version.startswith("3.0"): # pragma: no cover
|
|
1599
1656
|
warnings.warn(
|
|
1600
1657
|
"You are using Pydantic v1, which is incompatible with OpenAPI schema 3.1. Forcing OpenAPI 3.0",
|
|
1601
1658
|
stacklevel=2,
|
|
@@ -1696,6 +1753,7 @@ class ApiGatewayResolver(BaseRouter):
|
|
|
1696
1753
|
security_schemes: Optional[Dict[str, "SecurityScheme"]] = None,
|
|
1697
1754
|
security: Optional[List[Dict[str, List[str]]]] = None,
|
|
1698
1755
|
oauth2_config: Optional["OAuth2Config"] = None,
|
|
1756
|
+
persist_authorization: bool = False,
|
|
1699
1757
|
):
|
|
1700
1758
|
"""
|
|
1701
1759
|
Returns the OpenAPI schema as a JSON serializable dict
|
|
@@ -1736,6 +1794,8 @@ class ApiGatewayResolver(BaseRouter):
|
|
|
1736
1794
|
A declaration of which security mechanisms are applied globally across the API.
|
|
1737
1795
|
oauth2_config: OAuth2Config, optional
|
|
1738
1796
|
The OAuth2 configuration for the Swagger UI.
|
|
1797
|
+
persist_authorization: bool, optional
|
|
1798
|
+
Whether to persist authorization data on browser close/refresh.
|
|
1739
1799
|
"""
|
|
1740
1800
|
from aws_lambda_powertools.event_handler.openapi.compat import model_json
|
|
1741
1801
|
from aws_lambda_powertools.event_handler.openapi.models import Server
|
|
@@ -1814,6 +1874,7 @@ class ApiGatewayResolver(BaseRouter):
|
|
|
1814
1874
|
swagger_css,
|
|
1815
1875
|
swagger_base_url,
|
|
1816
1876
|
oauth2_config,
|
|
1877
|
+
persist_authorization,
|
|
1817
1878
|
)
|
|
1818
1879
|
|
|
1819
1880
|
return Response(
|
|
@@ -2135,7 +2196,7 @@ class ApiGatewayResolver(BaseRouter):
|
|
|
2135
2196
|
|
|
2136
2197
|
def exception_handler(self, exc_class: Union[Type[Exception], List[Type[Exception]]]):
|
|
2137
2198
|
def register_exception_handler(func: Callable):
|
|
2138
|
-
if isinstance(exc_class, list):
|
|
2199
|
+
if isinstance(exc_class, list): # pragma: no cover
|
|
2139
2200
|
for exp in exc_class:
|
|
2140
2201
|
self._exception_handlers[exp] = func
|
|
2141
2202
|
else:
|
|
@@ -410,7 +410,7 @@ def _normalize_multi_query_string_with_param(
|
|
|
410
410
|
return resolved_query_string
|
|
411
411
|
|
|
412
412
|
|
|
413
|
-
def _normalize_multi_header_values_with_param(headers:
|
|
413
|
+
def _normalize_multi_header_values_with_param(headers: Dict[str, Any], params: Sequence[ModelField]):
|
|
414
414
|
"""
|
|
415
415
|
Extract and normalize resolved_headers_field
|
|
416
416
|
|
|
@@ -40,7 +40,7 @@ sequence_types = tuple(sequence_annotation_to_type.keys())
|
|
|
40
40
|
|
|
41
41
|
RequestErrorModel: Type[BaseModel] = create_model("Request")
|
|
42
42
|
|
|
43
|
-
if PYDANTIC_V2:
|
|
43
|
+
if PYDANTIC_V2: # pragma: no cover # false positive; dropping in v3
|
|
44
44
|
from pydantic import TypeAdapter, ValidationError
|
|
45
45
|
from pydantic._internal._typing_extra import eval_type_lenient
|
|
46
46
|
from pydantic.fields import FieldInfo
|
|
@@ -10,6 +10,7 @@ def generate_swagger_html(
|
|
|
10
10
|
swagger_css: str,
|
|
11
11
|
swagger_base_url: str,
|
|
12
12
|
oauth2_config: Optional[OAuth2Config],
|
|
13
|
+
persist_authorization: bool = False,
|
|
13
14
|
) -> str:
|
|
14
15
|
"""
|
|
15
16
|
Generate Swagger UI HTML page
|
|
@@ -28,6 +29,8 @@ def generate_swagger_html(
|
|
|
28
29
|
The base URL for Swagger UI
|
|
29
30
|
oauth2_config: OAuth2Config, optional
|
|
30
31
|
The OAuth2 configuration.
|
|
32
|
+
persist_authorization: bool, optional
|
|
33
|
+
Whether to persist authorization data on browser close/refresh.
|
|
31
34
|
"""
|
|
32
35
|
|
|
33
36
|
# If Swagger base URL is present, generate HTML content with linked CSS and JavaScript files
|
|
@@ -86,6 +89,7 @@ def generate_swagger_html(
|
|
|
86
89
|
SwaggerUIBundle.plugins.DownloadUrl
|
|
87
90
|
],
|
|
88
91
|
withCredentials: true,
|
|
92
|
+
persistAuthorization: {str(persist_authorization).lower()},
|
|
89
93
|
oauth2RedirectUrl: baseUrl + "?format=oauth2-redirect",
|
|
90
94
|
}}
|
|
91
95
|
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# logger.powertools_handler is set with Powertools Logger handler; useful when there are many handlers
|
|
2
|
+
LOGGER_ATTRIBUTE_POWERTOOLS_HANDLER = "powertools_handler"
|
|
3
|
+
# logger.init attribute is set when Logger has been configured
|
|
4
|
+
LOGGER_ATTRIBUTE_PRECONFIGURED = "init"
|
|
5
|
+
LOGGER_ATTRIBUTE_HANDLER = "logger_handler"
|
|
@@ -19,9 +19,15 @@ from typing import (
|
|
|
19
19
|
Optional,
|
|
20
20
|
TypeVar,
|
|
21
21
|
Union,
|
|
22
|
+
cast,
|
|
22
23
|
overload,
|
|
23
24
|
)
|
|
24
25
|
|
|
26
|
+
from aws_lambda_powertools.logging.constants import (
|
|
27
|
+
LOGGER_ATTRIBUTE_HANDLER,
|
|
28
|
+
LOGGER_ATTRIBUTE_POWERTOOLS_HANDLER,
|
|
29
|
+
LOGGER_ATTRIBUTE_PRECONFIGURED,
|
|
30
|
+
)
|
|
25
31
|
from aws_lambda_powertools.shared import constants
|
|
26
32
|
from aws_lambda_powertools.shared.functions import (
|
|
27
33
|
extract_event_from_common_models,
|
|
@@ -31,7 +37,7 @@ from aws_lambda_powertools.shared.functions import (
|
|
|
31
37
|
from aws_lambda_powertools.utilities import jmespath_utils
|
|
32
38
|
|
|
33
39
|
from ..shared.types import AnyCallableT
|
|
34
|
-
from .exceptions import InvalidLoggerSamplingRateError
|
|
40
|
+
from .exceptions import InvalidLoggerSamplingRateError, OrphanedChildLoggerError
|
|
35
41
|
from .filters import SuppressFilter
|
|
36
42
|
from .formatter import (
|
|
37
43
|
RESERVED_FORMATTER_CUSTOM_KEYS,
|
|
@@ -233,7 +239,6 @@ class Logger:
|
|
|
233
239
|
self.child = child
|
|
234
240
|
self.logger_formatter = logger_formatter
|
|
235
241
|
self._stream = stream or sys.stdout
|
|
236
|
-
self.logger_handler = logger_handler or logging.StreamHandler(self._stream)
|
|
237
242
|
self.log_uncaught_exceptions = log_uncaught_exceptions
|
|
238
243
|
|
|
239
244
|
self._is_deduplication_disabled = resolve_truthy_env_var_choice(
|
|
@@ -241,6 +246,7 @@ class Logger:
|
|
|
241
246
|
)
|
|
242
247
|
self._default_log_keys = {"service": self.service, "sampling_rate": self.sampling_rate}
|
|
243
248
|
self._logger = self._get_logger()
|
|
249
|
+
self.logger_handler = logger_handler or self._get_handler()
|
|
244
250
|
|
|
245
251
|
# NOTE: This is primarily to improve UX, so IDEs can autocomplete LambdaPowertoolsFormatter options
|
|
246
252
|
# previously, we masked all of them as kwargs thus limiting feature discovery
|
|
@@ -264,7 +270,7 @@ class Logger:
|
|
|
264
270
|
|
|
265
271
|
# Prevent __getattr__ from shielding unknown attribute errors in type checkers
|
|
266
272
|
# https://github.com/aws-powertools/powertools-lambda-python/issues/1660
|
|
267
|
-
if not TYPE_CHECKING:
|
|
273
|
+
if not TYPE_CHECKING: # pragma: no cover
|
|
268
274
|
|
|
269
275
|
def __getattr__(self, name):
|
|
270
276
|
# Proxy attributes not found to actual logger to support backward compatibility
|
|
@@ -279,6 +285,18 @@ class Logger:
|
|
|
279
285
|
|
|
280
286
|
return logging.getLogger(logger_name)
|
|
281
287
|
|
|
288
|
+
def _get_handler(self) -> logging.Handler:
|
|
289
|
+
# is a logger handler already configured?
|
|
290
|
+
if getattr(self, LOGGER_ATTRIBUTE_HANDLER, None):
|
|
291
|
+
return self.logger_handler
|
|
292
|
+
|
|
293
|
+
# for children, use parent's handler
|
|
294
|
+
if self.child:
|
|
295
|
+
return getattr(self._logger.parent, LOGGER_ATTRIBUTE_POWERTOOLS_HANDLER, None) # type: ignore[return-value] # always checked in formatting
|
|
296
|
+
|
|
297
|
+
# otherwise, create a new stream handler (first time init)
|
|
298
|
+
return logging.StreamHandler(self._stream)
|
|
299
|
+
|
|
282
300
|
def _init_logger(
|
|
283
301
|
self,
|
|
284
302
|
formatter_options: Optional[Dict] = None,
|
|
@@ -292,7 +310,7 @@ class Logger:
|
|
|
292
310
|
# a) multiple handlers being attached
|
|
293
311
|
# b) different sampling mechanisms
|
|
294
312
|
# c) multiple messages from being logged as handlers can be duplicated
|
|
295
|
-
is_logger_preconfigured = getattr(self._logger,
|
|
313
|
+
is_logger_preconfigured = getattr(self._logger, LOGGER_ATTRIBUTE_PRECONFIGURED, False)
|
|
296
314
|
if self.child or is_logger_preconfigured:
|
|
297
315
|
return
|
|
298
316
|
|
|
@@ -317,6 +335,7 @@ class Logger:
|
|
|
317
335
|
# std logging will return the same Logger with our attribute if name is reused
|
|
318
336
|
logger.debug(f"Marking logger {self.service} as preconfigured")
|
|
319
337
|
self._logger.init = True # type: ignore[attr-defined]
|
|
338
|
+
self._logger.powertools_handler = self.logger_handler # type: ignore[attr-defined]
|
|
320
339
|
|
|
321
340
|
def _configure_sampling(self) -> None:
|
|
322
341
|
"""Dynamically set log level based on sampling rate
|
|
@@ -613,7 +632,7 @@ class Logger:
|
|
|
613
632
|
|
|
614
633
|
# Mode 1
|
|
615
634
|
log_keys = {**self._default_log_keys, **keys}
|
|
616
|
-
is_logger_preconfigured = getattr(self._logger,
|
|
635
|
+
is_logger_preconfigured = getattr(self._logger, LOGGER_ATTRIBUTE_PRECONFIGURED, False)
|
|
617
636
|
if not is_logger_preconfigured:
|
|
618
637
|
formatter = self.logger_formatter or LambdaPowertoolsFormatter(**formatter_options, **log_keys)
|
|
619
638
|
self.registered_handler.setFormatter(formatter)
|
|
@@ -672,15 +691,20 @@ class Logger:
|
|
|
672
691
|
@property
|
|
673
692
|
def registered_handler(self) -> logging.Handler:
|
|
674
693
|
"""Convenience property to access the first logger handler"""
|
|
675
|
-
|
|
676
|
-
# None, mypy can't see this from context but we can
|
|
677
|
-
handlers = self._logger.parent.handlers if self.child else self._logger.handlers # type: ignore[union-attr]
|
|
678
|
-
return handlers[0]
|
|
694
|
+
return self._get_handler()
|
|
679
695
|
|
|
680
696
|
@property
|
|
681
697
|
def registered_formatter(self) -> BasePowertoolsFormatter:
|
|
682
698
|
"""Convenience property to access the first logger formatter"""
|
|
683
|
-
|
|
699
|
+
handler = self.registered_handler
|
|
700
|
+
if handler is None:
|
|
701
|
+
raise OrphanedChildLoggerError(
|
|
702
|
+
"Orphan child loggers cannot append nor remove keys until a parent is initialized first. "
|
|
703
|
+
"To solve this issue, you can A) make sure a parent logger is initialized first, or B) move append/remove keys operations to a later stage." # noqa: E501
|
|
704
|
+
"Reference: https://docs.powertools.aws.dev/lambda/python/latest/core/logger/#reusing-logger-across-your-code",
|
|
705
|
+
)
|
|
706
|
+
|
|
707
|
+
return cast(BasePowertoolsFormatter, handler.formatter)
|
|
684
708
|
|
|
685
709
|
@property
|
|
686
710
|
def log_level(self) -> int:
|
{aws_lambda_powertools-2.37.0 → aws_lambda_powertools-2.38.0}/aws_lambda_powertools/logging/utils.py
RENAMED
|
@@ -9,6 +9,7 @@ PACKAGE_LOGGER = "aws_lambda_powertools"
|
|
|
9
9
|
def copy_config_to_registered_loggers(
|
|
10
10
|
source_logger: Logger,
|
|
11
11
|
log_level: Optional[Union[int, str]] = None,
|
|
12
|
+
ignore_log_level=False,
|
|
12
13
|
exclude: Optional[Set[str]] = None,
|
|
13
14
|
include: Optional[Set[str]] = None,
|
|
14
15
|
) -> None:
|
|
@@ -16,10 +17,13 @@ def copy_config_to_registered_loggers(
|
|
|
16
17
|
|
|
17
18
|
Parameters
|
|
18
19
|
----------
|
|
20
|
+
ignore_log_level
|
|
19
21
|
source_logger : Logger
|
|
20
22
|
Powertools for AWS Lambda (Python) Logger to copy configuration from
|
|
21
23
|
log_level : Union[int, str], optional
|
|
22
24
|
Logging level to set to registered loggers, by default uses source_logger logging level
|
|
25
|
+
ignore_log_level: bool
|
|
26
|
+
Whether to not touch log levels for discovered loggers. log_level param is disregarded when this is set.
|
|
23
27
|
include : Optional[Set[str]], optional
|
|
24
28
|
List of logger names to include, by default all registered loggers are included
|
|
25
29
|
exclude : Optional[Set[str]], optional
|
|
@@ -54,7 +58,7 @@ def copy_config_to_registered_loggers(
|
|
|
54
58
|
|
|
55
59
|
registered_loggers = _find_registered_loggers(source_logger, loggers, filter_func)
|
|
56
60
|
for logger in registered_loggers:
|
|
57
|
-
_configure_logger(source_logger, logger, level)
|
|
61
|
+
_configure_logger(source_logger=source_logger, logger=logger, level=level, ignore_log_level=ignore_log_level)
|
|
58
62
|
|
|
59
63
|
|
|
60
64
|
def _include_registered_loggers_filter(loggers: Set[str]):
|
|
@@ -78,13 +82,21 @@ def _find_registered_loggers(
|
|
|
78
82
|
return root_loggers
|
|
79
83
|
|
|
80
84
|
|
|
81
|
-
def _configure_logger(
|
|
85
|
+
def _configure_logger(
|
|
86
|
+
source_logger: Logger,
|
|
87
|
+
logger: logging.Logger,
|
|
88
|
+
level: Union[int, str],
|
|
89
|
+
ignore_log_level: bool = False,
|
|
90
|
+
) -> None:
|
|
91
|
+
# customers may not want to copy the same log level from Logger to discovered loggers
|
|
92
|
+
if not ignore_log_level:
|
|
93
|
+
logger.setLevel(level)
|
|
94
|
+
source_logger.debug(f"Logger {logger} reconfigured to use logging level {level}")
|
|
95
|
+
|
|
82
96
|
logger.handlers = []
|
|
83
|
-
logger.setLevel(level)
|
|
84
97
|
logger.propagate = False # ensure we don't propagate logs to existing loggers, #1073
|
|
85
98
|
source_logger.append_keys(name="%(name)s") # include logger name, see #1267
|
|
86
99
|
|
|
87
|
-
source_logger.debug(f"Logger {logger} reconfigured to use logging level {level}")
|
|
88
100
|
for source_handler in source_logger.handlers:
|
|
89
101
|
logger.addHandler(source_handler)
|
|
90
102
|
source_logger.debug(f"Logger {logger} reconfigured to use {source_handler}")
|
|
@@ -9,6 +9,7 @@ MIDDLEWARE_FACTORY_TRACE_ENV: str = "POWERTOOLS_TRACE_MIDDLEWARES"
|
|
|
9
9
|
INVALID_XRAY_NAME_CHARACTERS = r"[?;*()!$~^<>]"
|
|
10
10
|
|
|
11
11
|
# Logger constants
|
|
12
|
+
# maintenance: future major version should start having localized `constants.py` to ease future modularization
|
|
12
13
|
LOGGER_LOG_SAMPLING_RATE: str = "POWERTOOLS_LOGGER_SAMPLE_RATE"
|
|
13
14
|
LOGGER_LOG_EVENT_ENV: str = "POWERTOOLS_LOGGER_LOG_EVENT"
|
|
14
15
|
LOGGER_LOG_DEDUPLICATION_ENV: str = "POWERTOOLS_LOG_DEDUPLICATION_DISABLED"
|
|
@@ -61,7 +62,7 @@ POWERTOOLS_DEBUG_ENV: str = "POWERTOOLS_DEBUG"
|
|
|
61
62
|
|
|
62
63
|
# JSON constants
|
|
63
64
|
PRETTY_INDENT: int = 4
|
|
64
|
-
COMPACT_INDENT = None
|
|
65
|
+
COMPACT_INDENT: None = None
|
|
65
66
|
|
|
66
67
|
# Idempotency constants
|
|
67
68
|
IDEMPOTENCY_DISABLED_ENV: str = "POWERTOOLS_IDEMPOTENCY_DISABLED"
|
|
@@ -7,7 +7,7 @@ has_pydantic = "pydantic" in sys.modules
|
|
|
7
7
|
|
|
8
8
|
# For IntelliSense and Mypy to work, we need to account for possible SQS subclasses
|
|
9
9
|
# We need them as subclasses as we must access their message ID or sequence number metadata via dot notation
|
|
10
|
-
if has_pydantic:
|
|
10
|
+
if has_pydantic: # pragma: no cover
|
|
11
11
|
from aws_lambda_powertools.utilities.parser.models import DynamoDBStreamRecordModel, SqsRecordModel
|
|
12
12
|
from aws_lambda_powertools.utilities.parser.models import (
|
|
13
13
|
KinesisDataStreamRecord as KinesisDataStreamRecordModel,
|
|
@@ -17,7 +17,7 @@ if has_pydantic:
|
|
|
17
17
|
Union[Type[SqsRecordModel], Type[DynamoDBStreamRecordModel], Type[KinesisDataStreamRecordModel]]
|
|
18
18
|
]
|
|
19
19
|
BatchSqsTypeModel = Optional[Type[SqsRecordModel]]
|
|
20
|
-
else:
|
|
20
|
+
else: # pragma: no cover
|
|
21
21
|
BatchTypeModels = "BatchTypeModels" # type: ignore
|
|
22
22
|
BatchSqsTypeModel = "BatchSqsTypeModel" # type: ignore
|
|
23
23
|
|
|
@@ -43,7 +43,7 @@ class ALBEvent(BaseProxyEvent):
|
|
|
43
43
|
return super().resolved_query_string_parameters
|
|
44
44
|
|
|
45
45
|
@property
|
|
46
|
-
def resolved_headers_field(self) ->
|
|
46
|
+
def resolved_headers_field(self) -> Dict[str, Any]:
|
|
47
47
|
headers: Dict[str, Any] = {}
|
|
48
48
|
|
|
49
49
|
if self.multi_value_headers:
|
|
@@ -15,18 +15,18 @@ from aws_lambda_powertools.utilities.data_classes.common import (
|
|
|
15
15
|
|
|
16
16
|
class APIGatewayEventAuthorizer(DictWrapper):
|
|
17
17
|
@property
|
|
18
|
-
def claims(self) ->
|
|
19
|
-
return self.get("claims")
|
|
18
|
+
def claims(self) -> Dict[str, Any]:
|
|
19
|
+
return self.get("claims") or {} # key might exist but can be `null`
|
|
20
20
|
|
|
21
21
|
@property
|
|
22
|
-
def scopes(self) ->
|
|
23
|
-
return self.get("scopes")
|
|
22
|
+
def scopes(self) -> List[str]:
|
|
23
|
+
return self.get("scopes") or [] # key might exist but can be `null`
|
|
24
24
|
|
|
25
25
|
@property
|
|
26
|
-
def principal_id(self) ->
|
|
26
|
+
def principal_id(self) -> str:
|
|
27
27
|
"""The principal user identification associated with the token sent by the client and returned from an
|
|
28
28
|
API Gateway Lambda authorizer (formerly known as a custom authorizer)"""
|
|
29
|
-
return self.get("principalId")
|
|
29
|
+
return self.get("principalId") or "" # key might exist but can be `null`
|
|
30
30
|
|
|
31
31
|
@property
|
|
32
32
|
def integration_latency(self) -> Optional[int]:
|
|
@@ -91,7 +91,8 @@ class APIGatewayEventRequestContext(BaseRequestContext):
|
|
|
91
91
|
|
|
92
92
|
@property
|
|
93
93
|
def authorizer(self) -> APIGatewayEventAuthorizer:
|
|
94
|
-
|
|
94
|
+
authz_data = self._data.get("requestContext", {}).get("authorizer", {})
|
|
95
|
+
return APIGatewayEventAuthorizer(authz_data)
|
|
95
96
|
|
|
96
97
|
|
|
97
98
|
class APIGatewayProxyEvent(BaseProxyEvent):
|
|
@@ -112,11 +113,11 @@ class APIGatewayProxyEvent(BaseProxyEvent):
|
|
|
112
113
|
|
|
113
114
|
@property
|
|
114
115
|
def multi_value_headers(self) -> Dict[str, List[str]]:
|
|
115
|
-
return self.get("multiValueHeaders") or {}
|
|
116
|
+
return self.get("multiValueHeaders") or {} # key might exist but can be `null`
|
|
116
117
|
|
|
117
118
|
@property
|
|
118
119
|
def multi_value_query_string_parameters(self) -> Dict[str, List[str]]:
|
|
119
|
-
return self.get("multiValueQueryStringParameters") or {}
|
|
120
|
+
return self.get("multiValueQueryStringParameters") or {} # key might exist but can be `null`
|
|
120
121
|
|
|
121
122
|
@property
|
|
122
123
|
def resolved_query_string_parameters(self) -> Dict[str, List[str]]:
|
|
@@ -126,7 +127,7 @@ class APIGatewayProxyEvent(BaseProxyEvent):
|
|
|
126
127
|
return super().resolved_query_string_parameters
|
|
127
128
|
|
|
128
129
|
@property
|
|
129
|
-
def resolved_headers_field(self) ->
|
|
130
|
+
def resolved_headers_field(self) -> Dict[str, Any]:
|
|
130
131
|
headers: Dict[str, Any] = {}
|
|
131
132
|
|
|
132
133
|
if self.multi_value_headers:
|
|
@@ -154,72 +155,72 @@ class APIGatewayProxyEvent(BaseProxyEvent):
|
|
|
154
155
|
|
|
155
156
|
class RequestContextV2AuthorizerIam(DictWrapper):
|
|
156
157
|
@property
|
|
157
|
-
def access_key(self) ->
|
|
158
|
+
def access_key(self) -> str:
|
|
158
159
|
"""The IAM user access key associated with the request."""
|
|
159
|
-
return self.get("accessKey")
|
|
160
|
+
return self.get("accessKey") or "" # key might exist but can be `null`
|
|
160
161
|
|
|
161
162
|
@property
|
|
162
|
-
def account_id(self) ->
|
|
163
|
+
def account_id(self) -> str:
|
|
163
164
|
"""The AWS account ID associated with the request."""
|
|
164
|
-
return self.get("accountId")
|
|
165
|
+
return self.get("accountId") or "" # key might exist but can be `null`
|
|
165
166
|
|
|
166
167
|
@property
|
|
167
|
-
def caller_id(self) ->
|
|
168
|
+
def caller_id(self) -> str:
|
|
168
169
|
"""The principal identifier of the caller making the request."""
|
|
169
|
-
return self.get("callerId")
|
|
170
|
+
return self.get("callerId") or "" # key might exist but can be `null`
|
|
170
171
|
|
|
171
172
|
def _cognito_identity(self) -> Dict:
|
|
172
|
-
return self.get("cognitoIdentity"
|
|
173
|
+
return self.get("cognitoIdentity") or {} # not available in FunctionURL; key might exist but can be `null`
|
|
173
174
|
|
|
174
175
|
@property
|
|
175
|
-
def cognito_amr(self) ->
|
|
176
|
+
def cognito_amr(self) -> List[str]:
|
|
176
177
|
"""This represents how the user was authenticated.
|
|
177
178
|
AMR stands for Authentication Methods References as per the openid spec"""
|
|
178
|
-
return self._cognito_identity().get("amr")
|
|
179
|
+
return self._cognito_identity().get("amr", [])
|
|
179
180
|
|
|
180
181
|
@property
|
|
181
|
-
def cognito_identity_id(self) ->
|
|
182
|
+
def cognito_identity_id(self) -> str:
|
|
182
183
|
"""The Amazon Cognito identity ID of the caller making the request.
|
|
183
184
|
Available only if the request was signed with Amazon Cognito credentials."""
|
|
184
|
-
return self._cognito_identity().get("identityId")
|
|
185
|
+
return self._cognito_identity().get("identityId", "")
|
|
185
186
|
|
|
186
187
|
@property
|
|
187
|
-
def cognito_identity_pool_id(self) ->
|
|
188
|
+
def cognito_identity_pool_id(self) -> str:
|
|
188
189
|
"""The Amazon Cognito identity pool ID of the caller making the request.
|
|
189
190
|
Available only if the request was signed with Amazon Cognito credentials."""
|
|
190
|
-
return self._cognito_identity().get("identityPoolId")
|
|
191
|
+
return self._cognito_identity().get("identityPoolId") or "" # key might exist but can be `null`
|
|
191
192
|
|
|
192
193
|
@property
|
|
193
|
-
def principal_org_id(self) ->
|
|
194
|
+
def principal_org_id(self) -> str:
|
|
194
195
|
"""The AWS organization ID."""
|
|
195
|
-
return self.get("principalOrgId")
|
|
196
|
+
return self.get("principalOrgId") or "" # key might exist but can be `null`
|
|
196
197
|
|
|
197
198
|
@property
|
|
198
|
-
def user_arn(self) ->
|
|
199
|
+
def user_arn(self) -> str:
|
|
199
200
|
"""The Amazon Resource Name (ARN) of the effective user identified after authentication."""
|
|
200
|
-
return self.get("userArn")
|
|
201
|
+
return self.get("userArn") or "" # key might exist but can be `null`
|
|
201
202
|
|
|
202
203
|
@property
|
|
203
|
-
def user_id(self) ->
|
|
204
|
+
def user_id(self) -> str:
|
|
204
205
|
"""The IAM user ID of the effective user identified after authentication."""
|
|
205
|
-
return self.get("userId")
|
|
206
|
+
return self.get("userId") or "" # key might exist but can be `null`
|
|
206
207
|
|
|
207
208
|
|
|
208
209
|
class RequestContextV2Authorizer(DictWrapper):
|
|
209
210
|
@property
|
|
210
|
-
def jwt_claim(self) ->
|
|
211
|
-
jwt = self.get("jwt") or {} # not available in FunctionURL
|
|
212
|
-
return jwt.get("claims")
|
|
211
|
+
def jwt_claim(self) -> Dict[str, Any]:
|
|
212
|
+
jwt = self.get("jwt") or {} # not available in FunctionURL; key might exist but can be `null`
|
|
213
|
+
return jwt.get("claims") or {} # key might exist but can be `null`
|
|
213
214
|
|
|
214
215
|
@property
|
|
215
|
-
def jwt_scopes(self) ->
|
|
216
|
-
jwt = self.get("jwt") or {} # not available in FunctionURL
|
|
217
|
-
return jwt.get("scopes")
|
|
216
|
+
def jwt_scopes(self) -> List[str]:
|
|
217
|
+
jwt = self.get("jwt") or {} # not available in FunctionURL; key might exist but can be `null`
|
|
218
|
+
return jwt.get("scopes", [])
|
|
218
219
|
|
|
219
220
|
@property
|
|
220
|
-
def get_lambda(self) ->
|
|
221
|
+
def get_lambda(self) -> Dict[str, Any]:
|
|
221
222
|
"""Lambda authorization context details"""
|
|
222
|
-
return self.get("lambda")
|
|
223
|
+
return self.get("lambda") or {} # key might exist but can be `null`
|
|
223
224
|
|
|
224
225
|
def get_context(self) -> Dict[str, Any]:
|
|
225
226
|
"""Retrieve the authorization context details injected by a Lambda Authorizer.
|
|
@@ -238,20 +239,20 @@ class RequestContextV2Authorizer(DictWrapper):
|
|
|
238
239
|
Dict[str, Any]
|
|
239
240
|
A dictionary containing Lambda authorization context details.
|
|
240
241
|
"""
|
|
241
|
-
return self.
|
|
242
|
+
return self.get_lambda
|
|
242
243
|
|
|
243
244
|
@property
|
|
244
|
-
def iam(self) ->
|
|
245
|
+
def iam(self) -> RequestContextV2AuthorizerIam:
|
|
245
246
|
"""IAM authorization details used for making the request."""
|
|
246
|
-
iam = self.get("iam")
|
|
247
|
-
return
|
|
247
|
+
iam = self.get("iam") or {} # key might exist but can be `null`
|
|
248
|
+
return RequestContextV2AuthorizerIam(iam)
|
|
248
249
|
|
|
249
250
|
|
|
250
251
|
class RequestContextV2(BaseRequestContextV2):
|
|
251
252
|
@property
|
|
252
|
-
def authorizer(self) ->
|
|
253
|
-
|
|
254
|
-
return
|
|
253
|
+
def authorizer(self) -> RequestContextV2Authorizer:
|
|
254
|
+
ctx = self.get("requestContext") or {} # key might exist but can be `null`
|
|
255
|
+
return RequestContextV2Authorizer(ctx.get("authorizer", {}))
|
|
255
256
|
|
|
256
257
|
|
|
257
258
|
class APIGatewayProxyEventV2(BaseProxyEvent):
|
|
@@ -319,7 +320,7 @@ class APIGatewayProxyEventV2(BaseProxyEvent):
|
|
|
319
320
|
return HttpApiHeadersSerializer()
|
|
320
321
|
|
|
321
322
|
@property
|
|
322
|
-
def resolved_headers_field(self) ->
|
|
323
|
+
def resolved_headers_field(self) -> Dict[str, Any]:
|
|
323
324
|
if self.headers is not None:
|
|
324
325
|
headers = {key.lower(): value.split(",") if "," in value else value for key, value in self.headers.items()}
|
|
325
326
|
return headers
|
|
@@ -111,7 +111,7 @@ class BedrockAgentEvent(BaseProxyEvent):
|
|
|
111
111
|
return {x["name"]: x["value"] for x in self["parameters"]} if self.get("parameters") else None
|
|
112
112
|
|
|
113
113
|
@property
|
|
114
|
-
def resolved_headers_field(self) ->
|
|
114
|
+
def resolved_headers_field(self) -> Dict[str, Any]:
|
|
115
115
|
return {}
|
|
116
116
|
|
|
117
117
|
@cached_property
|
|
@@ -124,7 +124,7 @@ class BaseProxyEvent(DictWrapper):
|
|
|
124
124
|
return {}
|
|
125
125
|
|
|
126
126
|
@property
|
|
127
|
-
def resolved_headers_field(self) ->
|
|
127
|
+
def resolved_headers_field(self) -> Dict[str, Any]:
|
|
128
128
|
"""
|
|
129
129
|
This property determines the appropriate header to be used
|
|
130
130
|
as a trusted source for validating OpenAPI.
|