aws-lambda-powertools 3.7.1a6__tar.gz → 3.8.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 (263) hide show
  1. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/PKG-INFO +1 -1
  2. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +2 -3
  3. aws_lambda_powertools-3.8.0/aws_lambda_powertools/logging/buffer/__init__.py +3 -0
  4. aws_lambda_powertools-3.8.0/aws_lambda_powertools/logging/buffer/cache.py +215 -0
  5. aws_lambda_powertools-3.8.0/aws_lambda_powertools/logging/buffer/config.py +78 -0
  6. aws_lambda_powertools-3.8.0/aws_lambda_powertools/logging/buffer/functions.py +127 -0
  7. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/logger.py +343 -26
  8. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/functions.py +5 -0
  9. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/version.py +1 -1
  10. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/pyproject.toml +1 -1
  11. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/setup.py +2 -1
  12. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/LICENSE +0 -0
  13. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/README.md +0 -0
  14. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/THIRD-PARTY-LICENSES +0 -0
  15. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/__init__.py +0 -0
  16. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/__init__.py +0 -0
  17. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/api_gateway.py +0 -0
  18. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/appsync.py +0 -0
  19. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/bedrock_agent.py +0 -0
  20. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/content_types.py +0 -0
  21. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/exceptions.py +0 -0
  22. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/graphql_appsync/__init__.py +0 -0
  23. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/graphql_appsync/_registry.py +0 -0
  24. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/graphql_appsync/base.py +0 -0
  25. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/graphql_appsync/exceptions.py +0 -0
  26. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/graphql_appsync/router.py +0 -0
  27. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/lambda_function_url.py +0 -0
  28. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/middlewares/__init__.py +0 -0
  29. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/middlewares/base.py +0 -0
  30. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/middlewares/schema_validation.py +0 -0
  31. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/__init__.py +0 -0
  32. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/compat.py +0 -0
  33. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/constants.py +0 -0
  34. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/dependant.py +0 -0
  35. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/encoders.py +0 -0
  36. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/exceptions.py +0 -0
  37. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/models.py +0 -0
  38. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/params.py +0 -0
  39. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/pydantic_loader.py +0 -0
  40. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py +0 -0
  41. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py +0 -0
  42. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +0 -0
  43. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js +0 -0
  44. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css +0 -0
  45. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/openapi/types.py +0 -0
  46. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/router.py +0 -0
  47. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/types.py +0 -0
  48. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/util.py +0 -0
  49. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/event_handler/vpc_lattice.py +0 -0
  50. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/exceptions/__init__.py +0 -0
  51. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/__init__.py +0 -0
  52. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/constants.py +0 -0
  53. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/correlation_paths.py +0 -0
  54. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/exceptions.py +0 -0
  55. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/filters.py +0 -0
  56. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/formatter.py +0 -0
  57. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/formatters/__init__.py +0 -0
  58. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/formatters/datadog.py +0 -0
  59. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/lambda_context.py +0 -0
  60. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/types.py +0 -0
  61. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/logging/utils.py +0 -0
  62. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/__init__.py +0 -0
  63. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/base.py +0 -0
  64. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/exceptions.py +0 -0
  65. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/functions.py +0 -0
  66. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/metric.py +0 -0
  67. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/metrics.py +0 -0
  68. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/__init__.py +0 -0
  69. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/base.py +0 -0
  70. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/__init__.py +0 -0
  71. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +0 -0
  72. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py +0 -0
  73. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py +0 -0
  74. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py +0 -0
  75. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +0 -0
  76. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/cold_start.py +0 -0
  77. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/datadog/__init__.py +0 -0
  78. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/datadog/datadog.py +0 -0
  79. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/datadog/metrics.py +0 -0
  80. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/provider/datadog/warnings.py +0 -0
  81. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/metrics/types.py +0 -0
  82. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/middleware_factory/__init__.py +0 -0
  83. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/middleware_factory/exceptions.py +0 -0
  84. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/middleware_factory/factory.py +0 -0
  85. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/package_logger.py +0 -0
  86. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/py.typed +0 -0
  87. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/__init__.py +0 -0
  88. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/cache_dict.py +0 -0
  89. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/constants.py +0 -0
  90. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/cookies.py +0 -0
  91. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/dynamodb_deserializer.py +0 -0
  92. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/headers_serializer.py +0 -0
  93. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/json_encoder.py +0 -0
  94. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/lazy_import.py +0 -0
  95. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/types.py +0 -0
  96. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/shared/user_agent.py +0 -0
  97. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/tracing/__init__.py +0 -0
  98. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/tracing/base.py +0 -0
  99. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/tracing/extensions.py +0 -0
  100. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/tracing/tracer.py +0 -0
  101. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/__init__.py +0 -0
  102. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/batch/__init__.py +0 -0
  103. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/batch/base.py +0 -0
  104. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/batch/decorators.py +0 -0
  105. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/batch/exceptions.py +0 -0
  106. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/batch/sqs_fifo_partial_processor.py +0 -0
  107. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/batch/types.py +0 -0
  108. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/__init__.py +0 -0
  109. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/active_mq_event.py +0 -0
  110. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/alb_event.py +0 -0
  111. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +0 -0
  112. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +0 -0
  113. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/appsync/__init__.py +0 -0
  114. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py +0 -0
  115. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py +0 -0
  116. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +0 -0
  117. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py +0 -0
  118. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py +0 -0
  119. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py +0 -0
  120. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py +0 -0
  121. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py +0 -0
  122. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/cloudformation_custom_resource_event.py +0 -0
  123. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/code_deploy_lifecycle_hook_event.py +0 -0
  124. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py +0 -0
  125. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py +0 -0
  126. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/common.py +0 -0
  127. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py +0 -0
  128. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +0 -0
  129. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py +0 -0
  130. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/event_source.py +0 -0
  131. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/iot_registry_event.py +0 -0
  132. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/kafka_event.py +0 -0
  133. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py +0 -0
  134. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +0 -0
  135. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py +0 -0
  136. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py +0 -0
  137. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py +0 -0
  138. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/s3_event.py +0 -0
  139. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/s3_object_event.py +0 -0
  140. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +0 -0
  141. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/ses_event.py +0 -0
  142. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/shared_functions.py +0 -0
  143. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/sns_event.py +0 -0
  144. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/sqs_event.py +0 -0
  145. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/transfer_family_event.py +0 -0
  146. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +0 -0
  147. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_masking/__init__.py +0 -0
  148. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_masking/base.py +0 -0
  149. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_masking/constants.py +0 -0
  150. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_masking/exceptions.py +0 -0
  151. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_masking/provider/__init__.py +0 -0
  152. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_masking/provider/base.py +0 -0
  153. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/__init__.py +0 -0
  154. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +0 -0
  155. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/feature_flags/__init__.py +0 -0
  156. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/feature_flags/appconfig.py +0 -0
  157. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/feature_flags/base.py +0 -0
  158. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/feature_flags/comparators.py +0 -0
  159. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/feature_flags/constants.py +0 -0
  160. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/feature_flags/exceptions.py +0 -0
  161. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +0 -0
  162. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/feature_flags/schema.py +0 -0
  163. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/feature_flags/types.py +0 -0
  164. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/__init__.py +0 -0
  165. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/base.py +0 -0
  166. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/config.py +0 -0
  167. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -0
  168. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/hook.py +0 -0
  169. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/idempotency.py +0 -0
  170. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/persistence/__init__.py +0 -0
  171. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/persistence/base.py +0 -0
  172. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +0 -0
  173. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +0 -0
  174. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/persistence/redis.py +0 -0
  175. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/serialization/__init__.py +0 -0
  176. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/serialization/base.py +0 -0
  177. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/serialization/custom_dict.py +0 -0
  178. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/serialization/dataclass.py +0 -0
  179. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/serialization/functions.py +0 -0
  180. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/serialization/no_op.py +0 -0
  181. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/idempotency/serialization/pydantic.py +0 -0
  182. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/jmespath_utils/__init__.py +0 -0
  183. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +0 -0
  184. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parameters/__init__.py +0 -0
  185. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parameters/appconfig.py +0 -0
  186. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parameters/base.py +0 -0
  187. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parameters/constants.py +0 -0
  188. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -0
  189. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parameters/exceptions.py +0 -0
  190. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parameters/secrets.py +0 -0
  191. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parameters/ssm.py +0 -0
  192. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parameters/types.py +0 -0
  193. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/__init__.py +0 -0
  194. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/__init__.py +0 -0
  195. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw.py +0 -0
  196. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/apigw_websocket.py +0 -0
  197. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/apigwv2.py +0 -0
  198. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/base.py +0 -0
  199. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py +0 -0
  200. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +0 -0
  201. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +0 -0
  202. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py +0 -0
  203. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/kafka.py +0 -0
  204. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +0 -0
  205. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py +0 -0
  206. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py +0 -0
  207. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/sns.py +0 -0
  208. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +0 -0
  209. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py +0 -0
  210. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py +0 -0
  211. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/exceptions.py +0 -0
  212. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/functions.py +0 -0
  213. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/__init__.py +0 -0
  214. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/alb.py +0 -0
  215. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/apigw.py +0 -0
  216. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/apigw_websocket.py +0 -0
  217. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/apigwv2.py +0 -0
  218. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/bedrock_agent.py +0 -0
  219. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py +0 -0
  220. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +0 -0
  221. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/dynamodb.py +0 -0
  222. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/event_bridge.py +0 -0
  223. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +0 -0
  224. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/kafka.py +0 -0
  225. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/kinesis.py +0 -0
  226. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose.py +0 -0
  227. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/kinesis_firehose_sqs.py +0 -0
  228. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/lambda_function_url.py +0 -0
  229. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/s3.py +0 -0
  230. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/s3_batch_operation.py +0 -0
  231. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/s3_event_notification.py +0 -0
  232. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/s3_object_event.py +0 -0
  233. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/ses.py +0 -0
  234. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/sns.py +0 -0
  235. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/sqs.py +0 -0
  236. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/transfer_family.py +0 -0
  237. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/vpc_lattice.py +0 -0
  238. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/models/vpc_latticev2.py +0 -0
  239. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/parser.py +0 -0
  240. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/parser/types.py +0 -0
  241. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/serialization.py +0 -0
  242. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/__init__.py +0 -0
  243. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/_s3_seekable_io.py +0 -0
  244. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/compat.py +0 -0
  245. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/constants.py +0 -0
  246. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/s3_object.py +0 -0
  247. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/transformations/__init__.py +0 -0
  248. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/transformations/base.py +0 -0
  249. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/transformations/csv.py +0 -0
  250. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/transformations/gzip.py +0 -0
  251. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/transformations/zip.py +0 -0
  252. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/streaming/types.py +0 -0
  253. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/typing/__init__.py +0 -0
  254. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/typing/lambda_client_context.py +0 -0
  255. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/typing/lambda_client_context_mobile_client.py +0 -0
  256. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/typing/lambda_cognito_identity.py +0 -0
  257. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/typing/lambda_context.py +0 -0
  258. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/validation/__init__.py +0 -0
  259. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/validation/base.py +0 -0
  260. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/validation/envelopes.py +0 -0
  261. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/validation/exceptions.py +0 -0
  262. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/utilities/validation/validator.py +0 -0
  263. {aws_lambda_powertools-3.7.1a6 → aws_lambda_powertools-3.8.0}/aws_lambda_powertools/warnings/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: aws_lambda_powertools
3
- Version: 3.7.1a6
3
+ Version: 3.8.0
4
4
  Summary: Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity.
5
5
  License: MIT
6
6
  Keywords: aws_lambda_powertools,aws,tracing,logging,lambda,powertools,feature_flags,idempotency,middleware
@@ -136,9 +136,8 @@ class OpenAPIValidationMiddleware(BaseMiddlewareHandler):
136
136
  return self._handle_response(route=route, response=response)
137
137
 
138
138
  def _handle_response(self, *, route: Route, response: Response):
139
- # Check if we have a return type defined
140
- if route.dependant.return_param:
141
- # Validate and serialize the response, including None
139
+ # Process the response body if it exists
140
+ if response.body and response.is_json():
142
141
  response.body = self._serialize_response(
143
142
  field=route.dependant.return_param,
144
143
  response_content=response.body,
@@ -0,0 +1,3 @@
1
+ from aws_lambda_powertools.logging.buffer.config import LoggerBufferConfig
2
+
3
+ __all__ = ["LoggerBufferConfig"]
@@ -0,0 +1,215 @@
1
+ from __future__ import annotations
2
+
3
+ from collections import deque
4
+ from typing import Any
5
+
6
+
7
+ class KeyBufferCache:
8
+ """
9
+ A cache implementation for a single key with size tracking and eviction support.
10
+
11
+ This class manages a buffer for a specific key, keeping track of the current size
12
+ and providing methods to add, remove, and manage cached items. It supports automatic
13
+ eviction tracking and size management.
14
+
15
+ Attributes
16
+ ----------
17
+ cache : deque
18
+ A double-ended queue storing the cached items.
19
+ current_size : int
20
+ The total size of all items currently in the cache.
21
+ has_evicted : bool
22
+ A flag indicating whether any items have been evicted from the cache.
23
+ """
24
+
25
+ def __init__(self):
26
+ """
27
+ Initialize a buffer cache for a specific key.
28
+ """
29
+ self.cache: deque = deque()
30
+ self.current_size: int = 0
31
+ self.has_evicted: bool = False
32
+
33
+ def add(self, item: Any) -> None:
34
+ """
35
+ Add an item to the cache.
36
+
37
+ Parameters
38
+ ----------
39
+ item : Any
40
+ The item to be stored in the cache.
41
+ """
42
+ item_size = len(str(item))
43
+ self.cache.append(item)
44
+ self.current_size += item_size
45
+
46
+ def remove_oldest(self) -> Any:
47
+ """
48
+ Remove and return the oldest item from the cache.
49
+
50
+ Returns
51
+ -------
52
+ Any
53
+ The removed item.
54
+ """
55
+ removed_item = self.cache.popleft()
56
+ self.current_size -= len(str(removed_item))
57
+ self.has_evicted = True
58
+ return removed_item
59
+
60
+ def get(self) -> list:
61
+ """
62
+ Retrieve items for this key.
63
+
64
+ Returns
65
+ -------
66
+ list
67
+ List of items in the cache.
68
+ """
69
+ return list(self.cache)
70
+
71
+ def clear(self) -> None:
72
+ """
73
+ Clear the cache for this key.
74
+ """
75
+ self.cache.clear()
76
+ self.current_size = 0
77
+ self.has_evicted = False
78
+
79
+
80
+ class LoggerBufferCache:
81
+ """
82
+ A multi-key buffer cache with size-based eviction and management.
83
+
84
+ This class provides a flexible caching mechanism that manages multiple keys,
85
+ with each key having its own buffer cache. The total size of each key's cache
86
+ is limited, and older items are automatically evicted when the size limit is reached.
87
+
88
+ Key Features:
89
+ - Multiple key support
90
+ - Size-based eviction
91
+ - Tracking of evicted items
92
+ - Configurable maximum buffer size
93
+
94
+ Example
95
+ --------
96
+ >>> buffer_cache = LoggerBufferCache(max_size_bytes=1000)
97
+ >>> buffer_cache.add("logs", "First log message")
98
+ >>> buffer_cache.add("debug", "Debug information")
99
+ >>> buffer_cache.get("logs")
100
+ ['First log message']
101
+ >>> buffer_cache.get_current_size("logs")
102
+ 16
103
+ """
104
+
105
+ def __init__(self, max_size_bytes: int):
106
+ """
107
+ Initialize the LoggerBufferCache.
108
+
109
+ Parameters
110
+ ----------
111
+ max_size_bytes : int
112
+ Maximum size of the cache in bytes for each key.
113
+ """
114
+ self.max_size_bytes: int = max_size_bytes
115
+ self.cache: dict[str, KeyBufferCache] = {}
116
+
117
+ def add(self, key: str, item: Any) -> None:
118
+ """
119
+ Add an item to the cache for a specific key.
120
+
121
+ Parameters
122
+ ----------
123
+ key : str
124
+ The key to store the item under.
125
+ item : Any
126
+ The item to be stored in the cache.
127
+
128
+ Returns
129
+ -------
130
+ bool
131
+ True if item was added, False otherwise.
132
+ """
133
+ # Check if item is larger than entire buffer
134
+ item_size = len(str(item))
135
+ if item_size > self.max_size_bytes:
136
+ raise BufferError("Cannot add item to the buffer")
137
+
138
+ # Create the key's cache if it doesn't exist
139
+ if key not in self.cache:
140
+ self.cache[key] = KeyBufferCache()
141
+
142
+ # Calculate the size after adding the new item
143
+ new_total_size = self.cache[key].current_size + item_size
144
+
145
+ # If adding the item would exceed max size, remove oldest items
146
+ while new_total_size > self.max_size_bytes and self.cache[key].cache:
147
+ self.cache[key].remove_oldest()
148
+ new_total_size = self.cache[key].current_size + item_size
149
+
150
+ self.cache[key].add(item)
151
+
152
+ def get(self, key: str) -> list:
153
+ """
154
+ Retrieve items for a specific key.
155
+
156
+ Parameters
157
+ ----------
158
+ key : str
159
+ The key to retrieve items for.
160
+
161
+ Returns
162
+ -------
163
+ list
164
+ List of items for the given key, or an empty list if the key doesn't exist.
165
+ """
166
+ return [] if key not in self.cache else self.cache[key].get()
167
+
168
+ def clear(self, key: str | None = None) -> None:
169
+ """
170
+ Clear the cache, either for a specific key or entirely.
171
+
172
+ Parameters
173
+ ----------
174
+ key : Optional[str], optional
175
+ The key to clear. If None, clears the entire cache.
176
+ """
177
+ if key:
178
+ if key in self.cache:
179
+ self.cache[key].clear()
180
+ del self.cache[key]
181
+ else:
182
+ self.cache.clear()
183
+
184
+ def has_items_evicted(self, key: str) -> bool:
185
+ """
186
+ Check if a specific key's cache has evicted items.
187
+
188
+ Parameters
189
+ ----------
190
+ key : str
191
+ The key to check for evicted items.
192
+
193
+ Returns
194
+ -------
195
+ bool
196
+ True if items have been evicted, False otherwise.
197
+ """
198
+ return False if key not in self.cache else self.cache[key].has_evicted
199
+
200
+ def get_current_size(self, key: str) -> int | None:
201
+ """
202
+ Get the current size of the buffer for a specific key.
203
+
204
+ Parameters
205
+ ----------
206
+ key : str
207
+ The key to get the current size for.
208
+
209
+ Returns
210
+ -------
211
+ int
212
+ The current size of the buffer for the key.
213
+ Returns 0 if the key does not exist.
214
+ """
215
+ return None if key not in self.cache else self.cache[key].current_size
@@ -0,0 +1,78 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Literal
4
+
5
+
6
+ class LoggerBufferConfig:
7
+ """
8
+ Configuration for log buffering behavior.
9
+ """
10
+
11
+ # Define class-level constant for valid log levels
12
+ VALID_LOG_LEVELS: list[str] = ["DEBUG", "INFO", "WARNING"]
13
+ LOG_LEVEL_BUFFER_VALUES = Literal["DEBUG", "INFO", "WARNING"]
14
+
15
+ def __init__(
16
+ self,
17
+ max_bytes: int = 20480,
18
+ buffer_at_verbosity: LOG_LEVEL_BUFFER_VALUES = "DEBUG",
19
+ flush_on_error_log: bool = True,
20
+ ):
21
+ """
22
+ Initialize logger buffer configuration.
23
+
24
+ Parameters
25
+ ----------
26
+ max_bytes : int, optional
27
+ Maximum size of the buffer in bytes
28
+ buffer_at_verbosity : str, optional
29
+ Minimum log level to buffer
30
+ flush_on_error_log : bool, optional
31
+ Whether to flush the buffer when an error occurs
32
+ """
33
+ self._validate_inputs(max_bytes, buffer_at_verbosity, flush_on_error_log)
34
+
35
+ self._max_bytes = max_bytes
36
+ self._buffer_at_verbosity = buffer_at_verbosity.upper()
37
+ self._flush_on_error_log = flush_on_error_log
38
+
39
+ def _validate_inputs(
40
+ self,
41
+ max_bytes: int,
42
+ buffer_at_verbosity: str,
43
+ flush_on_error_log: bool,
44
+ ) -> None:
45
+ """
46
+ Validate configuration inputs.
47
+
48
+ Parameters
49
+ ----------
50
+ Same as __init__ method parameters
51
+ """
52
+ if not isinstance(max_bytes, int) or max_bytes <= 0:
53
+ raise ValueError("Max size must be a positive integer")
54
+
55
+ if not isinstance(buffer_at_verbosity, str):
56
+ raise ValueError("Log level must be a string")
57
+
58
+ # Validate log level
59
+ if buffer_at_verbosity.upper() not in self.VALID_LOG_LEVELS:
60
+ raise ValueError(f"Invalid log level. Must be one of {self.VALID_LOG_LEVELS}")
61
+
62
+ if not isinstance(flush_on_error_log, bool):
63
+ raise ValueError("flush_on_error must be a boolean")
64
+
65
+ @property
66
+ def max_bytes(self) -> int:
67
+ """Maximum buffer size in bytes."""
68
+ return self._max_bytes
69
+
70
+ @property
71
+ def buffer_at_verbosity(self) -> str:
72
+ """Minimum log level to buffer."""
73
+ return self._buffer_at_verbosity
74
+
75
+ @property
76
+ def flush_on_error_log(self) -> bool:
77
+ """Flag to flush buffer on error."""
78
+ return self._flush_on_error_log
@@ -0,0 +1,127 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+ import time
5
+ from typing import TYPE_CHECKING, Any, Mapping
6
+
7
+ if TYPE_CHECKING:
8
+ import logging
9
+
10
+
11
+ def _create_buffer_record(
12
+ level: int,
13
+ msg: object,
14
+ args: object,
15
+ exc_info: logging._ExcInfoType = None,
16
+ stack_info: bool = False,
17
+ extra: Mapping[str, object] | None = None,
18
+ ) -> dict[str, Any]:
19
+ """
20
+ Create a structured log record for buffering to save in buffer.
21
+
22
+ Parameters
23
+ ----------
24
+ level : int
25
+ Logging level (e.g., logging.DEBUG, logging.INFO) indicating log severity.
26
+ msg : object
27
+ The log message to be recorded.
28
+ args : object
29
+ Additional arguments associated with the log message.
30
+ exc_info : logging._ExcInfoType, optional
31
+ Exception information to be included in the log record.
32
+ If None, no exception details will be captured.
33
+ stack_info : bool, default False
34
+ Flag to include stack trace information in the log record.
35
+ extra : Mapping[str, object], optional
36
+ Additional context or metadata to be attached to the log record.
37
+
38
+ Returns
39
+ -------
40
+ dict[str, Any]
41
+
42
+ Notes
43
+ -----
44
+ - Captures caller frame information for precise log source tracking
45
+ - Automatically handles exception context
46
+ """
47
+ # Retrieve the caller's frame information to capture precise log context
48
+ # Uses inspect.stack() with index 3 to get the original caller's details
49
+ caller_frame = sys._getframe(3)
50
+
51
+ # Get the current timestamp
52
+ timestamp = time.time()
53
+
54
+ # Dynamically replace exc_info with current system exception information
55
+ # This ensures the most recent exception is captured if available
56
+ if exc_info:
57
+ exc_info = sys.exc_info()
58
+
59
+ # Construct and return the og record dictionary
60
+ return {
61
+ "level": level,
62
+ "msg": msg,
63
+ "args": args,
64
+ "filename": caller_frame.f_code.co_filename,
65
+ "line": caller_frame.f_lineno,
66
+ "function": caller_frame.f_code.co_name,
67
+ "extra": extra,
68
+ "timestamp": timestamp,
69
+ "exc_info": exc_info,
70
+ "stack_info": stack_info,
71
+ }
72
+
73
+
74
+ def _check_minimum_buffer_log_level(buffer_log_level, current_log_level):
75
+ """
76
+ Determine if the current log level meets or exceeds the buffer's minimum log level.
77
+
78
+ Compares log levels to decide whether a log message should be included in the buffer.
79
+
80
+ Parameters
81
+ ----------
82
+ buffer_log_level : str
83
+ Minimum log level configured for the buffer.
84
+ Must be one of: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'.
85
+ current_log_level : str
86
+ Log level of the current log message.
87
+ Must be one of: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'.
88
+
89
+ Returns
90
+ -------
91
+ bool
92
+ True if the current log level is lower (more verbose) than the buffer's
93
+ minimum log level, indicating the message should be buffered.
94
+ False if the current log level is higher (less verbose) and should not be buffered.
95
+
96
+ Notes
97
+ -----
98
+ - Log levels are compared based on their numeric severity
99
+ - Conversion to uppercase ensures case-insensitive comparisons
100
+
101
+ Examples
102
+ --------
103
+ >>> _check_minimum_buffer_log_level('INFO', 'DEBUG')
104
+ True
105
+ >>> _check_minimum_buffer_log_level('ERROR', 'WARNING')
106
+ False
107
+ """
108
+ # Predefined log level mapping with numeric severity values
109
+ # Lower values indicate more verbose logging levels
110
+ log_levels = {
111
+ "DEBUG": 10,
112
+ "INFO": 20,
113
+ "WARNING": 30,
114
+ "ERROR": 40,
115
+ "CRITICAL": 50,
116
+ }
117
+
118
+ # Normalize input log levels to uppercase for consistent comparison
119
+ # Retrieve corresponding numeric log level values
120
+ buffer_level_num = log_levels.get(buffer_log_level.upper())
121
+ current_level_num = log_levels.get(current_log_level.upper())
122
+
123
+ # Compare numeric levels
124
+ if buffer_level_num < current_level_num:
125
+ return True
126
+
127
+ return False