buz 2.14.3__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.
@@ -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 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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: buz
3
- Version: 2.14.3
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
@@ -41,7 +41,7 @@ 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=eD1DGzLB22bEPnxZGZd5U0geTfBooB0LiIosEg5HzTo,690
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
@@ -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=7EhNo_YZdXNpoVIuSm7Thk-Kv-wh3LtFP256g-IzljA,6483
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=1_33sdvRejCF4mHuKVkbldeJde6Y2jYtSrB5vMs0Rfo,773
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.14.3.dist-info/LICENSE,sha256=Jytu2S-2SPEgsB0y6BF-_LUxIWY7402fl0JSh36TLZE,1062
249
- buz-2.14.3.dist-info/METADATA,sha256=mIxvjnK8YV9oyOgKXUnEoF_1OfXv1DuzTguIlFX6z_g,1659
250
- buz-2.14.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
251
- buz-2.14.3.dist-info/RECORD,,
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