buz 2.17.0rc1__py3-none-any.whl → 2.17.0rc2__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.
@@ -16,5 +16,5 @@ class EventToOutboxRecordTranslator:
16
16
  event_fqn=event.fqn(),
17
17
  created_at=event.parsed_created_at(),
18
18
  event_payload=payload,
19
- event_metadata=event.metadata,
19
+ event_metadata=dict(event.metadata),
20
20
  )
@@ -2,7 +2,6 @@ from datetime import datetime
2
2
  from typing import Optional, Any, ClassVar
3
3
  from uuid import UUID
4
4
  from dataclasses import dataclass, fields
5
- from dataclasses import field as dataclass_field
6
5
 
7
6
 
8
7
  @dataclass
@@ -13,7 +12,7 @@ class OutboxRecord: # type: ignore[misc]
13
12
  event_fqn: str
14
13
  event_payload: dict[str, Any] # type: ignore[misc]
15
14
  created_at: datetime
16
- event_metadata: Optional[dict[str, Any]] = dataclass_field(default_factory=dict) # type: ignore[misc]
15
+ event_metadata: Optional[dict[str, Any]] = None
17
16
  delivered_at: Optional[datetime] = None
18
17
  delivery_errors: int = 0
19
18
  delivery_paused_at: Optional[datetime] = None
@@ -52,5 +52,4 @@ class CDCRecordBytesToEventDeserializer(BytesToMessageDeserializer[Event], Gener
52
52
  def __deserialize_event_metadata(self, event_metadata: Optional[str]) -> dict:
53
53
  if event_metadata is None:
54
54
  return {}
55
-
56
55
  return orjson.loads(event_metadata)
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import asdict
4
4
  from datetime import datetime
5
+ from typing import Optional
5
6
 
6
7
  from buz.event import Event
7
8
  from buz.kafka.infrastructure.cdc.cdc_message import CDCMessage, CDCPayload
@@ -38,8 +39,5 @@ class CDCRecordBytesToEventSerializer(ByteSerializer):
38
39
  del payload["metadata"]
39
40
  return self.__json_serializer.serialize_as_json(payload)
40
41
 
41
- def __serialize_event_metadata(self, event: Event) -> str:
42
- if event.metadata is None:
43
- return str({})
44
-
45
- return self.__json_serializer.serialize_as_json(event.metadata)
42
+ def __serialize_event_metadata(self, event: Event) -> Optional[str]:
43
+ return self.__json_serializer.serialize_as_json(event.metadata) # type: ignore[arg-type]
@@ -15,7 +15,9 @@ ALLOWED_SERIALIZABLE_DICTIONARY_KEYS = str
15
15
 
16
16
  JSON_SERIALIZABLE_VALUE = Union[PRIMITIVES, list[PRIMITIVES], dict[ALLOWED_SERIALIZABLE_DICTIONARY_KEYS, PRIMITIVES]]
17
17
 
18
- JSON_SERIALIZABLE = dict[ALLOWED_SERIALIZABLE_DICTIONARY_KEYS, Union[JSON_SERIALIZABLE_VALUE, "JSON_SERIALIZABLE"]]
18
+ JSON_SERIALIZABLE = Union[
19
+ dict[ALLOWED_SERIALIZABLE_DICTIONARY_KEYS, Union[JSON_SERIALIZABLE_VALUE, "JSON_SERIALIZABLE"]]
20
+ ]
19
21
 
20
22
 
21
23
  class JSONByteSerializer(ByteSerializer[JSON_SERIALIZABLE]):
buz/message.py CHANGED
@@ -3,11 +3,13 @@ from dataclasses import field, dataclass
3
3
  from datetime import datetime
4
4
  from inspect import signature, Parameter
5
5
  from types import MappingProxyType
6
- from typing import Any, ClassVar, Optional, get_origin, get_args, Union
6
+ from typing import Any, ClassVar, get_origin, get_args, Union
7
7
  from typing_extensions import Self
8
8
 
9
9
  from uuid_utils.compat import uuid7
10
10
 
11
+ from buz.metadata import Metadata
12
+
11
13
 
12
14
  @dataclass(frozen=True)
13
15
  class Message(ABC):
@@ -17,7 +19,7 @@ class Message(ABC):
17
19
  created_at: str = field(
18
20
  init=False, default_factory=lambda: datetime.strftime(datetime.now(), Message.DATE_TIME_FORMAT)
19
21
  )
20
- metadata: Optional[dict[str, Any]] = field(init=False, default_factory=dict)
22
+ metadata: Metadata = field(init=False, default_factory=lambda: Metadata())
21
23
 
22
24
  @classmethod
23
25
  def fqn(cls) -> str:
@@ -27,7 +29,8 @@ class Message(ABC):
27
29
  def restore(cls, **kwargs: Any) -> Self:
28
30
  message_id = kwargs.pop("id")
29
31
  created_at = kwargs.pop("created_at")
30
- metadata = kwargs.pop("metadata", dict())
32
+ metadata_kwargs = kwargs.pop("metadata", None) or {}
33
+ metadata = Metadata(**metadata_kwargs)
31
34
 
32
35
  instance = cls.__from_dict(kwargs) # type: ignore
33
36
 
@@ -65,11 +68,5 @@ class Message(ABC):
65
68
  def parsed_created_at(self) -> datetime:
66
69
  return datetime.strptime(self.created_at, self.DATE_TIME_FORMAT)
67
70
 
68
- def add_metadata(self, metadata: Optional[dict[str, Any]]) -> None:
69
- if metadata is None:
70
- return None
71
-
72
- if self.metadata is None:
73
- object.__setattr__(self, "metadata", metadata)
74
- else:
75
- self.metadata.update(metadata)
71
+ def add_metadata(self, metadata: Metadata) -> None:
72
+ self.metadata.update(metadata)
buz/metadata.py ADDED
@@ -0,0 +1,8 @@
1
+ from typing import Any, TypedDict
2
+
3
+
4
+ class Metadata(TypedDict):
5
+ def __init__(self, **kwargs: dict[str, Any]) -> None: # type: ignore[misc]
6
+ super().__init__()
7
+ for key, value in kwargs.items():
8
+ setattr(self, key, value)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: buz
3
- Version: 2.17.0rc1
3
+ Version: 2.17.0rc2
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
@@ -121,14 +121,14 @@ buz/event/sync/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
121
121
  buz/event/sync/models/sync_delivery_context.py,sha256=LHjrS6gV-19NEKwtAXVmefjPd-Dsp_Ym8RZb84T3lm8,190
122
122
  buz/event/sync/sync_event_bus.py,sha256=LTJHNKy8LrbygO343AA4Zt_hmgTP9uY6TLdjKs8LuHM,1821
123
123
  buz/event/transactional_outbox/__init__.py,sha256=k8ZBWCi12pWKXchHfgW_Raw4sVR8XkBLuPNW9jB9X2k,1381
124
- buz/event/transactional_outbox/event_to_outbox_record_translator.py,sha256=HB6tBGzO2WMvl5g-wyWUZIOOgcyiFyEH8Iruv_mVOuM,609
124
+ buz/event/transactional_outbox/event_to_outbox_record_translator.py,sha256=d20JOeKIrCcpPEV66TzWiQmYqoyZGyL7J1ys0dUfHFs,615
125
125
  buz/event/transactional_outbox/fqn_to_event_mapper.py,sha256=ujcq6CfYqRJtM8f3SEEltbWN0Ru7NM5JfrbNdh4nvhQ,773
126
126
  buz/event/transactional_outbox/outbox_criteria/__init__.py,sha256=_9YjtbyYdqvDKEAwSQUyOn46Fc2pSNzTl2I7AqisEoc,594
127
127
  buz/event/transactional_outbox/outbox_criteria/deliverable_records_outbox_criteria_factory.py,sha256=vnaf6OPBAiw78RJZ8iOtaISbvuDIj4gN31aR-5k3BL8,347
128
128
  buz/event/transactional_outbox/outbox_criteria/outbox_criteria.py,sha256=HlD7tt3V-qVdPrq4H0idvyDnP7ncD0ZYQJ_XkwLNg-o,695
129
129
  buz/event/transactional_outbox/outbox_criteria/outbox_criteria_factory.py,sha256=XvqOfd7coi2veXyAvAthIBYRxS0Gpfb70nnkq9igvVM,220
130
130
  buz/event/transactional_outbox/outbox_criteria/outbox_sorting_criteria.py,sha256=-ckCLHvHlkuabI0TZ4Tw-qAQhU1hFLAgCOwuvIs_vpI,89
131
- buz/event/transactional_outbox/outbox_record.py,sha256=8UxPydEFt5qHwfxR20kjte-xO0x9JDjAL6DJvqQtKdQ,1307
131
+ buz/event/transactional_outbox/outbox_record.py,sha256=0lK9cG0wmP-t9JD8erxtcFFH9VoqXclRox3VIp-iSo8,1203
132
132
  buz/event/transactional_outbox/outbox_record_finder/__init__.py,sha256=HdW8GTIaxYExlUWeXugFmkRDyHcBiOlAVwh17dpPOfQ,344
133
133
  buz/event/transactional_outbox/outbox_record_finder/outbox_record_stream_finder.py,sha256=RjCetETAggQ5arXI4Terpyvh7xfz0eXXZon2-C1gXgw,239
134
134
  buz/event/transactional_outbox/outbox_record_finder/polling_outbox_record_stream_finder.py,sha256=qdCsqPQaS6cJ7li0veA2bY17iUG7fd84MzIywG7cPHw,1078
@@ -185,7 +185,7 @@ buz/kafka/infrastructure/deserializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JC
185
185
  buz/kafka/infrastructure/deserializers/byte_deserializer.py,sha256=4fc6t-zvcFx6F5eoyEixH2uN0cM6aB0YRGwowIzz1RA,211
186
186
  buz/kafka/infrastructure/deserializers/bytes_to_message_deserializer.py,sha256=r40yq67DIElPi6ClmElbtR3VGrG2grNwgwuflXWOh20,345
187
187
  buz/kafka/infrastructure/deserializers/implementations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
188
- buz/kafka/infrastructure/deserializers/implementations/cdc/cdc_record_bytes_to_event_deserializer.py,sha256=5ptC3yZHAXaoySpAeLPRDtZkXE0IFDdeEOH4GHJ7eIk,2197
188
+ buz/kafka/infrastructure/deserializers/implementations/cdc/cdc_record_bytes_to_event_deserializer.py,sha256=JwtO0K1uJ1RmCw1Dd8rspPGBI-S-9j08GfczPXnN00s,2196
189
189
  buz/kafka/infrastructure/deserializers/implementations/cdc/not_valid_cdc_message_exception.py,sha256=hgLLwTcC-C2DuJSOWUhmQsrd1bO9I1469869IqfAPOk,414
190
190
  buz/kafka/infrastructure/deserializers/implementations/json_byte_deserializer.py,sha256=L4b164-KweiQUwyRONhTMIGnAz48UPk0btLqjGOTNdk,373
191
191
  buz/kafka/infrastructure/deserializers/implementations/json_bytes_to_message_deserializer.py,sha256=YwugXkmOudMNtkVfCC4BFe3pFVpbM8rAL9bT88bZMRk,756
@@ -200,8 +200,8 @@ buz/kafka/infrastructure/kafka_python/kafka_python_producer.py,sha256=DkqqLSSXHB
200
200
  buz/kafka/infrastructure/kafka_python/translators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
201
  buz/kafka/infrastructure/kafka_python/translators/consumer_initial_offset_position_translator.py,sha256=hJ48_eyMcnbFL_Y5TOiMbGXrQSryuKk9CvP59MdqNOY,620
202
202
  buz/kafka/infrastructure/serializers/byte_serializer.py,sha256=T83sLdX9V5Oh1mzjRwHi_1DsTFI7KefFj7kmnz7JVy4,207
203
- buz/kafka/infrastructure/serializers/implementations/cdc_record_bytes_to_event_serializer.py,sha256=_14_HzyC7N_FdTmT8h5HsDuY1QB6ozhqnfdxdsp9xdI,1818
204
- buz/kafka/infrastructure/serializers/implementations/json_byte_serializer.py,sha256=KGkTQE7lq8VB048zCew_IlYgoWPozkmERYKg0t4DjOA,1510
203
+ buz/kafka/infrastructure/serializers/implementations/cdc_record_bytes_to_event_serializer.py,sha256=w75PNn3rsi-eUpsvzCHwirWU7FvMKF74FfoGINbqxA4,1819
204
+ buz/kafka/infrastructure/serializers/implementations/json_byte_serializer.py,sha256=yCPlZ-TNoF5Jh0WUlhseC8rTnHk-IJgmAHmU58ninyA,1523
205
205
  buz/kafka/infrastructure/serializers/kafka_header_serializer.py,sha256=ws9xr5lsJF6J-uVIplPym7vboo00KtXHfLJf8JjG0lo,649
206
206
  buz/locator/__init__.py,sha256=my8qfHL5htIT9RFFjzV4zGIPVW72tu4SMQbKKqBeSKo,293
207
207
  buz/locator/handler_fqn_not_found_exception.py,sha256=HfQb8gwqEpG1YfOc_IQlSCjRg0Ete0Aj_z3s7GPC-RM,206
@@ -216,7 +216,8 @@ buz/locator/sync/__init__.py,sha256=OljGqPXBPuxHzWcn-tQ0P-ObLRHbhoCmmXhsSIgVxJM,
216
216
  buz/locator/sync/handler_already_registered_exception.py,sha256=7DAnkGD97OIC9gc7604dTMBtVUl8KereUvTMicK7FD0,245
217
217
  buz/locator/sync/handler_not_registered_exception.py,sha256=cYKtKET1fHXaMvbBFJNLtvNF6-yp8pixUV62_CdTS54,234
218
218
  buz/locator/sync/instance_locator.py,sha256=HGQ6uRIwrTruhax2i8L6clfJUywgHCHC3k2rwYqjApo,2076
219
- buz/message.py,sha256=cXJoF0w1Cy6j1Au5PCIagvn86D1VzOsK9MjJyIoE7Hk,2879
219
+ buz/message.py,sha256=d9CMiVSlQVX7xXHi60NSHwqd9cLFoulKIlmlBqLqzaA,2779
220
+ buz/metadata.py,sha256=F0-zp_6Tplr2L3euZtuZR3jZ1qb2mW0X99I5ZvQE9Yg,250
220
221
  buz/middleware/__init__.py,sha256=ndg9oGa4p8zOYC3i0nikfmSe3Ny5ug9RBwb9vZ7YhKM,176
221
222
  buz/middleware/middleware.py,sha256=XNSlfSTyBAfHzvuFrjM0IOVtz35lP_f-xWbkfdMYltA,54
222
223
  buz/middleware/middleware_chain_builder.py,sha256=D9zl5XSF5P65QpnPcbtyFaaVHqBTb6hX75aKI7CtiPU,1010
@@ -257,7 +258,7 @@ buz/serializer/message_to_json_bytes_serializer.py,sha256=RGZJ64t4t4Pz2FCASZZCv-
257
258
  buz/wrapper/__init__.py,sha256=GnRdJFcncn-qp0hzDG9dBHLmTJSbHFVjE_yr-MdW_n4,77
258
259
  buz/wrapper/async_to_sync.py,sha256=OfK-vrVUhuN-LLLvekLdMbQYtH0ue5lfbvuasj6ovMI,698
259
260
  buz/wrapper/event_loop.py,sha256=pfBJ1g-8A2a3YgW8Gf9Fg0kkewoh3-wgTy2KIFDyfHk,266
260
- buz-2.17.0rc1.dist-info/LICENSE,sha256=jcLgcIIVaBqaZNwe0kzGWSU99YgwMcI0IGv142wkYSM,1062
261
- buz-2.17.0rc1.dist-info/METADATA,sha256=l0G8yhZ42hHCWCVgIY5X6Yf6wb5HABbIsVsnyPquGOw,12682
262
- buz-2.17.0rc1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
263
- buz-2.17.0rc1.dist-info/RECORD,,
261
+ buz-2.17.0rc2.dist-info/LICENSE,sha256=jcLgcIIVaBqaZNwe0kzGWSU99YgwMcI0IGv142wkYSM,1062
262
+ buz-2.17.0rc2.dist-info/METADATA,sha256=1gFRXIis0nVeEJ3CS1im64qJuzyFJx-Y_3c7PIjFsQg,12682
263
+ buz-2.17.0rc2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
264
+ buz-2.17.0rc2.dist-info/RECORD,,