buz 2.15.10rc6__py3-none-any.whl → 2.15.12__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.
Files changed (32) hide show
  1. buz/command/asynchronous/base_command_handler.py +13 -6
  2. buz/command/asynchronous/command_handler.py +8 -5
  3. buz/command/synchronous/base_command_handler.py +14 -6
  4. buz/command/synchronous/command_handler.py +7 -5
  5. buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py +20 -3
  6. buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py +20 -5
  7. buz/event/infrastructure/buz_kafka/models/kafka_delivery_context.py +10 -0
  8. buz/event/infrastructure/kombu/kombu_consumer.py +10 -2
  9. buz/event/infrastructure/kombu/models/kombu_delivery_context.py +7 -0
  10. buz/event/infrastructure/models/__init__.py +0 -0
  11. buz/event/infrastructure/models/delivery_context.py +6 -0
  12. buz/event/infrastructure/models/execution_context.py +8 -0
  13. buz/event/middleware/async_consume_middleware.py +9 -2
  14. buz/event/middleware/async_consume_middleware_chain_resolver.py +16 -5
  15. buz/event/middleware/base_async_consume_middleware.py +23 -6
  16. buz/event/middleware/base_consume_middleware.py +9 -6
  17. buz/event/middleware/consume_middleware.py +5 -2
  18. buz/event/middleware/consume_middleware_chain_resolver.py +13 -4
  19. buz/event/sync/models/__init__.py +0 -0
  20. buz/event/sync/models/sync_delivery_context.py +7 -0
  21. buz/event/sync/sync_event_bus.py +10 -2
  22. buz/handler.py +6 -3
  23. buz/kafka/domain/models/kafka_poll_record.py +1 -0
  24. buz/query/asynchronous/base_query_handler.py +15 -6
  25. buz/query/asynchronous/query_handler.py +8 -4
  26. buz/query/synchronous/base_query_handler.py +15 -6
  27. buz/query/synchronous/query_handler.py +8 -5
  28. {buz-2.15.10rc6.dist-info → buz-2.15.12.dist-info}/LICENSE +1 -1
  29. buz-2.15.12.dist-info/METADATA +438 -0
  30. {buz-2.15.10rc6.dist-info → buz-2.15.12.dist-info}/RECORD +31 -24
  31. buz-2.15.10rc6.dist-info/METADATA +0 -41
  32. {buz-2.15.10rc6.dist-info → buz-2.15.12.dist-info}/WHEEL +0 -0
@@ -1,27 +1,36 @@
1
- from typing import Type, get_type_hints, Any
1
+ from typing import Generic, Type, get_type_hints, Any, cast, TypeVar
2
2
 
3
3
  from buz.query import Query
4
+ from buz.query.query_response import QueryResponse
4
5
  from buz.query.synchronous.query_handler import QueryHandler
5
6
 
7
+ TQuery = TypeVar("TQuery", bound=Query)
8
+ TQueryResponse = TypeVar("TQueryResponse", bound=QueryResponse)
6
9
 
7
- class BaseQueryHandler(QueryHandler):
10
+
11
+ class BaseQueryHandler(Generic[TQuery, TQueryResponse], QueryHandler[TQuery, TQueryResponse]):
8
12
  @classmethod
9
13
  def fqn(cls) -> str:
10
14
  return f"query_handler.{cls.__module__}.{cls.__name__}"
11
15
 
12
16
  @classmethod
13
- def handles(cls) -> Type[Query]:
17
+ def handles(cls) -> Type[TQuery]:
14
18
  handle_types = get_type_hints(cls.handle)
15
19
 
16
- if "query" not in handle_types:
20
+ t_query = handle_types.get("query")
21
+ if t_query is None:
17
22
  raise TypeError(
18
23
  f"The method 'handle' in '{cls.fqn()}' doesn't have a parameter named 'query'. Found parameters: {cls.__get_method_parameter_names(handle_types)}"
19
24
  )
20
25
 
21
- if not issubclass(handle_types["query"], Query):
26
+ # TypeVar mask the actual bound type
27
+ if hasattr(t_query, "__bound__"):
28
+ t_query = t_query.__bound__
29
+
30
+ if not issubclass(t_query, Query):
22
31
  raise TypeError(f"The parameter 'query' in '{cls.fqn()}.handle' is not a 'buz.query.Query' subclass")
23
32
 
24
- return handle_types["query"]
33
+ return cast(Type[TQuery], t_query)
25
34
 
26
35
  @classmethod
27
36
  def __get_method_parameter_names(cls, handle_types: dict[str, Any]) -> list[str]:
@@ -1,16 +1,19 @@
1
- from abc import abstractmethod
2
- from typing import Type
1
+ from abc import ABC, abstractmethod
2
+ from typing import Generic, Type, TypeVar
3
3
 
4
4
  from buz import Handler
5
5
  from buz.query import Query, QueryResponse
6
6
 
7
+ TQuery = TypeVar("TQuery", bound=Query)
8
+ TQueryResponse = TypeVar("TQueryResponse", bound=QueryResponse)
7
9
 
8
- class QueryHandler(Handler):
10
+
11
+ class QueryHandler(Generic[TQuery, TQueryResponse], Handler[TQuery], ABC):
9
12
  @classmethod
10
13
  @abstractmethod
11
- def handles(cls) -> Type[Query]:
14
+ def handles(cls) -> Type[TQuery]:
12
15
  pass
13
16
 
14
17
  @abstractmethod
15
- def handle(self, query: Query) -> QueryResponse:
18
+ def handle(self, query: TQuery) -> TQueryResponse:
16
19
  pass
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2020 Fever
3
+ Copyright (c) 2025 Fever
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,438 @@
1
+ Metadata-Version: 2.1
2
+ Name: buz
3
+ Version: 2.15.12
4
+ Summary: Buz is a set of light, simple and extensible implementations of event, command and query buses.
5
+ License: MIT
6
+ Author: Luis Pintado Lozano
7
+ Author-email: luis.pintado.lozano@gmail.com
8
+ Maintainer: Fever - Platform Squad
9
+ Maintainer-email: platform@feverup.com
10
+ Requires-Python: >=3.9
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.8
20
+ Classifier: Topic :: Software Development :: Libraries
21
+ Classifier: Typing :: Typed
22
+ Provides-Extra: aiokafka
23
+ Provides-Extra: kombu
24
+ Provides-Extra: pypendency
25
+ Requires-Dist: aiohttp (>=3.12.15,<4.0.0)
26
+ Requires-Dist: aiokafka[lz4] (==0.12.0) ; extra == "aiokafka"
27
+ Requires-Dist: asgiref (>=3.8.1,<4.0.0) ; extra == "aiokafka"
28
+ Requires-Dist: cachetools (>=5.5.0,<6.0.0)
29
+ Requires-Dist: dacite (>=1.8.1,<2.0.0)
30
+ Requires-Dist: kafka-python-ng (==2.2.3)
31
+ Requires-Dist: kombu (>=4.6.11) ; extra == "kombu"
32
+ Requires-Dist: orjson (>=3.10.1,<4.0.0)
33
+ Requires-Dist: pympler (==1.0.1)
34
+ Requires-Dist: pypendency (>=0,<1) ; extra == "pypendency"
35
+ Requires-Dist: uuid-utils (>=0.9.0,<0.10.0)
36
+ Description-Content-Type: text/markdown
37
+
38
+ # Buz
39
+
40
+ [![PyPI version](https://badge.fury.io/py/buz.svg)](https://badge.fury.io/py/buz)
41
+ [![Python Support](https://img.shields.io/pypi/pyversions/buz.svg)](https://pypi.org/project/buz/)
42
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
43
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
44
+
45
+ **Buz** is a lightweight, simple, and extensible Python library that provides implementations of **Event**, **Command**, and **Query** buses following CQRS and Event-Driven Architecture patterns.
46
+
47
+ ## 📋 Table of Contents
48
+
49
+ - [Buz](#buz)
50
+ - [📋 Table of Contents](#-table-of-contents)
51
+ - [✨ Key Features](#-key-features)
52
+ - [🚀 Quick Start](#-quick-start)
53
+ - [Installation](#installation)
54
+ - [Basic Usage](#basic-usage)
55
+ - [Event Bus Example](#event-bus-example)
56
+ - [Command Bus Example](#command-bus-example)
57
+ - [Query Bus Example](#query-bus-example)
58
+ - [🏗️ Architecture](#️-architecture)
59
+ - [Event Bus](#event-bus)
60
+ - [Command Bus](#command-bus)
61
+ - [Query Bus](#query-bus)
62
+ - [🔧 Advanced Features](#-advanced-features)
63
+ - [Middleware System](#middleware-system)
64
+ - [Transactional Outbox Pattern](#transactional-outbox-pattern)
65
+ - [RabbitMQ](#rabbitmq)
66
+ - [Kafka Integration](#kafka-integration)
67
+ - [Async Support](#async-support)
68
+ - [📦 Message Brokers](#-message-brokers)
69
+ - [Supported Brokers](#supported-brokers)
70
+ - [🧪 Testing](#-testing)
71
+ - [🔗 Related Projects](#-related-projects)
72
+ - [📋 Requirements](#-requirements)
73
+ - [🤝 Contributing](#-contributing)
74
+ - [Development Setup](#development-setup)
75
+ - [📄 License](#-license)
76
+ - [📚 Documentation](#-documentation)
77
+ - [🙋‍♀️ Support](#️-support)
78
+
79
+ ## ✨ Key Features
80
+
81
+ - 🚌 **Bus Types**: Event, Command, and Query buses for clean architecture
82
+ - 🔄 **Sync & Async Support**: Both synchronous and asynchronous implementations
83
+ - 🔧 **Middleware System**: Extensible middleware for cross-cutting concerns
84
+ - 📦 **Message Brokers**: Support for Kafka, RabbitMQ (via Kombu), and in-memory
85
+ - 🔒 **Transactional Outbox**: Reliable event publishing with transactional guarantees
86
+ - 🎯 **Dependency Injection**: Built-in locator pattern for handler resolution
87
+ - 📝 **Type Safety**: Fully typed with mypy support
88
+ - 🪶 **Lightweight**: Minimal dependencies, maximum flexibility
89
+
90
+ ## 🚀 Quick Start
91
+
92
+ ### Installation
93
+
94
+ ```bash
95
+ # Basic installation
96
+ pip install buz
97
+
98
+ # With Kafka support
99
+ pip install buz[aiokafka]
100
+
101
+ # With RabbitMQ support
102
+ pip install buz[kombu]
103
+
104
+ # With dependency injection
105
+ pip install buz[pypendency]
106
+ ```
107
+
108
+ ### Basic Usage
109
+
110
+ #### Event Bus Example
111
+
112
+ ```python
113
+ from dataclasses import dataclass
114
+ from buz import Message
115
+ from buz.event import Event, BaseSubscriber
116
+ from buz.event.sync import SyncEventBus
117
+ from buz.locator.sync import InstanceLocator
118
+
119
+ @dataclass(frozen=True)
120
+ class UserCreated(Event):
121
+ user_id: str
122
+ email: str
123
+
124
+ class EmailSubscriber(BaseSubscriber):
125
+ def consume(self, event: UserCreated) -> None:
126
+ print(f"Sending welcome email to {event.email}")
127
+
128
+ class AnalyticsSubscriber(BaseSubscriber):
129
+ def consume(self, event: UserCreated) -> None:
130
+ print(f"Tracking user creation: {event.user_id}")
131
+
132
+ # Setup
133
+ locator: InstanceLocator = InstanceLocator()
134
+ locator.register(EmailSubscriber())
135
+ locator.register(AnalyticsSubscriber())
136
+
137
+ event_bus = SyncEventBus(locator)
138
+
139
+ # Usage
140
+ event = UserCreated(user_id="123", email="user@example.com")
141
+ event_bus.publish(event)
142
+ ```
143
+
144
+ #### Command Bus Example
145
+
146
+ ```python
147
+ from dataclasses import dataclass
148
+ from buz.command import Command
149
+ from buz.command.synchronous import BaseCommandHandler
150
+ from buz.command.synchronous.self_process import SelfProcessCommandBus
151
+ from buz.locator.sync import InstanceLocator
152
+
153
+ @dataclass(frozen=True)
154
+ class CreateUser(Command):
155
+ email: str
156
+ name: str
157
+
158
+ class CreateUserCommandHandler(BaseCommandHandler):
159
+ def handle(self, command: CreateUser) -> None:
160
+ # Business logic here
161
+ print(f"Creating user: {command.name} ({command.email})")
162
+
163
+ # Setup
164
+ locator = InstanceLocator()
165
+ locator.register(CreateUserCommandHandler())
166
+
167
+ command_bus = SelfProcessCommandBus(locator)
168
+
169
+ # Usage
170
+ command = CreateUser(email="user@example.com", name="John Doe")
171
+ command_bus.handle(command)
172
+ ```
173
+
174
+ #### Query Bus Example
175
+
176
+ ```python
177
+ from dataclasses import dataclass
178
+ from buz.query import Query, QueryResponse
179
+ from buz.query.synchronous import BaseQueryHandler
180
+ from buz.query.synchronous.self_process import SelfProcessQueryBus
181
+ from buz.locator.sync import InstanceLocator
182
+
183
+ @dataclass(frozen=True)
184
+ class GetUser(Query):
185
+ user_id: str
186
+
187
+ @dataclass(frozen=True)
188
+ class User:
189
+ user_id: str
190
+ name: str
191
+ email: str
192
+
193
+ class GetUserQueryHandler(BaseQueryHandler):
194
+ def handle(self, query: GetUser) -> QueryResponse:
195
+ # Business logic here
196
+ return QueryResponse(
197
+ content=User(
198
+ user_id=query.user_id,
199
+ name="John Doe",
200
+ email="john@example.com"
201
+ )
202
+ )
203
+
204
+ # Setup
205
+ locator = InstanceLocator()
206
+ locator.register(GetUserQueryHandler())
207
+
208
+ query_bus = SelfProcessQueryBus(locator)
209
+
210
+ # Usage
211
+ query = GetUser(user_id="123")
212
+ query_response = query_bus.handle(query)
213
+ user = query_response.content
214
+ print(f"User: {user.name}")
215
+ ```
216
+
217
+ ## 🏗️ Architecture
218
+
219
+ Buz implements the **Command Query Responsibility Segregation (CQRS)** pattern with distinct buses:
220
+
221
+ ### Event Bus
222
+
223
+ - **Purpose**: Publish domain events and notify multiple subscribers
224
+ - **Pattern**: Pub/Sub with multiple handlers per event
225
+ - **Use Cases**: Domain event broadcasting, eventual consistency, integration events
226
+
227
+ ### Command Bus
228
+
229
+ - **Purpose**: Execute business operations and commands
230
+ - **Pattern**: Single handler per command
231
+ - **Use Cases**: Business logic execution, write operations, state changes
232
+
233
+ ### Query Bus
234
+
235
+ - **Purpose**: Retrieve data and execute queries
236
+ - **Pattern**: Single handler per query with typed responses
237
+ - **Use Cases**: Data retrieval, read operations, projections
238
+
239
+ ## 🔧 Advanced Features
240
+
241
+ ### Middleware System
242
+
243
+ Add cross-cutting concerns like logging, validation, and metrics:
244
+
245
+ ```python
246
+ from datetime import datetime
247
+ from buz.event import Event, Subscriber
248
+ from buz.event.middleware import BasePublishMiddleware, BaseConsumeMiddleware
249
+ from buz.event.infrastructure.models.execution_context import ExecutionContext
250
+
251
+ class LoggingPublishMiddleware(BasePublishMiddleware):
252
+ def _before_on_publish(self, event: Event) -> None:
253
+ print(f"Publishing event {event}")
254
+
255
+ def _after_on_publish(self, event: Event) -> None:
256
+ return
257
+
258
+ class MetricsConsumeMiddleware(BaseConsumeMiddleware):
259
+ def __init__(self) -> None:
260
+ self.__consumption_start_time: datetime = datetime.now()
261
+
262
+ def _before_on_consume(
263
+ self,
264
+ event: Event,
265
+ subscriber: Subscriber,
266
+ execution_context: ExecutionContext,
267
+ ) -> None:
268
+ self.__consumption_start_time = datetime.now()
269
+
270
+ def _after_on_consume(
271
+ self,
272
+ event: Event,
273
+ subscriber: Subscriber,
274
+ execution_context: ExecutionContext,
275
+ ) -> None:
276
+ consumption_time_ms = int((datetime.now() - self.__consumption_start_time).total_seconds() * 1000)
277
+ print(
278
+ f"Subscriber {subscriber.fqn()} consumed event {event.id} successfully in {consumption_time_ms} ms"
279
+ )
280
+
281
+ # Apply middleware
282
+ event_bus = SyncEventBus(
283
+ locator=locator,
284
+ publish_middlewares=[LoggingPublishMiddleware()],
285
+ consume_middlewares=[MetricsConsumeMiddleware()]
286
+ )
287
+
288
+ # Usage
289
+ event = UserCreated(user_id="123", email="user@example.com")
290
+ event_bus.publish(event)
291
+ ```
292
+
293
+ ### Transactional Outbox Pattern
294
+
295
+ Ensure reliable event publishing with database transactions:
296
+
297
+ ```python
298
+ from buz.event.transactional_outbox import TransactionalOutboxEventBus
299
+
300
+ # Configure with your database and event bus
301
+ transactional_outbox_bus = TransactionalOutboxEventBus(
302
+ outbox_repository=your_outbox_repository,
303
+ event_to_outbox_record_translator=your_outbox_record_translator,
304
+ ...
305
+ )
306
+
307
+ # Events are stored in database, published later by worker
308
+ transactional_outbox_bus.publish(event)
309
+ ```
310
+
311
+ ### RabbitMQ
312
+
313
+ ```python
314
+ from buz.event.infrastructure.kombu.kombu_event_bus import KombuEventBus
315
+
316
+ kombu_event_bus = KombuEventBus(
317
+ connection=your_connection,
318
+ publish_strategy=your_publish_strategy,
319
+ publish_retry_policy=you_publish_retry_policy,
320
+ ...
321
+ )
322
+
323
+ # Published and consumed in RabbitMQ
324
+ kombu_event_bus.publish(event)
325
+ ```
326
+
327
+ ### Kafka Integration
328
+
329
+ ```python
330
+ from buz.kafka import BuzKafkaEventBus
331
+
332
+ kafka_bus = KafkaEventBus(
333
+ publish_strategy=your_publish_strategy,
334
+ producer=your_producer,
335
+ logger=your_logger,
336
+ ...
337
+ )
338
+
339
+ # Published and consumed in Kafka
340
+ kafka_bus.publish(event)
341
+ ```
342
+
343
+ ### Async Support
344
+
345
+ ```python
346
+ from buz.event.async_event_bus import AsyncEventBus
347
+ from buz.query.asynchronous import QueryBus as AsyncQueryBus
348
+ from buz.command.asynchronous import CommandHandler as AsyncCommandHandler
349
+
350
+
351
+ # Async event bus
352
+ async_event_bus = AsyncEventBus(locator)
353
+ await async_event_bus.publish(event)
354
+
355
+ # Async query bus
356
+ async_query_bus = AsyncQueryBus(locator)
357
+ await async_query_bus.handle(event)
358
+
359
+ # Async command bus
360
+ async_command_bus = AsyncCommandBus(locator)
361
+ await async_command_bus.handle(command)
362
+ ```
363
+
364
+ ## 📦 Message Brokers
365
+
366
+ ### Supported Brokers
367
+
368
+ | Broker | Sync | Async | Installation |
369
+ | --------- | ---- | ----- | --------------------------- |
370
+ | In-Memory | ✅ | ✅ | Built-in |
371
+ | Kafka | ✅ | ✅ | `pip install buz[aiokafka]` |
372
+ | RabbitMQ | ✅ | ❌ | `pip install buz[kombu]` |
373
+
374
+ ## 🧪 Testing
375
+
376
+ Buz includes testing utilities for unit and integration tests:
377
+
378
+ ```python
379
+ from buz.event.sync import SyncEventBus
380
+ from buz.locator.sync import InstanceLocator
381
+
382
+ test_locator = InstanceLocator()
383
+ test_bus = SyncEventBus(test_locator)
384
+
385
+ test_locator.register(EmailSubscriber())
386
+ test_bus.publish(UserCreated(user_id="123", email="test@example.com"))
387
+ ```
388
+
389
+ ## 🔗 Related Projects
390
+
391
+ - **[buz-fever-shared](https://github.com/Feverup/buz-fever-shared)**: Opinionated utilities and standards for Buz
392
+ - **[buz-basic-example](https://github.com/Feverup/buz-basic-example)**: Complete example project with Docker setup
393
+
394
+ ## 📋 Requirements
395
+
396
+ - Python 3.9+
397
+ - Optional dependencies based on features used
398
+
399
+ ## 🤝 Contributing
400
+
401
+ We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.
402
+
403
+ ### Development Setup
404
+
405
+ ```bash
406
+ # Clone the repository
407
+ git clone https://github.com/Feverup/buz.git
408
+ cd buz
409
+
410
+ # Install with development dependencies
411
+ make build
412
+
413
+ # Run tests
414
+ make test
415
+
416
+ # Run linting
417
+ make lint
418
+
419
+ # Format code
420
+ make format
421
+ ```
422
+
423
+ ## 📄 License
424
+
425
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
426
+
427
+ ## 📚 Documentation
428
+
429
+ - [Changelog](CHANGELOG.md) - Release notes and version history
430
+
431
+ ## 🙋‍♀️ Support
432
+
433
+ - Create an [Issue](https://github.com/Feverup/buz/issues) for bug reports or feature requests
434
+
435
+ ---
436
+
437
+ Made with ❤️ by the [Fever Platform Team](platform@feverup.com)
438
+
@@ -1,9 +1,9 @@
1
1
  buz/__init__.py,sha256=ctEyEjRm2Z2te3dZ1CLTbJw8_MmVFFqTflZowKeMSvM,109
2
2
  buz/command/__init__.py,sha256=iwaODtzgrlWc1IyD-3YPDN2jbTtwqog9_rS-P-Gmi6k,223
3
3
  buz/command/asynchronous/__init__.py,sha256=aMvcBRDvIP9SUXh1B8BTQS_VPkntem3BomBI_ypEs4U,271
4
- buz/command/asynchronous/base_command_handler.py,sha256=Fm5SYqoki2DXcZUhQmuDhSnZpgxyaid0PRT8rtxZVl4,1128
4
+ buz/command/asynchronous/base_command_handler.py,sha256=8ADx07Rwtnxbmz4f0L65uI8cJRkHr3itzyykC--AmBA,1393
5
5
  buz/command/asynchronous/command_bus.py,sha256=mQPzemGvC14fRADUv6_jA8qlBLSIGmXVorM6xo_V6_A,181
6
- buz/command/asynchronous/command_handler.py,sha256=lHCS4FyoAwq9aDpfy1u11tAtBRxYMXwSxAWhX7-qyX8,330
6
+ buz/command/asynchronous/command_handler.py,sha256=ffVqrE_rK_nN4Yf82A6MQxb7O4OeEfkgR2ioBVGVNCs,437
7
7
  buz/command/asynchronous/middleware/__init__.py,sha256=1CGYsALue16-2nkxg7lHhxiS5EQWX6R6Hr4Lr0qwOcQ,409
8
8
  buz/command/asynchronous/middleware/base_handle_middleware.py,sha256=xvGZW5rzPz13f08bw0QigSszzSwO16hKqL4oKW_IoSs,788
9
9
  buz/command/asynchronous/middleware/handle_middleware.py,sha256=2lCgRRqWkiJLbys4YzWSUupVt8S50vwfEWzVu8PSqjw,449
@@ -13,9 +13,9 @@ buz/command/asynchronous/self_process/self_process_command_bus.py,sha256=PjP46OI
13
13
  buz/command/command.py,sha256=wYpjD16PH23r2VapFEMa-wnm3xNjkR22FXtuLoKfnu0,193
14
14
  buz/command/more_than_one_command_handler_related_exception.py,sha256=dNCMXCAKVckKgrgROyJWqaEyWntyByQKsa6gQfaKE4U,554
15
15
  buz/command/synchronous/__init__.py,sha256=ZAH35jpte6zpxb70iQfZfGSg_OsXqVNYwNkCJy7Qnzk,268
16
- buz/command/synchronous/base_command_handler.py,sha256=P0tyjCh4mKKcBV67JR4m5qosXpTk6qemG-7Zpdu6PD8,1127
16
+ buz/command/synchronous/base_command_handler.py,sha256=GkmxttA1_Wu2X5O7iR-tLRdnmT-JDgeyURPwkjLPGhg,1393
17
17
  buz/command/synchronous/command_bus.py,sha256=FHJH4lerThu5fWRISM0VIK8ebyfqgDGqNNCqItbmGPI,175
18
- buz/command/synchronous/command_handler.py,sha256=nswGhsUBtCHjXVHCN3pToa9WYPab0bvTcTuSPZZbxBU,316
18
+ buz/command/synchronous/command_handler.py,sha256=pP11Njbth89NQiVPqlALtKmabVtOX4sucdbiCp-sceI,422
19
19
  buz/command/synchronous/middleware/__init__.py,sha256=wE97veOW2cCGpTZ-3bvc3aU6NdQmSOYfdX9kAUETJ0w,406
20
20
  buz/command/synchronous/middleware/base_handle_middleware.py,sha256=qHnbucL7j6Dnw7E8ACBf32pzDD9squYPp6UiK2heb5A,774
21
21
  buz/command/synchronous/middleware/handle_middleware.py,sha256=oIsmB30mu-Cd9IQc1qMKbUIaIMHipSEXOw2swVrtbkk,420
@@ -59,9 +59,10 @@ buz/event/infrastructure/buz_kafka/exceptions/__init__.py,sha256=47DEQpj8HBSa-_T
59
59
  buz/event/infrastructure/buz_kafka/exceptions/kafka_event_bus_config_not_valid_exception.py,sha256=VUKZXA2ygjg21P4DADFl_Tace6RwSXia1MRYvJypxbM,135
60
60
  buz/event/infrastructure/buz_kafka/exceptions/max_consumer_retry_exception.py,sha256=5O33uUC8FLILY1C13tQwkfsLSXrmbe0vMaUfBmOuXdU,264
61
61
  buz/event/infrastructure/buz_kafka/exceptions/retry_exception.py,sha256=Fq9kvI3DpFsGD3x2icmQ1fYIsuKZAFqI3tCibAuEtSQ,441
62
- buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py,sha256=KDJjeY1z8ZJGKGmEUB7OxknenBCI0o0WkgcNkNmQITU,6804
62
+ buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py,sha256=zQg2QJFT5-NUea5uP0RiWzmJHPqs_oJlcbDRDzstSeU,7536
63
63
  buz/event/infrastructure/buz_kafka/kafka_event_subscriber_executor.py,sha256=EyG2vsFYErWAyqxdXqSwxx5Zi_y0d6i0h05XavJMnxg,254
64
- buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py,sha256=tuK9gHJXuGwHtfjYNEoLi-aKOGv_YjOeqPg_1zns7NM,6849
64
+ buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py,sha256=i3Gr173p91UZ4N-giQkZHVikCntu6A2ihVlqkUsReOc,7636
65
+ buz/event/infrastructure/buz_kafka/models/kafka_delivery_context.py,sha256=Kvi1Pq9EvR_UQ6e-DbvB2l3m7rTvq2k4UmEZuHUg-qU,259
65
66
  buz/event/infrastructure/buz_kafka/publish_strategy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
67
  buz/event/infrastructure/buz_kafka/publish_strategy/publish_strategy.py,sha256=zIkgMnUU7ueG6QHEubMzdTHOtqdldIbS7k5FDLNmqVk,178
67
68
  buz/event/infrastructure/buz_kafka/publish_strategy/topic_per_event_kafka_publish_strategy.py,sha256=aLKj6GyLJNcMbuDA1QBa-RzWKBHEorBuPFkkqo_H60k,405
@@ -70,28 +71,32 @@ buz/event/infrastructure/kombu/allowed_kombu_serializer.py,sha256=LQ6futYsInawTC
70
71
  buz/event/infrastructure/kombu/consume_strategy/__init__.py,sha256=6dnAv-bOxoDL31gQD1dErRocdJvkLHTgdqeb4S33eWc,302
71
72
  buz/event/infrastructure/kombu/consume_strategy/consume_strategy.py,sha256=Zsv7QVpZXRLYvlV2nRbSdSwT_FgEELLyzUxdT6DyX8Q,179
72
73
  buz/event/infrastructure/kombu/consume_strategy/queue_per_subscriber_consume_strategy.py,sha256=Vsa1uC7dwS3jJ-dp_lvrE-hVWnN91-ma8oVqdLuXHMo,786
73
- buz/event/infrastructure/kombu/kombu_consumer.py,sha256=cCTlbGM3LomTsNu6YmWvXrA3Gsn8_LkM4USbmQ8uYDk,7842
74
+ buz/event/infrastructure/kombu/kombu_consumer.py,sha256=hGpPRUOVlu9zba_2XYsIhYXdXkja5j_3w-oh-cgovFM,8307
74
75
  buz/event/infrastructure/kombu/kombu_event_bus.py,sha256=VSLBtamp-YOta4KyqmfXvDurvPiHZSL9QPCozMK3Qyw,4017
76
+ buz/event/infrastructure/kombu/models/kombu_delivery_context.py,sha256=oj6IBEj19fUs0U1HwZll_uIEORABiyrr6Z_WotGJexs,191
75
77
  buz/event/infrastructure/kombu/publish_strategy/__init__.py,sha256=96ssn7ydJwLXYoVyrhfGcwCpXr4_5Sl0DbN6UCoeNc8,315
76
78
  buz/event/infrastructure/kombu/publish_strategy/fanout_exchange_per_event_publish_strategy.py,sha256=Pw85A1oI-cPtzHCQTr0XHQjb7-u9LVmKR3eBIonHsUU,397
77
79
  buz/event/infrastructure/kombu/publish_strategy/publish_strategy.py,sha256=mcpXSRPbIYedt1vsoiBBAzqzR3E6o77ZzF6IOFsVRUw,309
78
80
  buz/event/infrastructure/kombu/retry_strategy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
81
  buz/event/infrastructure/kombu/retry_strategy/publish_retry_policy.py,sha256=2wNMuIYRz8zECTRkcEwHX6INT1xc403MeUcZul_q0yE,562
80
82
  buz/event/infrastructure/kombu/retry_strategy/simple_publish_retry_policy.py,sha256=kuHXdMKuG87NBQlrABabF-Wl-r3QgS2f9zEUapzMnd0,1357
83
+ buz/event/infrastructure/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
84
  buz/event/infrastructure/models/consuming_task.py,sha256=GJvn6fGTN5ZQJaOuQCX17JP7SInIGvTLTk7DLoqnLQ4,302
85
+ buz/event/infrastructure/models/delivery_context.py,sha256=D6_wppbYEkfoBgDaPeUaQPWFUMvZiHn-4QaAxDmWUZo,92
86
+ buz/event/infrastructure/models/execution_context.py,sha256=tohrJMSHWA5U7WByGE47LSjteAN8_IMyHoXtjyrHJMM,200
82
87
  buz/event/infrastructure/queue/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
88
  buz/event/meta_base_subscriber.py,sha256=IP2Siol98OmoeCoOISiaCJxgxJG2SCrhmbAN4t01aWg,698
84
89
  buz/event/meta_subscriber.py,sha256=JPhhRqHkDOBWhuqtPmseUtAoYde1OmTBViqVbLBhvME,359
85
90
  buz/event/middleware/__init__.py,sha256=vbmskMeXurTSgwXqPsRQBydHhNAYnbEoqFc1pqemI7Y,897
86
- buz/event/middleware/async_consume_middleware.py,sha256=314z7ZyhvQIvi90kEO0t-FlnHSyRjArk3RqKOdDE6bM,459
87
- buz/event/middleware/async_consume_middleware_chain_resolver.py,sha256=Hw75JAs5pyZVDi7-nD4I1nbUXjwYpHQW9PctafGS4ks,1193
91
+ buz/event/middleware/async_consume_middleware.py,sha256=n_EsDMNFgOIu7UVPGRC0iaxCIfGL-p_3xo5Avq43zYA,640
92
+ buz/event/middleware/async_consume_middleware_chain_resolver.py,sha256=dIiyob5TYavjcD5QL31_Yqya9x3ujWtL7cUZK4bEVvk,1459
88
93
  buz/event/middleware/async_publish_middleware.py,sha256=JIxbRx7HVf_Q1iEziN_5RKGVJ-Oen_f1c3OL9QLmoxE,358
89
94
  buz/event/middleware/async_publish_middleware_chain_resolver.py,sha256=Hqj8CRZXJD6h9KuJaKl88iToOFN7BijoatoDo66En8w,1016
90
- buz/event/middleware/base_async_consume_middleware.py,sha256=7yncBDiAJYgAhKvXVqkY0jf-dH4Ug-qwqzd_DQESmjg,795
91
- buz/event/middleware/base_consume_middleware.py,sha256=9G1jsr_Wm-avsTfWAndi5_tf4WW6dSLwQ3rN0-jc7AE,651
95
+ buz/event/middleware/base_async_consume_middleware.py,sha256=9IAY-c57PlUq93rAUB3aVDXBVCNH_UO57xHOTiYeWvw,1167
96
+ buz/event/middleware/base_consume_middleware.py,sha256=GQxuAjHFVs_nKZXvYjBn9h4EZyUFHz1xdwl6qW5TVo8,912
92
97
  buz/event/middleware/base_publish_middleware.py,sha256=vtM8oA4LZjbZn4omPy-cIAUxQQwL-_Xb4ScU85DwjMU,531
93
- buz/event/middleware/consume_middleware.py,sha256=BCcs1LgIc5YZx5nf7nE_bMuiiXxscqBE4LqD-nd4JS0,363
94
- buz/event/middleware/consume_middleware_chain_resolver.py,sha256=_btZkLn_HIBiQls5apOZDJ6B0STeNBh_Rek4nZgZizQ,1028
98
+ buz/event/middleware/consume_middleware.py,sha256=MEzfXfV1hMI0TKHU9f4zqWZsNykgu02X2lr9ZM1WLaw,511
99
+ buz/event/middleware/consume_middleware_chain_resolver.py,sha256=--Dz--OqSJnrkkp2UGdLL4QqzGw2Sbe74i_5zSVs9HM,1277
95
100
  buz/event/middleware/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
101
  buz/event/middleware/exceptions/event_already_in_progress_exception.py,sha256=1Wouo05mddhdBxcWuhHr1rLassTux76AWDdyXx7YoDI,296
97
102
  buz/event/middleware/publish_middleware.py,sha256=mSuXfQSUf_miwx0QGuYmME5TOrkzX53AZ98ZwCC6zU8,315
@@ -112,7 +117,9 @@ buz/event/strategies/retry/max_retries_negative_exception.py,sha256=UdM5T4cxRv_a
112
117
  buz/event/strategies/retry/reject_callback.py,sha256=TnmUt0AkB2DEQMieec9TtB7IAkRHdFAFepAclbiCRns,316
113
118
  buz/event/subscriber.py,sha256=WxppO8PFP5zO-gwLZNg1DKSY_uFdsF8JgWIJa6nTTds,237
114
119
  buz/event/sync/__init__.py,sha256=uJmU80PGVNNL2HoRFXp4loQTn1VK8gLo-hMEvgVPpBQ,91
115
- buz/event/sync/sync_event_bus.py,sha256=nXNJqoaWQWV3asYCAIReH2nN5AOjvJH2OFODHOrWM6M,1403
120
+ buz/event/sync/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
+ buz/event/sync/models/sync_delivery_context.py,sha256=LHjrS6gV-19NEKwtAXVmefjPd-Dsp_Ym8RZb84T3lm8,190
122
+ buz/event/sync/sync_event_bus.py,sha256=LTJHNKy8LrbygO343AA4Zt_hmgTP9uY6TLdjKs8LuHM,1821
116
123
  buz/event/transactional_outbox/__init__.py,sha256=k8ZBWCi12pWKXchHfgW_Raw4sVR8XkBLuPNW9jB9X2k,1381
117
124
  buz/event/transactional_outbox/event_to_outbox_record_translator.py,sha256=oSn1iQuW-cZLvlXYIJPnSwm3JYUwGMm9f1pqnlF0cJI,534
118
125
  buz/event/transactional_outbox/fqn_to_event_mapper.py,sha256=ujcq6CfYqRJtM8f3SEEltbWN0Ru7NM5JfrbNdh4nvhQ,773
@@ -136,7 +143,7 @@ buz/event/transactional_outbox/outbox_repository.py,sha256=Sn7aWaq1G6uiKXcV09l9L
136
143
  buz/event/transactional_outbox/transactional_outbox_event_bus.py,sha256=S2VIrKCyZG8vztgBagKOJUhp2oJhbLx6oGVHPBplRZ4,1676
137
144
  buz/event/transactional_outbox/transactional_outbox_worker.py,sha256=x6kf-Oc4oYKu9S4MTcCqd3VqPNURScTReYJ3Ahx4rKA,2221
138
145
  buz/event/worker.py,sha256=BL9TXB_kyr0Avql9fIcFm3CDNnXPvZB6O6BxVwjtCdA,942
139
- buz/handler.py,sha256=cZqV1NDPGVZQgJ3YSBDhOQ1sdJGdUopxi57yQ6fbPvc,272
146
+ buz/handler.py,sha256=W6jSTo5BNV9u9QKBaEMhLIa3tgQocd6oYEJf5K4EfEU,358
140
147
  buz/kafka/__init__.py,sha256=R3fcyET-SNEAvk_XlBQbHIbQVb63Qiz6lVrif3nDhNU,3435
141
148
  buz/kafka/domain/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
149
  buz/kafka/domain/exceptions/not_all_partition_assigned_exception.py,sha256=1Ky6gDh_baD6cGB0MBnjbkkLcw2zQU_kFXPpDZn56z0,400
@@ -153,7 +160,7 @@ buz/kafka/domain/models/kafka_connection_credentials.py,sha256=-9VbkY8etqQgjZVjS
153
160
  buz/kafka/domain/models/kafka_connection_plain_text_credentials.py,sha256=DzhJClYFGhZWpO82DNemJ_y1aMLotB0fVbD6-UrI2gA,588
154
161
  buz/kafka/domain/models/kafka_connection_sasl_credentials.py,sha256=SG45bU8EFlV0cUObkW_a0wvfRuZU6HelqQVPVu-EV0o,591
155
162
  buz/kafka/domain/models/kafka_consumer_record.py,sha256=2oJvTBAr8jQq4FglsSgtkno29XLmxgC49O6uriKCdqw,230
156
- buz/kafka/domain/models/kafka_poll_record.py,sha256=Yt55L6rGM_taJ615_YyO1gBJIgpVruD0VG0rgSLXSq4,305
163
+ buz/kafka/domain/models/kafka_poll_record.py,sha256=kaKk9m02c2JDt8LOuFECUKK0HYK8Zb-hEPWEmLhm1mc,324
157
164
  buz/kafka/domain/models/kafka_supported_compression_type.py,sha256=ZEY1kPzYQlkPhEg0y2EMdZXUQ_oSHhjbGj9MIQvU09E,141
158
165
  buz/kafka/domain/models/kafka_supported_sasl_mechanisms.py,sha256=ASyDaFgseQRcUJA2kubQSdCkG6KhGmpMAzTFj5NwK5w,212
159
166
  buz/kafka/domain/models/kafka_supported_security_protocols.py,sha256=ffY2-9sOj4XIkJTSQVkqeOb4KnuqEYXISDarfDN8r9Q,161
@@ -216,26 +223,26 @@ buz/middleware/middleware_chain_builder.py,sha256=D9zl5XSF5P65QpnPcbtyFaaVHqBTb6
216
223
  buz/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
217
224
  buz/query/__init__.py,sha256=Eq0ppBYFYaDp-Z7uViSqhuOBxjh_q8VSCbFdpMz3FsU,274
218
225
  buz/query/asynchronous/__init__.py,sha256=YhCudd43otBYDi6ZdisSjnAZ0psCkp_ZZ_pb36fWoMY,247
219
- buz/query/asynchronous/base_query_handler.py,sha256=Sj2tnluRvlImHyN6MrlKftLoavVkCWKxm55p2r64ej4,1094
226
+ buz/query/asynchronous/base_query_handler.py,sha256=148JQwx6Yvp_pCDJEdw98r1K0YSQBdNEq9GqwA_Q368,1484
220
227
  buz/query/asynchronous/middleware/__init__.py,sha256=aoei9p2Ti1biFCOAQpsDQ7H_s0Dt5hkWgALJHhfjpoE,404
221
228
  buz/query/asynchronous/middleware/base_handle_middleware.py,sha256=51FliRBVrobao3TSJnYKJz1fJPg8dxSymCFQRiClz9g,874
222
229
  buz/query/asynchronous/middleware/handle_middleware.py,sha256=LfQLKc4jIlUegbGbnMXqCSXgAl6NaRGqvKDN0GuvgY4,462
223
230
  buz/query/asynchronous/middleware/handle_middleware_chain_resolver.py,sha256=iA2faVRvNkuS5S4dB1buP25JGSqfBKBQIKg14hWis2U,1123
224
231
  buz/query/asynchronous/query_bus.py,sha256=L3VIw6VofJzJYH2oie5uFKH-dQ-M6a2VECTd6Seos_o,195
225
- buz/query/asynchronous/query_handler.py,sha256=E8fd49ZvguJLY7WvtbieTS_ksVt154uLVFggenTeZLw,334
232
+ buz/query/asynchronous/query_handler.py,sha256=Me80YBdGP368WYUhEY7n5AmwacFmdqFYyiM6TyDrqKE,501
226
233
  buz/query/asynchronous/self_process/__init__.py,sha256=5y0dGgeDq0ZPCrexVjvJWT6gix8lKd-7Iw7Z3H8dirc,126
227
234
  buz/query/asynchronous/self_process/self_process_query_bus.py,sha256=2PqbJGrjv7ULEAl0yIj-Gn4ylVc3_EvJ0VXIlzUlhNc,1217
228
235
  buz/query/more_than_one_query_handler_related_exception.py,sha256=sEfShwCB1VHdUbf02NSEAyv6pXx4GO9ram0AenBF_dE,516
229
236
  buz/query/query.py,sha256=_YGlCOfywRv4JaHBweIn2AdXMwM5g9UJCWLojNg-qCA,189
230
237
  buz/query/query_response.py,sha256=XaHBi0Vw_3Tw5IxnuMgenZCRH0B-IBR86mtyYwj_eWw,153
231
238
  buz/query/synchronous/__init__.py,sha256=pc56XeFQnTbXB-HEDa2DtvYo9wgKUUHHB3lsCKjv-L4,244
232
- buz/query/synchronous/base_query_handler.py,sha256=0Up77CW0Zk8Dr92u-pT712cGDj5OFUxCIHd6ewZJcNY,1093
239
+ buz/query/synchronous/base_query_handler.py,sha256=a78B0GVeAFScMbef4ii8cjJbVZR-m8WwkxBiWQ2Cfik,1483
233
240
  buz/query/synchronous/middleware/__init__.py,sha256=Yo66O_HODdEfJ-MR5FvWTu7_4UFQooYG8M2IB0crd6U,400
234
241
  buz/query/synchronous/middleware/base_handle_middleware.py,sha256=4lqJB2C-GHl3T5S5dVXp8qgwA-48Cmp8mfQy21-GxNI,846
235
242
  buz/query/synchronous/middleware/handle_middleware.py,sha256=Xr2HSlRrW3slluyUiJ6zH0Rw0oeWD3uMN-1hjuFbC_k,433
236
243
  buz/query/synchronous/middleware/handle_middleware_chain_resolver.py,sha256=OIpGLJ_2a8cGsp-LmA3Q1Lvb1pB65MIuA-geiPrQKHM,1070
237
244
  buz/query/synchronous/query_bus.py,sha256=eYl_sGH5TcELkOXc4RnV4Tkmcs-VLc1vzd-YMduQ1YI,189
238
- buz/query/synchronous/query_handler.py,sha256=2miSCBzVuD861mldG-XflkoKtpKO16Cdvb2bQBLQq9w,328
245
+ buz/query/synchronous/query_handler.py,sha256=q8zqXjU9btid_q4wbL73QgaiWjMzGDFvwZ5AQN4q0CA,505
239
246
  buz/query/synchronous/self_process/__init__.py,sha256=fU1OoXXXH5dMGKz8y7mwTVvyhNj6BCKDTxuxH_q-leM,125
240
247
  buz/query/synchronous/self_process/self_process_query_bus.py,sha256=pKGJxXBWtqU4i0fzb30OCNhAVPCkUh7IlfNzgAhCUC8,1157
241
248
  buz/query/synchronous/synced_async/__init__.py,sha256=TdFmIBeFIpl3Tvmh_FJpJMXJdPdfRxOstVqnPUi23mo,125
@@ -250,7 +257,7 @@ buz/serializer/message_to_json_bytes_serializer.py,sha256=RGZJ64t4t4Pz2FCASZZCv-
250
257
  buz/wrapper/__init__.py,sha256=GnRdJFcncn-qp0hzDG9dBHLmTJSbHFVjE_yr-MdW_n4,77
251
258
  buz/wrapper/async_to_sync.py,sha256=OfK-vrVUhuN-LLLvekLdMbQYtH0ue5lfbvuasj6ovMI,698
252
259
  buz/wrapper/event_loop.py,sha256=pfBJ1g-8A2a3YgW8Gf9Fg0kkewoh3-wgTy2KIFDyfHk,266
253
- buz-2.15.10rc6.dist-info/LICENSE,sha256=Jytu2S-2SPEgsB0y6BF-_LUxIWY7402fl0JSh36TLZE,1062
254
- buz-2.15.10rc6.dist-info/METADATA,sha256=hIQPwtZ0Kwc54AxWOljmfsUTbiAGGZt9OtWukGK1m1E,1601
255
- buz-2.15.10rc6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
256
- buz-2.15.10rc6.dist-info/RECORD,,
260
+ buz-2.15.12.dist-info/LICENSE,sha256=jcLgcIIVaBqaZNwe0kzGWSU99YgwMcI0IGv142wkYSM,1062
261
+ buz-2.15.12.dist-info/METADATA,sha256=0OTKNDoBKW4CPRuo5gFprqjtavCT7uL-qVJ1oTdWYZg,12680
262
+ buz-2.15.12.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
263
+ buz-2.15.12.dist-info/RECORD,,