buz 2.14.2__py3-none-any.whl → 2.15.0__py3-none-any.whl
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/event/exceptions/subscribers_not_found_exception.py +6 -2
- buz/event/infrastructure/buz_kafka/base_buz_aiokafka_async_consumer.py +31 -1
- buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py +2 -0
- buz/event/infrastructure/buz_kafka/buz_aiokafka_multi_threaded_consumer.py +2 -0
- buz/event/infrastructure/kombu/kombu_consumer.py +33 -10
- buz/event/middleware/__init__.py +2 -0
- buz/event/middleware/base_async_consume_middleware.py +20 -0
- {buz-2.14.2.dist-info → buz-2.15.0.dist-info}/METADATA +2 -1
- {buz-2.14.2.dist-info → buz-2.15.0.dist-info}/RECORD +11 -10
- {buz-2.14.2.dist-info → buz-2.15.0.dist-info}/LICENSE +0 -0
- {buz-2.14.2.dist-info → buz-2.15.0.dist-info}/WHEEL +0 -0
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
from typing import Optional, Sequence
|
|
2
2
|
|
|
3
|
-
from buz.event import Event
|
|
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,
|
|
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
|
|
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,
|
|
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[
|
|
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,
|
|
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
|
|
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,
|
|
116
|
+
self.__on_consume_exception(message, event, meta_subscribers, exc)
|
|
110
117
|
|
|
111
|
-
def __perform_consume(self, event: Event, subscriber:
|
|
112
|
-
subscriber
|
|
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[
|
|
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[
|
|
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:
|
buz/event/middleware/__init__.py
CHANGED
|
@@ -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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: buz
|
|
3
|
-
Version: 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"
|
|
@@ -41,15 +41,15 @@ buz/event/event_bus.py,sha256=QnvZD_bKsv628TZ58s5uLntLJCA9Ngir_YHOwb4_UaU,289
|
|
|
41
41
|
buz/event/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
42
|
buz/event/exceptions/event_not_published_exception.py,sha256=gGEiRFGdKIS-VTKg8SN54vSS10WeSkgBhlO2Gpcll_0,215
|
|
43
43
|
buz/event/exceptions/event_restore_exception.py,sha256=dYHp5i1E-VCUYYhOAVYR-eJfZ3CqPpR9gm1bZ1EFXfE,245
|
|
44
|
-
buz/event/exceptions/subscribers_not_found_exception.py,sha256=
|
|
44
|
+
buz/event/exceptions/subscribers_not_found_exception.py,sha256=tTaAJaVZXJ-8CwDq_Jru0FYhFDkdprFp3itauv9XJ4k,760
|
|
45
45
|
buz/event/exceptions/term_signal_interruption_exception.py,sha256=RkRRF0v_K9Hg48bMeCHlyvAsqCpSYTA5Wcdbz3BpjOQ,265
|
|
46
46
|
buz/event/exceptions/worker_execution_exception.py,sha256=6mgztvXOCG_9VZ_Jptkk72kZtNWQ2CPuQ3TjXEWFE14,123
|
|
47
47
|
buz/event/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
48
|
buz/event/infrastructure/buz_kafka/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
49
|
buz/event/infrastructure/buz_kafka/async_buz_kafka_event_bus.py,sha256=SyLblUVlwWOaNfZzK7vL6Ee4m-85vZVCH0rjOgqVAww,4913
|
|
50
|
-
buz/event/infrastructure/buz_kafka/base_buz_aiokafka_async_consumer.py,sha256=
|
|
51
|
-
buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py,sha256=
|
|
52
|
-
buz/event/infrastructure/buz_kafka/buz_aiokafka_multi_threaded_consumer.py,sha256=
|
|
50
|
+
buz/event/infrastructure/buz_kafka/base_buz_aiokafka_async_consumer.py,sha256=ybdytgOGUYN8ql-7wRk-zLYFK4_prZdNeb5uzKXZY7Q,15084
|
|
51
|
+
buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py,sha256=bArqX8vE_jUOjfIzo1QGROxsachat-5n2vz013utDFA,5830
|
|
52
|
+
buz/event/infrastructure/buz_kafka/buz_aiokafka_multi_threaded_consumer.py,sha256=S7veewA3hIabW_ILfNoJbWbry1VmUKlhBEo6Ocj7c_k,5773
|
|
53
53
|
buz/event/infrastructure/buz_kafka/buz_kafka_event_bus.py,sha256=ymRSvcYVgbVCPgHN6rMBVBHQ5heCSwCDl6EffyqGVX8,4601
|
|
54
54
|
buz/event/infrastructure/buz_kafka/consume_strategy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
55
|
buz/event/infrastructure/buz_kafka/consume_strategy/consume_strategy.py,sha256=RqlXe5W2S6rH3FTr--tcxzFJTAVLb-Dhl7m6qjgNz2M,331
|
|
@@ -69,7 +69,7 @@ buz/event/infrastructure/kombu/allowed_kombu_serializer.py,sha256=LQ6futYsInawTC
|
|
|
69
69
|
buz/event/infrastructure/kombu/consume_strategy/__init__.py,sha256=6dnAv-bOxoDL31gQD1dErRocdJvkLHTgdqeb4S33eWc,302
|
|
70
70
|
buz/event/infrastructure/kombu/consume_strategy/consume_strategy.py,sha256=Zsv7QVpZXRLYvlV2nRbSdSwT_FgEELLyzUxdT6DyX8Q,179
|
|
71
71
|
buz/event/infrastructure/kombu/consume_strategy/queue_per_subscriber_consume_strategy.py,sha256=Vsa1uC7dwS3jJ-dp_lvrE-hVWnN91-ma8oVqdLuXHMo,786
|
|
72
|
-
buz/event/infrastructure/kombu/kombu_consumer.py,sha256=
|
|
72
|
+
buz/event/infrastructure/kombu/kombu_consumer.py,sha256=cCTlbGM3LomTsNu6YmWvXrA3Gsn8_LkM4USbmQ8uYDk,7842
|
|
73
73
|
buz/event/infrastructure/kombu/kombu_event_bus.py,sha256=VSLBtamp-YOta4KyqmfXvDurvPiHZSL9QPCozMK3Qyw,4017
|
|
74
74
|
buz/event/infrastructure/kombu/publish_strategy/__init__.py,sha256=96ssn7ydJwLXYoVyrhfGcwCpXr4_5Sl0DbN6UCoeNc8,315
|
|
75
75
|
buz/event/infrastructure/kombu/publish_strategy/fanout_exchange_per_event_publish_strategy.py,sha256=Pw85A1oI-cPtzHCQTr0XHQjb7-u9LVmKR3eBIonHsUU,397
|
|
@@ -81,11 +81,12 @@ buz/event/infrastructure/models/consuming_task.py,sha256=GJvn6fGTN5ZQJaOuQCX17JP
|
|
|
81
81
|
buz/event/infrastructure/queue/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
82
82
|
buz/event/meta_base_subscriber.py,sha256=IP2Siol98OmoeCoOISiaCJxgxJG2SCrhmbAN4t01aWg,698
|
|
83
83
|
buz/event/meta_subscriber.py,sha256=JPhhRqHkDOBWhuqtPmseUtAoYde1OmTBViqVbLBhvME,359
|
|
84
|
-
buz/event/middleware/__init__.py,sha256=
|
|
84
|
+
buz/event/middleware/__init__.py,sha256=vbmskMeXurTSgwXqPsRQBydHhNAYnbEoqFc1pqemI7Y,897
|
|
85
85
|
buz/event/middleware/async_consume_middleware.py,sha256=314z7ZyhvQIvi90kEO0t-FlnHSyRjArk3RqKOdDE6bM,459
|
|
86
86
|
buz/event/middleware/async_consume_middleware_chain_resolver.py,sha256=Hw75JAs5pyZVDi7-nD4I1nbUXjwYpHQW9PctafGS4ks,1193
|
|
87
87
|
buz/event/middleware/async_publish_middleware.py,sha256=JIxbRx7HVf_Q1iEziN_5RKGVJ-Oen_f1c3OL9QLmoxE,358
|
|
88
88
|
buz/event/middleware/async_publish_middleware_chain_resolver.py,sha256=Hqj8CRZXJD6h9KuJaKl88iToOFN7BijoatoDo66En8w,1016
|
|
89
|
+
buz/event/middleware/base_async_consume_middleware.py,sha256=7yncBDiAJYgAhKvXVqkY0jf-dH4Ug-qwqzd_DQESmjg,795
|
|
89
90
|
buz/event/middleware/base_consume_middleware.py,sha256=9G1jsr_Wm-avsTfWAndi5_tf4WW6dSLwQ3rN0-jc7AE,651
|
|
90
91
|
buz/event/middleware/base_publish_middleware.py,sha256=vtM8oA4LZjbZn4omPy-cIAUxQQwL-_Xb4ScU85DwjMU,531
|
|
91
92
|
buz/event/middleware/consume_middleware.py,sha256=BCcs1LgIc5YZx5nf7nE_bMuiiXxscqBE4LqD-nd4JS0,363
|
|
@@ -245,7 +246,7 @@ buz/serializer/message_to_json_bytes_serializer.py,sha256=RGZJ64t4t4Pz2FCASZZCv-
|
|
|
245
246
|
buz/wrapper/__init__.py,sha256=GnRdJFcncn-qp0hzDG9dBHLmTJSbHFVjE_yr-MdW_n4,77
|
|
246
247
|
buz/wrapper/async_to_sync.py,sha256=OfK-vrVUhuN-LLLvekLdMbQYtH0ue5lfbvuasj6ovMI,698
|
|
247
248
|
buz/wrapper/event_loop.py,sha256=pfBJ1g-8A2a3YgW8Gf9Fg0kkewoh3-wgTy2KIFDyfHk,266
|
|
248
|
-
buz-2.
|
|
249
|
-
buz-2.
|
|
250
|
-
buz-2.
|
|
251
|
-
buz-2.
|
|
249
|
+
buz-2.15.0.dist-info/LICENSE,sha256=Jytu2S-2SPEgsB0y6BF-_LUxIWY7402fl0JSh36TLZE,1062
|
|
250
|
+
buz-2.15.0.dist-info/METADATA,sha256=QGRmI-gxSAfhDPtg8oeGCNdgbEdiXS5SXCX3i3oEVzQ,1659
|
|
251
|
+
buz-2.15.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
252
|
+
buz-2.15.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|