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.
Files changed (247) hide show
  1. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/PKG-INFO +1 -1
  2. aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/appsync.py +462 -0
  3. aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/graphql_appsync/_registry.py +76 -0
  4. aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/graphql_appsync/base.py +158 -0
  5. aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/graphql_appsync/exceptions.py +10 -0
  6. aws_lambda_powertools-2.40.0/aws_lambda_powertools/event_handler/graphql_appsync/router.py +53 -0
  7. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/version.py +1 -1
  8. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +2 -2
  9. aws_lambda_powertools-2.40.0/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
  10. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/secrets.py +1 -1
  11. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/pyproject.toml +6 -5
  12. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/setup.py +2 -1
  13. aws_lambda_powertools-2.39.2a4/aws_lambda_powertools/event_handler/appsync.py +0 -216
  14. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/LICENSE +0 -0
  15. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/README.md +0 -0
  16. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/THIRD-PARTY-LICENSES +0 -0
  17. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/__init__.py +0 -0
  18. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/__init__.py +0 -0
  19. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/api_gateway.py +0 -0
  20. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/bedrock_agent.py +0 -0
  21. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/content_types.py +0 -0
  22. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
  23. {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
  24. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
  25. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
  26. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
  27. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +0 -0
  28. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
  29. {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
  30. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/compat.py +0 -0
  31. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
  32. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
  33. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
  34. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
  35. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/models.py +0 -0
  36. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
  37. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +0 -0
  38. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +0 -0
  39. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +0 -0
  40. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +0 -0
  41. {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
  42. {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
  43. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
  44. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/router.py +0 -0
  45. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/types.py +0 -0
  46. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/util.py +0 -0
  47. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
  48. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/exceptions/__init__.py +0 -0
  49. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/__init__.py +0 -0
  50. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/constants.py +0 -0
  51. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
  52. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/exceptions.py +0 -0
  53. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/filters.py +0 -0
  54. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/formatter.py +0 -0
  55. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
  56. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
  57. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/lambda_context.py +0 -0
  58. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/logger.py +0 -0
  59. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/types.py +0 -0
  60. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/logging/utils.py +0 -0
  61. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/__init__.py +0 -0
  62. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/base.py +0 -0
  63. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/exceptions.py +0 -0
  64. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/functions.py +0 -0
  65. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/metric.py +0 -0
  66. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/metrics.py +0 -0
  67. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
  68. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/base.py +0 -0
  69. {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
  70. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +0 -0
  71. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
  72. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
  73. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
  74. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
  75. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
  76. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
  77. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +0 -0
  78. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +0 -0
  79. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
  80. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/metrics/types.py +0 -0
  81. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
  82. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
  83. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
  84. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/package_logger.py +0 -0
  85. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/py.typed +0 -0
  86. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/__init__.py +0 -0
  87. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/cache_dict.py +0 -0
  88. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/constants.py +0 -0
  89. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/cookies.py +0 -0
  90. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/functions.py +0 -0
  91. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
  92. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/json_encoder.py +0 -0
  93. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/lazy_import.py +0 -0
  94. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/types.py +0 -0
  95. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/shared/user_agent.py +0 -0
  96. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/tracing/__init__.py +0 -0
  97. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/tracing/base.py +0 -0
  98. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/tracing/extensions.py +0 -0
  99. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/tracing/tracer.py +0 -0
  100. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/__init__.py +0 -0
  101. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
  102. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/base.py +0 -0
  103. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
  104. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
  105. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
  106. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/batch/types.py +0 -0
  107. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
  108. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +0 -0
  109. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/alb_event.py +0 -0
  110. {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
  111. {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
  112. {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
  113. {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
  114. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
  115. {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
  116. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +0 -0
  117. {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
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/common.py +0 -0
  124. {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
  125. {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
  126. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
  127. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
  128. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +0 -0
  129. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
  130. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
  131. {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
  132. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
  133. {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
  134. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/s3_event.py +0 -0
  135. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +0 -0
  136. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
  137. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
  138. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +0 -0
  139. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
  140. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +0 -0
  141. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +0 -0
  142. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/__init__.py +0 -0
  143. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/base.py +0 -0
  144. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/constants.py +0 -0
  145. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/exceptions.py +0 -0
  146. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/provider/__init__.py +0 -0
  147. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/provider/base.py +0 -0
  148. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/__init__.py +0 -0
  149. {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
  150. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
  151. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
  152. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
  153. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
  154. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
  155. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
  156. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
  157. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/__init__.py +0 -0
  158. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/base.py +0 -0
  159. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/config.py +0 -0
  160. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
  161. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/hook.py +0 -0
  162. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
  163. {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
  164. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
  165. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +0 -0
  166. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
  167. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +0 -0
  168. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
  169. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
  170. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
  171. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
  172. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
  173. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
  174. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
  175. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
  176. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
  177. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
  178. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
  179. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
  180. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
  181. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
  182. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
  183. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/compat.py +0 -0
  184. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
  185. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
  186. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
  187. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
  188. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
  189. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
  190. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
  191. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
  192. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
  193. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
  194. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
  195. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
  196. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
  197. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
  198. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
  199. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
  200. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
  201. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
  202. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
  203. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
  204. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
  205. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
  206. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
  207. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
  208. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
  209. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
  210. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
  211. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
  212. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
  213. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
  214. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
  215. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/s3.py +0 -0
  216. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/s3_batch_operation.py +0 -0
  217. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
  218. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
  219. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
  220. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
  221. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/sqs.py +0 -0
  222. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
  223. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
  224. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/parser.py +0 -0
  225. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/pydantic.py +0 -0
  226. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/parser/types.py +0 -0
  227. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/serialization.py +0 -0
  228. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
  229. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
  230. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
  231. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
  232. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
  233. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
  234. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
  235. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
  236. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
  237. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
  238. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
  239. {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
  240. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
  241. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
  242. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
  243. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/validation/base.py +0 -0
  244. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
  245. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
  246. {aws_lambda_powertools-2.39.2a4 → aws_lambda_powertools-2.40.0}/aws_lambda_powertools/utilities/validation/validator.py +0 -0
  247. {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.39.2a4
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