buz 2.14.2__tar.gz → 2.15.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 (252) hide show
  1. {buz-2.14.2 → buz-2.15.0}/PKG-INFO +2 -1
  2. {buz-2.14.2 → buz-2.15.0}/pyproject.toml +2 -1
  3. {buz-2.14.2 → buz-2.15.0}/src/buz/event/exceptions/subscribers_not_found_exception.py +6 -2
  4. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/base_buz_aiokafka_async_consumer.py +31 -1
  5. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py +2 -0
  6. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_multi_threaded_consumer.py +2 -0
  7. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/kombu_consumer.py +33 -10
  8. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/__init__.py +2 -0
  9. buz-2.15.0/src/buz/event/middleware/base_async_consume_middleware.py +20 -0
  10. {buz-2.14.2 → buz-2.15.0}/LICENSE +0 -0
  11. {buz-2.14.2 → buz-2.15.0}/README.md +0 -0
  12. {buz-2.14.2 → buz-2.15.0}/src/buz/__init__.py +0 -0
  13. {buz-2.14.2 → buz-2.15.0}/src/buz/command/__init__.py +0 -0
  14. {buz-2.14.2 → buz-2.15.0}/src/buz/command/asynchronous/__init__.py +0 -0
  15. {buz-2.14.2 → buz-2.15.0}/src/buz/command/asynchronous/base_command_handler.py +0 -0
  16. {buz-2.14.2 → buz-2.15.0}/src/buz/command/asynchronous/command_bus.py +0 -0
  17. {buz-2.14.2 → buz-2.15.0}/src/buz/command/asynchronous/command_handler.py +0 -0
  18. {buz-2.14.2 → buz-2.15.0}/src/buz/command/asynchronous/middleware/__init__.py +0 -0
  19. {buz-2.14.2 → buz-2.15.0}/src/buz/command/asynchronous/middleware/base_handle_middleware.py +0 -0
  20. {buz-2.14.2 → buz-2.15.0}/src/buz/command/asynchronous/middleware/handle_middleware.py +0 -0
  21. {buz-2.14.2 → buz-2.15.0}/src/buz/command/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  22. {buz-2.14.2 → buz-2.15.0}/src/buz/command/asynchronous/self_process/__init__.py +0 -0
  23. {buz-2.14.2 → buz-2.15.0}/src/buz/command/asynchronous/self_process/self_process_command_bus.py +0 -0
  24. {buz-2.14.2 → buz-2.15.0}/src/buz/command/command.py +0 -0
  25. {buz-2.14.2 → buz-2.15.0}/src/buz/command/more_than_one_command_handler_related_exception.py +0 -0
  26. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/__init__.py +0 -0
  27. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/base_command_handler.py +0 -0
  28. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/command_bus.py +0 -0
  29. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/command_handler.py +0 -0
  30. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/middleware/__init__.py +0 -0
  31. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/middleware/base_handle_middleware.py +0 -0
  32. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/middleware/handle_middleware.py +0 -0
  33. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  34. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/self_process/__init__.py +0 -0
  35. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/self_process/self_process_command_bus.py +0 -0
  36. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/synced_async/__init__.py +0 -0
  37. {buz-2.14.2 → buz-2.15.0}/src/buz/command/synchronous/synced_async/synced_async_command_bus.py +0 -0
  38. {buz-2.14.2 → buz-2.15.0}/src/buz/event/__init__.py +0 -0
  39. {buz-2.14.2 → buz-2.15.0}/src/buz/event/async_consumer.py +0 -0
  40. {buz-2.14.2 → buz-2.15.0}/src/buz/event/async_event_bus.py +0 -0
  41. {buz-2.14.2 → buz-2.15.0}/src/buz/event/async_subscriber.py +0 -0
  42. {buz-2.14.2 → buz-2.15.0}/src/buz/event/async_worker.py +0 -0
  43. {buz-2.14.2 → buz-2.15.0}/src/buz/event/base_async_subscriber.py +0 -0
  44. {buz-2.14.2 → buz-2.15.0}/src/buz/event/base_subscriber.py +0 -0
  45. {buz-2.14.2 → buz-2.15.0}/src/buz/event/consumer.py +0 -0
  46. {buz-2.14.2 → buz-2.15.0}/src/buz/event/dead_letter_queue/__init__.py +0 -0
  47. {buz-2.14.2 → buz-2.15.0}/src/buz/event/dead_letter_queue/dlq_criteria.py +0 -0
  48. {buz-2.14.2 → buz-2.15.0}/src/buz/event/dead_letter_queue/dlq_record.py +0 -0
  49. {buz-2.14.2 → buz-2.15.0}/src/buz/event/dead_letter_queue/dlq_repository.py +0 -0
  50. {buz-2.14.2 → buz-2.15.0}/src/buz/event/event.py +0 -0
  51. {buz-2.14.2 → buz-2.15.0}/src/buz/event/event_bus.py +0 -0
  52. {buz-2.14.2 → buz-2.15.0}/src/buz/event/exceptions/__init__.py +0 -0
  53. {buz-2.14.2 → buz-2.15.0}/src/buz/event/exceptions/event_not_published_exception.py +0 -0
  54. {buz-2.14.2 → buz-2.15.0}/src/buz/event/exceptions/event_restore_exception.py +0 -0
  55. {buz-2.14.2 → buz-2.15.0}/src/buz/event/exceptions/term_signal_interruption_exception.py +0 -0
  56. {buz-2.14.2 → buz-2.15.0}/src/buz/event/exceptions/worker_execution_exception.py +0 -0
  57. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/__init__.py +0 -0
  58. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/__init__.py +0 -0
  59. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/async_buz_kafka_event_bus.py +0 -0
  60. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/buz_kafka_event_bus.py +0 -0
  61. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/__init__.py +0 -0
  62. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/consume_strategy.py +0 -0
  63. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/kafka_on_fail_strategy.py +0 -0
  64. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/topic_and_subscription_group_per_subscriber_kafka_consumer_strategy.py +0 -0
  65. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/exceptions/__init__.py +0 -0
  66. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/exceptions/kafka_event_bus_config_not_valid_exception.py +0 -0
  67. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/exceptions/retry_exception.py +0 -0
  68. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py +0 -0
  69. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/kafka_event_subscriber_executor.py +0 -0
  70. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py +0 -0
  71. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/publish_strategy/__init__.py +0 -0
  72. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/publish_strategy/publish_strategy.py +0 -0
  73. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/buz_kafka/publish_strategy/topic_per_event_kafka_publish_strategy.py +0 -0
  74. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/__init__.py +0 -0
  75. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/allowed_kombu_serializer.py +0 -0
  76. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/consume_strategy/__init__.py +0 -0
  77. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/consume_strategy/consume_strategy.py +0 -0
  78. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/consume_strategy/queue_per_subscriber_consume_strategy.py +0 -0
  79. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/kombu_event_bus.py +0 -0
  80. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/publish_strategy/__init__.py +0 -0
  81. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/publish_strategy/fanout_exchange_per_event_publish_strategy.py +0 -0
  82. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/publish_strategy/publish_strategy.py +0 -0
  83. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/retry_strategy/__init__.py +0 -0
  84. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/retry_strategy/publish_retry_policy.py +0 -0
  85. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/kombu/retry_strategy/simple_publish_retry_policy.py +0 -0
  86. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/models/consuming_task.py +0 -0
  87. {buz-2.14.2 → buz-2.15.0}/src/buz/event/infrastructure/queue/__init__.py +0 -0
  88. {buz-2.14.2 → buz-2.15.0}/src/buz/event/meta_base_subscriber.py +0 -0
  89. {buz-2.14.2 → buz-2.15.0}/src/buz/event/meta_subscriber.py +0 -0
  90. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/async_consume_middleware.py +0 -0
  91. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/async_consume_middleware_chain_resolver.py +0 -0
  92. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/async_publish_middleware.py +0 -0
  93. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/async_publish_middleware_chain_resolver.py +0 -0
  94. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/base_consume_middleware.py +0 -0
  95. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/base_publish_middleware.py +0 -0
  96. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/consume_middleware.py +0 -0
  97. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/consume_middleware_chain_resolver.py +0 -0
  98. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/exceptions/__init__.py +0 -0
  99. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/exceptions/event_already_in_progress_exception.py +0 -0
  100. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/publish_middleware.py +0 -0
  101. {buz-2.14.2 → buz-2.15.0}/src/buz/event/middleware/publish_middleware_chain_resolver.py +0 -0
  102. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/__init__.py +0 -0
  103. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/execution_strategy/__init__.py +0 -0
  104. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/execution_strategy/async_execution_strategy.py +0 -0
  105. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/execution_strategy/async_self_process_execution_strategy.py +0 -0
  106. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/execution_strategy/cyclic_iterator_execution_strategy.py +0 -0
  107. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/execution_strategy/execution_strategy.py +0 -0
  108. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/execution_strategy/self_process_execution_strategy.py +0 -0
  109. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/retry/__init__.py +0 -0
  110. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/retry/consume_retrier.py +0 -0
  111. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/retry/consumed_event_retry.py +0 -0
  112. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/retry/consumed_event_retry_repository.py +0 -0
  113. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/retry/max_retries_consume_retrier.py +0 -0
  114. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/retry/max_retries_negative_exception.py +0 -0
  115. {buz-2.14.2 → buz-2.15.0}/src/buz/event/strategies/retry/reject_callback.py +0 -0
  116. {buz-2.14.2 → buz-2.15.0}/src/buz/event/subscriber.py +0 -0
  117. {buz-2.14.2 → buz-2.15.0}/src/buz/event/sync/__init__.py +0 -0
  118. {buz-2.14.2 → buz-2.15.0}/src/buz/event/sync/sync_event_bus.py +0 -0
  119. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/__init__.py +0 -0
  120. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/event_to_outbox_record_translator.py +0 -0
  121. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/fqn_to_event_mapper.py +0 -0
  122. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_criteria/__init__.py +0 -0
  123. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_criteria/deliverable_records_outbox_criteria_factory.py +0 -0
  124. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria.py +0 -0
  125. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria_factory.py +0 -0
  126. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_criteria/outbox_sorting_criteria.py +0 -0
  127. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record.py +0 -0
  128. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record_finder/__init__.py +0 -0
  129. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record_finder/outbox_record_stream_finder.py +0 -0
  130. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record_finder/polling_outbox_record_stream_finder.py +0 -0
  131. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record_to_event_translator.py +0 -0
  132. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record_validation/__init__.py +0 -0
  133. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record_validation/abstract_outbox_record_validator.py +0 -0
  134. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_size_not_allowed_exception.py +0 -0
  135. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validation_exception.py +0 -0
  136. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validator.py +0 -0
  137. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_record_validation/size_outbox_record_validator.py +0 -0
  138. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/outbox_repository.py +0 -0
  139. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/transactional_outbox_event_bus.py +0 -0
  140. {buz-2.14.2 → buz-2.15.0}/src/buz/event/transactional_outbox/transactional_outbox_worker.py +0 -0
  141. {buz-2.14.2 → buz-2.15.0}/src/buz/event/worker.py +0 -0
  142. {buz-2.14.2 → buz-2.15.0}/src/buz/handler.py +0 -0
  143. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/__init__.py +0 -0
  144. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/exceptions/__init__.py +0 -0
  145. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/exceptions/not_all_partition_assigned_exception.py +0 -0
  146. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/exceptions/not_valid_kafka_message_exception.py +0 -0
  147. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/exceptions/not_valid_partition_number_exception.py +0 -0
  148. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/exceptions/topic_already_created_exception.py +0 -0
  149. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/exceptions/topic_not_found_exception.py +0 -0
  150. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/__init__.py +0 -0
  151. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/auto_create_topic_configuration.py +0 -0
  152. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/consumer_initial_offset_position.py +0 -0
  153. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/create_kafka_topic.py +0 -0
  154. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/kafka_connection_config.py +0 -0
  155. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/kafka_connection_credentials.py +0 -0
  156. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/kafka_connection_plain_text_credentials.py +0 -0
  157. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/kafka_connection_sasl_credentials.py +0 -0
  158. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/kafka_consumer_record.py +0 -0
  159. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/kafka_poll_record.py +0 -0
  160. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/kafka_supported_compression_type.py +0 -0
  161. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/kafka_supported_sasl_mechanisms.py +0 -0
  162. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/models/kafka_supported_security_protocols.py +0 -0
  163. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/services/__init__.py +0 -0
  164. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/services/async_kafka_producer.py +0 -0
  165. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/services/kafka_admin_client.py +0 -0
  166. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/services/kafka_admin_test_client.py +0 -0
  167. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/domain/services/kafka_producer.py +0 -0
  168. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/__init__.py +0 -0
  169. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/aiokafka/__init__.py +0 -0
  170. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/aiokafka/aiokafka_consumer.py +0 -0
  171. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/aiokafka/aiokafka_producer.py +0 -0
  172. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/aiokafka/rebalance/__init__.py +0 -0
  173. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/aiokafka/rebalance/kafka_callback_rebalancer.py +0 -0
  174. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/aiokafka/translators/__init__.py +0 -0
  175. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/aiokafka/translators/consumer_initial_offset_position_translator.py +0 -0
  176. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/cdc/cdc_message.py +0 -0
  177. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/deserializers/__init__.py +0 -0
  178. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/deserializers/byte_deserializer.py +0 -0
  179. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/deserializers/bytes_to_message_deserializer.py +0 -0
  180. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/deserializers/implementations/__init__.py +0 -0
  181. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cdc_record_bytes_to_event_deserializer.py +0 -0
  182. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/deserializers/implementations/cdc/not_valid_cdc_message_exception.py +0 -0
  183. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/deserializers/implementations/json_byte_deserializer.py +0 -0
  184. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/deserializers/implementations/json_bytes_to_message_deserializer.py +0 -0
  185. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/interfaces/__init__.py +0 -0
  186. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/interfaces/async_connection_manager.py +0 -0
  187. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/interfaces/connection_manager.py +0 -0
  188. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/kafka_python/__init__.py +0 -0
  189. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/kafka_python/exception/consumer_interrupted_exception.py +0 -0
  190. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_client.py +0 -0
  191. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_test_client.py +0 -0
  192. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/kafka_python/kafka_python_producer.py +0 -0
  193. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/kafka_python/translators/__init__.py +0 -0
  194. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/kafka_python/translators/consumer_initial_offset_position_translator.py +0 -0
  195. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/serializers/byte_serializer.py +0 -0
  196. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/serializers/implementations/cdc_record_bytes_to_event_serializer.py +0 -0
  197. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/serializers/implementations/json_byte_serializer.py +0 -0
  198. {buz-2.14.2 → buz-2.15.0}/src/buz/kafka/infrastructure/serializers/kafka_header_serializer.py +0 -0
  199. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/__init__.py +0 -0
  200. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/handler_fqn_not_found_exception.py +0 -0
  201. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/locator.py +0 -0
  202. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/message_fqn_not_found_exception.py +0 -0
  203. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/pypendency/__init__.py +0 -0
  204. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/pypendency/container_locator.py +0 -0
  205. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/pypendency/container_locator_resolution_configuration.py +0 -0
  206. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/pypendency/handler_not_found_exception.py +0 -0
  207. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/pypendency/handler_not_registered_exception.py +0 -0
  208. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/sync/__init__.py +0 -0
  209. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/sync/handler_already_registered_exception.py +0 -0
  210. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/sync/handler_not_registered_exception.py +0 -0
  211. {buz-2.14.2 → buz-2.15.0}/src/buz/locator/sync/instance_locator.py +0 -0
  212. {buz-2.14.2 → buz-2.15.0}/src/buz/message.py +0 -0
  213. {buz-2.14.2 → buz-2.15.0}/src/buz/middleware/__init__.py +0 -0
  214. {buz-2.14.2 → buz-2.15.0}/src/buz/middleware/middleware.py +0 -0
  215. {buz-2.14.2 → buz-2.15.0}/src/buz/middleware/middleware_chain_builder.py +0 -0
  216. {buz-2.14.2 → buz-2.15.0}/src/buz/py.typed +0 -0
  217. {buz-2.14.2 → buz-2.15.0}/src/buz/query/__init__.py +0 -0
  218. {buz-2.14.2 → buz-2.15.0}/src/buz/query/asynchronous/__init__.py +0 -0
  219. {buz-2.14.2 → buz-2.15.0}/src/buz/query/asynchronous/base_query_handler.py +0 -0
  220. {buz-2.14.2 → buz-2.15.0}/src/buz/query/asynchronous/middleware/__init__.py +0 -0
  221. {buz-2.14.2 → buz-2.15.0}/src/buz/query/asynchronous/middleware/base_handle_middleware.py +0 -0
  222. {buz-2.14.2 → buz-2.15.0}/src/buz/query/asynchronous/middleware/handle_middleware.py +0 -0
  223. {buz-2.14.2 → buz-2.15.0}/src/buz/query/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  224. {buz-2.14.2 → buz-2.15.0}/src/buz/query/asynchronous/query_bus.py +0 -0
  225. {buz-2.14.2 → buz-2.15.0}/src/buz/query/asynchronous/query_handler.py +0 -0
  226. {buz-2.14.2 → buz-2.15.0}/src/buz/query/asynchronous/self_process/__init__.py +0 -0
  227. {buz-2.14.2 → buz-2.15.0}/src/buz/query/asynchronous/self_process/self_process_query_bus.py +0 -0
  228. {buz-2.14.2 → buz-2.15.0}/src/buz/query/more_than_one_query_handler_related_exception.py +0 -0
  229. {buz-2.14.2 → buz-2.15.0}/src/buz/query/query.py +0 -0
  230. {buz-2.14.2 → buz-2.15.0}/src/buz/query/query_response.py +0 -0
  231. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/__init__.py +0 -0
  232. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/base_query_handler.py +0 -0
  233. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/middleware/__init__.py +0 -0
  234. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/middleware/base_handle_middleware.py +0 -0
  235. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/middleware/handle_middleware.py +0 -0
  236. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  237. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/query_bus.py +0 -0
  238. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/query_handler.py +0 -0
  239. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/self_process/__init__.py +0 -0
  240. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/self_process/self_process_query_bus.py +0 -0
  241. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/synced_async/__init__.py +0 -0
  242. {buz-2.14.2 → buz-2.15.0}/src/buz/query/synchronous/synced_async/synced_async_query_bus.py +0 -0
  243. {buz-2.14.2 → buz-2.15.0}/src/buz/queue/__init__.py +0 -0
  244. {buz-2.14.2 → buz-2.15.0}/src/buz/queue/in_memory/in_memory_multiqueue_repository.py +0 -0
  245. {buz-2.14.2 → buz-2.15.0}/src/buz/queue/in_memory/in_memory_queue_repository.py +0 -0
  246. {buz-2.14.2 → buz-2.15.0}/src/buz/queue/multiqueue_repository.py +0 -0
  247. {buz-2.14.2 → buz-2.15.0}/src/buz/queue/queue_repository.py +0 -0
  248. {buz-2.14.2 → buz-2.15.0}/src/buz/serializer/message_to_bytes_serializer.py +0 -0
  249. {buz-2.14.2 → buz-2.15.0}/src/buz/serializer/message_to_json_bytes_serializer.py +0 -0
  250. {buz-2.14.2 → buz-2.15.0}/src/buz/wrapper/__init__.py +0 -0
  251. {buz-2.14.2 → buz-2.15.0}/src/buz/wrapper/async_to_sync.py +0 -0
  252. {buz-2.14.2 → buz-2.15.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.14.2
3
+ Version: 2.15.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
@@ -22,6 +22,7 @@ Classifier: Typing :: Typed
22
22
  Provides-Extra: aiokafka
23
23
  Provides-Extra: kombu
24
24
  Provides-Extra: pypendency
25
+ Requires-Dist: aiohttp (>=3.11.13,<4.0.0)
25
26
  Requires-Dist: aiokafka[lz4] (==0.12.0) ; extra == "aiokafka"
26
27
  Requires-Dist: asgiref (>=3.8.1,<4.0.0) ; extra == "aiokafka"
27
28
  Requires-Dist: asyncio (>=3.4.3,<4.0.0) ; extra == "aiokafka"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "buz"
3
- version = "2.14.2"
3
+ version = "2.15.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 = ["Luis Pintado Lozano <luis.pintado.lozano@gmail.com>", "Gerardo Parra <gprauxiliar@gmail.com>"]
@@ -31,6 +31,7 @@ asyncio = { version ="^3.4.3", optional = true }
31
31
  aiokafka = {version = "==0.12.0", extras = ["lz4"], optional = true}
32
32
  asgiref = {version = "^3.8.1", optional = true}
33
33
  cachetools = "^5.5.0"
34
+ aiohttp = "^3.11.13"
34
35
 
35
36
  [tool.poetry.dev-dependencies]
36
37
  black = "^23.3"
@@ -1,11 +1,15 @@
1
1
  from typing import Optional, Sequence
2
2
 
3
- from buz.event import Event, Subscriber
3
+ from buz.event import Event
4
+ from buz.event.meta_subscriber import MetaSubscriber
4
5
 
5
6
 
6
7
  class SubscribersNotFoundException(Exception):
7
8
  def __init__(
8
- self, event: Event, allowed_subscriber_fqns: set[str], event_subscribers: Optional[Sequence[Subscriber]] = None
9
+ self,
10
+ event: Event,
11
+ allowed_subscriber_fqns: set[str],
12
+ event_subscribers: Optional[Sequence[MetaSubscriber]] = None,
9
13
  ) -> None:
10
14
  self.event = event
11
15
  self.allowed_subscriber_fqns = allowed_subscriber_fqns
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import traceback
2
3
  from abc import abstractmethod
3
4
  from asyncio import Lock, Task, create_task, gather, Semaphore, Event as AsyncIOEvent, sleep
@@ -5,6 +6,7 @@ from datetime import timedelta, datetime
5
6
  from itertools import cycle
6
7
  from logging import Logger
7
8
  from typing import AsyncIterator, Optional, Sequence, Type, TypeVar
9
+ from aiohttp import web
8
10
 
9
11
  from aiokafka import TopicPartition
10
12
  from aiokafka.coordinator.assignors.abstract import AbstractPartitionAssignor
@@ -43,6 +45,7 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
43
45
  kafka_partition_assignors: tuple[Type[AbstractPartitionAssignor], ...] = (),
44
46
  subscribers: Sequence[MetaSubscriber],
45
47
  logger: Logger,
48
+ health_check_port: Optional[int],
46
49
  consumer_initial_offset_position: ConsumerInitialOffsetPosition,
47
50
  auto_create_topic_configuration: Optional[AutoCreateTopicConfiguration] = None,
48
51
  seconds_between_executions_if_there_are_no_tasks_in_the_queue: int = 1,
@@ -55,6 +58,7 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
55
58
  self.__kafka_partition_assignors = kafka_partition_assignors
56
59
  self.__subscribers = subscribers
57
60
  self._logger = logger
61
+ self.__health_check_port = health_check_port
58
62
  self.__consumer_initial_offset_position = consumer_initial_offset_position
59
63
  self.__max_records_retrieved_per_poll = 1
60
64
  self.__executor_per_consumer_mapper: dict[AIOKafkaConsumer, KafkaEventSubscriberExecutor] = {}
@@ -78,12 +82,26 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
78
82
  )
79
83
  self.__seconds_between_polls_if_there_are_no_new_tasks = seconds_between_polls_if_there_are_no_new_tasks
80
84
  self.__polling_tasks_semaphore = Semaphore(max_number_of_concurrent_polling_tasks)
81
-
82
85
  self.__task_execution_mutex = Lock()
83
86
 
87
+ async def configure_health_check_server(self, health_check_port: int) -> web.TCPSite:
88
+ self._logger.info(f"Starting health check server on port {health_check_port}")
89
+ app = web.Application()
90
+ app.router.add_get("/health", lambda request: self.__health_check())
91
+ runner = web.AppRunner(app)
92
+ await runner.setup()
93
+ site = web.TCPSite(runner, "localhost", health_check_port)
94
+ await site.start()
95
+ return site
96
+
84
97
  async def run(self) -> None:
85
98
  start_time = datetime.now()
86
99
  await self.__generate_kafka_consumers()
100
+ health_check_server: Optional[web.TCPSite] = None
101
+
102
+ if self.__health_check_port is not None:
103
+ health_check_server = await self.configure_health_check_server(self.__health_check_port)
104
+
87
105
  self.__initial_coroutines_created_elapsed_time = datetime.now() - start_time
88
106
 
89
107
  if len(self.__executor_per_consumer_mapper) == 0:
@@ -94,6 +112,9 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
94
112
  worker_errors = await self.__run_worker()
95
113
  self.__events_processed_elapsed_time = datetime.now() - start_consumption_time
96
114
 
115
+ if health_check_server is not None:
116
+ await health_check_server.stop()
117
+
97
118
  await self.__handle_graceful_stop(worker_errors)
98
119
 
99
120
  async def __handle_graceful_stop(self, worker_errors: tuple[Optional[Exception], Optional[Exception]]) -> None:
@@ -270,6 +291,15 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
270
291
  for kafka_consumer in self.__queue_per_consumer_mapper.keys():
271
292
  await kafka_consumer.stop()
272
293
 
294
+ async def __health_check(self) -> web.Response:
295
+ health_information = {
296
+ "subscribers": [subscriber.fqn() for subscriber in self.__subscribers],
297
+ "number_of_subscribers": len(self.__subscribers),
298
+ "event_processed": self.__events_processed,
299
+ }
300
+
301
+ return web.Response(text=json.dumps(health_information), content_type="application/json")
302
+
273
303
  def __print_statistics(self) -> None:
274
304
  self._logger.info("Number of subscribers: %d", len(self.__subscribers))
275
305
  self._logger.info(f"Start kafka consumers elapsed time: {self.__start_kafka_consumers_elapsed_time}")
@@ -51,6 +51,7 @@ class BuzAIOKafkaAsyncConsumer(BaseBuzAIOKafkaAsyncConsumer):
51
51
  seconds_between_polls_if_there_are_tasks_in_the_queue: int = 1,
52
52
  seconds_between_polls_if_there_are_no_new_tasks: int = 1,
53
53
  max_number_of_concurrent_polling_tasks: int = 20,
54
+ health_check_port: Optional[int] = None,
54
55
  ):
55
56
  super().__init__(
56
57
  connection_config=connection_config,
@@ -67,6 +68,7 @@ class BuzAIOKafkaAsyncConsumer(BaseBuzAIOKafkaAsyncConsumer):
67
68
  seconds_between_polls_if_there_are_tasks_in_the_queue=seconds_between_polls_if_there_are_tasks_in_the_queue,
68
69
  seconds_between_polls_if_there_are_no_new_tasks=seconds_between_polls_if_there_are_no_new_tasks,
69
70
  max_number_of_concurrent_polling_tasks=max_number_of_concurrent_polling_tasks,
71
+ health_check_port=health_check_port,
70
72
  )
71
73
  self.__on_fail_strategy = on_fail_strategy
72
74
  self.__consume_middlewares = consume_middlewares
@@ -52,6 +52,7 @@ class BuzAIOKafkaMultiThreadedConsumer(BaseBuzAIOKafkaAsyncConsumer):
52
52
  seconds_between_polls_if_there_are_tasks_in_the_queue: int = 1,
53
53
  seconds_between_polls_if_there_are_no_new_tasks: int = 1,
54
54
  max_number_of_concurrent_polling_tasks: int = 20,
55
+ health_check_port: Optional[int] = 3123,
55
56
  ):
56
57
  super().__init__(
57
58
  connection_config=connection_config,
@@ -68,6 +69,7 @@ class BuzAIOKafkaMultiThreadedConsumer(BaseBuzAIOKafkaAsyncConsumer):
68
69
  seconds_between_polls_if_there_are_tasks_in_the_queue=seconds_between_polls_if_there_are_tasks_in_the_queue,
69
70
  seconds_between_polls_if_there_are_no_new_tasks=seconds_between_polls_if_there_are_no_new_tasks,
70
71
  max_number_of_concurrent_polling_tasks=max_number_of_concurrent_polling_tasks,
72
+ health_check_port=health_check_port,
71
73
  )
72
74
  self.__on_fail_strategy = on_fail_strategy
73
75
  self.__consume_middlewares = consume_middlewares
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  from logging import Logger
2
3
  from typing import Optional, Callable, cast
3
4
 
@@ -5,11 +6,14 @@ from kombu import Connection, Queue, Consumer as MessageConsumer, Message
5
6
  from kombu.mixins import ConsumerMixin
6
7
  from kombu.transport.pyamqp import Channel
7
8
 
8
- from buz.event import Event, Subscriber
9
+ from buz.event import Event
10
+ from buz.event.async_subscriber import AsyncSubscriber
9
11
  from buz.event.infrastructure.kombu.allowed_kombu_serializer import AllowedKombuSerializer
10
12
  from buz.event.exceptions.term_signal_interruption_exception import TermSignalInterruptionException
13
+ from buz.event.meta_subscriber import MetaSubscriber
11
14
  from buz.event.middleware import ConsumeMiddleware, ConsumeMiddlewareChainResolver
12
15
  from buz.event.middleware.exceptions.event_already_in_progress_exception import EventAlreadyInProgressException
16
+ from buz.event.subscriber import Subscriber
13
17
  from buz.locator import Locator
14
18
  from buz.event.consumer import Consumer
15
19
  from buz.event.exceptions.event_restore_exception import EventRestoreException
@@ -27,7 +31,7 @@ class KombuConsumer(ConsumerMixin, Consumer):
27
31
  queues_mapping: QueueToSubscriberFqnMapping,
28
32
  serializer: AllowedKombuSerializer,
29
33
  prefetch_count: int,
30
- locator: Locator[Event, Subscriber],
34
+ locator: Locator[Event, MetaSubscriber],
31
35
  logger: Logger,
32
36
  consume_retrier: Optional[ConsumeRetrier] = None,
33
37
  reject_callback: Optional[RejectCallback] = None,
@@ -83,7 +87,7 @@ class KombuConsumer(ConsumerMixin, Consumer):
83
87
  except Exception as exc:
84
88
  raise EventRestoreException(body, str(message)) from exc
85
89
 
86
- def __subscribers(self, event: Event, allowed_subscriber_fqns: set[str]) -> list[Subscriber]:
90
+ def __subscribers(self, event: Event, allowed_subscriber_fqns: set[str]) -> list[MetaSubscriber]:
87
91
  event_subscribers = None
88
92
  try:
89
93
  event_subscribers = self.__locator.get(event)
@@ -97,22 +101,41 @@ class KombuConsumer(ConsumerMixin, Consumer):
97
101
  except Exception as exc:
98
102
  raise SubscribersNotFoundException(event, allowed_subscriber_fqns, event_subscribers) from exc
99
103
 
100
- def __consume_event(self, message: Message, event: Event, subscribers: list[Subscriber]) -> None:
104
+ def __consume_event(self, message: Message, event: Event, meta_subscribers: list[MetaSubscriber]) -> None:
101
105
  try:
102
106
  if self.should_stop is True:
103
107
  raise TermSignalInterruptionException()
104
108
 
105
- for subscriber in subscribers:
109
+ for meta_subscriber in meta_subscribers:
110
+ # The problem here is that the chain resolver works with syncsubscribers, an asyncsubscriber would require of a async function,
111
+ # 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
112
+ subscriber = cast(Subscriber, meta_subscriber)
106
113
  self.__consume_middleware_chain_resolver.resolve(event, subscriber, self.__perform_consume)
107
114
  message.ack()
108
115
  except Exception as exc:
109
- self.__on_consume_exception(message, event, subscribers, exc)
116
+ self.__on_consume_exception(message, event, meta_subscribers, exc)
110
117
 
111
- def __perform_consume(self, event: Event, subscriber: Subscriber) -> None:
112
- subscriber.consume(event)
118
+ def __perform_consume(self, event: Event, subscriber: MetaSubscriber) -> None:
119
+ if isinstance(subscriber, AsyncSubscriber):
120
+ self.__get_or_create_event_loop().run_until_complete(subscriber.consume(event))
121
+ return
122
+
123
+ if isinstance(subscriber, Subscriber):
124
+ return subscriber.consume(event)
125
+
126
+ raise TypeError(f"Subscriber {subscriber} is not an instance of Subscriber or AsyncSubscriber")
127
+
128
+ def __get_or_create_event_loop(self) -> asyncio.AbstractEventLoop:
129
+ try:
130
+ return asyncio.get_event_loop()
131
+ except RuntimeError:
132
+ self.__logger.warning("The current thread does not have an event loop attached. Creating new event loop.")
133
+ event_loop = asyncio.new_event_loop()
134
+ asyncio.set_event_loop(event_loop)
135
+ return event_loop
113
136
 
114
137
  def __on_consume_exception(
115
- self, message: Message, event: Event, subscribers: list[Subscriber], exception: Exception
138
+ self, message: Message, event: Event, subscribers: list[MetaSubscriber], exception: Exception
116
139
  ) -> None:
117
140
  if isinstance(exception, EventAlreadyInProgressException) or isinstance(
118
141
  exception, TermSignalInterruptionException
@@ -139,7 +162,7 @@ class KombuConsumer(ConsumerMixin, Consumer):
139
162
  self.__reject_message(message, event, subscribers, exception)
140
163
 
141
164
  def __reject_message(
142
- self, message: Message, event: Event, subscribers: list[Subscriber], exception: Exception
165
+ self, message: Message, event: Event, subscribers: list[MetaSubscriber], exception: Exception
143
166
  ) -> None:
144
167
  message.reject()
145
168
  if self.__reject_callback is not None:
@@ -1,3 +1,4 @@
1
+ from buz.event.middleware.base_async_consume_middleware import BaseAsyncConsumeMiddleware
1
2
  from buz.event.middleware.publish_middleware import PublishMiddleware, PublishCallable
2
3
  from buz.event.middleware.base_publish_middleware import BasePublishMiddleware
3
4
  from buz.event.middleware.publish_middleware_chain_resolver import PublishMiddlewareChainResolver
@@ -14,4 +15,5 @@ __all__ = [
14
15
  "ConsumeCallable",
15
16
  "BaseConsumeMiddleware",
16
17
  "ConsumeMiddlewareChainResolver",
18
+ "BaseAsyncConsumeMiddleware",
17
19
  ]
@@ -0,0 +1,20 @@
1
+ from abc import abstractmethod
2
+
3
+ from buz.event import Event
4
+ from buz.event.async_subscriber import AsyncSubscriber
5
+ from buz.event.middleware.async_consume_middleware import AsyncConsumeMiddleware, AsyncConsumeCallable
6
+
7
+
8
+ class BaseAsyncConsumeMiddleware(AsyncConsumeMiddleware):
9
+ async def on_consume(self, event: Event, subscriber: AsyncSubscriber, consume: AsyncConsumeCallable) -> None:
10
+ await self._before_on_consume(event, subscriber)
11
+ await consume(event, subscriber)
12
+ await self._after_on_consume(event, subscriber)
13
+
14
+ @abstractmethod
15
+ async def _before_on_consume(self, event: Event, subscriber: AsyncSubscriber) -> None:
16
+ pass
17
+
18
+ @abstractmethod
19
+ async def _after_on_consume(self, event: Event, subscriber: AsyncSubscriber) -> None:
20
+ pass
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes