modmex-lambda 0.5.4__tar.gz → 0.5.6__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 (239) hide show
  1. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/PKG-INFO +1 -1
  2. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/dependencies.py +9 -7
  3. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/persistence/dynamodb/keys.py +17 -19
  4. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/persistence/dynamodb/materialized_views.py +1 -1
  5. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/pyproject.toml +1 -1
  6. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/persistence/test_dynamodb_keys.py +28 -18
  7. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/persistence/test_dynamodb_materialized_views.py +2 -2
  8. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/.github/workflows/ci.yml +0 -0
  9. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/.github/workflows/release.yml +0 -0
  10. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/.gitignore +0 -0
  11. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/LICENSE +0 -0
  12. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/README.md +0 -0
  13. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/__init__.py +0 -0
  14. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/__init__.py +0 -0
  15. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/cloudwatch.py +0 -0
  16. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/dynamodb.py +0 -0
  17. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/eventbridge.py +0 -0
  18. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/icloudwatch.py +0 -0
  19. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/idynamodb.py +0 -0
  20. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/ieventbridge.py +0 -0
  21. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/ilambda.py +0 -0
  22. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/is3.py +0 -0
  23. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/isns.py +0 -0
  24. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/isqs.py +0 -0
  25. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/lambda_.py +0 -0
  26. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/module.py +0 -0
  27. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/s3.py +0 -0
  28. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/sns.py +0 -0
  29. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/connectors/sqs.py +0 -0
  30. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/data_classes/__init__.py +0 -0
  31. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/data_classes/api_gateway_authorizer_event.py +0 -0
  32. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/data_classes/api_gateway_proxy_event.py +0 -0
  33. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/data_classes/api_gateway_websocket_event.py +0 -0
  34. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/data_classes/cognito_user_pool_event.py +0 -0
  35. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/data_classes/common.py +0 -0
  36. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/__init__.py +0 -0
  37. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/api_gateway.py +0 -0
  38. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/constants.py +0 -0
  39. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/content_types.py +0 -0
  40. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/cors.py +0 -0
  41. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/dependencies/__init__.py +0 -0
  42. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/dependencies/compat.py +0 -0
  43. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/dependencies/dependant.py +0 -0
  44. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/dependencies/dependency_middleware.py +0 -0
  45. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/dependencies/depends.py +0 -0
  46. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/dependencies/params.py +0 -0
  47. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/dependencies/types.py +0 -0
  48. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/exception_handler.py +0 -0
  49. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/exceptions.py +0 -0
  50. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/gateway_response.py +0 -0
  51. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/middlewares.py +0 -0
  52. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/params.py +0 -0
  53. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/request.py +0 -0
  54. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/response.py +0 -0
  55. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/routing.py +0 -0
  56. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/routing_fallbacks.py +0 -0
  57. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_handler/types.py +0 -0
  58. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/event_sources.py +0 -0
  59. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/exceptions.py +0 -0
  60. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/logging.py +0 -0
  61. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/params.py +0 -0
  62. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/parser.py +0 -0
  63. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/persistence/__init__.py +0 -0
  64. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/persistence/dynamodb/__init__.py +0 -0
  65. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/persistence/dynamodb/expressions.py +0 -0
  66. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/persistence/dynamodb/stream_fields.py +0 -0
  67. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/request.py +0 -0
  68. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/resolver.py +0 -0
  69. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/response.py +0 -0
  70. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/routing.py +0 -0
  71. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/shared/__init__.py +0 -0
  72. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/shared/cookies.py +0 -0
  73. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/shared/headers_serializer.py +0 -0
  74. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/shared/json_encoder.py +0 -0
  75. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/shared/types.py +0 -0
  76. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/__init__.py +0 -0
  77. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/events/__init__.py +0 -0
  78. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/events/dynamodb.py +0 -0
  79. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/events/kinesis.py +0 -0
  80. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/events/s3.py +0 -0
  81. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/events/sns.py +0 -0
  82. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/events/sqs.py +0 -0
  83. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/filters/__init__.py +0 -0
  84. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/filters/content.py +0 -0
  85. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/filters/event_type.py +0 -0
  86. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/filters/latch.py +0 -0
  87. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/filters/skip.py +0 -0
  88. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/__init__.py +0 -0
  89. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/base_flavor.py +0 -0
  90. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/cdc.py +0 -0
  91. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/collect.py +0 -0
  92. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/correlate.py +0 -0
  93. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/evaluate.py +0 -0
  94. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/expired.py +0 -0
  95. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/iflavor.py +0 -0
  96. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/job.py +0 -0
  97. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/materialize.py +0 -0
  98. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/s3.py +0 -0
  99. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/sns.py +0 -0
  100. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/task.py +0 -0
  101. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/flavors/update.py +0 -0
  102. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/irules_registry.py +0 -0
  103. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/operators/__init__.py +0 -0
  104. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/operators/cloudwatch.py +0 -0
  105. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/operators/dynamodb.py +0 -0
  106. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/operators/ioperator.py +0 -0
  107. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/operators/lambda_.py +0 -0
  108. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/operators/publisher.py +0 -0
  109. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/operators/s3.py +0 -0
  110. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/operators/sns.py +0 -0
  111. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/operators/sqs.py +0 -0
  112. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/rules_registry.py +0 -0
  113. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/runner.py +0 -0
  114. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/sources/__init__.py +0 -0
  115. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/sources/base.py +0 -0
  116. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/sources/dynamodb.py +0 -0
  117. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/sources/kinesis.py +0 -0
  118. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/sources/s3.py +0 -0
  119. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/sources/sns.py +0 -0
  120. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/sources/sqs.py +0 -0
  121. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/__init__.py +0 -0
  122. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/apigateway.py +0 -0
  123. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/aws.py +0 -0
  124. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/batch.py +0 -0
  125. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/cloudwatch.py +0 -0
  126. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/concurrency.py +0 -0
  127. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/contracts.py +0 -0
  128. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/data_classes/__init__.py +0 -0
  129. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/data_classes/dynamodb.py +0 -0
  130. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/decorators.py +0 -0
  131. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/dynamodb.py +0 -0
  132. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/eventbridge.py +0 -0
  133. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/faults.py +0 -0
  134. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/filters.py +0 -0
  135. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/json_encoder.py +0 -0
  136. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/lambda_.py +0 -0
  137. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/operators.py +0 -0
  138. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/pluralize.py +0 -0
  139. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/print.py +0 -0
  140. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/retry.py +0 -0
  141. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/s3.py +0 -0
  142. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/sns.py +0 -0
  143. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/split.py +0 -0
  144. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/sqs.py +0 -0
  145. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/tags.py +0 -0
  146. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/time.py +0 -0
  147. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/stream/utils/uow.py +0 -0
  148. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/tracing.py +0 -0
  149. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/modmex_lambda/validation.py +0 -0
  150. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/poetry.lock +0 -0
  151. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/__init__.py +0 -0
  152. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/conftest.py +0 -0
  153. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/connectors/__init__.py +0 -0
  154. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/connectors/conftest.py +0 -0
  155. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/connectors/test_cloudwatch.py +0 -0
  156. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/connectors/test_dynamodb.py +0 -0
  157. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/connectors/test_lazy_clients.py +0 -0
  158. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/connectors/test_s3.py +0 -0
  159. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/connectors/test_simple_connectors.py +0 -0
  160. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/connectors/test_sns.py +0 -0
  161. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/connectors/test_sqs.py +0 -0
  162. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/data_classes/test_api_gateway_proxy_event.py +0 -0
  163. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/data_classes/test_cognito_user_pool_event.py +0 -0
  164. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/data_classes/test_common.py +0 -0
  165. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/event_handler/__init__.py +0 -0
  166. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/event_handler/test_api_gateway.py +0 -0
  167. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/event_handler/test_cors.py +0 -0
  168. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/event_handler/test_dependencies.py +0 -0
  169. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/event_handler/test_exception_handler.py +0 -0
  170. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/event_handler/test_gateway_response.py +0 -0
  171. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/event_handler/test_request.py +0 -0
  172. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/event_handler/test_response.py +0 -0
  173. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/event_handler/test_routing.py +0 -0
  174. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/persistence/__init__.py +0 -0
  175. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/persistence/test_dynamodb_expressions.py +0 -0
  176. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/persistence/test_dynamodb_stream_fields.py +0 -0
  177. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/shared/test_cookies_headers.py +0 -0
  178. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/shared/test_json_encoder.py +0 -0
  179. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/__init__.py +0 -0
  180. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/conftest.py +0 -0
  181. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/events/test_dynamodb.py +0 -0
  182. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/events/test_kinesis.py +0 -0
  183. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/events/test_s3.py +0 -0
  184. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/events/test_sns.py +0 -0
  185. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/events/test_sqs.py +0 -0
  186. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/filters/__init__.py +0 -0
  187. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/filters/test_content.py +0 -0
  188. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/filters/test_event_type.py +0 -0
  189. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/filters/test_latch.py +0 -0
  190. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/filters/test_skip.py +0 -0
  191. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/__init__.py +0 -0
  192. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/source_events.py +0 -0
  193. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_base_flavor.py +0 -0
  194. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_cdc.py +0 -0
  195. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_collect.py +0 -0
  196. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_correlate.py +0 -0
  197. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_evaluate.py +0 -0
  198. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_expired.py +0 -0
  199. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_job.py +0 -0
  200. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_materialize.py +0 -0
  201. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_s3.py +0 -0
  202. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_sns.py +0 -0
  203. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_task.py +0 -0
  204. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/flavors/test_update.py +0 -0
  205. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/test_dependency_resolver.py +0 -0
  206. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/test_rules_registry.py +0 -0
  207. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/test_runner.py +0 -0
  208. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/test_runner_pipeline.py +0 -0
  209. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/test_sources.py +0 -0
  210. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/__init__.py +0 -0
  211. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/faults.py +0 -0
  212. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_apigateway.py +0 -0
  213. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_aws.py +0 -0
  214. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_batch.py +0 -0
  215. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_cloudwatch.py +0 -0
  216. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_concurrency.py +0 -0
  217. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_decorators.py +0 -0
  218. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_dynamodb.py +0 -0
  219. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_eventbridge.py +0 -0
  220. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_filters.py +0 -0
  221. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_json_encoder.py +0 -0
  222. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_lambda.py +0 -0
  223. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_operators.py +0 -0
  224. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_pluralize.py +0 -0
  225. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_print.py +0 -0
  226. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_retry.py +0 -0
  227. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_s3.py +0 -0
  228. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_sns.py +0 -0
  229. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_split.py +0 -0
  230. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_sqs.py +0 -0
  231. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_tags.py +0 -0
  232. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_time.py +0 -0
  233. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/stream/utils/test_uow.py +0 -0
  234. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/test_lazy_imports.py +0 -0
  235. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/test_logging.py +0 -0
  236. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/test_parser_event_sources.py +0 -0
  237. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/test_reexports.py +0 -0
  238. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/test_tracing.py +0 -0
  239. {modmex_lambda-0.5.4 → modmex_lambda-0.5.6}/tests/test_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modmex-lambda
3
- Version: 0.5.4
3
+ Version: 0.5.6
4
4
  Summary: Ultra-lightweight AWS Lambda utilities for API Gateway routing and event handling.
5
5
  Author: Modmex
6
6
  License: MIT
@@ -4,21 +4,23 @@ from __future__ import annotations
4
4
 
5
5
  import inspect
6
6
  from importlib import import_module
7
- from typing import TYPE_CHECKING, Any, Callable, Protocol
7
+ from typing import TYPE_CHECKING, Any, Callable, Protocol, TypeVar
8
8
 
9
9
  if TYPE_CHECKING:
10
10
  from modmex_lambda.connectors import AwsConnectorsModule
11
11
 
12
12
 
13
+ T = TypeVar("T")
14
+
13
15
  class DependencyResolver(Protocol):
14
16
  """Resolves a dependency token into the value passed to a handler."""
15
17
 
16
18
  def resolve(
17
19
  self,
18
- dependency: Callable[..., Any] | type[Any],
20
+ dependency: type[T],
19
21
  *,
20
22
  values: dict[str, Any] | None = None,
21
- ) -> Any:
23
+ ) -> T:
22
24
  ...
23
25
 
24
26
 
@@ -27,10 +29,10 @@ class DefaultDependencyResolver:
27
29
 
28
30
  def resolve(
29
31
  self,
30
- dependency: Callable[..., Any] | type[Any],
32
+ dependency: type[T],
31
33
  *,
32
34
  values: dict[str, Any] | None = None,
33
- ) -> Any:
35
+ ) -> T:
34
36
  return dependency(**(values or {}))
35
37
 
36
38
 
@@ -42,10 +44,10 @@ class InjectorDependencyResolver:
42
44
 
43
45
  def resolve(
44
46
  self,
45
- dependency: Callable[..., Any] | type[Any],
47
+ dependency: type[T],
46
48
  *,
47
49
  values: dict[str, Any] | None = None,
48
- ) -> Any:
50
+ ) -> T:
49
51
  kwargs = values or {}
50
52
 
51
53
  if hasattr(self.injector, "call_with_injection") and not inspect.isclass(dependency):
@@ -28,10 +28,11 @@ class SingleEntityKeyStrategy(KeyStrategy):
28
28
  """Use the entity id as pk and a fixed discriminator as sk."""
29
29
 
30
30
  discriminator: str
31
+ separator: str = "#"
31
32
 
32
33
  def key_for_id(self, entity_id: Any, **context: Any) -> dict[str, str]:
33
34
  return {
34
- "pk": str(entity_id),
35
+ "pk": f"{self.discriminator}{self.separator}{entity_id}",
35
36
  "sk": self.discriminator,
36
37
  }
37
38
 
@@ -41,64 +42,61 @@ class SingleEntityKeyStrategy(KeyStrategy):
41
42
 
42
43
  @dataclass(frozen=True)
43
44
  class TenantScopedSortKeyStrategy(KeyStrategy):
44
- """Use entity id as pk and discriminator plus tenant id as sk."""
45
+ """Use discriminator + entity id as pk and tenant name + tenant id as sk."""
45
46
 
46
47
  discriminator: str
47
- separator: str = "#"
48
+ tenant_name: str = "tenant"
48
49
  tenant_field: str = "tenant_id"
50
+ separator: str = "#"
49
51
 
50
52
  def key_for_id(self, entity_id: Any, **context: Any) -> dict[str, str]:
51
53
  tenant_id = _context_value(context, self.tenant_field)
52
54
  return {
53
- "pk": str(entity_id),
54
- "sk": self._sort_key(tenant_id),
55
+ "pk": f"{self.discriminator}{self.separator}{entity_id}",
56
+ "sk": f"{self.tenant_name}{self.separator}{tenant_id}",
55
57
  }
56
58
 
57
59
  def key_for_entity(self, entity: Any, **context: Any) -> dict[str, str]:
58
60
  tenant_id = _context_or_entity_value(context, entity, self.tenant_field)
59
61
  return self.key_for_id(_entity_attr(entity, "id"), **{self.tenant_field: tenant_id})
60
62
 
61
- def _sort_key(self, tenant_id: Any) -> str:
62
- return f"{self.discriminator}{self.separator}{tenant_id}"
63
63
 
64
64
 
65
65
  @dataclass(frozen=True)
66
66
  class TenantPartitionKeyStrategy(KeyStrategy):
67
- """Use tenant id as pk and discriminator plus entity id as sk."""
67
+ """Use tenant name + tenant id as pk and discriminator + entity id as sk."""
68
68
 
69
69
  discriminator: str
70
- separator: str = "#"
70
+ tenant_name: str = "tenant"
71
71
  tenant_field: str = "tenant_id"
72
+ separator: str = "#"
72
73
 
73
74
  def key_for_id(self, entity_id: Any, **context: Any) -> dict[str, str]:
74
75
  tenant_id = _context_value(context, self.tenant_field)
75
76
  return {
76
- "pk": str(tenant_id),
77
- "sk": self._sort_key(entity_id),
77
+ "pk": f"{self.tenant_name}{self.separator}{tenant_id}",
78
+ "sk": f"{self.discriminator}{self.separator}{entity_id}",
78
79
  }
79
80
 
80
81
  def key_for_entity(self, entity: Any, **context: Any) -> dict[str, str]:
81
82
  tenant_id = _context_or_entity_value(context, entity, self.tenant_field)
82
83
  return self.key_for_id(_entity_attr(entity, "id"), **{self.tenant_field: tenant_id})
83
84
 
84
- def _sort_key(self, entity_id: Any) -> str:
85
- return f"{self.discriminator}{self.separator}{entity_id}"
86
-
87
-
88
85
  @dataclass(frozen=True)
89
86
  class AggregateKeyStrategy(KeyStrategy):
90
- """Use aggregate id as pk and entity name plus entity id as sk."""
87
+ """Use aggregate name + aggregate id as pk and discriminator + entity id as sk."""
91
88
 
89
+ discriminator: str
92
90
  aggregate_name: str
93
- entity_name: str
91
+ aggregate_field: str
94
92
  separator: str = "#"
95
- aggregate_field: str = "aggregate_id"
93
+
96
94
 
97
95
  def key_for_id(self, entity_id: Any, **context: Any) -> dict[str, str]:
98
96
  aggregate_id = _context_value(context, self.aggregate_field)
99
97
  return {
100
98
  "pk": f"{self.aggregate_name}{self.separator}{aggregate_id}",
101
- "sk": f"{self.entity_name}{self.separator}{entity_id}",
99
+ "sk": f"{self.discriminator}{self.separator}{entity_id}",
102
100
  }
103
101
 
104
102
  def key_for_entity(self, entity: Any, **context: Any) -> dict[str, str]:
@@ -55,7 +55,7 @@ class MaterializedViewMixin(DynamoDBUpdateRequestMixin):
55
55
 
56
56
  def materialized_key(self, uow: dict[str, Any], entity: dict[str, Any]) -> dict[str, Any]:
57
57
  return {
58
- "pk": entity["id"],
58
+ "pk": entity.get('pk') or entity.get('id'),
59
59
  "sk": entity.get("sk", self.discriminator),
60
60
  }
61
61
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "modmex-lambda"
7
- version = "0.5.4"
7
+ version = "0.5.6"
8
8
  description = "Ultra-lightweight AWS Lambda utilities for API Gateway routing and event handling."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10,<4.0"
@@ -30,34 +30,39 @@ def test_key_strategy_is_abstract() -> None:
30
30
  def test_single_entity_key_strategy_uses_id_as_pk_and_discriminator_as_sk() -> None:
31
31
  strategy = SingleEntityKeyStrategy("thing")
32
32
 
33
- assert strategy.key_for_id("thing-1") == {"pk": "thing-1", "sk": "thing"}
34
- assert strategy.key_for_entity(Thing(id="thing-2")) == {"pk": "thing-2", "sk": "thing"}
35
- assert strategy.key_for_entity({"id": "thing-3"}) == {"pk": "thing-3", "sk": "thing"}
33
+ assert strategy.key_for_id("thing-1") == {"pk": "thing#thing-1", "sk": "thing"}
34
+ assert strategy.key_for_entity(Thing(id="thing-2")) == {"pk": "thing#thing-2", "sk": "thing"}
35
+ assert strategy.key_for_entity({"id": "thing-3"}) == {"pk": "thing#thing-3", "sk": "thing"}
36
36
 
37
37
 
38
38
  def test_tenant_scoped_sort_key_strategy_uses_entity_id_and_tenant_scoped_sk() -> None:
39
39
  strategy = TenantScopedSortKeyStrategy("thing")
40
40
 
41
41
  assert strategy.key_for_id("thing-1", tenant_id="acme") == {
42
- "pk": "thing-1",
43
- "sk": "thing#acme",
42
+ "pk": "thing#thing-1",
43
+ "sk": "tenant#acme",
44
44
  }
45
45
  assert strategy.key_for_entity(Thing(id="thing-2", tenant_id="modmex")) == {
46
- "pk": "thing-2",
47
- "sk": "thing#modmex",
46
+ "pk": "thing#thing-2",
47
+ "sk": "tenant#modmex",
48
48
  }
49
49
  assert strategy.key_for_entity(Thing(id="thing-3", tenant_id="ignored"), tenant_id="acme") == {
50
- "pk": "thing-3",
51
- "sk": "thing#acme",
50
+ "pk": "thing#thing-3",
51
+ "sk": "tenant#acme",
52
52
  }
53
53
 
54
54
 
55
55
  def test_tenant_scoped_sort_key_strategy_supports_custom_field_and_separator() -> None:
56
- strategy = TenantScopedSortKeyStrategy("thing", separator=":", tenant_field="account_id")
56
+ strategy = TenantScopedSortKeyStrategy(
57
+ "thing",
58
+ tenant_name="account",
59
+ separator=":",
60
+ tenant_field="account_id",
61
+ )
57
62
 
58
63
  assert strategy.key_for_entity(Thing(id="thing-1", account_id="acct-1")) == {
59
- "pk": "thing-1",
60
- "sk": "thing:acct-1",
64
+ "pk": "thing:thing-1",
65
+ "sk": "account:acct-1",
61
66
  }
62
67
 
63
68
 
@@ -65,26 +70,31 @@ def test_tenant_partition_key_strategy_uses_tenant_as_pk_and_entity_scoped_sk()
65
70
  strategy = TenantPartitionKeyStrategy("thing")
66
71
 
67
72
  assert strategy.key_for_id("thing-1", tenant_id="acme") == {
68
- "pk": "acme",
73
+ "pk": "tenant#acme",
69
74
  "sk": "thing#thing-1",
70
75
  }
71
76
  assert strategy.key_for_entity(Thing(id="thing-2", tenant_id="modmex")) == {
72
- "pk": "modmex",
77
+ "pk": "tenant#modmex",
73
78
  "sk": "thing#thing-2",
74
79
  }
75
80
 
76
81
 
77
82
  def test_tenant_partition_key_strategy_supports_custom_field_and_separator() -> None:
78
- strategy = TenantPartitionKeyStrategy("thing", separator=":", tenant_field="account_id")
83
+ strategy = TenantPartitionKeyStrategy(
84
+ "thing",
85
+ tenant_name="account",
86
+ separator=":",
87
+ tenant_field="account_id",
88
+ )
79
89
 
80
90
  assert strategy.key_for_entity(Thing(id="thing-1", account_id="acct-1")) == {
81
- "pk": "acct-1",
91
+ "pk": "account:acct-1",
82
92
  "sk": "thing:thing-1",
83
93
  }
84
94
 
85
95
 
86
96
  def test_aggregate_key_strategy_uses_aggregate_pk_and_entity_sk() -> None:
87
- strategy = AggregateKeyStrategy("order", "item")
97
+ strategy = AggregateKeyStrategy("item", "order", "aggregate_id")
88
98
 
89
99
  assert strategy.key_for_id("item-1", aggregate_id="order-1") == {
90
100
  "pk": "order#order-1",
@@ -97,7 +107,7 @@ def test_aggregate_key_strategy_uses_aggregate_pk_and_entity_sk() -> None:
97
107
 
98
108
 
99
109
  def test_aggregate_key_strategy_supports_custom_field_and_separator() -> None:
100
- strategy = AggregateKeyStrategy("order", "item", separator=":", aggregate_field="order_id")
110
+ strategy = AggregateKeyStrategy("item", "order", separator=":", aggregate_field="order_id")
101
111
 
102
112
  assert strategy.key_for_entity(Thing(id="item-1", order_id="order-1")) == {
103
113
  "pk": "order:order-1",
@@ -56,7 +56,7 @@ def test_materialized_view_mixin_replicates_event_entity_with_stream_fields(monk
56
56
  "timestamp": 1548967022000,
57
57
  "thing": {
58
58
  "id": "thing-1",
59
- "pk": "ignored",
59
+ "pk": "thing#thing-1",
60
60
  "sk": "thing",
61
61
  "name": "Desk",
62
62
  },
@@ -65,7 +65,7 @@ def test_materialized_view_mixin_replicates_event_entity_with_stream_fields(monk
65
65
 
66
66
  request = ThingMaterializer().to_materialized_update_request(uow)
67
67
 
68
- assert request["Key"] == {"pk": "thing-1", "sk": "thing"}
68
+ assert request["Key"] == {"pk": "thing#thing-1", "sk": "thing"}
69
69
  assert request["ExpressionAttributeValues"][":id"] == "thing-1"
70
70
  assert request["ExpressionAttributeValues"][":name"] == "Desk"
71
71
  assert request["ExpressionAttributeValues"][":discriminator"] == "thing"
File without changes
File without changes
File without changes