aws-lambda-powertools 2.39.2a4__tar.gz → 2.40.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.39.2a4 → aws_lambda_powertools-2.40.0}/PKG-INFO +1 -1
- aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/appsync.py +462 -0
- aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/graphql_appsync/_registry.py +76 -0
- aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/graphql_appsync/base.py +158 -0
- aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/graphql_appsync/exceptions.py +10 -0
- aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/graphql_appsync/router.py +53 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/version.py +1 -1
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +2 -2
- aws_lambda_powertools-2.40.0/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/secrets.py +1 -1
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/pyproject.toml +6 -5
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/setup.py +2 -1
- aws_lambda_powertools-2.39.2a4/aws_lambda_powertools/event_handler/appsync.py +0 -216
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/LICENSE +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/README.md +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/THIRD-PARTY-LICENSES +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/api_gateway.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/content_types.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4/aws_lambda_powertools/event_handler/openapi → aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/graphql_appsync}/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
- {aws_lambda_powertools-2.39.2a4/aws_lambda_powertools/metrics/provider/cloudwatch_emf → aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/openapi}/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/compat.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/models.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/router.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/types.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/util.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/exceptions/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/constants.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/filters.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/formatter.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/lambda_context.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/logger.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/types.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/utils.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/functions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/metric.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/metrics.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4/aws_lambda_powertools/utilities/data_classes/appsync → aws_lambda_powertools-2.40.0/aws_lambda_powertools/metrics/provider/cloudwatch_emf}/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/types.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/package_logger.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/py.typed +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/cache_dict.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/constants.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/cookies.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/functions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/json_encoder.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/lazy_import.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/types.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/user_agent.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/tracing/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/tracing/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/tracing/extensions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/tracing/tracer.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/types.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/alb_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4/aws_lambda_powertools/utilities/idempotency/persistence → aws_lambda_powertools-2.40.0/aws_lambda_powertools/utilities/data_classes/appsync}/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/cloudformation_custom_resource_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/common.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/s3_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/constants.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/provider/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/provider/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/config.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/hook.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
- {aws_lambda_powertools-2.39.2a4/aws_lambda_powertools/utilities/idempotency/serialization → aws_lambda_powertools-2.40.0/aws_lambda_powertools/utilities/idempotency/persistence}/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/compat.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/s3.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/s3_batch_operation.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/sqs.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/parser.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/types.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/serialization.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/typing/lambda_client_context_mobile_client.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/validation/base.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/validation/validator.py +0 -0
- {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/warnings/__init__.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.40.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
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import logging
|
|
3
|
+
import warnings
|
|
4
|
+
from typing import Any, Callable, Dict, List, Optional, Type, Union
|
|
5
|
+
|
|
6
|
+
from aws_lambda_powertools.event_handler.graphql_appsync.exceptions import InvalidBatchResponse, ResolverNotFoundError
|
|
7
|
+
from aws_lambda_powertools.event_handler.graphql_appsync.router import Router
|
|
8
|
+
from aws_lambda_powertools.utilities.data_classes import AppSyncResolverEvent
|
|
9
|
+
from aws_lambda_powertools.utilities.typing import LambdaContext
|
|
10
|
+
from aws_lambda_powertools.warnings import PowertoolsUserWarning
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AppSyncResolver(Router):
|
|
16
|
+
"""
|
|
17
|
+
AppSync GraphQL API Resolver
|
|
18
|
+
|
|
19
|
+
Example
|
|
20
|
+
-------
|
|
21
|
+
```python
|
|
22
|
+
from aws_lambda_powertools.event_handler import AppSyncResolver
|
|
23
|
+
|
|
24
|
+
app = AppSyncResolver()
|
|
25
|
+
|
|
26
|
+
@app.resolver(type_name="Query", field_name="listLocations")
|
|
27
|
+
def list_locations(page: int = 0, size: int = 10) -> list:
|
|
28
|
+
# Your logic to fetch locations with arguments passed in
|
|
29
|
+
return [{"id": 100, "name": "Smooth Grooves"}]
|
|
30
|
+
|
|
31
|
+
@app.resolver(type_name="Merchant", field_name="extraInfo")
|
|
32
|
+
def get_extra_info() -> dict:
|
|
33
|
+
# Can use "app.current_event.source" to filter within the parent context
|
|
34
|
+
account_type = app.current_event.source["accountType"]
|
|
35
|
+
method = "BTC" if account_type == "NEW" else "USD"
|
|
36
|
+
return {"preferredPaymentMethod": method}
|
|
37
|
+
|
|
38
|
+
@app.resolver(field_name="commonField")
|
|
39
|
+
def common_field() -> str:
|
|
40
|
+
# Would match all fieldNames matching 'commonField'
|
|
41
|
+
return str(uuid.uuid4())
|
|
42
|
+
```
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self):
|
|
46
|
+
"""
|
|
47
|
+
Initialize a new instance of the AppSyncResolver.
|
|
48
|
+
"""
|
|
49
|
+
super().__init__()
|
|
50
|
+
self.context = {} # early init as customers might add context before event resolution
|
|
51
|
+
|
|
52
|
+
self.current_batch_event: List[AppSyncResolverEvent] = []
|
|
53
|
+
self.current_event: Optional[AppSyncResolverEvent] = None
|
|
54
|
+
self.lambda_context: Optional[LambdaContext] = None
|
|
55
|
+
|
|
56
|
+
def __call__(
|
|
57
|
+
self,
|
|
58
|
+
event: dict,
|
|
59
|
+
context: LambdaContext,
|
|
60
|
+
data_model: Type[AppSyncResolverEvent] = AppSyncResolverEvent,
|
|
61
|
+
) -> Any:
|
|
62
|
+
"""Implicit lambda handler which internally calls `resolve`"""
|
|
63
|
+
return self.resolve(event, context, data_model)
|
|
64
|
+
|
|
65
|
+
def resolve(
|
|
66
|
+
self,
|
|
67
|
+
event: Union[dict, List[Dict]],
|
|
68
|
+
context: LambdaContext,
|
|
69
|
+
data_model: Type[AppSyncResolverEvent] = AppSyncResolverEvent,
|
|
70
|
+
) -> Any:
|
|
71
|
+
"""Resolves the response based on the provide event and decorator routes
|
|
72
|
+
|
|
73
|
+
Parameters
|
|
74
|
+
----------
|
|
75
|
+
event : dict | List[Dict]
|
|
76
|
+
Lambda event either coming from batch processing endpoint or from standard processing endpoint
|
|
77
|
+
context : LambdaContext
|
|
78
|
+
Lambda context
|
|
79
|
+
data_model:
|
|
80
|
+
Your data data_model to decode AppSync event, by default AppSyncResolverEvent
|
|
81
|
+
|
|
82
|
+
Example
|
|
83
|
+
-------
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
from aws_lambda_powertools.event_handler import AppSyncResolver
|
|
87
|
+
from aws_lambda_powertools.utilities.typing import LambdaContext
|
|
88
|
+
|
|
89
|
+
@app.resolver(field_name="createSomething")
|
|
90
|
+
def create_something(id: str): # noqa AA03 VNE003
|
|
91
|
+
return id
|
|
92
|
+
|
|
93
|
+
def handler(event, context: LambdaContext):
|
|
94
|
+
return app.resolve(event, context)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Bringing custom models**
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
from aws_lambda_powertools import Logger, Tracer
|
|
101
|
+
|
|
102
|
+
from aws_lambda_powertools.logging import correlation_paths
|
|
103
|
+
from aws_lambda_powertools.event_handler import AppSyncResolver
|
|
104
|
+
|
|
105
|
+
tracer = Tracer(service="sample_resolver")
|
|
106
|
+
logger = Logger(service="sample_resolver")
|
|
107
|
+
app = AppSyncResolver()
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class MyCustomModel(AppSyncResolverEvent):
|
|
111
|
+
@property
|
|
112
|
+
def country_viewer(self) -> str:
|
|
113
|
+
return self.request_headers.get("cloudfront-viewer-country")
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
@app.resolver(field_name="listLocations")
|
|
117
|
+
@app.resolver(field_name="locations")
|
|
118
|
+
def get_locations(name: str, description: str = ""):
|
|
119
|
+
if app.current_event.country_viewer == "US":
|
|
120
|
+
...
|
|
121
|
+
return name + description
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@logger.inject_lambda_context(correlation_id_path=correlation_paths.APPSYNC_RESOLVER)
|
|
125
|
+
@tracer.capture_lambda_handler
|
|
126
|
+
def lambda_handler(event, context):
|
|
127
|
+
return app.resolve(event, context, data_model=MyCustomModel)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Returns
|
|
131
|
+
-------
|
|
132
|
+
Any
|
|
133
|
+
Returns the result of the resolver
|
|
134
|
+
|
|
135
|
+
Raises
|
|
136
|
+
-------
|
|
137
|
+
ValueError
|
|
138
|
+
If we could not find a field resolver
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
self.lambda_context = context
|
|
142
|
+
|
|
143
|
+
if isinstance(event, list):
|
|
144
|
+
response = self._call_batch_resolver(event=event, data_model=data_model)
|
|
145
|
+
else:
|
|
146
|
+
response = self._call_single_resolver(event=event, data_model=data_model)
|
|
147
|
+
|
|
148
|
+
self.clear_context()
|
|
149
|
+
|
|
150
|
+
return response
|
|
151
|
+
|
|
152
|
+
def _call_single_resolver(self, event: dict, data_model: Type[AppSyncResolverEvent]) -> Any:
|
|
153
|
+
"""Call single event resolver
|
|
154
|
+
|
|
155
|
+
Parameters
|
|
156
|
+
----------
|
|
157
|
+
event : dict
|
|
158
|
+
Event
|
|
159
|
+
data_model : Type[AppSyncResolverEvent]
|
|
160
|
+
Data_model to decode AppSync event, by default it is of AppSyncResolverEvent type or subclass of it
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
logger.debug("Processing direct resolver event")
|
|
164
|
+
|
|
165
|
+
self.current_event = data_model(event)
|
|
166
|
+
resolver = self._resolver_registry.find_resolver(self.current_event.type_name, self.current_event.field_name)
|
|
167
|
+
if not resolver:
|
|
168
|
+
raise ValueError(f"No resolver found for '{self.current_event.type_name}.{self.current_event.field_name}'")
|
|
169
|
+
return resolver["func"](**self.current_event.arguments)
|
|
170
|
+
|
|
171
|
+
def _call_sync_batch_resolver(
|
|
172
|
+
self,
|
|
173
|
+
resolver: Callable,
|
|
174
|
+
raise_on_error: bool = False,
|
|
175
|
+
aggregate: bool = True,
|
|
176
|
+
) -> List[Any]:
|
|
177
|
+
"""
|
|
178
|
+
Calls a synchronous batch resolver function for each event in the current batch.
|
|
179
|
+
|
|
180
|
+
Parameters
|
|
181
|
+
----------
|
|
182
|
+
resolver: Callable
|
|
183
|
+
The callable function to resolve events.
|
|
184
|
+
raise_on_error: bool
|
|
185
|
+
A flag indicating whether to raise an error when processing batches
|
|
186
|
+
with failed items. Defaults to False, which means errors are handled without raising exceptions.
|
|
187
|
+
aggregate: bool
|
|
188
|
+
A flag indicating whether the batch items should be processed at once or individually.
|
|
189
|
+
If True (default), the batch resolver will process all items in the batch as a single event.
|
|
190
|
+
If False, the batch resolver will process each item in the batch individually.
|
|
191
|
+
|
|
192
|
+
Returns
|
|
193
|
+
-------
|
|
194
|
+
List[Any]
|
|
195
|
+
A list of results corresponding to the resolved events.
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
logger.debug(f"Graceful error handling flag {raise_on_error=}")
|
|
199
|
+
|
|
200
|
+
# Checks whether the entire batch should be processed at once
|
|
201
|
+
if aggregate:
|
|
202
|
+
# Process the entire batch
|
|
203
|
+
response = resolver(event=self.current_batch_event)
|
|
204
|
+
|
|
205
|
+
if not isinstance(response, List):
|
|
206
|
+
raise InvalidBatchResponse("The response must be a List when using batch resolvers")
|
|
207
|
+
|
|
208
|
+
return response
|
|
209
|
+
|
|
210
|
+
# Non aggregated events, so we call this event list x times
|
|
211
|
+
# Stop on first exception we encounter
|
|
212
|
+
if raise_on_error:
|
|
213
|
+
return [
|
|
214
|
+
resolver(event=appconfig_event, **appconfig_event.arguments)
|
|
215
|
+
for appconfig_event in self.current_batch_event
|
|
216
|
+
]
|
|
217
|
+
|
|
218
|
+
# By default, we gracefully append `None` for any records that failed processing
|
|
219
|
+
results = []
|
|
220
|
+
for idx, event in enumerate(self.current_batch_event):
|
|
221
|
+
try:
|
|
222
|
+
results.append(resolver(event=event, **event.arguments))
|
|
223
|
+
except Exception:
|
|
224
|
+
logger.debug(f"Failed to process event number {idx} from field '{event.info.field_name}'")
|
|
225
|
+
results.append(None)
|
|
226
|
+
|
|
227
|
+
return results
|
|
228
|
+
|
|
229
|
+
async def _call_async_batch_resolver(
|
|
230
|
+
self,
|
|
231
|
+
resolver: Callable,
|
|
232
|
+
raise_on_error: bool = False,
|
|
233
|
+
aggregate: bool = True,
|
|
234
|
+
) -> List[Any]:
|
|
235
|
+
"""
|
|
236
|
+
Asynchronously call a batch resolver for each event in the current batch.
|
|
237
|
+
|
|
238
|
+
Parameters
|
|
239
|
+
----------
|
|
240
|
+
resolver: Callable
|
|
241
|
+
The asynchronous resolver function.
|
|
242
|
+
raise_on_error: bool
|
|
243
|
+
A flag indicating whether to raise an error when processing batches
|
|
244
|
+
with failed items. Defaults to False, which means errors are handled without raising exceptions.
|
|
245
|
+
aggregate: bool
|
|
246
|
+
A flag indicating whether the batch items should be processed at once or individually.
|
|
247
|
+
If True (default), the batch resolver will process all items in the batch as a single event.
|
|
248
|
+
If False, the batch resolver will process each item in the batch individually.
|
|
249
|
+
|
|
250
|
+
Returns
|
|
251
|
+
-------
|
|
252
|
+
List[Any]
|
|
253
|
+
A list of results corresponding to the resolved events.
|
|
254
|
+
"""
|
|
255
|
+
|
|
256
|
+
logger.debug(f"Graceful error handling flag {raise_on_error=}")
|
|
257
|
+
|
|
258
|
+
# Checks whether the entire batch should be processed at once
|
|
259
|
+
if aggregate:
|
|
260
|
+
# Process the entire batch
|
|
261
|
+
ret = await resolver(event=self.current_batch_event)
|
|
262
|
+
if not isinstance(ret, List):
|
|
263
|
+
raise InvalidBatchResponse("The response must be a List when using batch resolvers")
|
|
264
|
+
|
|
265
|
+
return ret
|
|
266
|
+
|
|
267
|
+
response: List = []
|
|
268
|
+
|
|
269
|
+
# Prime coroutines
|
|
270
|
+
tasks = [resolver(event=e, **e.arguments) for e in self.current_batch_event]
|
|
271
|
+
|
|
272
|
+
# Aggregate results or raise at first error
|
|
273
|
+
if raise_on_error:
|
|
274
|
+
response.extend(await asyncio.gather(*tasks))
|
|
275
|
+
return response
|
|
276
|
+
|
|
277
|
+
# Aggregate results and exceptions, then filter them out
|
|
278
|
+
# Use `None` upon exception for graceful error handling at GraphQL engine level
|
|
279
|
+
#
|
|
280
|
+
# NOTE: asyncio.gather(return_exceptions=True) catches and includes exceptions in the results
|
|
281
|
+
# this will become useful when we support exception handling in AppSync resolver
|
|
282
|
+
results = await asyncio.gather(*tasks, return_exceptions=True)
|
|
283
|
+
response.extend(None if isinstance(ret, Exception) else ret for ret in results)
|
|
284
|
+
|
|
285
|
+
return response
|
|
286
|
+
|
|
287
|
+
def _call_batch_resolver(self, event: List[dict], data_model: Type[AppSyncResolverEvent]) -> List[Any]:
|
|
288
|
+
"""Call batch event resolver for sync and async methods
|
|
289
|
+
|
|
290
|
+
Parameters
|
|
291
|
+
----------
|
|
292
|
+
event : List[dict]
|
|
293
|
+
Batch event
|
|
294
|
+
data_model : Type[AppSyncResolverEvent]
|
|
295
|
+
Data_model to decode AppSync event, by default AppSyncResolverEvent or a subclass
|
|
296
|
+
|
|
297
|
+
Returns
|
|
298
|
+
-------
|
|
299
|
+
List[Any]
|
|
300
|
+
Results of the resolver execution.
|
|
301
|
+
|
|
302
|
+
Raises
|
|
303
|
+
------
|
|
304
|
+
InconsistentPayloadError:
|
|
305
|
+
When all events in the batch do not have the same fieldName.
|
|
306
|
+
|
|
307
|
+
ResolverNotFoundError:
|
|
308
|
+
When no resolver is found for the specified type and field.
|
|
309
|
+
"""
|
|
310
|
+
logger.debug("Processing batch resolver event")
|
|
311
|
+
|
|
312
|
+
self.current_batch_event = [data_model(e) for e in event]
|
|
313
|
+
type_name, field_name = self.current_batch_event[0].type_name, self.current_batch_event[0].field_name
|
|
314
|
+
|
|
315
|
+
resolver = self._batch_resolver_registry.find_resolver(type_name, field_name)
|
|
316
|
+
async_resolver = self._async_batch_resolver_registry.find_resolver(type_name, field_name)
|
|
317
|
+
|
|
318
|
+
if resolver and async_resolver:
|
|
319
|
+
warnings.warn(
|
|
320
|
+
f"Both synchronous and asynchronous resolvers found for the same event and field."
|
|
321
|
+
f"The synchronous resolver takes precedence. Executing: {resolver['func'].__name__}",
|
|
322
|
+
stacklevel=2,
|
|
323
|
+
category=PowertoolsUserWarning,
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
if resolver:
|
|
327
|
+
logger.debug(f"Found sync resolver. {resolver=}, {field_name=}")
|
|
328
|
+
return self._call_sync_batch_resolver(
|
|
329
|
+
resolver=resolver["func"],
|
|
330
|
+
raise_on_error=resolver["raise_on_error"],
|
|
331
|
+
aggregate=resolver["aggregate"],
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
if async_resolver:
|
|
335
|
+
logger.debug(f"Found async resolver. {resolver=}, {field_name=}")
|
|
336
|
+
return asyncio.run(
|
|
337
|
+
self._call_async_batch_resolver(
|
|
338
|
+
resolver=async_resolver["func"],
|
|
339
|
+
raise_on_error=async_resolver["raise_on_error"],
|
|
340
|
+
aggregate=async_resolver["aggregate"],
|
|
341
|
+
),
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
raise ResolverNotFoundError(f"No resolver found for '{type_name}.{field_name}'")
|
|
345
|
+
|
|
346
|
+
def include_router(self, router: "Router") -> None:
|
|
347
|
+
"""Adds all resolvers defined in a router
|
|
348
|
+
|
|
349
|
+
Parameters
|
|
350
|
+
----------
|
|
351
|
+
router : Router
|
|
352
|
+
A router containing a dict of field resolvers
|
|
353
|
+
"""
|
|
354
|
+
|
|
355
|
+
# Merge app and router context
|
|
356
|
+
logger.debug("Merging router and app context")
|
|
357
|
+
self.context.update(**router.context)
|
|
358
|
+
|
|
359
|
+
# use pointer to allow context clearance after event is processed e.g., resolve(evt, ctx)
|
|
360
|
+
router.context = self.context
|
|
361
|
+
|
|
362
|
+
logger.debug("Merging router resolver registries")
|
|
363
|
+
self._resolver_registry.merge(router._resolver_registry)
|
|
364
|
+
self._batch_resolver_registry.merge(router._batch_resolver_registry)
|
|
365
|
+
self._async_batch_resolver_registry.merge(router._async_batch_resolver_registry)
|
|
366
|
+
|
|
367
|
+
def resolver(self, type_name: str = "*", field_name: Optional[str] = None) -> Callable:
|
|
368
|
+
"""Registers direct resolver function for GraphQL type and field name.
|
|
369
|
+
|
|
370
|
+
Parameters
|
|
371
|
+
----------
|
|
372
|
+
type_name : str, optional
|
|
373
|
+
GraphQL type e.g., Query, Mutation, by default "*" meaning any
|
|
374
|
+
field_name : Optional[str], optional
|
|
375
|
+
GraphQL field e.g., getTodo, createTodo, by default None
|
|
376
|
+
|
|
377
|
+
Returns
|
|
378
|
+
-------
|
|
379
|
+
Callable
|
|
380
|
+
Registered resolver
|
|
381
|
+
|
|
382
|
+
Example
|
|
383
|
+
-------
|
|
384
|
+
|
|
385
|
+
```python
|
|
386
|
+
from aws_lambda_powertools.event_handler import AppSyncResolver
|
|
387
|
+
|
|
388
|
+
from typing import TypedDict
|
|
389
|
+
|
|
390
|
+
app = AppSyncResolver()
|
|
391
|
+
|
|
392
|
+
class Todo(TypedDict, total=False):
|
|
393
|
+
id: str
|
|
394
|
+
userId: str
|
|
395
|
+
title: str
|
|
396
|
+
completed: bool
|
|
397
|
+
|
|
398
|
+
# resolve any GraphQL `getTodo` queries
|
|
399
|
+
# arguments are injected as function arguments as-is
|
|
400
|
+
@app.resolver(type_name="Query", field_name="getTodo")
|
|
401
|
+
def get_todo(id: str = "", status: str = "open") -> Todo:
|
|
402
|
+
todos: Response = requests.get(f"https://jsonplaceholder.typicode.com/todos/{id}")
|
|
403
|
+
todos.raise_for_status()
|
|
404
|
+
|
|
405
|
+
return todos.json()
|
|
406
|
+
|
|
407
|
+
def lambda_handler(event, context):
|
|
408
|
+
return app.resolve(event, context)
|
|
409
|
+
```
|
|
410
|
+
"""
|
|
411
|
+
return self._resolver_registry.register(field_name=field_name, type_name=type_name)
|
|
412
|
+
|
|
413
|
+
def batch_resolver(
|
|
414
|
+
self,
|
|
415
|
+
type_name: str = "*",
|
|
416
|
+
field_name: Optional[str] = None,
|
|
417
|
+
raise_on_error: bool = False,
|
|
418
|
+
aggregate: bool = True,
|
|
419
|
+
) -> Callable:
|
|
420
|
+
"""Registers batch resolver function for GraphQL type and field name.
|
|
421
|
+
|
|
422
|
+
By default, we handle errors gracefully by returning `None`. If you want
|
|
423
|
+
to short-circuit and fail the entire batch use `raise_on_error=True`.
|
|
424
|
+
|
|
425
|
+
Parameters
|
|
426
|
+
----------
|
|
427
|
+
type_name : str, optional
|
|
428
|
+
GraphQL type e.g., Query, Mutation, by default "*" meaning any
|
|
429
|
+
field_name : Optional[str], optional
|
|
430
|
+
GraphQL field e.g., getTodo, createTodo, by default None
|
|
431
|
+
raise_on_error : bool, optional
|
|
432
|
+
Whether to fail entire batch upon error, or handle errors gracefully (None), by default False
|
|
433
|
+
aggregate: bool
|
|
434
|
+
A flag indicating whether the batch items should be processed at once or individually.
|
|
435
|
+
If True (default), the batch resolver will process all items in the batch as a single event.
|
|
436
|
+
If False, the batch resolver will process each item in the batch individually.
|
|
437
|
+
|
|
438
|
+
Returns
|
|
439
|
+
-------
|
|
440
|
+
Callable
|
|
441
|
+
Registered resolver
|
|
442
|
+
"""
|
|
443
|
+
return self._batch_resolver_registry.register(
|
|
444
|
+
field_name=field_name,
|
|
445
|
+
type_name=type_name,
|
|
446
|
+
raise_on_error=raise_on_error,
|
|
447
|
+
aggregate=aggregate,
|
|
448
|
+
)
|
|
449
|
+
|
|
450
|
+
def async_batch_resolver(
|
|
451
|
+
self,
|
|
452
|
+
type_name: str = "*",
|
|
453
|
+
field_name: Optional[str] = None,
|
|
454
|
+
raise_on_error: bool = False,
|
|
455
|
+
aggregate: bool = True,
|
|
456
|
+
) -> Callable:
|
|
457
|
+
return self._async_batch_resolver_registry.register(
|
|
458
|
+
field_name=field_name,
|
|
459
|
+
type_name=type_name,
|
|
460
|
+
raise_on_error=raise_on_error,
|
|
461
|
+
aggregate=aggregate,
|
|
462
|
+
)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Callable, Dict, Optional
|
|
3
|
+
|
|
4
|
+
logger = logging.getLogger(__name__)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ResolverRegistry:
|
|
8
|
+
def __init__(self):
|
|
9
|
+
self.resolvers: Dict[str, Dict[str, Any]] = {}
|
|
10
|
+
|
|
11
|
+
def register(
|
|
12
|
+
self,
|
|
13
|
+
type_name: str = "*",
|
|
14
|
+
field_name: Optional[str] = None,
|
|
15
|
+
raise_on_error: bool = False,
|
|
16
|
+
aggregate: bool = True,
|
|
17
|
+
) -> Callable:
|
|
18
|
+
"""Registers the resolver for field_name
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
type_name : str
|
|
23
|
+
Type name
|
|
24
|
+
field_name : str
|
|
25
|
+
Field name
|
|
26
|
+
raise_on_error: bool
|
|
27
|
+
A flag indicating whether to raise an error when processing batches
|
|
28
|
+
with failed items. Defaults to False, which means errors are handled without raising exceptions.
|
|
29
|
+
aggregate: bool
|
|
30
|
+
A flag indicating whether the batch items should be processed at once or individually.
|
|
31
|
+
If True (default), the batch resolver will process all items in the batch as a single event.
|
|
32
|
+
If False, the batch resolver will process each item in the batch individually.
|
|
33
|
+
|
|
34
|
+
Return
|
|
35
|
+
----------
|
|
36
|
+
Dict
|
|
37
|
+
A dictionary with the resolver and if raise exception on error
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def _register(func) -> Callable:
|
|
41
|
+
logger.debug(f"Adding resolver `{func.__name__}` for field `{type_name}.{field_name}`")
|
|
42
|
+
self.resolvers[f"{type_name}.{field_name}"] = {
|
|
43
|
+
"func": func,
|
|
44
|
+
"raise_on_error": raise_on_error,
|
|
45
|
+
"aggregate": aggregate,
|
|
46
|
+
}
|
|
47
|
+
return func
|
|
48
|
+
|
|
49
|
+
return _register
|
|
50
|
+
|
|
51
|
+
def find_resolver(self, type_name: str, field_name: str) -> Optional[Dict]:
|
|
52
|
+
"""Find resolver based on type_name and field_name
|
|
53
|
+
|
|
54
|
+
Parameters
|
|
55
|
+
----------
|
|
56
|
+
type_name : str
|
|
57
|
+
Type name
|
|
58
|
+
field_name : str
|
|
59
|
+
Field name
|
|
60
|
+
Return
|
|
61
|
+
----------
|
|
62
|
+
Optional[Dict]
|
|
63
|
+
A dictionary with the resolver and if raise exception on error
|
|
64
|
+
"""
|
|
65
|
+
logger.debug(f"Looking for resolver for type={type_name}, field={field_name}.")
|
|
66
|
+
return self.resolvers.get(f"{type_name}.{field_name}", self.resolvers.get(f"*.{field_name}"))
|
|
67
|
+
|
|
68
|
+
def merge(self, other_registry: "ResolverRegistry"):
|
|
69
|
+
"""Update current registry with incoming registry
|
|
70
|
+
|
|
71
|
+
Parameters
|
|
72
|
+
----------
|
|
73
|
+
other_registry : ResolverRegistry
|
|
74
|
+
Registry to merge from
|
|
75
|
+
"""
|
|
76
|
+
self.resolvers.update(**other_registry.resolvers)
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Callable, Optional
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class BaseRouter(ABC):
|
|
6
|
+
"""Abstract base class for Router (resolvers)"""
|
|
7
|
+
|
|
8
|
+
@abstractmethod
|
|
9
|
+
def resolver(self, type_name: str = "*", field_name: Optional[str] = None) -> Callable:
|
|
10
|
+
"""
|
|
11
|
+
Retrieve a resolver function for a specific type and field.
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
-----------
|
|
15
|
+
type_name: str
|
|
16
|
+
The name of the type.
|
|
17
|
+
field_name: Optional[str]
|
|
18
|
+
The name of the field (default is None).
|
|
19
|
+
|
|
20
|
+
Examples
|
|
21
|
+
--------
|
|
22
|
+
```python
|
|
23
|
+
from typing import Optional
|
|
24
|
+
|
|
25
|
+
from aws_lambda_powertools.event_handler import AppSyncResolver
|
|
26
|
+
from aws_lambda_powertools.utilities.data_classes import AppSyncResolverEvent
|
|
27
|
+
from aws_lambda_powertools.utilities.typing import LambdaContext
|
|
28
|
+
|
|
29
|
+
app = AppSyncResolver()
|
|
30
|
+
|
|
31
|
+
@app.resolver(type_name="Query", field_name="getPost")
|
|
32
|
+
def related_posts(event: AppSyncResolverEvent) -> Optional[list]:
|
|
33
|
+
return {"success": "ok"}
|
|
34
|
+
|
|
35
|
+
def lambda_handler(event, context: LambdaContext) -> dict:
|
|
36
|
+
return app.resolve(event, context)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
Callable
|
|
42
|
+
The resolver function.
|
|
43
|
+
"""
|
|
44
|
+
raise NotImplementedError
|
|
45
|
+
|
|
46
|
+
@abstractmethod
|
|
47
|
+
def batch_resolver(
|
|
48
|
+
self,
|
|
49
|
+
type_name: str = "*",
|
|
50
|
+
field_name: Optional[str] = None,
|
|
51
|
+
raise_on_error: bool = False,
|
|
52
|
+
aggregate: bool = True,
|
|
53
|
+
) -> Callable:
|
|
54
|
+
"""
|
|
55
|
+
Retrieve a batch resolver function for a specific type and field.
|
|
56
|
+
|
|
57
|
+
Parameters
|
|
58
|
+
-----------
|
|
59
|
+
type_name: str
|
|
60
|
+
The name of the type.
|
|
61
|
+
field_name: Optional[str]
|
|
62
|
+
The name of the field (default is None).
|
|
63
|
+
raise_on_error: bool
|
|
64
|
+
A flag indicating whether to raise an error when processing batches
|
|
65
|
+
with failed items. Defaults to False, which means errors are handled without raising exceptions.
|
|
66
|
+
aggregate: bool
|
|
67
|
+
A flag indicating whether the batch items should be processed at once or individually.
|
|
68
|
+
If True (default), the batch resolver will process all items in the batch as a single event.
|
|
69
|
+
If False, the batch resolver will process each item in the batch individually.
|
|
70
|
+
|
|
71
|
+
Examples
|
|
72
|
+
--------
|
|
73
|
+
```python
|
|
74
|
+
from typing import Optional
|
|
75
|
+
|
|
76
|
+
from aws_lambda_powertools.event_handler import AppSyncResolver
|
|
77
|
+
from aws_lambda_powertools.utilities.data_classes import AppSyncResolverEvent
|
|
78
|
+
from aws_lambda_powertools.utilities.typing import LambdaContext
|
|
79
|
+
|
|
80
|
+
app = AppSyncResolver()
|
|
81
|
+
|
|
82
|
+
@app.batch_resolver(type_name="Query", field_name="getPost")
|
|
83
|
+
def related_posts(event: AppSyncResolverEvent, id) -> Optional[list]:
|
|
84
|
+
return {"post_id": id}
|
|
85
|
+
|
|
86
|
+
def lambda_handler(event, context: LambdaContext) -> dict:
|
|
87
|
+
return app.resolve(event, context)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Returns
|
|
91
|
+
-------
|
|
92
|
+
Callable
|
|
93
|
+
The batch resolver function.
|
|
94
|
+
"""
|
|
95
|
+
raise NotImplementedError
|
|
96
|
+
|
|
97
|
+
@abstractmethod
|
|
98
|
+
def async_batch_resolver(
|
|
99
|
+
self,
|
|
100
|
+
type_name: str = "*",
|
|
101
|
+
field_name: Optional[str] = None,
|
|
102
|
+
raise_on_error: bool = False,
|
|
103
|
+
aggregate: bool = True,
|
|
104
|
+
) -> Callable:
|
|
105
|
+
"""
|
|
106
|
+
Retrieve a batch resolver function for a specific type and field and runs async.
|
|
107
|
+
|
|
108
|
+
Parameters
|
|
109
|
+
-----------
|
|
110
|
+
type_name: str
|
|
111
|
+
The name of the type.
|
|
112
|
+
field_name: Optional[str]
|
|
113
|
+
The name of the field (default is None).
|
|
114
|
+
raise_on_error: bool
|
|
115
|
+
A flag indicating whether to raise an error when processing batches
|
|
116
|
+
with failed items. Defaults to False, which means errors are handled without raising exceptions.
|
|
117
|
+
aggregate: bool
|
|
118
|
+
A flag indicating whether the batch items should be processed at once or individually.
|
|
119
|
+
If True (default), the batch resolver will process all items in the batch as a single event.
|
|
120
|
+
If False, the batch resolver will process each item in the batch individually.
|
|
121
|
+
|
|
122
|
+
Examples
|
|
123
|
+
--------
|
|
124
|
+
```python
|
|
125
|
+
from typing import Optional
|
|
126
|
+
|
|
127
|
+
from aws_lambda_powertools.event_handler import AppSyncResolver
|
|
128
|
+
from aws_lambda_powertools.utilities.data_classes import AppSyncResolverEvent
|
|
129
|
+
from aws_lambda_powertools.utilities.typing import LambdaContext
|
|
130
|
+
|
|
131
|
+
app = AppSyncResolver()
|
|
132
|
+
|
|
133
|
+
@app.async_batch_resolver(type_name="Query", field_name="getPost")
|
|
134
|
+
async def related_posts(event: AppSyncResolverEvent, id) -> Optional[list]:
|
|
135
|
+
return {"post_id": id}
|
|
136
|
+
|
|
137
|
+
def lambda_handler(event, context: LambdaContext) -> dict:
|
|
138
|
+
return app.resolve(event, context)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Returns
|
|
142
|
+
-------
|
|
143
|
+
Callable
|
|
144
|
+
The batch resolver function.
|
|
145
|
+
"""
|
|
146
|
+
raise NotImplementedError
|
|
147
|
+
|
|
148
|
+
@abstractmethod
|
|
149
|
+
def append_context(self, **additional_context) -> None:
|
|
150
|
+
"""
|
|
151
|
+
Appends context information available under any route.
|
|
152
|
+
|
|
153
|
+
Parameters
|
|
154
|
+
-----------
|
|
155
|
+
**additional_context: dict
|
|
156
|
+
Additional context key-value pairs to append.
|
|
157
|
+
"""
|
|
158
|
+
raise NotImplementedError
|