buz 2.17.0rc6__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.
- {buz-2.17.0rc6 → buz-2.18.0}/PKG-INFO +1 -1
- {buz-2.17.0rc6 → buz-2.18.0}/pyproject.toml +1 -1
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py +13 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_multi_threaded_consumer.py +13 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py +23 -2
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py +24 -2
- buz-2.18.0/src/buz/event/infrastructure/buz_kafka/models/cdc_process_context.py +9 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/kombu_consumer.py +6 -1
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/models/execution_context.py +2 -0
- buz-2.18.0/src/buz/event/infrastructure/models/process_context.py +6 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/sync/sync_event_bus.py +3 -1
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/cdc/cdc_payload.py +6 -3
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/cdc/cdc_schema.py +1 -1
- buz-2.17.0rc6/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
- buz-2.18.0/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cannot_restore_event_from_cdc_payload_exception.py +11 -0
- buz-2.18.0/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cdc_record_bytes_to_cdc_payload_deserializer.py +35 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cdc_record_bytes_to_event_deserializer.py +14 -21
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/serializers/implementations/cdc_record_bytes_to_event_serializer.py +2 -2
- {buz-2.17.0rc6 → buz-2.18.0}/LICENSE +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/README.md +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/base_command_handler.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/command_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/command_handler.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/middleware/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/middleware/base_handle_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/middleware/handle_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/self_process/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/self_process/self_process_command_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/command.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/more_than_one_command_handler_related_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/base_command_handler.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/command_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/command_handler.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/middleware/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/middleware/base_handle_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/middleware/handle_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/self_process/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/self_process/self_process_command_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/synced_async/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/synced_async/synced_async_command_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/async_consumer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/async_event_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/async_subscriber.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/async_worker.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/base_async_subscriber.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/base_subscriber.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/consumer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/dead_letter_queue/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/dead_letter_queue/dlq_criteria.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/dead_letter_queue/dlq_record.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/dead_letter_queue/dlq_repository.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/event.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/event_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/exceptions/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/exceptions/event_not_published_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/exceptions/event_restore_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/exceptions/subscribers_not_found_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/exceptions/term_signal_interruption_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/exceptions/worker_execution_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/async_buz_kafka_event_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/base_buz_aiokafka_async_consumer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/buz_kafka_event_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/consume_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/kafka_on_fail_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/topic_and_subscription_group_per_subscriber_kafka_consumer_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/exceptions/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/exceptions/kafka_event_bus_config_not_valid_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/exceptions/max_consumer_retry_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/exceptions/retry_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/kafka_event_subscriber_executor.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/models/kafka_delivery_context.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/publish_strategy/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/publish_strategy/publish_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/publish_strategy/topic_per_event_kafka_publish_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/allowed_kombu_serializer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/consume_strategy/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/consume_strategy/consume_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/consume_strategy/queue_per_subscriber_consume_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/kombu_event_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/models/kombu_delivery_context.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/publish_strategy/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/publish_strategy/fanout_exchange_per_event_publish_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/publish_strategy/publish_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/retry_strategy/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/retry_strategy/publish_retry_policy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/kombu/retry_strategy/simple_publish_retry_policy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/models/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/models/consuming_task.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/models/delivery_context.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/queue/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/meta_base_subscriber.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/meta_subscriber.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/async_consume_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/async_consume_middleware_chain_resolver.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/async_publish_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/async_publish_middleware_chain_resolver.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/base_async_consume_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/base_consume_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/base_publish_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/consume_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/consume_middleware_chain_resolver.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/exceptions/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/exceptions/event_already_in_progress_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/publish_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/middleware/publish_middleware_chain_resolver.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/async_execution_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/async_self_process_execution_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/cyclic_iterator_execution_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/execution_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/execution_strategy/self_process_execution_strategy.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/retry/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/retry/consume_retrier.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/retry/consumed_event_retry.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/retry/consumed_event_retry_repository.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/retry/max_retries_consume_retrier.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/retry/max_retries_negative_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/strategies/retry/reject_callback.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/subscriber.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/sync/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/sync/models/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/sync/models/sync_delivery_context.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/event_to_outbox_record_translator.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/fqn_to_event_mapper.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_criteria/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_criteria/deliverable_records_outbox_criteria_factory.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria_factory.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_criteria/outbox_sorting_criteria.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_finder/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_finder/outbox_record_stream_finder.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_finder/polling_outbox_record_stream_finder.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_to_event_translator.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/abstract_outbox_record_validator.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_size_not_allowed_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validation_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validator.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_record_validation/size_outbox_record_validator.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/outbox_repository.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/transactional_outbox_event_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/transactional_outbox/transactional_outbox_worker.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/worker.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/handler.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/exceptions/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/exceptions/not_all_partition_assigned_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/exceptions/not_valid_kafka_message_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/exceptions/not_valid_partition_number_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/exceptions/topic_already_created_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/exceptions/topic_not_found_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/auto_create_topic_configuration.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/consumer_initial_offset_position.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/create_kafka_topic.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_connection_config.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_connection_credentials.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_connection_plain_text_credentials.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_connection_sasl_credentials.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_consumer_record.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_poll_record.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_supported_compression_type.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_supported_sasl_mechanisms.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/models/kafka_supported_security_protocols.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/services/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/services/async_kafka_producer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/services/kafka_admin_client.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/services/kafka_admin_test_client.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/domain/services/kafka_producer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/aiokafka_consumer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/aiokafka_producer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/rebalance/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/rebalance/kafka_callback_rebalancer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/translators/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/aiokafka/translators/consumer_initial_offset_position_translator.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/cdc/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/cdc/cdc_message.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/byte_deserializer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/bytes_to_message_deserializer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/implementations/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/implementations/json_byte_deserializer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/deserializers/implementations/json_bytes_to_message_deserializer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/interfaces/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/interfaces/async_connection_manager.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/interfaces/connection_manager.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/exception/consumer_interrupted_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_client.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_test_client.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/kafka_python_producer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/translators/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/kafka_python/translators/consumer_initial_offset_position_translator.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/serializers/byte_serializer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/serializers/implementations/json_byte_serializer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/kafka/infrastructure/serializers/kafka_header_serializer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/handler_fqn_not_found_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/locator.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/message_fqn_not_found_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/pypendency/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/pypendency/container_locator.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/pypendency/container_locator_resolution_configuration.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/pypendency/handler_not_found_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/pypendency/handler_not_registered_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/sync/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/sync/handler_already_registered_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/sync/handler_not_registered_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/locator/sync/instance_locator.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/message.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/metadata.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/middleware/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/middleware/middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/middleware/middleware_chain_builder.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/py.typed +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/asynchronous/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/asynchronous/base_query_handler.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/asynchronous/middleware/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/asynchronous/middleware/base_handle_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/asynchronous/middleware/handle_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/asynchronous/query_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/asynchronous/query_handler.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/asynchronous/self_process/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/asynchronous/self_process/self_process_query_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/more_than_one_query_handler_related_exception.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/query.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/query_response.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/base_query_handler.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/middleware/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/middleware/base_handle_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/middleware/handle_middleware.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/query_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/query_handler.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/self_process/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/self_process/self_process_query_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/synced_async/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/query/synchronous/synced_async/synced_async_query_bus.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/queue/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/queue/in_memory/in_memory_multiqueue_repository.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/queue/in_memory/in_memory_queue_repository.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/queue/multiqueue_repository.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/queue/queue_repository.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/serializer/message_to_bytes_serializer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/serializer/message_to_json_bytes_serializer.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/wrapper/__init__.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/wrapper/async_to_sync.py +0 -0
- {buz-2.17.0rc6 → buz-2.18.0}/src/buz/wrapper/event_loop.py +0 -0
{buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py
RENAMED
|
@@ -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
|
)
|
|
@@ -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(
|
|
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
|
|
@@ -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,
|
|
@@ -10,7 +10,8 @@ class CDCPayload:
|
|
|
10
10
|
event_id: str # uuid
|
|
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):
|
|
@@ -21,8 +22,10 @@ class CDCPayload:
|
|
|
21
22
|
raise ValueError("The created_at value is not a value")
|
|
22
23
|
if not isinstance(self.event_fqn, str):
|
|
23
24
|
raise ValueError("The event_fqn value is not a valid value")
|
|
24
|
-
if self.
|
|
25
|
-
raise ValueError("The
|
|
25
|
+
if self.metadata is not None and not isinstance(self.metadata, str):
|
|
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
|
|
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.
|
|
13
|
-
|
|
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,35 +23,26 @@ 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
|
-
|
|
29
|
+
cdc_payload = self.__cdc_record_bytes_to_cdc_payload_deserializer.deserialize(data)
|
|
27
30
|
try:
|
|
28
|
-
|
|
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
|
-
metadata=self.
|
|
33
|
-
**
|
|
35
|
+
metadata=self.__deserialize_metadata(cdc_payload.metadata),
|
|
36
|
+
**payload_dict,
|
|
34
37
|
)
|
|
35
38
|
except Exception as exception:
|
|
36
|
-
raise
|
|
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
|
|
43
|
-
|
|
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
|
-
def __deserialize_event_metadata(self, event_metadata: Optional[str]) -> dict:
|
|
53
|
-
if event_metadata is None:
|
|
45
|
+
def __deserialize_metadata(self, metadata: Optional[str]) -> dict:
|
|
46
|
+
if metadata is None:
|
|
54
47
|
return {}
|
|
55
|
-
return orjson.loads(
|
|
48
|
+
return orjson.loads(metadata)
|
|
@@ -22,7 +22,7 @@ class CDCRecordBytesToEventSerializer(ByteSerializer):
|
|
|
22
22
|
created_at=self.__adapt_created_to_cdc_format(data.created_at),
|
|
23
23
|
event_fqn=data.fqn(),
|
|
24
24
|
payload=self.__serialize_payload(data),
|
|
25
|
-
|
|
25
|
+
metadata=self.__serialize_metadata(data),
|
|
26
26
|
),
|
|
27
27
|
schema=generate_cdc_schema(data),
|
|
28
28
|
)
|
|
@@ -39,5 +39,5 @@ class CDCRecordBytesToEventSerializer(ByteSerializer):
|
|
|
39
39
|
del payload["metadata"]
|
|
40
40
|
return self.__json_serializer.serialize_as_json(payload)
|
|
41
41
|
|
|
42
|
-
def
|
|
42
|
+
def __serialize_metadata(self, event: Event) -> Optional[str]:
|
|
43
43
|
return self.__json_serializer.serialize_as_json(event.metadata) # type: ignore[arg-type]
|
|
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
|
{buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/middleware/base_handle_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/asynchronous/self_process/self_process_command_bus.py
RENAMED
|
File without changes
|
|
File without changes
|
{buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/more_than_one_command_handler_related_exception.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/middleware/base_handle_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/self_process/self_process_command_bus.py
RENAMED
|
File without changes
|
|
File without changes
|
{buz-2.17.0rc6 → buz-2.18.0}/src/buz/command/synchronous/synced_async/synced_async_command_bus.py
RENAMED
|
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
|
|
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
|
|
File without changes
|
{buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/async_buz_kafka_event_bus.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/consume_strategy/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.17.0rc6 → buz-2.18.0}/src/buz/event/infrastructure/buz_kafka/exceptions/retry_exception.py
RENAMED
|
File without changes
|