buz 2.17.0rc7__tar.gz → 2.18.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 (268) hide show
  1. {buz-2.17.0rc7 → buz-2.18.0}/PKG-INFO +1 -1
  2. {buz-2.17.0rc7 → buz-2.18.0}/pyproject.toml +1 -1
  3. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py +13 -0
  4. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_multi_threaded_consumer.py +13 -0
  5. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py +23 -2
  6. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py +24 -2
  7. buz-2.18.0/src/buz/event/infrastructure/buz_kafka/models/cdc_process_context.py +9 -0
  8. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/kombu_consumer.py +6 -1
  9. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/models/execution_context.py +2 -0
  10. buz-2.18.0/src/buz/event/infrastructure/models/process_context.py +6 -0
  11. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/sync/sync_event_bus.py +3 -1
  12. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/cdc/cdc_payload.py +3 -0
  13. buz-2.17.0rc7/src/buz/kafka/infrastructure/deserializers/implementations/cdc/not_valid_cdc_message_exception.py → buz-2.18.0/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cannot_decode_cdc_message_exception.py +1 -1
  14. buz-2.18.0/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cannot_restore_event_from_cdc_payload_exception.py +11 -0
  15. buz-2.18.0/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cdc_record_bytes_to_cdc_payload_deserializer.py +35 -0
  16. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cdc_record_bytes_to_event_deserializer.py +10 -17
  17. {buz-2.17.0rc7 → buz-2.18.0}/LICENSE +0 -0
  18. {buz-2.17.0rc7 → buz-2.18.0}/README.md +0 -0
  19. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/__init__.py +0 -0
  20. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/__init__.py +0 -0
  21. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/asynchronous/__init__.py +0 -0
  22. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/asynchronous/base_command_handler.py +0 -0
  23. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/asynchronous/command_bus.py +0 -0
  24. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/asynchronous/command_handler.py +0 -0
  25. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/asynchronous/middleware/__init__.py +0 -0
  26. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/asynchronous/middleware/base_handle_middleware.py +0 -0
  27. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/asynchronous/middleware/handle_middleware.py +0 -0
  28. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  29. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/asynchronous/self_process/__init__.py +0 -0
  30. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/asynchronous/self_process/self_process_command_bus.py +0 -0
  31. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/command.py +0 -0
  32. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/more_than_one_command_handler_related_exception.py +0 -0
  33. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/__init__.py +0 -0
  34. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/base_command_handler.py +0 -0
  35. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/command_bus.py +0 -0
  36. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/command_handler.py +0 -0
  37. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/middleware/__init__.py +0 -0
  38. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/middleware/base_handle_middleware.py +0 -0
  39. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/middleware/handle_middleware.py +0 -0
  40. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  41. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/self_process/__init__.py +0 -0
  42. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/self_process/self_process_command_bus.py +0 -0
  43. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/synced_async/__init__.py +0 -0
  44. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/command/synchronous/synced_async/synced_async_command_bus.py +0 -0
  45. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/__init__.py +0 -0
  46. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/async_consumer.py +0 -0
  47. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/async_event_bus.py +0 -0
  48. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/async_subscriber.py +0 -0
  49. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/async_worker.py +0 -0
  50. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/base_async_subscriber.py +0 -0
  51. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/base_subscriber.py +0 -0
  52. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/consumer.py +0 -0
  53. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/dead_letter_queue/__init__.py +0 -0
  54. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/dead_letter_queue/dlq_criteria.py +0 -0
  55. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/dead_letter_queue/dlq_record.py +0 -0
  56. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/dead_letter_queue/dlq_repository.py +0 -0
  57. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/event.py +0 -0
  58. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/event_bus.py +0 -0
  59. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/exceptions/__init__.py +0 -0
  60. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/exceptions/event_not_published_exception.py +0 -0
  61. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/exceptions/event_restore_exception.py +0 -0
  62. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/exceptions/subscribers_not_found_exception.py +0 -0
  63. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/exceptions/term_signal_interruption_exception.py +0 -0
  64. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/exceptions/worker_execution_exception.py +0 -0
  65. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/__init__.py +0 -0
  66. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/__init__.py +0 -0
  67. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/async_buz_kafka_event_bus.py +0 -0
  68. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/base_buz_aiokafka_async_consumer.py +0 -0
  69. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/buz_kafka_event_bus.py +0 -0
  70. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/__init__.py +0 -0
  71. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/consume_strategy.py +0 -0
  72. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/kafka_on_fail_strategy.py +0 -0
  73. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/topic_and_subscription_group_per_subscriber_kafka_consumer_strategy.py +0 -0
  74. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/exceptions/__init__.py +0 -0
  75. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/exceptions/kafka_event_bus_config_not_valid_exception.py +0 -0
  76. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/exceptions/max_consumer_retry_exception.py +0 -0
  77. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/exceptions/retry_exception.py +0 -0
  78. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/kafka_event_subscriber_executor.py +0 -0
  79. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/models/kafka_delivery_context.py +0 -0
  80. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/publish_strategy/__init__.py +0 -0
  81. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/publish_strategy/publish_strategy.py +0 -0
  82. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/publish_strategy/topic_per_event_kafka_publish_strategy.py +0 -0
  83. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/__init__.py +0 -0
  84. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/allowed_kombu_serializer.py +0 -0
  85. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/consume_strategy/__init__.py +0 -0
  86. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/consume_strategy/consume_strategy.py +0 -0
  87. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/consume_strategy/queue_per_subscriber_consume_strategy.py +0 -0
  88. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/kombu_event_bus.py +0 -0
  89. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/models/kombu_delivery_context.py +0 -0
  90. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/publish_strategy/__init__.py +0 -0
  91. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/publish_strategy/fanout_exchange_per_event_publish_strategy.py +0 -0
  92. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/publish_strategy/publish_strategy.py +0 -0
  93. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/retry_strategy/__init__.py +0 -0
  94. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/retry_strategy/publish_retry_policy.py +0 -0
  95. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/kombu/retry_strategy/simple_publish_retry_policy.py +0 -0
  96. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/models/__init__.py +0 -0
  97. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/models/consuming_task.py +0 -0
  98. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/models/delivery_context.py +0 -0
  99. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/infrastructure/queue/__init__.py +0 -0
  100. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/meta_base_subscriber.py +0 -0
  101. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/meta_subscriber.py +0 -0
  102. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/__init__.py +0 -0
  103. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/async_consume_middleware.py +0 -0
  104. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/async_consume_middleware_chain_resolver.py +0 -0
  105. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/async_publish_middleware.py +0 -0
  106. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/async_publish_middleware_chain_resolver.py +0 -0
  107. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/base_async_consume_middleware.py +0 -0
  108. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/base_consume_middleware.py +0 -0
  109. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/base_publish_middleware.py +0 -0
  110. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/consume_middleware.py +0 -0
  111. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/consume_middleware_chain_resolver.py +0 -0
  112. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/exceptions/__init__.py +0 -0
  113. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/exceptions/event_already_in_progress_exception.py +0 -0
  114. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/publish_middleware.py +0 -0
  115. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/middleware/publish_middleware_chain_resolver.py +0 -0
  116. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/__init__.py +0 -0
  117. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/__init__.py +0 -0
  118. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/async_execution_strategy.py +0 -0
  119. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/async_self_process_execution_strategy.py +0 -0
  120. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/cyclic_iterator_execution_strategy.py +0 -0
  121. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/execution_strategy.py +0 -0
  122. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/self_process_execution_strategy.py +0 -0
  123. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/retry/__init__.py +0 -0
  124. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/retry/consume_retrier.py +0 -0
  125. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/retry/consumed_event_retry.py +0 -0
  126. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/retry/consumed_event_retry_repository.py +0 -0
  127. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/retry/max_retries_consume_retrier.py +0 -0
  128. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/retry/max_retries_negative_exception.py +0 -0
  129. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/strategies/retry/reject_callback.py +0 -0
  130. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/subscriber.py +0 -0
  131. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/sync/__init__.py +0 -0
  132. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/sync/models/__init__.py +0 -0
  133. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/sync/models/sync_delivery_context.py +0 -0
  134. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/__init__.py +0 -0
  135. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/event_to_outbox_record_translator.py +0 -0
  136. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/fqn_to_event_mapper.py +0 -0
  137. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_criteria/__init__.py +0 -0
  138. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_criteria/deliverable_records_outbox_criteria_factory.py +0 -0
  139. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria.py +0 -0
  140. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria_factory.py +0 -0
  141. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_criteria/outbox_sorting_criteria.py +0 -0
  142. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record.py +0 -0
  143. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_finder/__init__.py +0 -0
  144. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_finder/outbox_record_stream_finder.py +0 -0
  145. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_finder/polling_outbox_record_stream_finder.py +0 -0
  146. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_to_event_translator.py +0 -0
  147. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/__init__.py +0 -0
  148. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/abstract_outbox_record_validator.py +0 -0
  149. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_size_not_allowed_exception.py +0 -0
  150. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validation_exception.py +0 -0
  151. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validator.py +0 -0
  152. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/size_outbox_record_validator.py +0 -0
  153. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_repository.py +0 -0
  154. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/transactional_outbox_event_bus.py +0 -0
  155. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/transactional_outbox/transactional_outbox_worker.py +0 -0
  156. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/event/worker.py +0 -0
  157. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/handler.py +0 -0
  158. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/__init__.py +0 -0
  159. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/exceptions/__init__.py +0 -0
  160. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/exceptions/not_all_partition_assigned_exception.py +0 -0
  161. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/exceptions/not_valid_kafka_message_exception.py +0 -0
  162. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/exceptions/not_valid_partition_number_exception.py +0 -0
  163. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/exceptions/topic_already_created_exception.py +0 -0
  164. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/exceptions/topic_not_found_exception.py +0 -0
  165. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/__init__.py +0 -0
  166. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/auto_create_topic_configuration.py +0 -0
  167. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/consumer_initial_offset_position.py +0 -0
  168. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/create_kafka_topic.py +0 -0
  169. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_connection_config.py +0 -0
  170. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_connection_credentials.py +0 -0
  171. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_connection_plain_text_credentials.py +0 -0
  172. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_connection_sasl_credentials.py +0 -0
  173. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_consumer_record.py +0 -0
  174. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_poll_record.py +0 -0
  175. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_supported_compression_type.py +0 -0
  176. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_supported_sasl_mechanisms.py +0 -0
  177. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_supported_security_protocols.py +0 -0
  178. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/services/__init__.py +0 -0
  179. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/services/async_kafka_producer.py +0 -0
  180. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/services/kafka_admin_client.py +0 -0
  181. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/services/kafka_admin_test_client.py +0 -0
  182. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/domain/services/kafka_producer.py +0 -0
  183. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/__init__.py +0 -0
  184. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/__init__.py +0 -0
  185. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/aiokafka_consumer.py +0 -0
  186. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/aiokafka_producer.py +0 -0
  187. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/rebalance/__init__.py +0 -0
  188. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/rebalance/kafka_callback_rebalancer.py +0 -0
  189. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/translators/__init__.py +0 -0
  190. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/translators/consumer_initial_offset_position_translator.py +0 -0
  191. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/cdc/__init__.py +0 -0
  192. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/cdc/cdc_message.py +0 -0
  193. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/cdc/cdc_schema.py +0 -0
  194. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/__init__.py +0 -0
  195. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/byte_deserializer.py +0 -0
  196. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/bytes_to_message_deserializer.py +0 -0
  197. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/implementations/__init__.py +0 -0
  198. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/implementations/json_byte_deserializer.py +0 -0
  199. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/implementations/json_bytes_to_message_deserializer.py +0 -0
  200. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/interfaces/__init__.py +0 -0
  201. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/interfaces/async_connection_manager.py +0 -0
  202. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/interfaces/connection_manager.py +0 -0
  203. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/__init__.py +0 -0
  204. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/exception/consumer_interrupted_exception.py +0 -0
  205. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_client.py +0 -0
  206. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_test_client.py +0 -0
  207. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/kafka_python_producer.py +0 -0
  208. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/translators/__init__.py +0 -0
  209. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/translators/consumer_initial_offset_position_translator.py +0 -0
  210. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/serializers/byte_serializer.py +0 -0
  211. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/serializers/implementations/cdc_record_bytes_to_event_serializer.py +0 -0
  212. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/serializers/implementations/json_byte_serializer.py +0 -0
  213. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/kafka/infrastructure/serializers/kafka_header_serializer.py +0 -0
  214. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/__init__.py +0 -0
  215. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/handler_fqn_not_found_exception.py +0 -0
  216. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/locator.py +0 -0
  217. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/message_fqn_not_found_exception.py +0 -0
  218. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/pypendency/__init__.py +0 -0
  219. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/pypendency/container_locator.py +0 -0
  220. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/pypendency/container_locator_resolution_configuration.py +0 -0
  221. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/pypendency/handler_not_found_exception.py +0 -0
  222. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/pypendency/handler_not_registered_exception.py +0 -0
  223. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/sync/__init__.py +0 -0
  224. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/sync/handler_already_registered_exception.py +0 -0
  225. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/sync/handler_not_registered_exception.py +0 -0
  226. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/locator/sync/instance_locator.py +0 -0
  227. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/message.py +0 -0
  228. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/metadata.py +0 -0
  229. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/middleware/__init__.py +0 -0
  230. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/middleware/middleware.py +0 -0
  231. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/middleware/middleware_chain_builder.py +0 -0
  232. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/py.typed +0 -0
  233. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/__init__.py +0 -0
  234. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/asynchronous/__init__.py +0 -0
  235. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/asynchronous/base_query_handler.py +0 -0
  236. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/asynchronous/middleware/__init__.py +0 -0
  237. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/asynchronous/middleware/base_handle_middleware.py +0 -0
  238. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/asynchronous/middleware/handle_middleware.py +0 -0
  239. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  240. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/asynchronous/query_bus.py +0 -0
  241. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/asynchronous/query_handler.py +0 -0
  242. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/asynchronous/self_process/__init__.py +0 -0
  243. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/asynchronous/self_process/self_process_query_bus.py +0 -0
  244. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/more_than_one_query_handler_related_exception.py +0 -0
  245. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/query.py +0 -0
  246. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/query_response.py +0 -0
  247. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/__init__.py +0 -0
  248. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/base_query_handler.py +0 -0
  249. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/middleware/__init__.py +0 -0
  250. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/middleware/base_handle_middleware.py +0 -0
  251. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/middleware/handle_middleware.py +0 -0
  252. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  253. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/query_bus.py +0 -0
  254. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/query_handler.py +0 -0
  255. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/self_process/__init__.py +0 -0
  256. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/self_process/self_process_query_bus.py +0 -0
  257. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/synced_async/__init__.py +0 -0
  258. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/query/synchronous/synced_async/synced_async_query_bus.py +0 -0
  259. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/queue/__init__.py +0 -0
  260. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/queue/in_memory/in_memory_multiqueue_repository.py +0 -0
  261. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/queue/in_memory/in_memory_queue_repository.py +0 -0
  262. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/queue/multiqueue_repository.py +0 -0
  263. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/queue/queue_repository.py +0 -0
  264. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/serializer/message_to_bytes_serializer.py +0 -0
  265. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/serializer/message_to_json_bytes_serializer.py +0 -0
  266. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/wrapper/__init__.py +0 -0
  267. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/wrapper/async_to_sync.py +0 -0
  268. {buz-2.17.0rc7 → buz-2.18.0}/src/buz/wrapper/event_loop.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: buz
3
- Version: 2.17.0rc7
3
+ Version: 2.18.0
4
4
  Summary: Buz is a set of light, simple and extensible implementations of event, command and query buses.
5
5
  License: MIT
6
6
  Author: Luis Pintado Lozano
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "buz"
3
- version = "2.17.0-rc7"
3
+ version = "2.18.0"
4
4
  description = "Buz is a set of light, simple and extensible implementations of event, command and query buses."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -2,6 +2,12 @@ from logging import Logger
2
2
  from typing import Optional, Sequence, Type, TypeVar
3
3
 
4
4
  from aiokafka.coordinator.assignors.abstract import AbstractPartitionAssignor
5
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cdc_record_bytes_to_cdc_payload_deserializer import (
6
+ CDCRecordBytesToCDCPayloadDeserializer,
7
+ )
8
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cdc_record_bytes_to_event_deserializer import (
9
+ CDCRecordBytesToEventDeserializer,
10
+ )
5
11
 
6
12
  from buz.event import Event
7
13
  from buz.event.async_subscriber import AsyncSubscriber
@@ -102,6 +108,12 @@ class BuzAIOKafkaAsyncConsumer(BaseBuzAIOKafkaAsyncConsumer):
102
108
  event_class=subscriber.handles() # type: ignore
103
109
  )
104
110
 
111
+ cdc_payload_deserializer = (
112
+ CDCRecordBytesToCDCPayloadDeserializer()
113
+ if isinstance(byte_deserializer, CDCRecordBytesToEventDeserializer)
114
+ else None
115
+ )
116
+
105
117
  return KafkaEventAsyncSubscriberExecutor(
106
118
  logger=self._logger,
107
119
  byte_deserializer=byte_deserializer,
@@ -111,4 +123,5 @@ class BuzAIOKafkaAsyncConsumer(BaseBuzAIOKafkaAsyncConsumer):
111
123
  consume_middlewares=self.__consume_middlewares,
112
124
  consume_retrier=self.__consume_retrier,
113
125
  reject_callback=self.__reject_callback,
126
+ cdc_payload_deserializer=cdc_payload_deserializer,
114
127
  )
@@ -2,6 +2,12 @@ from logging import Logger
2
2
  from typing import Optional, Sequence, Type, TypeVar
3
3
 
4
4
  from aiokafka.coordinator.assignors.abstract import AbstractPartitionAssignor
5
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cdc_record_bytes_to_cdc_payload_deserializer import (
6
+ CDCRecordBytesToCDCPayloadDeserializer,
7
+ )
8
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cdc_record_bytes_to_event_deserializer import (
9
+ CDCRecordBytesToEventDeserializer,
10
+ )
5
11
 
6
12
  from buz.event import Event, Subscriber
7
13
  from buz.event.infrastructure.buz_kafka.base_buz_aiokafka_async_consumer import (
@@ -103,6 +109,12 @@ class BuzAIOKafkaMultiThreadedConsumer(BaseBuzAIOKafkaAsyncConsumer):
103
109
  event_class=subscriber.handles() # type: ignore
104
110
  )
105
111
 
112
+ cdc_payload_deserializer = (
113
+ CDCRecordBytesToCDCPayloadDeserializer()
114
+ if isinstance(byte_deserializer, CDCRecordBytesToEventDeserializer)
115
+ else None
116
+ )
117
+
106
118
  return KafkaEventSyncSubscriberExecutor(
107
119
  logger=self._logger,
108
120
  byte_deserializer=byte_deserializer,
@@ -112,4 +124,5 @@ class BuzAIOKafkaMultiThreadedConsumer(BaseBuzAIOKafkaAsyncConsumer):
112
124
  consume_middlewares=self.__consume_middlewares,
113
125
  consume_retrier=self.__consume_retrier,
114
126
  reject_callback=self.__reject_callback,
127
+ cdc_payload_deserializer=cdc_payload_deserializer,
115
128
  )
@@ -2,12 +2,16 @@ from asyncio import sleep
2
2
  from logging import Logger
3
3
  from typing import Optional, Sequence, cast
4
4
 
5
+ from buz.event.infrastructure.models.process_context import ProcessContext
6
+
5
7
  from buz.event import Event
6
8
  from buz.event.async_subscriber import AsyncSubscriber
7
9
  from buz.event.infrastructure.buz_kafka.consume_strategy.kafka_on_fail_strategy import KafkaOnFailStrategy
8
10
  from buz.event.infrastructure.buz_kafka.exceptions.max_consumer_retry_exception import MaxConsumerRetryException
9
11
  from buz.event.infrastructure.buz_kafka.exceptions.retry_exception import ConsumerRetryException
10
12
  from buz.event.infrastructure.buz_kafka.kafka_event_subscriber_executor import KafkaEventSubscriberExecutor
13
+ from buz.event.infrastructure.buz_kafka.models.kafka_delivery_context import KafkaDeliveryContext
14
+ from buz.event.infrastructure.buz_kafka.models.cdc_process_context import CDCProcessContext
11
15
  from buz.event.infrastructure.models.execution_context import ExecutionContext
12
16
  from buz.event.middleware.async_consume_middleware import AsyncConsumeMiddleware
13
17
  from buz.event.middleware.async_consume_middleware_chain_resolver import AsyncConsumeMiddlewareChainResolver
@@ -16,8 +20,13 @@ from buz.event.strategies.retry.reject_callback import RejectCallback
16
20
  from buz.kafka.domain.exceptions.not_valid_kafka_message_exception import NotValidKafkaMessageException
17
21
  from buz.kafka.domain.models.kafka_consumer_record import KafkaConsumerRecord
18
22
  from buz.kafka.domain.models.kafka_poll_record import KafkaPollRecord
19
- from buz.event.infrastructure.buz_kafka.models.kafka_delivery_context import KafkaDeliveryContext
20
23
  from buz.kafka.infrastructure.deserializers.byte_deserializer import ByteDeserializer
24
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cannot_decode_cdc_message_exception import (
25
+ CannotDecodeCDCMessageException,
26
+ )
27
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cdc_record_bytes_to_cdc_payload_deserializer import (
28
+ CDCRecordBytesToCDCPayloadDeserializer,
29
+ )
21
30
  from buz.kafka.infrastructure.serializers.kafka_header_serializer import KafkaHeaderSerializer
22
31
 
23
32
 
@@ -34,6 +43,7 @@ class KafkaEventAsyncSubscriberExecutor(KafkaEventSubscriberExecutor):
34
43
  on_fail_strategy: KafkaOnFailStrategy,
35
44
  consume_retrier: Optional[ConsumeRetrier] = None,
36
45
  reject_callback: Optional[RejectCallback] = None,
46
+ cdc_payload_deserializer: Optional[CDCRecordBytesToCDCPayloadDeserializer] = None,
37
47
  ):
38
48
  self.__subscriber = subscriber
39
49
  self.__logger = logger
@@ -44,6 +54,7 @@ class KafkaEventAsyncSubscriberExecutor(KafkaEventSubscriberExecutor):
44
54
  self.__reject_callback = reject_callback
45
55
  self.__byte_deserializer = byte_deserializer
46
56
  self.__header_deserializer = header_deserializer
57
+ self.__cdc_payload_deserializer = cdc_payload_deserializer
47
58
 
48
59
  async def consume(
49
60
  self,
@@ -57,6 +68,15 @@ class KafkaEventAsyncSubscriberExecutor(KafkaEventSubscriberExecutor):
57
68
  kafka_record_value = cast(bytes, kafka_poll_record.value)
58
69
 
59
70
  deserialized_value = self.__byte_deserializer.deserialize(kafka_record_value)
71
+ process_context = ProcessContext()
72
+ if self.__cdc_payload_deserializer is not None:
73
+ try:
74
+ deserialized_cdc_payload = self.__cdc_payload_deserializer.deserialize(kafka_record_value)
75
+ process_context = CDCProcessContext(
76
+ captured_at_ms=deserialized_cdc_payload.captured_at_ms,
77
+ )
78
+ except CannotDecodeCDCMessageException as e:
79
+ self.__logger.error(e.message)
60
80
 
61
81
  self.__logger.info(
62
82
  f"consuming the event '{deserialized_value.id}' by the subscriber '{self.__subscriber.fqn()}', "
@@ -75,7 +95,8 @@ class KafkaEventAsyncSubscriberExecutor(KafkaEventSubscriberExecutor):
75
95
  consumer_group=self.__subscriber.fqn(),
76
96
  partition=kafka_poll_record.partition,
77
97
  timestamp=kafka_poll_record.timestamp,
78
- )
98
+ ),
99
+ process_context=process_context,
79
100
  ),
80
101
  )
81
102
  except NotValidKafkaMessageException:
@@ -1,13 +1,17 @@
1
+ import time
1
2
  from asyncio import get_running_loop
2
3
  from logging import Logger
3
- import time
4
4
  from typing import Optional, Sequence, cast
5
+
6
+ from buz.event.infrastructure.models.process_context import ProcessContext
7
+
5
8
  from buz.event import Event
6
9
  from buz.event.infrastructure.buz_kafka.consume_strategy.kafka_on_fail_strategy import KafkaOnFailStrategy
7
10
  from buz.event.infrastructure.buz_kafka.exceptions.max_consumer_retry_exception import MaxConsumerRetryException
8
11
  from buz.event.infrastructure.buz_kafka.exceptions.retry_exception import ConsumerRetryException
9
12
  from buz.event.infrastructure.buz_kafka.kafka_event_subscriber_executor import KafkaEventSubscriberExecutor
10
13
  from buz.event.infrastructure.buz_kafka.models.kafka_delivery_context import KafkaDeliveryContext
14
+ from buz.event.infrastructure.buz_kafka.models.cdc_process_context import CDCProcessContext
11
15
  from buz.event.infrastructure.models.execution_context import ExecutionContext
12
16
  from buz.event.middleware.consume_middleware import ConsumeMiddleware
13
17
  from buz.event.middleware.consume_middleware_chain_resolver import ConsumeMiddlewareChainResolver
@@ -18,6 +22,12 @@ from buz.kafka.domain.exceptions.not_valid_kafka_message_exception import NotVal
18
22
  from buz.kafka.domain.models.kafka_consumer_record import KafkaConsumerRecord
19
23
  from buz.kafka.domain.models.kafka_poll_record import KafkaPollRecord
20
24
  from buz.kafka.infrastructure.deserializers.byte_deserializer import ByteDeserializer
25
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cannot_decode_cdc_message_exception import (
26
+ CannotDecodeCDCMessageException,
27
+ )
28
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cdc_record_bytes_to_cdc_payload_deserializer import (
29
+ CDCRecordBytesToCDCPayloadDeserializer,
30
+ )
21
31
  from buz.kafka.infrastructure.serializers.kafka_header_serializer import KafkaHeaderSerializer
22
32
 
23
33
 
@@ -34,6 +44,7 @@ class KafkaEventSyncSubscriberExecutor(KafkaEventSubscriberExecutor):
34
44
  on_fail_strategy: KafkaOnFailStrategy,
35
45
  consume_retrier: Optional[ConsumeRetrier] = None,
36
46
  reject_callback: Optional[RejectCallback] = None,
47
+ cdc_payload_deserializer: Optional[CDCRecordBytesToCDCPayloadDeserializer] = None,
37
48
  ):
38
49
  self.__subscriber = subscriber
39
50
  self.__logger = logger
@@ -44,6 +55,7 @@ class KafkaEventSyncSubscriberExecutor(KafkaEventSubscriberExecutor):
44
55
  self.__reject_callback = reject_callback
45
56
  self.__byte_deserializer = byte_deserializer
46
57
  self.__header_deserializer = header_deserializer
58
+ self.__cdc_payload_deserializer = cdc_payload_deserializer
47
59
 
48
60
  async def consume(
49
61
  self,
@@ -57,6 +69,15 @@ class KafkaEventSyncSubscriberExecutor(KafkaEventSubscriberExecutor):
57
69
  kafka_record_value = cast(bytes, kafka_poll_record.value)
58
70
 
59
71
  deserialized_value = self.__byte_deserializer.deserialize(kafka_record_value)
72
+ process_context = ProcessContext()
73
+ if self.__cdc_payload_deserializer is not None:
74
+ try:
75
+ deserialized_cdc_payload = self.__cdc_payload_deserializer.deserialize(kafka_record_value)
76
+ process_context = CDCProcessContext(
77
+ captured_at_ms=deserialized_cdc_payload.captured_at_ms,
78
+ )
79
+ except CannotDecodeCDCMessageException as e:
80
+ self.__logger.error(e.message)
60
81
 
61
82
  self.__logger.info(
62
83
  f"consuming the event '{deserialized_value.id}' by the subscriber '{self.__subscriber.fqn()}', "
@@ -77,7 +98,8 @@ class KafkaEventSyncSubscriberExecutor(KafkaEventSubscriberExecutor):
77
98
  consumer_group=self.__subscriber.fqn(),
78
99
  partition=kafka_poll_record.partition,
79
100
  timestamp=kafka_poll_record.timestamp,
80
- )
101
+ ),
102
+ process_context=process_context,
81
103
  ),
82
104
  ),
83
105
  )
@@ -0,0 +1,9 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional
3
+
4
+ from buz.event.infrastructure.models.process_context import ProcessContext
5
+
6
+
7
+ @dataclass(frozen=True)
8
+ class CDCProcessContext(ProcessContext):
9
+ captured_at_ms: Optional[int] = None
@@ -2,6 +2,8 @@ import asyncio
2
2
  from logging import Logger
3
3
  from typing import Optional, Callable, cast
4
4
 
5
+ from buz.event.infrastructure.models.process_context import ProcessContext
6
+
5
7
  from buz.event.infrastructure.kombu.models.kombu_delivery_context import KombuDeliveryContext
6
8
  from buz.event.infrastructure.models.execution_context import ExecutionContext
7
9
  from kombu import Connection, Queue, Consumer as MessageConsumer, Message
@@ -112,7 +114,10 @@ class KombuConsumer(ConsumerMixin, Consumer):
112
114
  # The problem here is that the chain resolver works with syncsubscribers, an asyncsubscriber would require of a async function,
113
115
  # but we are using run-until-complete to run the async function, so we are not really using the async function, we are just running it as a sync function, so we can cast the asyncsubscriber to a subscriber
114
116
  subscriber = cast(Subscriber, meta_subscriber)
115
- execution_context = ExecutionContext(delivery_context=KombuDeliveryContext())
117
+ execution_context = ExecutionContext(
118
+ delivery_context=KombuDeliveryContext(),
119
+ process_context=ProcessContext(),
120
+ )
116
121
  self.__consume_middleware_chain_resolver.resolve(
117
122
  event=event,
118
123
  subscriber=subscriber,
@@ -1,8 +1,10 @@
1
1
  from dataclasses import dataclass
2
2
 
3
3
  from buz.event.infrastructure.models.delivery_context import DeliveryContext
4
+ from buz.event.infrastructure.models.process_context import ProcessContext
4
5
 
5
6
 
6
7
  @dataclass(frozen=True)
7
8
  class ExecutionContext:
8
9
  delivery_context: DeliveryContext
10
+ process_context: ProcessContext
@@ -0,0 +1,6 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass(frozen=True)
5
+ class ProcessContext:
6
+ pass
@@ -1,5 +1,7 @@
1
1
  from typing import Optional, Iterable
2
2
 
3
+ from buz.event.infrastructure.models.process_context import ProcessContext
4
+
3
5
  from buz.event import Event, EventBus, Subscriber
4
6
  from buz.event.infrastructure.models.execution_context import ExecutionContext
5
7
  from buz.event.middleware import (
@@ -28,7 +30,7 @@ class SyncEventBus(EventBus):
28
30
 
29
31
  def __perform_publish(self, event: Event) -> None:
30
32
  subscribers = self.__locator.get(event)
31
- execution_context = ExecutionContext(delivery_context=SyncDeliveryContext())
33
+ execution_context = ExecutionContext(delivery_context=SyncDeliveryContext(), process_context=ProcessContext())
32
34
  for subscriber in subscribers:
33
35
  self.__consume_middleware_chain_resolver.resolve(
34
36
  event=event,
@@ -11,6 +11,7 @@ class CDCPayload:
11
11
  created_at: str
12
12
  event_fqn: str
13
13
  metadata: Optional[str] = None # json encoded
14
+ captured_at_ms: Optional[int] = None
14
15
 
15
16
  def validate(self) -> None:
16
17
  if not isinstance(self.payload, str):
@@ -23,6 +24,8 @@ class CDCPayload:
23
24
  raise ValueError("The event_fqn value is not a valid value")
24
25
  if self.metadata is not None and not isinstance(self.metadata, str):
25
26
  raise ValueError("The metadata value is not a valid value")
27
+ if self.captured_at_ms is not None and not isinstance(self.captured_at_ms, int):
28
+ raise ValueError("The captured_at_ms value is not a valid value")
26
29
 
27
30
  def __post_init__(self) -> None:
28
31
  self.validate()
@@ -1,7 +1,7 @@
1
1
  from buz.kafka.domain.exceptions.not_valid_kafka_message_exception import NotValidKafkaMessageException
2
2
 
3
3
 
4
- class NotValidCDCMessageException(NotValidKafkaMessageException):
4
+ class CannotDecodeCDCMessageException(NotValidKafkaMessageException):
5
5
  def __init__(self, message: str, exception: Exception) -> None:
6
6
  self.exception = exception
7
7
  self.message = message
@@ -0,0 +1,11 @@
1
+ from buz.kafka.domain.exceptions.not_valid_kafka_message_exception import NotValidKafkaMessageException
2
+ from buz.kafka.infrastructure.cdc.cdc_payload import CDCPayload
3
+
4
+
5
+ class CannotRestoreEventFromCDCPayloadException(NotValidKafkaMessageException):
6
+ def __init__(self, cdc_payload: CDCPayload, exception: Exception) -> None:
7
+ self.exception = exception
8
+ self.cdc_payload = cdc_payload
9
+ super().__init__(
10
+ f'Couldn\'t build a message from CDC payload "{self.cdc_payload}". Raised from "{str(exception)}"'
11
+ )
@@ -0,0 +1,35 @@
1
+ from __future__ import annotations
2
+
3
+ import orjson
4
+ from cachetools import LRUCache
5
+ from dacite import from_dict
6
+
7
+ from buz.kafka.infrastructure.cdc.cdc_message import CDCPayload
8
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cannot_decode_cdc_message_exception import (
9
+ CannotDecodeCDCMessageException,
10
+ )
11
+
12
+
13
+ class CDCRecordBytesToCDCPayloadDeserializer:
14
+ __STRING_ENCODING = "utf-8"
15
+ __cached_deserialization: LRUCache[str, CDCPayload] = LRUCache(maxsize=128)
16
+
17
+ def deserialize(self, data: bytes) -> CDCPayload:
18
+ decoded_string = data.decode(self.__STRING_ENCODING)
19
+ if decoded_string not in CDCRecordBytesToCDCPayloadDeserializer.__cached_deserialization:
20
+ try:
21
+ CDCRecordBytesToCDCPayloadDeserializer.__cached_deserialization[
22
+ decoded_string
23
+ ] = self.__get_cdc_payload_from_string(decoded_string)
24
+ except Exception as exception:
25
+ raise CannotDecodeCDCMessageException(decoded_string, exception) from exception
26
+
27
+ return CDCRecordBytesToCDCPayloadDeserializer.__cached_deserialization[decoded_string]
28
+
29
+ def __get_cdc_payload_from_string(self, decoded_string: str) -> CDCPayload:
30
+ decoded_record: dict = orjson.loads(decoded_string)
31
+ payload = decoded_record.get("payload")
32
+ if not isinstance(payload, dict):
33
+ raise ValueError("The provided payload value is not valid")
34
+
35
+ return from_dict(CDCPayload, payload)
@@ -4,13 +4,15 @@ from datetime import datetime
4
4
  from typing import Optional, TypeVar, Type, Generic
5
5
 
6
6
  import orjson
7
- from dacite import from_dict
8
7
 
9
8
  from buz.event import Event
10
9
  from buz.kafka.infrastructure.cdc.cdc_message import CDCPayload
11
10
  from buz.kafka.infrastructure.deserializers.bytes_to_message_deserializer import BytesToMessageDeserializer
12
- from buz.kafka.infrastructure.deserializers.implementations.cdc.not_valid_cdc_message_exception import (
13
- NotValidCDCMessageException,
11
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cannot_restore_event_from_cdc_payload_exception import (
12
+ CannotRestoreEventFromCDCPayloadException,
13
+ )
14
+ from buz.kafka.infrastructure.deserializers.implementations.cdc.cdc_record_bytes_to_cdc_payload_deserializer import (
15
+ CDCRecordBytesToCDCPayloadDeserializer,
14
16
  )
15
17
 
16
18
  T = TypeVar("T", bound=Event)
@@ -21,34 +23,25 @@ class CDCRecordBytesToEventDeserializer(BytesToMessageDeserializer[Event], Gener
21
23
 
22
24
  def __init__(self, event_class: Type[T]) -> None:
23
25
  self.__event_class = event_class
26
+ self.__cdc_record_bytes_to_cdc_payload_deserializer = CDCRecordBytesToCDCPayloadDeserializer()
24
27
 
25
28
  def deserialize(self, data: bytes) -> T:
26
- decoded_string = data.decode(self.__STRING_ENCODING)
29
+ cdc_payload = self.__cdc_record_bytes_to_cdc_payload_deserializer.deserialize(data)
27
30
  try:
28
- cdc_payload = self.__get_outbox_record_as_dict(decoded_string)
31
+ payload_dict = orjson.loads(cdc_payload.payload)
29
32
  return self.__event_class.restore(
30
33
  id=cdc_payload.event_id,
31
34
  created_at=self.__get_created_at_in_event_format(cdc_payload.created_at),
32
35
  metadata=self.__deserialize_metadata(cdc_payload.metadata),
33
- **orjson.loads(cdc_payload.payload),
36
+ **payload_dict,
34
37
  )
35
38
  except Exception as exception:
36
- raise NotValidCDCMessageException(decoded_string, exception) from exception
39
+ raise CannotRestoreEventFromCDCPayloadException(cdc_payload, exception) from exception
37
40
 
38
41
  def __get_created_at_in_event_format(self, cdc_payload_created_at: str) -> str:
39
42
  created_at_datetime = datetime.strptime(cdc_payload_created_at, CDCPayload.DATE_TIME_FORMAT)
40
43
  return created_at_datetime.strftime(Event.DATE_TIME_FORMAT)
41
44
 
42
- def __get_outbox_record_as_dict(self, decoded_string: str) -> CDCPayload:
43
- decoded_record: dict = orjson.loads(decoded_string)
44
-
45
- payload = decoded_record.get("payload")
46
-
47
- if not isinstance(payload, dict):
48
- raise ValueError("The provided payload value is not valid")
49
-
50
- return from_dict(CDCPayload, payload)
51
-
52
45
  def __deserialize_metadata(self, metadata: Optional[str]) -> dict:
53
46
  if metadata is None:
54
47
  return {}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes