aws-lambda-powertools 2.12.0__tar.gz → 2.14.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.12.0 → aws_lambda_powertools-2.14.0}/PKG-INFO +1 -1
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/shared/constants.py +3 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/shared/functions.py +5 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +22 -6
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parameters/appconfig.py +10 -4
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parameters/base.py +13 -3
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parameters/secrets.py +9 -6
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parameters/ssm.py +71 -24
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +21 -3
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/streaming/s3_object.py +12 -3
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/pyproject.toml +10 -10
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/setup.py +1 -1
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/LICENSE +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/README.md +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/THIRD-PARTY-LICENSES +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/event_handler/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/event_handler/api_gateway.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/event_handler/appsync.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/event_handler/content_types.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/event_handler/router.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/exceptions/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/logging/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/logging/exceptions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/logging/filters.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/logging/formatter.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/logging/lambda_context.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/logging/logger.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/logging/utils.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/metrics/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/metrics/base.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/metrics/exceptions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/metrics/metric.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/metrics/metrics.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/metrics/types.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/package_logger.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/py.typed +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/shared/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/shared/cache_dict.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/shared/cookies.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/shared/json_encoder.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/shared/lazy_import.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/shared/types.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/tracing/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/tracing/base.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/tracing/extensions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/tracing/tracer.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/batch/base.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/batch/types.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/alb_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/appsync/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/common.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/s3_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/feature_flags/time_conditions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/idempotency/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/idempotency/base.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/idempotency/config.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/idempotency/persistence/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/s3.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/models/sqs.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/parser.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/parser/types.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/typing/lambda_client_context_mobile_client.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/validation/base.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.0}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
- {aws_lambda_powertools-2.12.0 → aws_lambda_powertools-2.14.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.14.0
|
|
4
4
|
Summary: AWS Lambda Powertools is a developer toolkit to implement Serverless best practices and increase developer velocity.
|
|
5
5
|
Home-page: https://github.com/awslabs/aws-lambda-powertools-python
|
|
6
6
|
License: MIT
|
|
@@ -22,6 +22,9 @@ XRAY_SDK_CORE_MODULE: str = "aws_xray_sdk.core"
|
|
|
22
22
|
|
|
23
23
|
IDEMPOTENCY_DISABLED_ENV: str = "POWERTOOLS_IDEMPOTENCY_DISABLED"
|
|
24
24
|
|
|
25
|
+
PARAMETERS_SSM_DECRYPT_ENV: str = "POWERTOOLS_PARAMETERS_SSM_DECRYPT"
|
|
26
|
+
PARAMETERS_MAX_AGE_ENV: str = "POWERTOOLS_PARAMETERS_MAX_AGE"
|
|
27
|
+
|
|
25
28
|
LOGGER_LAMBDA_CONTEXT_KEYS = [
|
|
26
29
|
"function_arn",
|
|
27
30
|
"function_memory_size",
|
|
@@ -51,6 +51,11 @@ def resolve_truthy_env_var_choice(env: str, choice: Optional[bool] = None) -> bo
|
|
|
51
51
|
return choice if choice is not None else strtobool(env)
|
|
52
52
|
|
|
53
53
|
|
|
54
|
+
def resolve_max_age(env: str, choice: Optional[int]) -> int:
|
|
55
|
+
"""Resolve max age value"""
|
|
56
|
+
return choice if choice is not None else int(env)
|
|
57
|
+
|
|
58
|
+
|
|
54
59
|
@overload
|
|
55
60
|
def resolve_env_var_choice(env: Optional[str], choice: float) -> float:
|
|
56
61
|
...
|
|
@@ -16,14 +16,14 @@ class CodePipelineConfiguration(DictWrapper):
|
|
|
16
16
|
return self["FunctionName"]
|
|
17
17
|
|
|
18
18
|
@property
|
|
19
|
-
def user_parameters(self) -> str:
|
|
19
|
+
def user_parameters(self) -> Optional[str]:
|
|
20
20
|
"""User parameters"""
|
|
21
|
-
return self
|
|
21
|
+
return self.get("UserParameters", None)
|
|
22
22
|
|
|
23
23
|
@property
|
|
24
|
-
def decoded_user_parameters(self) -> Dict[str, Any]:
|
|
24
|
+
def decoded_user_parameters(self) -> Optional[Dict[str, Any]]:
|
|
25
25
|
"""Json Decoded user parameters"""
|
|
26
|
-
if self._json_data is None:
|
|
26
|
+
if self._json_data is None and self.user_parameters is not None:
|
|
27
27
|
self._json_data = json.loads(self.user_parameters)
|
|
28
28
|
return self._json_data
|
|
29
29
|
|
|
@@ -97,6 +97,16 @@ class CodePipelineArtifactCredentials(DictWrapper):
|
|
|
97
97
|
return self.get("expirationTime")
|
|
98
98
|
|
|
99
99
|
|
|
100
|
+
class CodePipelineEncryptionKey(DictWrapper):
|
|
101
|
+
@property
|
|
102
|
+
def get_id(self) -> str:
|
|
103
|
+
return self["id"]
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def get_type(self) -> str:
|
|
107
|
+
return self["type"]
|
|
108
|
+
|
|
109
|
+
|
|
100
110
|
class CodePipelineData(DictWrapper):
|
|
101
111
|
"""CodePipeline Job Data"""
|
|
102
112
|
|
|
@@ -125,6 +135,12 @@ class CodePipelineData(DictWrapper):
|
|
|
125
135
|
"""A continuation token if continuing job"""
|
|
126
136
|
return self.get("continuationToken")
|
|
127
137
|
|
|
138
|
+
@property
|
|
139
|
+
def encryption_key(self) -> Optional[CodePipelineEncryptionKey]:
|
|
140
|
+
"""Represents a CodePipeline encryption key"""
|
|
141
|
+
key_data = self.get("encryptionKey")
|
|
142
|
+
return CodePipelineEncryptionKey(key_data) if key_data is not None else None
|
|
143
|
+
|
|
128
144
|
|
|
129
145
|
class CodePipelineJobEvent(DictWrapper):
|
|
130
146
|
"""AWS CodePipeline Job Event
|
|
@@ -155,12 +171,12 @@ class CodePipelineJobEvent(DictWrapper):
|
|
|
155
171
|
return CodePipelineData(self._job["data"])
|
|
156
172
|
|
|
157
173
|
@property
|
|
158
|
-
def user_parameters(self) -> str:
|
|
174
|
+
def user_parameters(self) -> Optional[str]:
|
|
159
175
|
"""Action configuration user parameters"""
|
|
160
176
|
return self.data.action_configuration.configuration.user_parameters
|
|
161
177
|
|
|
162
178
|
@property
|
|
163
|
-
def decoded_user_parameters(self) -> Dict[str, Any]:
|
|
179
|
+
def decoded_user_parameters(self) -> Optional[Dict[str, Any]]:
|
|
164
180
|
"""Json Decoded action configuration user parameters"""
|
|
165
181
|
return self.data.action_configuration.configuration.decoded_user_parameters
|
|
166
182
|
|
|
@@ -14,8 +14,12 @@ from aws_lambda_powertools.utilities.parameters.types import TransformOptions
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
15
|
from mypy_boto3_appconfigdata import AppConfigDataClient
|
|
16
16
|
|
|
17
|
-
from
|
|
18
|
-
from
|
|
17
|
+
from aws_lambda_powertools.shared import constants
|
|
18
|
+
from aws_lambda_powertools.shared.functions import (
|
|
19
|
+
resolve_env_var_choice,
|
|
20
|
+
resolve_max_age,
|
|
21
|
+
)
|
|
22
|
+
|
|
19
23
|
from .base import DEFAULT_MAX_AGE_SECS, DEFAULT_PROVIDERS, BaseProvider
|
|
20
24
|
|
|
21
25
|
|
|
@@ -136,7 +140,7 @@ def get_app_config(
|
|
|
136
140
|
application: Optional[str] = None,
|
|
137
141
|
transform: TransformOptions = None,
|
|
138
142
|
force_fetch: bool = False,
|
|
139
|
-
max_age: int =
|
|
143
|
+
max_age: Optional[int] = None,
|
|
140
144
|
**sdk_options
|
|
141
145
|
) -> Union[str, list, dict, bytes]:
|
|
142
146
|
"""
|
|
@@ -154,7 +158,7 @@ def get_app_config(
|
|
|
154
158
|
Transforms the content from a JSON object ('json') or base64 binary string ('binary')
|
|
155
159
|
force_fetch: bool, optional
|
|
156
160
|
Force update even before a cached item has expired, defaults to False
|
|
157
|
-
max_age: int
|
|
161
|
+
max_age: int, optional
|
|
158
162
|
Maximum age of the cached value
|
|
159
163
|
sdk_options: dict, optional
|
|
160
164
|
SDK options to propagate to `start_configuration_session` API call
|
|
@@ -187,6 +191,8 @@ def get_app_config(
|
|
|
187
191
|
>>> print(value)
|
|
188
192
|
My configuration's JSON value
|
|
189
193
|
"""
|
|
194
|
+
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
|
|
195
|
+
max_age = resolve_max_age(env=os.getenv(constants.PARAMETERS_MAX_AGE_ENV, DEFAULT_MAX_AGE_SECS), choice=max_age)
|
|
190
196
|
|
|
191
197
|
# Only create the provider if this function is called at least once
|
|
192
198
|
if "appconfig" not in DEFAULT_PROVIDERS:
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
|
|
6
6
|
import base64
|
|
7
7
|
import json
|
|
8
|
+
import os
|
|
8
9
|
from abc import ABC, abstractmethod
|
|
9
10
|
from datetime import datetime, timedelta
|
|
10
11
|
from typing import (
|
|
@@ -24,6 +25,8 @@ from typing import (
|
|
|
24
25
|
import boto3
|
|
25
26
|
from botocore.config import Config
|
|
26
27
|
|
|
28
|
+
from aws_lambda_powertools.shared import constants
|
|
29
|
+
from aws_lambda_powertools.shared.functions import resolve_max_age
|
|
27
30
|
from aws_lambda_powertools.utilities.parameters.types import TransformOptions
|
|
28
31
|
|
|
29
32
|
from .exceptions import GetParameterError, TransformParameterError
|
|
@@ -35,7 +38,8 @@ if TYPE_CHECKING:
|
|
|
35
38
|
from mypy_boto3_ssm import SSMClient
|
|
36
39
|
|
|
37
40
|
|
|
38
|
-
DEFAULT_MAX_AGE_SECS = 5
|
|
41
|
+
DEFAULT_MAX_AGE_SECS = "5"
|
|
42
|
+
|
|
39
43
|
# These providers will be dynamically initialized on first use of the helper functions
|
|
40
44
|
DEFAULT_PROVIDERS: Dict[str, Any] = {}
|
|
41
45
|
TRANSFORM_METHOD_JSON = "json"
|
|
@@ -77,7 +81,7 @@ class BaseProvider(ABC):
|
|
|
77
81
|
def get(
|
|
78
82
|
self,
|
|
79
83
|
name: str,
|
|
80
|
-
max_age: int =
|
|
84
|
+
max_age: Optional[int] = None,
|
|
81
85
|
transform: TransformOptions = None,
|
|
82
86
|
force_fetch: bool = False,
|
|
83
87
|
**sdk_options,
|
|
@@ -121,6 +125,9 @@ class BaseProvider(ABC):
|
|
|
121
125
|
value: Optional[Union[str, bytes, dict]] = None
|
|
122
126
|
key = (name, transform)
|
|
123
127
|
|
|
128
|
+
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
|
|
129
|
+
max_age = resolve_max_age(env=os.getenv(constants.PARAMETERS_MAX_AGE_ENV, DEFAULT_MAX_AGE_SECS), choice=max_age)
|
|
130
|
+
|
|
124
131
|
if not force_fetch and self.has_not_expired_in_cache(key):
|
|
125
132
|
return self.store[key].value
|
|
126
133
|
|
|
@@ -149,7 +156,7 @@ class BaseProvider(ABC):
|
|
|
149
156
|
def get_multiple(
|
|
150
157
|
self,
|
|
151
158
|
path: str,
|
|
152
|
-
max_age: int =
|
|
159
|
+
max_age: Optional[int] = None,
|
|
153
160
|
transform: TransformOptions = None,
|
|
154
161
|
raise_on_transform_error: bool = False,
|
|
155
162
|
force_fetch: bool = False,
|
|
@@ -186,6 +193,9 @@ class BaseProvider(ABC):
|
|
|
186
193
|
"""
|
|
187
194
|
key = (path, transform)
|
|
188
195
|
|
|
196
|
+
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
|
|
197
|
+
max_age = resolve_max_age(env=os.getenv(constants.PARAMETERS_MAX_AGE_ENV, DEFAULT_MAX_AGE_SECS), choice=max_age)
|
|
198
|
+
|
|
189
199
|
if not force_fetch and self.has_not_expired_in_cache(key):
|
|
190
200
|
return self.store[key].value # type: ignore # need to revisit entire typing here
|
|
191
201
|
|
|
@@ -3,6 +3,7 @@ AWS Secrets Manager parameter retrieval and caching utility
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
import os
|
|
6
7
|
from typing import TYPE_CHECKING, Any, Dict, Optional, Union
|
|
7
8
|
|
|
8
9
|
import boto3
|
|
@@ -11,6 +12,9 @@ from botocore.config import Config
|
|
|
11
12
|
if TYPE_CHECKING:
|
|
12
13
|
from mypy_boto3_secretsmanager import SecretsManagerClient
|
|
13
14
|
|
|
15
|
+
from aws_lambda_powertools.shared import constants
|
|
16
|
+
from aws_lambda_powertools.shared.functions import resolve_max_age
|
|
17
|
+
|
|
14
18
|
from .base import DEFAULT_MAX_AGE_SECS, DEFAULT_PROVIDERS, BaseProvider
|
|
15
19
|
|
|
16
20
|
|
|
@@ -111,11 +115,7 @@ class SecretsProvider(BaseProvider):
|
|
|
111
115
|
|
|
112
116
|
|
|
113
117
|
def get_secret(
|
|
114
|
-
name: str,
|
|
115
|
-
transform: Optional[str] = None,
|
|
116
|
-
force_fetch: bool = False,
|
|
117
|
-
max_age: int = DEFAULT_MAX_AGE_SECS,
|
|
118
|
-
**sdk_options
|
|
118
|
+
name: str, transform: Optional[str] = None, force_fetch: bool = False, max_age: Optional[int] = None, **sdk_options
|
|
119
119
|
) -> Union[str, dict, bytes]:
|
|
120
120
|
"""
|
|
121
121
|
Retrieve a parameter value from AWS Secrets Manager
|
|
@@ -128,7 +128,7 @@ def get_secret(
|
|
|
128
128
|
Transforms the content from a JSON object ('json') or base64 binary string ('binary')
|
|
129
129
|
force_fetch: bool, optional
|
|
130
130
|
Force update even before a cached item has expired, defaults to False
|
|
131
|
-
max_age: int
|
|
131
|
+
max_age: int, optional
|
|
132
132
|
Maximum age of the cached value
|
|
133
133
|
sdk_options: dict, optional
|
|
134
134
|
Dictionary of options that will be passed to the get_secret_value call
|
|
@@ -162,6 +162,9 @@ def get_secret(
|
|
|
162
162
|
>>> get_secret("my-secret", VersionId="f658cac0-98a5-41d9-b993-8a76a7799194")
|
|
163
163
|
"""
|
|
164
164
|
|
|
165
|
+
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
|
|
166
|
+
max_age = resolve_max_age(env=os.getenv(constants.PARAMETERS_MAX_AGE_ENV, DEFAULT_MAX_AGE_SECS), choice=max_age)
|
|
167
|
+
|
|
165
168
|
# Only create the provider if this function is called at least once
|
|
166
169
|
if "secrets" not in DEFAULT_PROVIDERS:
|
|
167
170
|
DEFAULT_PROVIDERS["secrets"] = SecretsProvider()
|
|
@@ -3,13 +3,19 @@ AWS SSM Parameter retrieval and caching utility
|
|
|
3
3
|
"""
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
+
import os
|
|
6
7
|
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union, overload
|
|
7
8
|
|
|
8
9
|
import boto3
|
|
9
10
|
from botocore.config import Config
|
|
10
11
|
from typing_extensions import Literal
|
|
11
12
|
|
|
12
|
-
from aws_lambda_powertools.shared
|
|
13
|
+
from aws_lambda_powertools.shared import constants
|
|
14
|
+
from aws_lambda_powertools.shared.functions import (
|
|
15
|
+
resolve_max_age,
|
|
16
|
+
resolve_truthy_env_var_choice,
|
|
17
|
+
slice_dictionary,
|
|
18
|
+
)
|
|
13
19
|
|
|
14
20
|
from .base import DEFAULT_MAX_AGE_SECS, DEFAULT_PROVIDERS, BaseProvider, transform_value
|
|
15
21
|
from .exceptions import GetParameterError
|
|
@@ -110,9 +116,9 @@ class SSMProvider(BaseProvider):
|
|
|
110
116
|
def get( # type: ignore[override]
|
|
111
117
|
self,
|
|
112
118
|
name: str,
|
|
113
|
-
max_age: int =
|
|
119
|
+
max_age: Optional[int] = None,
|
|
114
120
|
transform: TransformOptions = None,
|
|
115
|
-
decrypt: bool =
|
|
121
|
+
decrypt: Optional[bool] = None,
|
|
116
122
|
force_fetch: bool = False,
|
|
117
123
|
**sdk_options,
|
|
118
124
|
) -> Optional[Union[str, dict, bytes]]:
|
|
@@ -123,7 +129,7 @@ class SSMProvider(BaseProvider):
|
|
|
123
129
|
----------
|
|
124
130
|
name: str
|
|
125
131
|
Parameter name
|
|
126
|
-
max_age: int
|
|
132
|
+
max_age: int, optional
|
|
127
133
|
Maximum age of the cached value
|
|
128
134
|
transform: str
|
|
129
135
|
Optional transformation of the parameter value. Supported values
|
|
@@ -145,6 +151,14 @@ class SSMProvider(BaseProvider):
|
|
|
145
151
|
When the parameter provider fails to transform a parameter value.
|
|
146
152
|
"""
|
|
147
153
|
|
|
154
|
+
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
|
|
155
|
+
max_age = resolve_max_age(env=os.getenv(constants.PARAMETERS_MAX_AGE_ENV, DEFAULT_MAX_AGE_SECS), choice=max_age)
|
|
156
|
+
|
|
157
|
+
# If decrypt is not set, resolve it from the environment variable, defaulting to False
|
|
158
|
+
decrypt = resolve_truthy_env_var_choice(
|
|
159
|
+
env=os.getenv(constants.PARAMETERS_SSM_DECRYPT_ENV, "false"), choice=decrypt
|
|
160
|
+
)
|
|
161
|
+
|
|
148
162
|
# Add to `decrypt` sdk_options to we can have an explicit option for this
|
|
149
163
|
sdk_options["decrypt"] = decrypt
|
|
150
164
|
|
|
@@ -212,8 +226,8 @@ class SSMProvider(BaseProvider):
|
|
|
212
226
|
self,
|
|
213
227
|
parameters: Dict[str, Dict],
|
|
214
228
|
transform: TransformOptions = None,
|
|
215
|
-
decrypt: bool =
|
|
216
|
-
max_age: int =
|
|
229
|
+
decrypt: Optional[bool] = None,
|
|
230
|
+
max_age: Optional[int] = None,
|
|
217
231
|
raise_on_error: bool = True,
|
|
218
232
|
) -> Dict[str, str] | Dict[str, bytes] | Dict[str, dict]:
|
|
219
233
|
"""
|
|
@@ -247,7 +261,7 @@ class SSMProvider(BaseProvider):
|
|
|
247
261
|
Transforms the content from a JSON object ('json') or base64 binary string ('binary')
|
|
248
262
|
decrypt: bool, optional
|
|
249
263
|
If the parameter values should be decrypted
|
|
250
|
-
max_age: int
|
|
264
|
+
max_age: int, optional
|
|
251
265
|
Maximum age of the cached value
|
|
252
266
|
raise_on_error: bool
|
|
253
267
|
Whether to fail-fast or fail gracefully by including "_errors" key in the response, by default True
|
|
@@ -259,6 +273,15 @@ class SSMProvider(BaseProvider):
|
|
|
259
273
|
|
|
260
274
|
When "_errors" reserved key is in parameters to be fetched from SSM.
|
|
261
275
|
"""
|
|
276
|
+
|
|
277
|
+
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
|
|
278
|
+
max_age = resolve_max_age(env=os.getenv(constants.PARAMETERS_MAX_AGE_ENV, DEFAULT_MAX_AGE_SECS), choice=max_age)
|
|
279
|
+
|
|
280
|
+
# If decrypt is not set, resolve it from the environment variable, defaulting to False
|
|
281
|
+
decrypt = resolve_truthy_env_var_choice(
|
|
282
|
+
env=os.getenv(constants.PARAMETERS_SSM_DECRYPT_ENV, "false"), choice=decrypt
|
|
283
|
+
)
|
|
284
|
+
|
|
262
285
|
# Init potential batch/decrypt batch responses and errors
|
|
263
286
|
batch_ret: Dict[str, Any] = {}
|
|
264
287
|
decrypt_ret: Dict[str, Any] = {}
|
|
@@ -487,9 +510,9 @@ class SSMProvider(BaseProvider):
|
|
|
487
510
|
def get_parameter(
|
|
488
511
|
name: str,
|
|
489
512
|
transform: Optional[str] = None,
|
|
490
|
-
decrypt: bool =
|
|
513
|
+
decrypt: Optional[bool] = None,
|
|
491
514
|
force_fetch: bool = False,
|
|
492
|
-
max_age: int =
|
|
515
|
+
max_age: Optional[int] = None,
|
|
493
516
|
**sdk_options,
|
|
494
517
|
) -> Union[str, dict, bytes]:
|
|
495
518
|
"""
|
|
@@ -505,7 +528,7 @@ def get_parameter(
|
|
|
505
528
|
If the parameter values should be decrypted
|
|
506
529
|
force_fetch: bool, optional
|
|
507
530
|
Force update even before a cached item has expired, defaults to False
|
|
508
|
-
max_age: int
|
|
531
|
+
max_age: int, optional
|
|
509
532
|
Maximum age of the cached value
|
|
510
533
|
sdk_options: dict, optional
|
|
511
534
|
Dictionary of options that will be passed to the Parameter Store get_parameter API call
|
|
@@ -543,6 +566,14 @@ def get_parameter(
|
|
|
543
566
|
if "ssm" not in DEFAULT_PROVIDERS:
|
|
544
567
|
DEFAULT_PROVIDERS["ssm"] = SSMProvider()
|
|
545
568
|
|
|
569
|
+
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
|
|
570
|
+
max_age = resolve_max_age(env=os.getenv(constants.PARAMETERS_MAX_AGE_ENV, DEFAULT_MAX_AGE_SECS), choice=max_age)
|
|
571
|
+
|
|
572
|
+
# If decrypt is not set, resolve it from the environment variable, defaulting to False
|
|
573
|
+
decrypt = resolve_truthy_env_var_choice(
|
|
574
|
+
env=os.getenv(constants.PARAMETERS_SSM_DECRYPT_ENV, "false"), choice=decrypt
|
|
575
|
+
)
|
|
576
|
+
|
|
546
577
|
# Add to `decrypt` sdk_options to we can have an explicit option for this
|
|
547
578
|
sdk_options["decrypt"] = decrypt
|
|
548
579
|
|
|
@@ -555,9 +586,9 @@ def get_parameters(
|
|
|
555
586
|
path: str,
|
|
556
587
|
transform: Optional[str] = None,
|
|
557
588
|
recursive: bool = True,
|
|
558
|
-
decrypt: bool =
|
|
589
|
+
decrypt: Optional[bool] = None,
|
|
559
590
|
force_fetch: bool = False,
|
|
560
|
-
max_age: int =
|
|
591
|
+
max_age: Optional[int] = None,
|
|
561
592
|
raise_on_transform_error: bool = False,
|
|
562
593
|
**sdk_options,
|
|
563
594
|
) -> Union[Dict[str, str], Dict[str, dict], Dict[str, bytes]]:
|
|
@@ -576,7 +607,7 @@ def get_parameters(
|
|
|
576
607
|
If the parameter values should be decrypted
|
|
577
608
|
force_fetch: bool, optional
|
|
578
609
|
Force update even before a cached item has expired, defaults to False
|
|
579
|
-
max_age: int
|
|
610
|
+
max_age: int, optional
|
|
580
611
|
Maximum age of the cached value
|
|
581
612
|
raise_on_transform_error: bool, optional
|
|
582
613
|
Raises an exception if any transform fails, otherwise this will
|
|
@@ -617,6 +648,14 @@ def get_parameters(
|
|
|
617
648
|
if "ssm" not in DEFAULT_PROVIDERS:
|
|
618
649
|
DEFAULT_PROVIDERS["ssm"] = SSMProvider()
|
|
619
650
|
|
|
651
|
+
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
|
|
652
|
+
max_age = resolve_max_age(env=os.getenv(constants.PARAMETERS_MAX_AGE_ENV, DEFAULT_MAX_AGE_SECS), choice=max_age)
|
|
653
|
+
|
|
654
|
+
# If decrypt is not set, resolve it from the environment variable, defaulting to False
|
|
655
|
+
decrypt = resolve_truthy_env_var_choice(
|
|
656
|
+
env=os.getenv(constants.PARAMETERS_SSM_DECRYPT_ENV, "false"), choice=decrypt
|
|
657
|
+
)
|
|
658
|
+
|
|
620
659
|
sdk_options["recursive"] = recursive
|
|
621
660
|
sdk_options["decrypt"] = decrypt
|
|
622
661
|
|
|
@@ -634,8 +673,8 @@ def get_parameters(
|
|
|
634
673
|
def get_parameters_by_name(
|
|
635
674
|
parameters: Dict[str, Dict],
|
|
636
675
|
transform: None = None,
|
|
637
|
-
decrypt: bool =
|
|
638
|
-
max_age: int =
|
|
676
|
+
decrypt: Optional[bool] = None,
|
|
677
|
+
max_age: Optional[int] = None,
|
|
639
678
|
raise_on_error: bool = True,
|
|
640
679
|
) -> Dict[str, str]:
|
|
641
680
|
...
|
|
@@ -645,8 +684,8 @@ def get_parameters_by_name(
|
|
|
645
684
|
def get_parameters_by_name(
|
|
646
685
|
parameters: Dict[str, Dict],
|
|
647
686
|
transform: Literal["binary"],
|
|
648
|
-
decrypt: bool =
|
|
649
|
-
max_age: int =
|
|
687
|
+
decrypt: Optional[bool] = None,
|
|
688
|
+
max_age: Optional[int] = None,
|
|
650
689
|
raise_on_error: bool = True,
|
|
651
690
|
) -> Dict[str, bytes]:
|
|
652
691
|
...
|
|
@@ -656,8 +695,8 @@ def get_parameters_by_name(
|
|
|
656
695
|
def get_parameters_by_name(
|
|
657
696
|
parameters: Dict[str, Dict],
|
|
658
697
|
transform: Literal["json"],
|
|
659
|
-
decrypt: bool =
|
|
660
|
-
max_age: int =
|
|
698
|
+
decrypt: Optional[bool] = None,
|
|
699
|
+
max_age: Optional[int] = None,
|
|
661
700
|
raise_on_error: bool = True,
|
|
662
701
|
) -> Dict[str, Dict[str, Any]]:
|
|
663
702
|
...
|
|
@@ -667,8 +706,8 @@ def get_parameters_by_name(
|
|
|
667
706
|
def get_parameters_by_name(
|
|
668
707
|
parameters: Dict[str, Dict],
|
|
669
708
|
transform: Literal["auto"],
|
|
670
|
-
decrypt: bool =
|
|
671
|
-
max_age: int =
|
|
709
|
+
decrypt: Optional[bool] = None,
|
|
710
|
+
max_age: Optional[int] = None,
|
|
672
711
|
raise_on_error: bool = True,
|
|
673
712
|
) -> Union[Dict[str, str], Dict[str, dict]]:
|
|
674
713
|
...
|
|
@@ -677,8 +716,8 @@ def get_parameters_by_name(
|
|
|
677
716
|
def get_parameters_by_name(
|
|
678
717
|
parameters: Dict[str, Any],
|
|
679
718
|
transform: TransformOptions = None,
|
|
680
|
-
decrypt: bool =
|
|
681
|
-
max_age: int =
|
|
719
|
+
decrypt: Optional[bool] = None,
|
|
720
|
+
max_age: Optional[int] = None,
|
|
682
721
|
raise_on_error: bool = True,
|
|
683
722
|
) -> Union[Dict[str, str], Dict[str, bytes], Dict[str, dict]]:
|
|
684
723
|
"""
|
|
@@ -692,7 +731,7 @@ def get_parameters_by_name(
|
|
|
692
731
|
Transforms the content from a JSON object ('json') or base64 binary string ('binary')
|
|
693
732
|
decrypt: bool, optional
|
|
694
733
|
If the parameter values should be decrypted
|
|
695
|
-
max_age: int
|
|
734
|
+
max_age: int, optional
|
|
696
735
|
Maximum age of the cached value
|
|
697
736
|
raise_on_error: bool, optional
|
|
698
737
|
Whether to fail-fast or fail gracefully by including "_errors" key in the response, by default True
|
|
@@ -732,6 +771,14 @@ def get_parameters_by_name(
|
|
|
732
771
|
# NOTE: Decided against using multi-thread due to single-thread outperforming in 128M and 1G + timeout risk
|
|
733
772
|
# see: https://github.com/awslabs/aws-lambda-powertools-python/issues/1040#issuecomment-1299954613
|
|
734
773
|
|
|
774
|
+
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
|
|
775
|
+
max_age = resolve_max_age(env=os.getenv(constants.PARAMETERS_MAX_AGE_ENV, DEFAULT_MAX_AGE_SECS), choice=max_age)
|
|
776
|
+
|
|
777
|
+
# If decrypt is not set, resolve it from the environment variable, defaulting to False
|
|
778
|
+
decrypt = resolve_truthy_env_var_choice(
|
|
779
|
+
env=os.getenv(constants.PARAMETERS_SSM_DECRYPT_ENV, "false"), choice=decrypt
|
|
780
|
+
)
|
|
781
|
+
|
|
735
782
|
# Only create the provider if this function is called at least once
|
|
736
783
|
if "ssm" not in DEFAULT_PROVIDERS:
|
|
737
784
|
DEFAULT_PROVIDERS["ssm"] = SSMProvider()
|
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
import io
|
|
2
2
|
import logging
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import (
|
|
4
|
+
IO,
|
|
5
|
+
TYPE_CHECKING,
|
|
6
|
+
Any,
|
|
7
|
+
Iterable,
|
|
8
|
+
List,
|
|
9
|
+
Optional,
|
|
10
|
+
Sequence,
|
|
11
|
+
TypeVar,
|
|
12
|
+
Union,
|
|
13
|
+
cast,
|
|
14
|
+
)
|
|
4
15
|
|
|
5
16
|
import boto3
|
|
6
17
|
|
|
7
18
|
from aws_lambda_powertools.utilities.streaming.compat import PowertoolsStreamingBody
|
|
8
19
|
|
|
9
20
|
if TYPE_CHECKING:
|
|
21
|
+
from mmap import mmap
|
|
22
|
+
|
|
10
23
|
from mypy_boto3_s3 import Client
|
|
11
24
|
|
|
25
|
+
_CData = TypeVar("_CData")
|
|
26
|
+
|
|
12
27
|
logger = logging.getLogger(__name__)
|
|
13
28
|
|
|
14
29
|
|
|
@@ -177,8 +192,11 @@ class _S3SeekableIO(IO[bytes]):
|
|
|
177
192
|
def truncate(self, size: Optional[int] = 0) -> int:
|
|
178
193
|
raise NotImplementedError("this stream is not writable")
|
|
179
194
|
|
|
180
|
-
def write(self, data:
|
|
195
|
+
def write(self, data: Union[bytes, Union[bytearray, memoryview, Sequence[Any], "mmap", "_CData"]]) -> int:
|
|
181
196
|
raise NotImplementedError("this stream is not writable")
|
|
182
197
|
|
|
183
|
-
def writelines(
|
|
198
|
+
def writelines(
|
|
199
|
+
self,
|
|
200
|
+
data: Iterable[Union[bytes, Union[bytearray, memoryview, Sequence[Any], "mmap", "_CData"]]],
|
|
201
|
+
) -> None:
|
|
184
202
|
raise NotImplementedError("this stream is not writable")
|
|
@@ -4,11 +4,13 @@ import io
|
|
|
4
4
|
from typing import (
|
|
5
5
|
IO,
|
|
6
6
|
TYPE_CHECKING,
|
|
7
|
-
|
|
7
|
+
Any,
|
|
8
8
|
Iterable,
|
|
9
9
|
List,
|
|
10
10
|
Optional,
|
|
11
11
|
Sequence,
|
|
12
|
+
TypeVar,
|
|
13
|
+
Union,
|
|
12
14
|
cast,
|
|
13
15
|
overload,
|
|
14
16
|
)
|
|
@@ -26,8 +28,12 @@ from aws_lambda_powertools.utilities.streaming.transformations.base import (
|
|
|
26
28
|
)
|
|
27
29
|
|
|
28
30
|
if TYPE_CHECKING:
|
|
31
|
+
from mmap import mmap
|
|
32
|
+
|
|
29
33
|
from mypy_boto3_s3 import Client
|
|
30
34
|
|
|
35
|
+
_CData = TypeVar("_CData")
|
|
36
|
+
|
|
31
37
|
|
|
32
38
|
# Maintenance: almost all this logic should be moved to a base class
|
|
33
39
|
class S3Object(IO[bytes]):
|
|
@@ -252,8 +258,11 @@ class S3Object(IO[bytes]):
|
|
|
252
258
|
def truncate(self, size: Optional[int] = 0) -> int:
|
|
253
259
|
raise NotImplementedError("this stream is not writable")
|
|
254
260
|
|
|
255
|
-
def write(self, data:
|
|
261
|
+
def write(self, data: Union[bytes, Union[bytearray, memoryview, Sequence[Any], "mmap", "_CData"]]) -> int:
|
|
256
262
|
raise NotImplementedError("this stream is not writable")
|
|
257
263
|
|
|
258
|
-
def writelines(
|
|
264
|
+
def writelines(
|
|
265
|
+
self,
|
|
266
|
+
data: Iterable[Union[bytes, Union[bytearray, memoryview, Sequence[Any], "mmap", "_CData"]]],
|
|
267
|
+
) -> None:
|
|
259
268
|
raise NotImplementedError("this stream is not writable")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "aws_lambda_powertools"
|
|
3
|
-
version = "2.
|
|
3
|
+
version = "2.14.0"
|
|
4
4
|
description = "AWS Lambda Powertools is a developer toolkit to implement Serverless best practices and increase developer velocity."
|
|
5
5
|
authors = ["Amazon Web Services"]
|
|
6
6
|
include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"]
|
|
@@ -35,7 +35,7 @@ typing-extensions = "^4.4.0"
|
|
|
35
35
|
|
|
36
36
|
[tool.poetry.dev-dependencies]
|
|
37
37
|
coverage = {extras = ["toml"], version = "^7.2"}
|
|
38
|
-
pytest = "^7.
|
|
38
|
+
pytest = "^7.3.1"
|
|
39
39
|
black = "^23.3"
|
|
40
40
|
boto3 = "^1.18"
|
|
41
41
|
flake8 = [
|
|
@@ -44,7 +44,7 @@ flake8 = [
|
|
|
44
44
|
{ version = ">=5", python= ">=3.8"},
|
|
45
45
|
]
|
|
46
46
|
flake8-builtins = "^2.1.0"
|
|
47
|
-
flake8-comprehensions = "^3.
|
|
47
|
+
flake8-comprehensions = "^3.12.0"
|
|
48
48
|
flake8-debugger = "^4.0.0"
|
|
49
49
|
flake8-fixme = "^1.1.1"
|
|
50
50
|
flake8-variables-names = "^0.0.5"
|
|
@@ -63,7 +63,7 @@ mkdocs-git-revision-date-plugin = "^0.3.2"
|
|
|
63
63
|
mike = "^1.1.2"
|
|
64
64
|
retry = "^0.9.2"
|
|
65
65
|
pytest-xdist = "^3.2.1"
|
|
66
|
-
aws-cdk-lib = "^2.
|
|
66
|
+
aws-cdk-lib = "^2.75.0"
|
|
67
67
|
"aws-cdk.aws-apigatewayv2-alpha" = "^2.38.1-alpha.0"
|
|
68
68
|
"aws-cdk.aws-apigatewayv2-integrations-alpha" = "^2.38.1-alpha.0"
|
|
69
69
|
"aws-cdk.aws-apigatewayv2-authorizers-alpha" = "^2.38.1-alpha.0"
|
|
@@ -72,8 +72,8 @@ python-snappy = "^0.6.1"
|
|
|
72
72
|
mypy-boto3-appconfig = "^1.26.71"
|
|
73
73
|
mypy-boto3-cloudformation = "^1.26.108"
|
|
74
74
|
mypy-boto3-cloudwatch = "^1.26.99"
|
|
75
|
-
mypy-boto3-dynamodb = "^1.26.
|
|
76
|
-
mypy-boto3-lambda = "^1.26.
|
|
75
|
+
mypy-boto3-dynamodb = "^1.26.115"
|
|
76
|
+
mypy-boto3-lambda = "^1.26.115"
|
|
77
77
|
mypy-boto3-logs = "^1.26.53"
|
|
78
78
|
mypy-boto3-secretsmanager = "^1.26.89"
|
|
79
79
|
mypy-boto3-ssm = "^1.26.97"
|
|
@@ -81,11 +81,11 @@ mypy-boto3-s3 = "^1.26.104"
|
|
|
81
81
|
mypy-boto3-xray = "^1.26.11"
|
|
82
82
|
types-requests = "^2.28.11"
|
|
83
83
|
typing-extensions = "^4.4.0"
|
|
84
|
-
mkdocs-material = "^9.1.
|
|
84
|
+
mkdocs-material = "^9.1.6"
|
|
85
85
|
filelock = "^3.11.0"
|
|
86
86
|
checksumdir = "^1.2.0"
|
|
87
87
|
mypy-boto3-appconfigdata = "^1.26.70"
|
|
88
|
-
importlib-metadata = "^6.
|
|
88
|
+
importlib-metadata = "^6.4"
|
|
89
89
|
ijson = "^3.2.0"
|
|
90
90
|
typed-ast = { version = "^1.5.4", python = "< 3.8"}
|
|
91
91
|
hvac = "^1.1.0"
|
|
@@ -100,10 +100,10 @@ all = ["pydantic", "aws-xray-sdk", "fastjsonschema"]
|
|
|
100
100
|
aws-sdk = ["boto3"]
|
|
101
101
|
|
|
102
102
|
[tool.poetry.group.dev.dependencies]
|
|
103
|
-
cfn-lint = "0.
|
|
103
|
+
cfn-lint = "0.77.1"
|
|
104
104
|
mypy = "^1.1.1"
|
|
105
105
|
types-python-dateutil = "^2.8.19.6"
|
|
106
|
-
httpx = "
|
|
106
|
+
httpx = ">=0.23.3,<0.25.0"
|
|
107
107
|
|
|
108
108
|
[tool.coverage.run]
|
|
109
109
|
source = ["aws_lambda_powertools"]
|
|
@@ -44,7 +44,7 @@ extras_require = \
|
|
|
44
44
|
|
|
45
45
|
setup_kwargs = {
|
|
46
46
|
'name': 'aws-lambda-powertools',
|
|
47
|
-
'version': '2.
|
|
47
|
+
'version': '2.14.0',
|
|
48
48
|
'description': 'AWS Lambda Powertools is a developer toolkit to implement Serverless best practices and increase developer velocity.',
|
|
49
49
|
'long_description': '<!-- markdownlint-disable MD013 MD041 MD043 -->\n# AWS Lambda Powertools for Python\n\n[](https://github.com/awslabs/aws-lambda-powertools-python/actions/workflows/python_build.yml)\n[](https://app.codecov.io/gh/awslabs/aws-lambda-powertools-python)\n   [](https://discord.gg/B8zZKbbyET)\n\nPowertools is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://awslabs.github.io/aws-lambda-powertools-python/latest/#features).\n\n> Also available in [Java](https://github.com/awslabs/aws-lambda-powertools-java), [Typescript](https://github.com/awslabs/aws-lambda-powertools-typescript), and [.NET](https://awslabs.github.io/aws-lambda-powertools-dotnet/).\n\n**[📜Documentation](https://awslabs.github.io/aws-lambda-powertools-python/)** | **[🐍PyPi](https://pypi.org/project/aws-lambda-powertools/)** | **[Roadmap](https://awslabs.github.io/aws-lambda-powertools-python/latest/roadmap/)** | **[Detailed blog post](https://aws.amazon.com/blogs/opensource/simplifying-serverless-best-practices-with-lambda-powertools/)**\n\n> **An AWS Developer Acceleration (DevAx) initiative by Specialist Solution Architects | aws-devax-open-source@amazon.com**\n\n\n\n## Features\n\n* **[Tracing](https://awslabs.github.io/aws-lambda-powertools-python/latest/core/tracer/)** - Decorators and utilities to trace Lambda function handlers, and both synchronous and asynchronous functions\n* **[Logging](https://awslabs.github.io/aws-lambda-powertools-python/latest/core/logger/)** - Structured logging made easier, and decorator to enrich structured logging with key Lambda context details\n* **[Metrics](https://awslabs.github.io/aws-lambda-powertools-python/latest/core/metrics/)** - Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF)\n* **[Event handler: AppSync](https://awslabs.github.io/aws-lambda-powertools-python/latest/core/event_handler/appsync/)** - AWS AppSync event handler for Lambda Direct Resolver and Amplify GraphQL Transformer function\n* **[Event handler: API Gateway and ALB](https://awslabs.github.io/aws-lambda-powertools-python/latest/core/event_handler/api_gateway/)** - Amazon API Gateway REST/HTTP API and ALB event handler for Lambda functions invoked using Proxy integration\n* **[Bring your own middleware](https://awslabs.github.io/aws-lambda-powertools-python/latest/utilities/middleware_factory/)** - Decorator factory to create your own middleware to run logic before, and after each Lambda invocation\n* **[Parameters utility](https://awslabs.github.io/aws-lambda-powertools-python/latest/utilities/parameters/)** - Retrieve and cache parameter values from Parameter Store, Secrets Manager, or DynamoDB\n* **[Batch processing](https://awslabs.github.io/aws-lambda-powertools-python/latest/utilities/batch/)** - Handle partial failures for AWS SQS batch processing\n* **[Typing](https://awslabs.github.io/aws-lambda-powertools-python/latest/utilities/typing/)** - Static typing classes to speedup development in your IDE\n* **[Validation](https://awslabs.github.io/aws-lambda-powertools-python/latest/utilities/validation/)** - JSON Schema validator for inbound events and responses\n* **[Event source data classes](https://awslabs.github.io/aws-lambda-powertools-python/latest/utilities/data_classes/)** - Data classes describing the schema of common Lambda event triggers\n* **[Parser](https://awslabs.github.io/aws-lambda-powertools-python/latest/utilities/parser/)** - Data parsing and deep validation using Pydantic\n* **[Idempotency](https://awslabs.github.io/aws-lambda-powertools-python/latest/utilities/idempotency/)** - Convert your Lambda functions into idempotent operations which are safe to retry\n* **[Feature Flags](https://awslabs.github.io/aws-lambda-powertools-python/latest/utilities/feature_flags/)** - A simple rule engine to evaluate when one or multiple features should be enabled depending on the input\n* **[Streaming](https://awslabs.github.io/aws-lambda-powertools-python/latest/utilities/streaming/)** - Streams datasets larger than the available memory as streaming data.\n\n### Installation\n\nWith [pip](https://pip.pypa.io/en/latest/index.html) installed, run: ``pip install aws-lambda-powertools``\n\n## Tutorial and Examples\n\n* [Tutorial](https://awslabs.github.io/aws-lambda-powertools-python/latest/tutorial)\n* [Serverless Shopping cart](https://github.com/aws-samples/aws-serverless-shopping-cart)\n* [Serverless Airline](https://github.com/aws-samples/aws-serverless-airline-booking)\n* [Serverless E-commerce platform](https://github.com/aws-samples/aws-serverless-ecommerce-platform)\n* [Serverless GraphQL Nanny Booking Api](https://github.com/trey-rosius/babysitter_api)\n\n## Credits\n\n* Structured logging initial implementation from [aws-lambda-logging](https://gitlab.com/hadrien/aws_lambda_logging)\n* Powertools idea [DAZN Powertools](https://github.com/getndazn/dazn-lambda-powertools/)\n\n## Connect\n\n* **AWS Lambda Powertools on Discord**: `#python` - **[Invite link](https://discord.gg/B8zZKbbyET)**\n* **Email**: aws-lambda-powertools-feedback@amazon.com\n\n## Security disclosures\n\nIf you think you’ve found a potential security issue, please do not post it in the Issues. Instead, please follow the instructions [here](https://aws.amazon.com/security/vulnerability-reporting/) or [email AWS security directly](mailto:aws-security@amazon.com).\n\n## License\n\nThis library is licensed under the MIT-0 License. See the LICENSE file.\n',
|
|
50
50
|
'author': 'Amazon Web Services',
|
|
File without changes
|