buz 2.13.1rc9__tar.gz → 2.14.1__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 (254) hide show
  1. {buz-2.13.1rc9 → buz-2.14.1}/PKG-INFO +1 -1
  2. {buz-2.13.1rc9 → buz-2.14.1}/pyproject.toml +1 -1
  3. buz-2.14.1/src/buz/event/async_event_bus.py +15 -0
  4. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/event_bus.py +2 -2
  5. buz-2.14.1/src/buz/event/infrastructure/buz_kafka/async_buz_kafka_event_bus.py +107 -0
  6. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/base_buz_aiokafka_async_consumer.py +5 -10
  7. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py +3 -4
  8. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_multi_threaded_consumer.py +2 -4
  9. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/buz_kafka_event_bus.py +4 -6
  10. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py +2 -2
  11. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/kombu_consumer.py +1 -0
  12. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/kombu_event_bus.py +6 -7
  13. buz-2.14.1/src/buz/event/middleware/async_publish_middleware.py +13 -0
  14. buz-2.14.1/src/buz/event/middleware/async_publish_middleware_chain_resolver.py +22 -0
  15. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/sync/sync_event_bus.py +2 -2
  16. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_repository.py +5 -1
  17. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/transactional_outbox_event_bus.py +12 -11
  18. buz-2.14.1/src/buz/kafka/__init__.py +60 -0
  19. buz-2.14.1/src/buz/kafka/domain/exceptions/not_valid_partition_number_exception.py +10 -0
  20. buz-2.14.1/src/buz/kafka/domain/models/kafka_supported_compression_type.py +8 -0
  21. buz-2.14.1/src/buz/kafka/domain/services/async_kafka_producer.py +21 -0
  22. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/services/kafka_admin_client.py +15 -1
  23. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/services/kafka_producer.py +3 -1
  24. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/aiokafka/aiokafka_consumer.py +12 -9
  25. buz-2.14.1/src/buz/kafka/infrastructure/aiokafka/aiokafka_producer.py +98 -0
  26. buz-2.14.1/src/buz/kafka/infrastructure/interfaces/async_connection_manager.py +11 -0
  27. buz-2.14.1/src/buz/kafka/infrastructure/interfaces/connection_manager.py +11 -0
  28. buz-2.14.1/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_client.py +399 -0
  29. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_test_client.py +3 -3
  30. buz-2.14.1/src/buz/kafka/infrastructure/kafka_python/kafka_python_producer.py +90 -0
  31. buz-2.14.1/src/buz/kafka/infrastructure/kafka_python/translators/__init__.py +0 -0
  32. buz-2.14.1/src/buz/py.typed +0 -0
  33. buz-2.14.1/src/buz/queue/__init__.py +0 -0
  34. buz-2.13.1rc9/src/buz/kafka/__init__.py +0 -34
  35. buz-2.13.1rc9/src/buz/kafka/infrastructure/kafka_python/factories/kafka_python_producer_factory.py +0 -20
  36. buz-2.13.1rc9/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_client.py +0 -214
  37. buz-2.13.1rc9/src/buz/kafka/infrastructure/kafka_python/kafka_python_producer.py +0 -61
  38. {buz-2.13.1rc9 → buz-2.14.1}/LICENSE +0 -0
  39. {buz-2.13.1rc9 → buz-2.14.1}/README.md +0 -0
  40. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/__init__.py +0 -0
  41. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/__init__.py +0 -0
  42. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/asynchronous/__init__.py +0 -0
  43. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/asynchronous/base_command_handler.py +0 -0
  44. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/asynchronous/command_bus.py +0 -0
  45. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/asynchronous/command_handler.py +0 -0
  46. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/asynchronous/middleware/__init__.py +0 -0
  47. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/asynchronous/middleware/base_handle_middleware.py +0 -0
  48. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/asynchronous/middleware/handle_middleware.py +0 -0
  49. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  50. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/asynchronous/self_process/__init__.py +0 -0
  51. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/asynchronous/self_process/self_process_command_bus.py +0 -0
  52. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/command.py +0 -0
  53. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/more_than_one_command_handler_related_exception.py +0 -0
  54. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/__init__.py +0 -0
  55. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/base_command_handler.py +0 -0
  56. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/command_bus.py +0 -0
  57. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/command_handler.py +0 -0
  58. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/middleware/__init__.py +0 -0
  59. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/middleware/base_handle_middleware.py +0 -0
  60. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/middleware/handle_middleware.py +0 -0
  61. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  62. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/self_process/__init__.py +0 -0
  63. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/self_process/self_process_command_bus.py +0 -0
  64. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/synced_async/__init__.py +0 -0
  65. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/command/synchronous/synced_async/synced_async_command_bus.py +0 -0
  66. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/__init__.py +0 -0
  67. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/async_consumer.py +0 -0
  68. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/async_subscriber.py +0 -0
  69. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/async_worker.py +0 -0
  70. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/base_async_subscriber.py +0 -0
  71. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/base_subscriber.py +0 -0
  72. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/consumer.py +0 -0
  73. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/dead_letter_queue/__init__.py +0 -0
  74. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/dead_letter_queue/dlq_criteria.py +0 -0
  75. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/dead_letter_queue/dlq_record.py +0 -0
  76. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/dead_letter_queue/dlq_repository.py +0 -0
  77. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/event.py +0 -0
  78. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/exceptions/__init__.py +0 -0
  79. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/exceptions/event_not_published_exception.py +0 -0
  80. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/exceptions/event_restore_exception.py +0 -0
  81. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/exceptions/subscribers_not_found_exception.py +0 -0
  82. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/exceptions/term_signal_interruption_exception.py +0 -0
  83. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/exceptions/worker_execution_exception.py +0 -0
  84. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/__init__.py +0 -0
  85. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/__init__.py +0 -0
  86. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/consume_strategy/__init__.py +0 -0
  87. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/consume_strategy/consume_strategy.py +0 -0
  88. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/consume_strategy/kafka_on_fail_strategy.py +0 -0
  89. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/consume_strategy/topic_and_subscription_group_per_subscriber_kafka_consumer_strategy.py +0 -0
  90. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/exceptions/__init__.py +0 -0
  91. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/exceptions/kafka_event_bus_config_not_valid_exception.py +0 -0
  92. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py +0 -0
  93. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/kafka_event_subscriber_executor.py +0 -0
  94. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/publish_strategy/__init__.py +0 -0
  95. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/publish_strategy/publish_strategy.py +0 -0
  96. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/buz_kafka/publish_strategy/topic_per_event_kafka_publish_strategy.py +0 -0
  97. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/__init__.py +0 -0
  98. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/allowed_kombu_serializer.py +0 -0
  99. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/consume_strategy/__init__.py +0 -0
  100. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/consume_strategy/consume_strategy.py +0 -0
  101. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/consume_strategy/queue_per_subscriber_consume_strategy.py +0 -0
  102. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/publish_strategy/__init__.py +0 -0
  103. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/publish_strategy/fanout_exchange_per_event_publish_strategy.py +0 -0
  104. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/publish_strategy/publish_strategy.py +0 -0
  105. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/retry_strategy/__init__.py +0 -0
  106. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/retry_strategy/publish_retry_policy.py +0 -0
  107. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/kombu/retry_strategy/simple_publish_retry_policy.py +0 -0
  108. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/models/consuming_task.py +0 -0
  109. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/infrastructure/queue/__init__.py +0 -0
  110. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/meta_base_subscriber.py +0 -0
  111. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/meta_subscriber.py +0 -0
  112. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/__init__.py +0 -0
  113. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/async_consume_middleware.py +0 -0
  114. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/async_consume_middleware_chain_resolver.py +0 -0
  115. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/base_consume_middleware.py +0 -0
  116. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/base_publish_middleware.py +0 -0
  117. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/consume_middleware.py +0 -0
  118. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/consume_middleware_chain_resolver.py +0 -0
  119. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/exceptions/__init__.py +0 -0
  120. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/exceptions/event_already_in_progress_exception.py +0 -0
  121. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/publish_middleware.py +0 -0
  122. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/middleware/publish_middleware_chain_resolver.py +0 -0
  123. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/__init__.py +0 -0
  124. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/execution_strategy/__init__.py +0 -0
  125. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/execution_strategy/async_execution_strategy.py +0 -0
  126. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/execution_strategy/async_self_process_execution_strategy.py +0 -0
  127. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/execution_strategy/cyclic_iterator_execution_strategy.py +0 -0
  128. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/execution_strategy/execution_strategy.py +0 -0
  129. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/execution_strategy/self_process_execution_strategy.py +0 -0
  130. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/retry/__init__.py +0 -0
  131. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/retry/consume_retrier.py +0 -0
  132. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/retry/consumed_event_retry.py +0 -0
  133. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/retry/consumed_event_retry_repository.py +0 -0
  134. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/retry/max_retries_consume_retrier.py +0 -0
  135. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/retry/max_retries_negative_exception.py +0 -0
  136. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/strategies/retry/reject_callback.py +0 -0
  137. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/subscriber.py +0 -0
  138. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/sync/__init__.py +0 -0
  139. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/__init__.py +0 -0
  140. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/event_to_outbox_record_translator.py +0 -0
  141. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/fqn_to_event_mapper.py +0 -0
  142. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_criteria/__init__.py +0 -0
  143. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_criteria/deliverable_records_outbox_criteria_factory.py +0 -0
  144. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria.py +0 -0
  145. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria_factory.py +0 -0
  146. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_criteria/outbox_sorting_criteria.py +0 -0
  147. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record.py +0 -0
  148. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record_finder/__init__.py +0 -0
  149. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record_finder/outbox_record_stream_finder.py +0 -0
  150. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record_finder/polling_outbox_record_stream_finder.py +0 -0
  151. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record_to_event_translator.py +0 -0
  152. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record_validation/__init__.py +0 -0
  153. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record_validation/abstract_outbox_record_validator.py +0 -0
  154. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_size_not_allowed_exception.py +0 -0
  155. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validation_exception.py +0 -0
  156. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validator.py +0 -0
  157. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/outbox_record_validation/size_outbox_record_validator.py +0 -0
  158. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/transactional_outbox/transactional_outbox_worker.py +0 -0
  159. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/event/worker.py +0 -0
  160. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/handler.py +0 -0
  161. {buz-2.13.1rc9/src/buz/kafka/infrastructure → buz-2.14.1/src/buz/kafka/domain/exceptions}/__init__.py +0 -0
  162. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/exceptions/not_all_partition_assigned_exception.py +0 -0
  163. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/exceptions/not_valid_kafka_message_exception.py +0 -0
  164. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/exceptions/topic_already_created_exception.py +0 -0
  165. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/exceptions/topic_not_found_exception.py +0 -0
  166. {buz-2.13.1rc9/src/buz/kafka/infrastructure/aiokafka → buz-2.14.1/src/buz/kafka/domain/models}/__init__.py +0 -0
  167. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/auto_create_topic_configuration.py +0 -0
  168. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/consumer_initial_offset_position.py +0 -0
  169. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/create_kafka_topic.py +0 -0
  170. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/kafka_connection_config.py +0 -0
  171. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/kafka_connection_credentials.py +0 -0
  172. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/kafka_connection_plain_text_credentials.py +0 -0
  173. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/kafka_connection_sasl_credentials.py +0 -0
  174. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/kafka_consumer_record.py +0 -0
  175. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/kafka_poll_record.py +0 -0
  176. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/kafka_supported_sasl_mechanisms.py +0 -0
  177. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/models/kafka_supported_security_protocols.py +0 -0
  178. {buz-2.13.1rc9/src/buz/kafka/infrastructure/aiokafka/rebalance → buz-2.14.1/src/buz/kafka/domain/services}/__init__.py +0 -0
  179. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/domain/services/kafka_admin_test_client.py +0 -0
  180. {buz-2.13.1rc9/src/buz/kafka/infrastructure/aiokafka/translators → buz-2.14.1/src/buz/kafka/infrastructure}/__init__.py +0 -0
  181. {buz-2.13.1rc9/src/buz/kafka/infrastructure/deserializers → buz-2.14.1/src/buz/kafka/infrastructure/aiokafka}/__init__.py +0 -0
  182. {buz-2.13.1rc9/src/buz/kafka/infrastructure/deserializers/implementations → buz-2.14.1/src/buz/kafka/infrastructure/aiokafka/rebalance}/__init__.py +0 -0
  183. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/aiokafka/rebalance/kafka_callback_rebalancer.py +0 -0
  184. {buz-2.13.1rc9/src/buz/kafka/infrastructure/kafka_python → buz-2.14.1/src/buz/kafka/infrastructure/aiokafka/translators}/__init__.py +0 -0
  185. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/aiokafka/translators/consumer_initial_offset_position_translator.py +0 -0
  186. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/cdc/cdc_message.py +0 -0
  187. {buz-2.13.1rc9/src/buz/kafka/infrastructure/kafka_python/factories → buz-2.14.1/src/buz/kafka/infrastructure/deserializers}/__init__.py +0 -0
  188. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/deserializers/byte_deserializer.py +0 -0
  189. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/deserializers/bytes_to_message_deserializer.py +0 -0
  190. {buz-2.13.1rc9/src/buz/kafka/infrastructure/kafka_python/translators → buz-2.14.1/src/buz/kafka/infrastructure/deserializers/implementations}/__init__.py +0 -0
  191. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cdc_record_bytes_to_event_deserializer.py +0 -0
  192. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/deserializers/implementations/cdc/not_valid_cdc_message_exception.py +0 -0
  193. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/deserializers/implementations/json_byte_deserializer.py +0 -0
  194. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/deserializers/implementations/json_bytes_to_message_deserializer.py +0 -0
  195. {buz-2.13.1rc9/src/buz/queue → buz-2.14.1/src/buz/kafka/infrastructure/interfaces}/__init__.py +0 -0
  196. /buz-2.13.1rc9/src/buz/py.typed → /buz-2.14.1/src/buz/kafka/infrastructure/kafka_python/__init__.py +0 -0
  197. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/kafka_python/exception/consumer_interrupted_exception.py +0 -0
  198. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/kafka_python/translators/consumer_initial_offset_position_translator.py +0 -0
  199. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/serializers/byte_serializer.py +0 -0
  200. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/serializers/implementations/cdc_record_bytes_to_event_serializer.py +0 -0
  201. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/serializers/implementations/json_byte_serializer.py +0 -0
  202. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/kafka/infrastructure/serializers/kafka_header_serializer.py +0 -0
  203. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/__init__.py +0 -0
  204. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/handler_fqn_not_found_exception.py +0 -0
  205. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/locator.py +0 -0
  206. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/message_fqn_not_found_exception.py +0 -0
  207. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/pypendency/__init__.py +0 -0
  208. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/pypendency/container_locator.py +0 -0
  209. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/pypendency/container_locator_resolution_configuration.py +0 -0
  210. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/pypendency/handler_not_found_exception.py +0 -0
  211. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/pypendency/handler_not_registered_exception.py +0 -0
  212. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/sync/__init__.py +0 -0
  213. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/sync/handler_already_registered_exception.py +0 -0
  214. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/sync/handler_not_registered_exception.py +0 -0
  215. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/locator/sync/instance_locator.py +0 -0
  216. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/message.py +0 -0
  217. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/middleware/__init__.py +0 -0
  218. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/middleware/middleware.py +0 -0
  219. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/middleware/middleware_chain_builder.py +0 -0
  220. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/__init__.py +0 -0
  221. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/asynchronous/__init__.py +0 -0
  222. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/asynchronous/base_query_handler.py +0 -0
  223. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/asynchronous/middleware/__init__.py +0 -0
  224. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/asynchronous/middleware/base_handle_middleware.py +0 -0
  225. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/asynchronous/middleware/handle_middleware.py +0 -0
  226. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  227. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/asynchronous/query_bus.py +0 -0
  228. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/asynchronous/query_handler.py +0 -0
  229. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/asynchronous/self_process/__init__.py +0 -0
  230. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/asynchronous/self_process/self_process_query_bus.py +0 -0
  231. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/more_than_one_query_handler_related_exception.py +0 -0
  232. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/query.py +0 -0
  233. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/query_response.py +0 -0
  234. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/__init__.py +0 -0
  235. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/base_query_handler.py +0 -0
  236. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/middleware/__init__.py +0 -0
  237. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/middleware/base_handle_middleware.py +0 -0
  238. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/middleware/handle_middleware.py +0 -0
  239. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  240. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/query_bus.py +0 -0
  241. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/query_handler.py +0 -0
  242. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/self_process/__init__.py +0 -0
  243. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/self_process/self_process_query_bus.py +0 -0
  244. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/synced_async/__init__.py +0 -0
  245. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/query/synchronous/synced_async/synced_async_query_bus.py +0 -0
  246. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/queue/in_memory/in_memory_multiqueue_repository.py +0 -0
  247. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/queue/in_memory/in_memory_queue_repository.py +0 -0
  248. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/queue/multiqueue_repository.py +0 -0
  249. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/queue/queue_repository.py +0 -0
  250. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/serializer/message_to_bytes_serializer.py +0 -0
  251. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/serializer/message_to_json_bytes_serializer.py +0 -0
  252. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/wrapper/__init__.py +0 -0
  253. {buz-2.13.1rc9 → buz-2.14.1}/src/buz/wrapper/async_to_sync.py +0 -0
  254. {buz-2.13.1rc9 → buz-2.14.1}/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.13.1rc9
3
+ Version: 2.14.1
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.13.1rc9"
3
+ version = "2.14.1"
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 = ["Luis Pintado Lozano <luis.pintado.lozano@gmail.com>", "Gerardo Parra <gprauxiliar@gmail.com>"]
@@ -0,0 +1,15 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Collection
3
+
4
+ from buz.event import Event
5
+ from buz.kafka.infrastructure.interfaces.async_connection_manager import AsyncConnectionManager
6
+
7
+
8
+ class AsyncEventBus(AsyncConnectionManager, ABC):
9
+ @abstractmethod
10
+ async def publish(self, event: Event) -> None:
11
+ pass
12
+
13
+ @abstractmethod
14
+ async def bulk_publish(self, events: Collection[Event]) -> None:
15
+ pass
@@ -1,5 +1,5 @@
1
1
  from abc import ABC, abstractmethod
2
- from typing import Collection
2
+ from typing import Iterable
3
3
 
4
4
  from buz.event import Event
5
5
 
@@ -10,5 +10,5 @@ class EventBus(ABC):
10
10
  pass
11
11
 
12
12
  @abstractmethod
13
- def bulk_publish(self, events: Collection[Event]) -> None:
13
+ def bulk_publish(self, events: Iterable[Event]) -> None:
14
14
  pass
@@ -0,0 +1,107 @@
1
+ from logging import Logger
2
+ from typing import Collection, Optional
3
+
4
+ from buz.event import Event
5
+ from buz.event.async_event_bus import AsyncEventBus
6
+ from buz.event.exceptions.event_not_published_exception import EventNotPublishedException
7
+ from buz.event.infrastructure.buz_kafka.exceptions.kafka_event_bus_config_not_valid_exception import (
8
+ KafkaEventBusConfigNotValidException,
9
+ )
10
+ from buz.event.infrastructure.buz_kafka.publish_strategy.publish_strategy import KafkaPublishStrategy
11
+ from buz.event.middleware.async_publish_middleware import AsyncPublishMiddleware
12
+ from buz.event.middleware.async_publish_middleware_chain_resolver import AsyncPublishMiddlewareChainResolver
13
+ from buz.kafka.domain.exceptions.topic_already_created_exception import KafkaTopicsAlreadyCreatedException
14
+ from buz.kafka.domain.models.auto_create_topic_configuration import AutoCreateTopicConfiguration
15
+ from buz.kafka.domain.models.create_kafka_topic import CreateKafkaTopic
16
+ from buz.kafka.domain.services.async_kafka_producer import AsyncKafkaProducer
17
+ from buz.kafka.domain.services.kafka_admin_client import KafkaAdminClient
18
+
19
+
20
+ class AsyncBuzKafkaEventBus(AsyncEventBus):
21
+ def __init__(
22
+ self,
23
+ *,
24
+ publish_strategy: KafkaPublishStrategy,
25
+ producer: AsyncKafkaProducer,
26
+ logger: Logger,
27
+ kafka_admin_client: Optional[KafkaAdminClient] = None,
28
+ publish_middlewares: Optional[list[AsyncPublishMiddleware]] = None,
29
+ auto_create_topic_configuration: Optional[AutoCreateTopicConfiguration] = None,
30
+ ):
31
+ self.__publish_middleware_chain_resolver = AsyncPublishMiddlewareChainResolver(publish_middlewares or [])
32
+ self.__publish_strategy = publish_strategy
33
+ self.__producer = producer
34
+ self.__topics_checked: dict[str, bool] = {}
35
+ self.__kafka_admin_client = kafka_admin_client
36
+ self.__auto_create_topic_configuration = auto_create_topic_configuration
37
+ self.__logger = logger
38
+ self.__check_kafka_admin_client_is_needed()
39
+
40
+ def __check_kafka_admin_client_is_needed(self) -> None:
41
+ if self.__kafka_admin_client is None and self.__auto_create_topic_configuration is not None:
42
+ raise KafkaEventBusConfigNotValidException(
43
+ "A KafkaAdminClient is needed to create topics when 'auto_create_topic_configuration' is set."
44
+ )
45
+
46
+ async def publish(self, event: Event) -> None:
47
+ await self.__publish_middleware_chain_resolver.resolve(event, self.__perform_publish)
48
+
49
+ async def __perform_publish(self, event: Event) -> None:
50
+ try:
51
+ topic = self.__publish_strategy.get_topic(event)
52
+
53
+ if self.__auto_create_topic_configuration is not None and self.__is_topic_created(topic) is False:
54
+ try:
55
+ self.__logger.info(f"Creating missing topic: {topic}..")
56
+ self.__get_kafka_admin_client().create_topics(
57
+ topics=[
58
+ CreateKafkaTopic(
59
+ name=topic,
60
+ partitions=self.__auto_create_topic_configuration.partitions,
61
+ replication_factor=self.__auto_create_topic_configuration.replication_factor,
62
+ configs=self.__auto_create_topic_configuration.configs,
63
+ )
64
+ ]
65
+ )
66
+ self.__logger.info(f"Created missing topic: {topic}")
67
+ self.__topics_checked[topic] = True
68
+ except KafkaTopicsAlreadyCreatedException:
69
+ pass
70
+
71
+ headers = self.__get_event_headers(event)
72
+ await self.__producer.produce(
73
+ message=event,
74
+ headers=headers,
75
+ topic=topic,
76
+ )
77
+ except Exception as exc:
78
+ raise EventNotPublishedException(event) from exc
79
+
80
+ def __get_kafka_admin_client(self) -> KafkaAdminClient:
81
+ if self.__kafka_admin_client is None:
82
+ raise KafkaEventBusConfigNotValidException("KafkaAdminClient is not set.")
83
+ return self.__kafka_admin_client
84
+
85
+ def __is_topic_created(self, topic: str) -> bool:
86
+ is_topic_created = self.__topics_checked.get(topic, None)
87
+
88
+ if is_topic_created is not None:
89
+ return is_topic_created
90
+
91
+ is_topic_created = self.__get_kafka_admin_client().is_topic_created(topic)
92
+ self.__topics_checked[topic] = is_topic_created
93
+
94
+ return is_topic_created
95
+
96
+ async def bulk_publish(self, events: Collection[Event]) -> None:
97
+ for event in events:
98
+ await self.publish(event)
99
+
100
+ def __get_event_headers(self, event: Event) -> dict:
101
+ return {"id": event.id}
102
+
103
+ async def connect(self) -> None:
104
+ await self.__producer.connect()
105
+
106
+ async def disconnect(self) -> None:
107
+ await self.__producer.disconnect()
@@ -17,11 +17,9 @@ from buz.event.infrastructure.buz_kafka.consume_strategy.consume_strategy import
17
17
  from buz.event.infrastructure.buz_kafka.kafka_event_subscriber_executor import KafkaEventSubscriberExecutor
18
18
  from buz.event.infrastructure.models.consuming_task import ConsumingTask
19
19
  from buz.event.meta_subscriber import MetaSubscriber
20
- from buz.kafka import (
21
- KafkaConnectionConfig,
22
- ConsumerInitialOffsetPosition,
23
- )
24
20
  from buz.kafka.domain.models.auto_create_topic_configuration import AutoCreateTopicConfiguration
21
+ from buz.kafka.domain.models.consumer_initial_offset_position import ConsumerInitialOffsetPosition
22
+ from buz.kafka.domain.models.kafka_connection_config import KafkaConnectionConfig
25
23
  from buz.kafka.domain.models.kafka_poll_record import KafkaPollRecord
26
24
  from buz.kafka.domain.services.kafka_admin_client import KafkaAdminClient
27
25
  from buz.kafka.infrastructure.aiokafka.aiokafka_consumer import AIOKafkaConsumer
@@ -107,12 +105,9 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
107
105
 
108
106
  if self.__exceptions_are_thrown(worker_errors):
109
107
  consume_events_exception, polling_task_exception = worker_errors
110
- if consume_events_exception:
111
- self._logger.exception(consume_events_exception)
112
- if polling_task_exception:
113
- self._logger.exception(polling_task_exception)
114
-
115
- raise WorkerExecutionException("The worker was closed by an unexpected exception")
108
+ raise WorkerExecutionException(
109
+ "The worker was closed by an unexpected exception"
110
+ ) from consume_events_exception or polling_task_exception
116
111
 
117
112
  async def __run_worker(self) -> tuple[Optional[Exception], Optional[Exception]]:
118
113
  consume_events_task = create_task(self.__consume_events_task())
@@ -15,11 +15,10 @@ from buz.event.meta_subscriber import MetaSubscriber
15
15
  from buz.event.middleware.async_consume_middleware import AsyncConsumeMiddleware
16
16
  from buz.event.strategies.retry.consume_retrier import ConsumeRetrier
17
17
  from buz.event.strategies.retry.reject_callback import RejectCallback
18
- from buz.kafka import (
19
- KafkaConnectionConfig,
20
- ConsumerInitialOffsetPosition,
21
- )
18
+
22
19
  from buz.kafka.domain.models.auto_create_topic_configuration import AutoCreateTopicConfiguration
20
+ from buz.kafka.domain.models.consumer_initial_offset_position import ConsumerInitialOffsetPosition
21
+ from buz.kafka.domain.models.kafka_connection_config import KafkaConnectionConfig
23
22
  from buz.kafka.domain.services.kafka_admin_client import KafkaAdminClient
24
23
  from buz.kafka.infrastructure.deserializers.bytes_to_message_deserializer import BytesToMessageDeserializer
25
24
  from buz.kafka.infrastructure.deserializers.implementations.json_bytes_to_message_deserializer import (
@@ -15,11 +15,9 @@ from buz.event.meta_subscriber import MetaSubscriber
15
15
  from buz.event.middleware.consume_middleware import ConsumeMiddleware
16
16
  from buz.event.strategies.retry.consume_retrier import ConsumeRetrier
17
17
  from buz.event.strategies.retry.reject_callback import RejectCallback
18
- from buz.kafka import (
19
- KafkaConnectionConfig,
20
- ConsumerInitialOffsetPosition,
21
- )
22
18
  from buz.kafka.domain.models.auto_create_topic_configuration import AutoCreateTopicConfiguration
19
+ from buz.kafka.domain.models.consumer_initial_offset_position import ConsumerInitialOffsetPosition
20
+ from buz.kafka.domain.models.kafka_connection_config import KafkaConnectionConfig
23
21
  from buz.kafka.domain.services.kafka_admin_client import KafkaAdminClient
24
22
  from buz.kafka.infrastructure.deserializers.bytes_to_message_deserializer import BytesToMessageDeserializer
25
23
  from buz.kafka.infrastructure.deserializers.implementations.json_bytes_to_message_deserializer import (
@@ -1,5 +1,5 @@
1
1
  from logging import Logger
2
- from typing import Collection, Optional
2
+ from typing import Optional, Iterable
3
3
 
4
4
  from buz.event import Event, EventBus
5
5
  from buz.event.exceptions.event_not_published_exception import EventNotPublishedException
@@ -11,13 +11,11 @@ from buz.event.middleware import (
11
11
  PublishMiddleware,
12
12
  )
13
13
  from buz.event.middleware.publish_middleware_chain_resolver import PublishMiddlewareChainResolver
14
- from buz.kafka import (
15
- KafkaPythonProducer,
16
- )
17
14
  from buz.kafka.domain.exceptions.topic_already_created_exception import KafkaTopicsAlreadyCreatedException
18
15
  from buz.kafka.domain.models.auto_create_topic_configuration import AutoCreateTopicConfiguration
19
16
  from buz.kafka.domain.models.create_kafka_topic import CreateKafkaTopic
20
17
  from buz.kafka.domain.services.kafka_admin_client import KafkaAdminClient
18
+ from buz.kafka.domain.services.kafka_producer import KafkaProducer
21
19
 
22
20
 
23
21
  class BuzKafkaEventBus(EventBus):
@@ -25,7 +23,7 @@ class BuzKafkaEventBus(EventBus):
25
23
  self,
26
24
  *,
27
25
  publish_strategy: KafkaPublishStrategy,
28
- producer: KafkaPythonProducer,
26
+ producer: KafkaProducer,
29
27
  logger: Logger,
30
28
  kafka_admin_client: Optional[KafkaAdminClient] = None,
31
29
  publish_middlewares: Optional[list[PublishMiddleware]] = None,
@@ -96,7 +94,7 @@ class BuzKafkaEventBus(EventBus):
96
94
 
97
95
  return is_topic_created
98
96
 
99
- def bulk_publish(self, events: Collection[Event]) -> None:
97
+ def bulk_publish(self, events: Iterable[Event]) -> None:
100
98
  for event in events:
101
99
  self.publish(event)
102
100
 
@@ -81,13 +81,13 @@ class KafkaEventSyncSubscriberExecutor(KafkaEventSubscriberExecutor):
81
81
  return
82
82
  except Exception as exception:
83
83
  self.__logger.warning(f"Event {event.id} could not be consumed by the subscriber {subscriber.fqn}")
84
- self.__logger.error(exception, exc_info=True)
85
-
86
84
  if self.__should_retry(event, subscriber) is True:
87
85
  self.__register_retry(event, subscriber)
88
86
  time.sleep(self.__seconds_between_retires)
89
87
  continue
90
88
 
89
+ self.__logger.exception(exception)
90
+
91
91
  if self.__reject_callback:
92
92
  self.__reject_callback.on_reject(event=event, subscribers=[subscriber], exception=exception)
93
93
 
@@ -135,6 +135,7 @@ class KombuConsumer(ConsumerMixin, Consumer):
135
135
  message.requeue()
136
136
  return
137
137
 
138
+ self.__logger.exception(exception)
138
139
  self.__reject_message(message, event, subscribers, exception)
139
140
 
140
141
  def __reject_message(
@@ -1,21 +1,20 @@
1
1
  from dataclasses import asdict
2
- from typing import Collection, Optional
2
+ from typing import Optional, Iterable
3
3
 
4
4
  from kombu import Connection, Exchange, Producer
5
5
  from kombu.entity import PERSISTENT_DELIVERY_MODE
6
6
 
7
7
  from buz.event import Event, EventBus
8
- from buz.event.infrastructure.kombu.publish_strategy import PublishStrategy
8
+ from buz.event.exceptions.event_not_published_exception import EventNotPublishedException
9
9
  from buz.event.infrastructure.kombu.allowed_kombu_serializer import AllowedKombuSerializer
10
+ from buz.event.infrastructure.kombu.publish_strategy import PublishStrategy
11
+ from buz.event.infrastructure.kombu.retry_strategy.publish_retry_policy import PublishRetryPolicy
12
+ from buz.event.infrastructure.kombu.retry_strategy.simple_publish_retry_policy import SimplePublishRetryPolicy
10
13
  from buz.event.middleware import (
11
14
  PublishMiddleware,
12
15
  PublishMiddlewareChainResolver,
13
16
  )
14
17
 
15
- from buz.event.exceptions.event_not_published_exception import EventNotPublishedException
16
- from buz.event.infrastructure.kombu.retry_strategy.publish_retry_policy import PublishRetryPolicy
17
- from buz.event.infrastructure.kombu.retry_strategy.simple_publish_retry_policy import SimplePublishRetryPolicy
18
-
19
18
 
20
19
  class KombuEventBus(EventBus):
21
20
  def __init__(
@@ -96,6 +95,6 @@ class KombuEventBus(EventBus):
96
95
  def __get_headers(self, event: Event) -> dict:
97
96
  return {"fqn": event.fqn()}
98
97
 
99
- def bulk_publish(self, events: Collection[Event]) -> None:
98
+ def bulk_publish(self, events: Iterable[Event]) -> None:
100
99
  for event in events:
101
100
  self.publish(event)
@@ -0,0 +1,13 @@
1
+ from abc import abstractmethod
2
+ from typing import Awaitable, Callable
3
+
4
+ from buz.event import Event
5
+ from buz.middleware import Middleware
6
+
7
+ AsyncPublishCallable = Callable[[Event], Awaitable[None]]
8
+
9
+
10
+ class AsyncPublishMiddleware(Middleware):
11
+ @abstractmethod
12
+ async def on_publish(self, event: Event, publish: AsyncPublishCallable) -> None:
13
+ pass
@@ -0,0 +1,22 @@
1
+ from buz.event import Event
2
+ from buz.event.middleware.async_publish_middleware import AsyncPublishCallable, AsyncPublishMiddleware
3
+ from buz.middleware import MiddlewareChainBuilder
4
+
5
+
6
+ class AsyncPublishMiddlewareChainResolver:
7
+ def __init__(self, middlewares: list[AsyncPublishMiddleware]):
8
+ self.__middlewares = middlewares
9
+ self.__middleware_chain_builder: MiddlewareChainBuilder[
10
+ AsyncPublishCallable, AsyncPublishMiddleware
11
+ ] = MiddlewareChainBuilder(middlewares)
12
+
13
+ async def resolve(self, event: Event, publish: AsyncPublishCallable) -> None:
14
+ chain_callable: AsyncPublishCallable = self.__middleware_chain_builder.get_chain_callable(
15
+ publish, self.__get_middleware_callable
16
+ )
17
+ await chain_callable(event)
18
+
19
+ def __get_middleware_callable(
20
+ self, middleware: AsyncPublishMiddleware, publish_callable: AsyncPublishCallable
21
+ ) -> AsyncPublishCallable:
22
+ return lambda event: middleware.on_publish(event, publish_callable)
@@ -1,4 +1,4 @@
1
- from typing import Collection, Optional
1
+ from typing import Optional, Iterable
2
2
 
3
3
  from buz.event import Event, EventBus, Subscriber
4
4
  from buz.event.middleware import (
@@ -32,6 +32,6 @@ class SyncEventBus(EventBus):
32
32
  def __perform_consume(self, event: Event, subscriber: Subscriber) -> None:
33
33
  subscriber.consume(event)
34
34
 
35
- def bulk_publish(self, events: Collection[Event]) -> None:
35
+ def bulk_publish(self, events: Iterable[Event]) -> None:
36
36
  for event in events:
37
37
  self.publish(event)
@@ -1,5 +1,5 @@
1
1
  from abc import ABC, abstractmethod
2
- from typing import Sequence
2
+ from typing import Sequence, Iterable
3
3
 
4
4
  from buz.event.transactional_outbox import OutboxRecord
5
5
  from buz.event.transactional_outbox import OutboxCriteria
@@ -10,6 +10,10 @@ class OutboxRepository(ABC):
10
10
  def save(self, outbox_record: OutboxRecord) -> None:
11
11
  pass
12
12
 
13
+ @abstractmethod
14
+ def bulk_create(self, outbox_records: Iterable[OutboxRecord]) -> None:
15
+ pass
16
+
13
17
  @abstractmethod
14
18
  def find(self, criteria: OutboxCriteria) -> Sequence[OutboxRecord]:
15
19
  pass
@@ -1,6 +1,7 @@
1
- from typing import Collection, Optional
1
+ from typing import Optional, Iterable
2
2
 
3
3
  from buz.event import Event, EventBus
4
+ from buz.event.transactional_outbox import OutboxRecord
4
5
  from buz.event.transactional_outbox.event_to_outbox_record_translator import EventToOutboxRecordTranslator
5
6
  from buz.event.transactional_outbox.outbox_record_validation.outbox_record_validator import OutboxRecordValidator
6
7
  from buz.event.transactional_outbox.outbox_repository import OutboxRepository
@@ -18,16 +19,16 @@ class TransactionalOutboxEventBus(EventBus):
18
19
  self.__outbox_record_validator = outbox_record_validator
19
20
 
20
21
  def publish(self, event: Event) -> None:
21
- """
22
- Raises:
23
- OutboxRecordValidationException: If any validation inside outbox_record_validator fails.
24
- """
22
+ outbox_record = self.__translate_and_validate(event)
23
+ self.__outbox_repository.save(outbox_record)
24
+
25
+ def bulk_publish(self, events: Iterable[Event]) -> None:
26
+ outbox_records = map(self.__translate_and_validate, events)
27
+ self.__outbox_repository.bulk_create(outbox_records)
28
+
29
+ # Raises OutboxRecordValidationException: If any validation inside outbox_record_validator fails
30
+ def __translate_and_validate(self, event: Event) -> OutboxRecord:
25
31
  outbox_record = self.__event_to_outbox_record_translator.translate(event)
26
32
  if self.__outbox_record_validator is not None:
27
33
  self.__outbox_record_validator.validate(record=outbox_record)
28
-
29
- self.__outbox_repository.save(outbox_record)
30
-
31
- def bulk_publish(self, events: Collection[Event]) -> None:
32
- for event in events:
33
- self.publish(event)
34
+ return outbox_record
@@ -0,0 +1,60 @@
1
+ from buz.kafka.domain.exceptions.not_all_partition_assigned_exception import NotAllPartitionAssignedException
2
+ from buz.kafka.domain.exceptions.not_valid_kafka_message_exception import NotValidKafkaMessageException
3
+ from buz.kafka.domain.exceptions.topic_already_created_exception import KafkaTopicsAlreadyCreatedException
4
+ from buz.kafka.domain.exceptions.topic_not_found_exception import TopicNotFoundException
5
+ from buz.kafka.domain.models.auto_create_topic_configuration import AutoCreateTopicConfiguration
6
+ from buz.kafka.domain.models.consumer_initial_offset_position import ConsumerInitialOffsetPosition
7
+ from buz.kafka.domain.models.kafka_connection_config import KafkaConnectionConfig
8
+ from buz.kafka.domain.models.kafka_connection_credentials import KafkaConnectionCredentials
9
+ from buz.kafka.domain.models.kafka_connection_plain_text_credentials import KafkaConnectionPlainTextCredentials
10
+ from buz.kafka.domain.models.kafka_connection_sasl_credentials import KafkaConnectionSaslCredentials
11
+ from buz.kafka.domain.models.kafka_consumer_record import KafkaConsumerRecord
12
+ from buz.kafka.domain.models.kafka_supported_sasl_mechanisms import KafkaSupportedSaslMechanisms
13
+ from buz.kafka.domain.models.kafka_supported_security_protocols import KafkaSupportedSecurityProtocols
14
+ from buz.kafka.domain.models.create_kafka_topic import CreateKafkaTopic
15
+ from buz.kafka.domain.services.kafka_admin_client import KafkaAdminClient
16
+ from buz.kafka.domain.services.kafka_admin_test_client import KafkaAdminTestClient
17
+ from buz.kafka.domain.services.kafka_producer import KafkaProducer
18
+ from buz.kafka.infrastructure.aiokafka.aiokafka_producer import AIOKafkaProducer
19
+ from buz.kafka.infrastructure.kafka_python.kafka_python_admin_client import KafkaPythonAdminClient
20
+ from buz.kafka.infrastructure.kafka_python.kafka_python_admin_test_client import KafkaPythonAdminTestClient
21
+ from buz.kafka.infrastructure.kafka_python.kafka_python_producer import KafkaPythonProducer
22
+ from buz.kafka.infrastructure.serializers.byte_serializer import ByteSerializer
23
+ from buz.kafka.infrastructure.serializers.implementations.json_byte_serializer import JSONByteSerializer
24
+ from buz.kafka.domain.models.kafka_supported_compression_type import KafkaSupportedCompressionType
25
+ from buz.event.infrastructure.buz_kafka.exceptions.kafka_event_bus_config_not_valid_exception import (
26
+ KafkaEventBusConfigNotValidException,
27
+ )
28
+ from buz.event.infrastructure.buz_kafka.async_buz_kafka_event_bus import AsyncBuzKafkaEventBus
29
+ from buz.event.infrastructure.buz_kafka.buz_kafka_event_bus import BuzKafkaEventBus
30
+
31
+
32
+ __all__ = [
33
+ "KafkaProducer",
34
+ "KafkaPythonProducer",
35
+ "KafkaAdminClient",
36
+ "KafkaAdminTestClient",
37
+ "KafkaPythonAdminClient",
38
+ "KafkaPythonAdminTestClient",
39
+ "KafkaTopicsAlreadyCreatedException",
40
+ "KafkaConsumerRecord",
41
+ "CreateKafkaTopic",
42
+ "KafkaSupportedSecurityProtocols",
43
+ "KafkaConnectionConfig",
44
+ "ByteSerializer",
45
+ "JSONByteSerializer",
46
+ "ConsumerInitialOffsetPosition",
47
+ "KafkaSupportedCompressionType",
48
+ "KafkaEventBusConfigNotValidException",
49
+ "AsyncBuzKafkaEventBus",
50
+ "BuzKafkaEventBus",
51
+ "AutoCreateTopicConfiguration",
52
+ "NotAllPartitionAssignedException",
53
+ "NotValidKafkaMessageException",
54
+ "TopicNotFoundException",
55
+ "KafkaConnectionCredentials",
56
+ "KafkaConnectionPlainTextCredentials",
57
+ "KafkaConnectionSaslCredentials",
58
+ "KafkaSupportedSaslMechanisms",
59
+ "AIOKafkaProducer",
60
+ ]
@@ -0,0 +1,10 @@
1
+ class NotValidPartitionNumberException(Exception):
2
+ def __init__(
3
+ self,
4
+ *,
5
+ partition_number: int,
6
+ min_partition_number: int,
7
+ ) -> None:
8
+ super().__init__(
9
+ f'"{partition_number}" is not a valid partition number, the minimum partition number is "{min_partition_number}"'
10
+ )
@@ -0,0 +1,8 @@
1
+ from enum import Enum
2
+
3
+
4
+ class KafkaSupportedCompressionType(Enum):
5
+ GZIP = "gzip"
6
+ SNAPPY = "snappy"
7
+ LZ4 = "lz4"
8
+ ZSTD = "zstd"
@@ -0,0 +1,21 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import abstractmethod, ABC
4
+ from typing import Generic, Optional, TypeVar
5
+
6
+ from buz.kafka.infrastructure.interfaces.async_connection_manager import AsyncConnectionManager
7
+
8
+ T = TypeVar("T")
9
+
10
+
11
+ class AsyncKafkaProducer(AsyncConnectionManager, ABC, Generic[T]):
12
+ @abstractmethod
13
+ async def produce(
14
+ self,
15
+ *,
16
+ topic: str,
17
+ message: T,
18
+ partition_key: Optional[str] = None,
19
+ headers: Optional[dict[str, str]] = None,
20
+ ) -> None:
21
+ pass
@@ -5,11 +5,12 @@ from datetime import datetime
5
5
  from typing import Sequence
6
6
 
7
7
  from buz.kafka.domain.models.create_kafka_topic import CreateKafkaTopic
8
+ from buz.kafka.infrastructure.interfaces.connection_manager import ConnectionManager
8
9
 
9
10
  DEFAULT_NUMBER_OF_MESSAGES_TO_POLLING = 999
10
11
 
11
12
 
12
- class KafkaAdminClient(ABC):
13
+ class KafkaAdminClient(ConnectionManager, ABC):
13
14
  @abstractmethod
14
15
  def create_topics(
15
16
  self,
@@ -39,6 +40,10 @@ class KafkaAdminClient(ABC):
39
40
  ) -> set[str]:
40
41
  pass
41
42
 
43
+ @abstractmethod
44
+ def get_number_of_partitions(self, topic: str) -> int:
45
+ pass
46
+
42
47
  # This function moves the following offset from the provided date
43
48
  # if there are no messages with a date greater than the provided offset
44
49
  # the offset will be moved to the end
@@ -51,3 +56,12 @@ class KafkaAdminClient(ABC):
51
56
  target_datetime: datetime,
52
57
  ) -> None:
53
58
  pass
59
+
60
+ @abstractmethod
61
+ def increase_topic_partitions_and_set_offset_of_related_consumer_groups_to_the_beginning_of_the_new_ones(
62
+ self,
63
+ *,
64
+ topic: str,
65
+ new_number_of_partitions: int,
66
+ ) -> None:
67
+ pass
@@ -3,10 +3,12 @@ from __future__ import annotations
3
3
  from abc import abstractmethod, ABC
4
4
  from typing import Generic, Optional, TypeVar
5
5
 
6
+ from buz.kafka.infrastructure.interfaces.connection_manager import ConnectionManager
7
+
6
8
  T = TypeVar("T")
7
9
 
8
10
 
9
- class KafkaProducer(ABC, Generic[T]):
11
+ class KafkaProducer(ConnectionManager, ABC, Generic[T]):
10
12
  @abstractmethod
11
13
  def produce(
12
14
  self,
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from logging import Logger
4
- from ssl import SSLContext
5
4
  from typing import Awaitable, Callable, Optional, Sequence, cast
6
5
 
7
6
  from aiokafka import AIOKafkaConsumer as AIOKafkaNativeConsumer, TopicPartition, OffsetAndMetadata
@@ -69,21 +68,25 @@ class AIOKafkaConsumer:
69
68
  )
70
69
 
71
70
  def __generate_consumer(self) -> AIOKafkaNativeConsumer:
72
- sasl_mechanism: Optional[str] = None
73
- ssl_context: Optional[SSLContext] = None
74
-
75
71
  if self.__auto_create_topic_configuration is not None:
76
72
  self.__ensure_topics_are_created(self.__auto_create_topic_configuration)
77
73
 
78
- if self.__connection_config.credentials.sasl_mechanism is not None:
79
- sasl_mechanism = self.__connection_config.credentials.sasl_mechanism.value
74
+ sasl_mechanism = (
75
+ self.__connection_config.credentials.sasl_mechanism.value
76
+ if self.__connection_config.credentials.sasl_mechanism
77
+ else "PLAIN"
78
+ )
79
+
80
+ ssl_context = (
81
+ create_ssl_context()
82
+ if self.__connection_config.credentials.security_protocol == KafkaSupportedSecurityProtocols.SASL_SSL
83
+ else None
84
+ )
80
85
 
81
- if self.__connection_config.credentials.security_protocol == KafkaSupportedSecurityProtocols.SASL_SSL:
82
- ssl_context = create_ssl_context()
83
86
  consumer = AIOKafkaNativeConsumer(
84
87
  None,
85
88
  ssl_context=ssl_context,
86
- bootstrap_servers=self.__connection_config.bootstrap_servers,
89
+ bootstrap_servers=",".join(self.__connection_config.bootstrap_servers),
87
90
  security_protocol=self.__connection_config.credentials.security_protocol.value,
88
91
  sasl_mechanism=sasl_mechanism,
89
92
  sasl_plain_username=self.__connection_config.credentials.user,