jararaca 0.3.12a22__py3-none-any.whl → 0.3.13__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.
Potentially problematic release.
This version of jararaca might be problematic. Click here for more details.
- jararaca/__init__.py +8 -1
- jararaca/messagebus/worker.py +54 -50
- jararaca/microservice.py +28 -0
- jararaca/presentation/server.py +18 -36
- jararaca/scheduler/beat_worker.py +14 -13
- {jararaca-0.3.12a22.dist-info → jararaca-0.3.13.dist-info}/METADATA +1 -1
- {jararaca-0.3.12a22.dist-info → jararaca-0.3.13.dist-info}/RECORD +11 -11
- pyproject.toml +1 -1
- {jararaca-0.3.12a22.dist-info → jararaca-0.3.13.dist-info}/LICENSE +0 -0
- {jararaca-0.3.12a22.dist-info → jararaca-0.3.13.dist-info}/WHEEL +0 -0
- {jararaca-0.3.12a22.dist-info → jararaca-0.3.13.dist-info}/entry_points.txt +0 -0
jararaca/__init__.py
CHANGED
|
@@ -11,7 +11,12 @@ if TYPE_CHECKING:
|
|
|
11
11
|
retry_later,
|
|
12
12
|
use_bus_message_controller,
|
|
13
13
|
)
|
|
14
|
-
from jararaca.microservice import
|
|
14
|
+
from jararaca.microservice import (
|
|
15
|
+
AppContext,
|
|
16
|
+
AppInterceptor,
|
|
17
|
+
AppTransactionContext,
|
|
18
|
+
use_app_type,
|
|
19
|
+
)
|
|
15
20
|
from jararaca.observability.interceptor import ObservabilityInterceptor
|
|
16
21
|
from jararaca.observability.providers.otel import OtelObservabilityProvider
|
|
17
22
|
from jararaca.persistence.sort_filter import (
|
|
@@ -308,6 +313,7 @@ if TYPE_CHECKING:
|
|
|
308
313
|
# Exception classes
|
|
309
314
|
"TimeoutException",
|
|
310
315
|
"AppTransactionContext",
|
|
316
|
+
"use_app_type",
|
|
311
317
|
"AppContext",
|
|
312
318
|
"ControllerMemberReflect",
|
|
313
319
|
"ControllerReflect",
|
|
@@ -544,6 +550,7 @@ _dynamic_imports: "dict[str, tuple[str, str, str | None]]" = {
|
|
|
544
550
|
"AppContext": (__SPEC_PARENT__, "microservice", None),
|
|
545
551
|
"AppInterceptor": (__SPEC_PARENT__, "microservice", None),
|
|
546
552
|
"AppTransactionContext": (__SPEC_PARENT__, "microservice", None),
|
|
553
|
+
"use_app_type": (__SPEC_PARENT__, "microservice", None),
|
|
547
554
|
"ControllerMemberReflect": (__SPEC_PARENT__, "reflect.controller_inspect", None),
|
|
548
555
|
"ControllerReflect": (__SPEC_PARENT__, "reflect.controller_inspect", None),
|
|
549
556
|
}
|
jararaca/messagebus/worker.py
CHANGED
|
@@ -58,6 +58,7 @@ from jararaca.microservice import (
|
|
|
58
58
|
SchedulerTransactionData,
|
|
59
59
|
ShutdownState,
|
|
60
60
|
provide_shutdown_state,
|
|
61
|
+
providing_app_type,
|
|
61
62
|
)
|
|
62
63
|
from jararaca.scheduler.decorators import ScheduledActionData
|
|
63
64
|
from jararaca.utils.rabbitmq_utils import RabbitmqUtils
|
|
@@ -1725,61 +1726,64 @@ class MessageBusWorker:
|
|
|
1725
1726
|
async def start_async(self) -> None:
|
|
1726
1727
|
all_message_handlers_set: MESSAGE_HANDLER_DATA_SET = set()
|
|
1727
1728
|
all_scheduled_actions_set: SCHEDULED_ACTION_DATA_SET = set()
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
if controller is None:
|
|
1733
|
-
continue
|
|
1734
|
-
|
|
1735
|
-
instance: Any = self.container.get_by_type(instance_class)
|
|
1736
|
-
|
|
1737
|
-
factory = controller.get_messagebus_factory()
|
|
1738
|
-
handlers, schedulers = factory(instance)
|
|
1739
|
-
|
|
1740
|
-
message_handler_data_map: dict[str, MessageHandlerData] = {}
|
|
1741
|
-
all_scheduled_actions_set.update(schedulers)
|
|
1742
|
-
for handler_data in handlers:
|
|
1743
|
-
message_type = handler_data.spec.message_type
|
|
1744
|
-
topic = message_type.MESSAGE_TOPIC
|
|
1745
|
-
|
|
1746
|
-
# Filter handlers by name if specified
|
|
1747
|
-
if (
|
|
1748
|
-
self.handler_names is not None
|
|
1749
|
-
and handler_data.spec.name is not None
|
|
1750
|
-
):
|
|
1751
|
-
if handler_data.spec.name not in self.handler_names:
|
|
1752
|
-
continue
|
|
1753
|
-
elif (
|
|
1754
|
-
self.handler_names is not None
|
|
1755
|
-
and handler_data.spec.name is None
|
|
1756
|
-
):
|
|
1757
|
-
# Skip handlers without names when filtering is requested
|
|
1758
|
-
continue
|
|
1729
|
+
with providing_app_type("worker"):
|
|
1730
|
+
async with self.lifecycle():
|
|
1731
|
+
for instance_class in self.app.controllers:
|
|
1732
|
+
controller = MessageBusController.get_messagebus(instance_class)
|
|
1759
1733
|
|
|
1760
|
-
if
|
|
1761
|
-
topic in message_handler_data_map
|
|
1762
|
-
and message_type.MESSAGE_TYPE == "task"
|
|
1763
|
-
):
|
|
1764
|
-
logger.warning(
|
|
1765
|
-
"Task handler for topic '%s' already registered. Skipping"
|
|
1766
|
-
% topic
|
|
1767
|
-
)
|
|
1734
|
+
if controller is None:
|
|
1768
1735
|
continue
|
|
1769
|
-
message_handler_data_map[topic] = handler_data
|
|
1770
|
-
all_message_handlers_set.add(handler_data)
|
|
1771
1736
|
|
|
1772
|
-
|
|
1737
|
+
instance: Any = self.container.get_by_type(instance_class)
|
|
1773
1738
|
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1739
|
+
factory = controller.get_messagebus_factory()
|
|
1740
|
+
handlers, schedulers = factory(instance)
|
|
1741
|
+
|
|
1742
|
+
message_handler_data_map: dict[str, MessageHandlerData] = {}
|
|
1743
|
+
all_scheduled_actions_set.update(schedulers)
|
|
1744
|
+
for handler_data in handlers:
|
|
1745
|
+
message_type = handler_data.spec.message_type
|
|
1746
|
+
topic = message_type.MESSAGE_TOPIC
|
|
1747
|
+
|
|
1748
|
+
# Filter handlers by name if specified
|
|
1749
|
+
if (
|
|
1750
|
+
self.handler_names is not None
|
|
1751
|
+
and handler_data.spec.name is not None
|
|
1752
|
+
):
|
|
1753
|
+
if handler_data.spec.name not in self.handler_names:
|
|
1754
|
+
continue
|
|
1755
|
+
elif (
|
|
1756
|
+
self.handler_names is not None
|
|
1757
|
+
and handler_data.spec.name is None
|
|
1758
|
+
):
|
|
1759
|
+
# Skip handlers without names when filtering is requested
|
|
1760
|
+
continue
|
|
1761
|
+
|
|
1762
|
+
if (
|
|
1763
|
+
topic in message_handler_data_map
|
|
1764
|
+
and message_type.MESSAGE_TYPE == "task"
|
|
1765
|
+
):
|
|
1766
|
+
logger.warning(
|
|
1767
|
+
"Task handler for topic '%s' already registered. Skipping"
|
|
1768
|
+
% topic
|
|
1769
|
+
)
|
|
1770
|
+
continue
|
|
1771
|
+
message_handler_data_map[topic] = handler_data
|
|
1772
|
+
all_message_handlers_set.add(handler_data)
|
|
1773
|
+
|
|
1774
|
+
broker_backend = get_message_broker_backend_from_url(
|
|
1775
|
+
url=self.backend_url
|
|
1776
|
+
)
|
|
1777
|
+
|
|
1778
|
+
consumer = self._consumer = create_message_bus(
|
|
1779
|
+
broker_url=self.broker_url,
|
|
1780
|
+
broker_backend=broker_backend,
|
|
1781
|
+
scheduled_actions=all_scheduled_actions_set,
|
|
1782
|
+
message_handler_set=all_message_handlers_set,
|
|
1783
|
+
uow_context_provider=self.uow_context_provider,
|
|
1784
|
+
)
|
|
1781
1785
|
|
|
1782
|
-
|
|
1786
|
+
await consumer.consume()
|
|
1783
1787
|
|
|
1784
1788
|
def start_sync(self) -> None:
|
|
1785
1789
|
|
jararaca/microservice.py
CHANGED
|
@@ -59,6 +59,8 @@ class WebSocketTransactionData:
|
|
|
59
59
|
context_type: Literal["websocket"] = "websocket"
|
|
60
60
|
|
|
61
61
|
|
|
62
|
+
APP_TYPE = Literal["http", "worker", "beat"]
|
|
63
|
+
|
|
62
64
|
TransactionData = (
|
|
63
65
|
MessageBusTransactionData
|
|
64
66
|
| HttpTransactionData
|
|
@@ -367,6 +369,32 @@ def provide_shutdown_state(
|
|
|
367
369
|
shutdown_state_ctx.reset(token)
|
|
368
370
|
|
|
369
371
|
|
|
372
|
+
app_type_ctx = ContextVar[APP_TYPE]("app_type")
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def use_app_type() -> APP_TYPE:
|
|
376
|
+
"""
|
|
377
|
+
Returns the current application type.
|
|
378
|
+
This function is used to access the application type in the context of an application transaction.
|
|
379
|
+
If no context is set, it raises a LookupError.
|
|
380
|
+
"""
|
|
381
|
+
return app_type_ctx.get()
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
@contextmanager
|
|
385
|
+
def providing_app_type(app_type: APP_TYPE) -> Generator[None, None, None]:
|
|
386
|
+
"""
|
|
387
|
+
Context manager to provide the application type.
|
|
388
|
+
This is used to set the application type for the current transaction.
|
|
389
|
+
"""
|
|
390
|
+
token = app_type_ctx.set(app_type)
|
|
391
|
+
try:
|
|
392
|
+
yield
|
|
393
|
+
finally:
|
|
394
|
+
with suppress(ValueError):
|
|
395
|
+
app_type_ctx.reset(token)
|
|
396
|
+
|
|
397
|
+
|
|
370
398
|
__all__ = [
|
|
371
399
|
"AppTransactionContext",
|
|
372
400
|
"AppInterceptor",
|
jararaca/presentation/server.py
CHANGED
|
@@ -17,6 +17,7 @@ from jararaca.microservice import (
|
|
|
17
17
|
ShutdownState,
|
|
18
18
|
WebSocketTransactionData,
|
|
19
19
|
provide_shutdown_state,
|
|
20
|
+
providing_app_type,
|
|
20
21
|
)
|
|
21
22
|
from jararaca.presentation.decorators import RestController
|
|
22
23
|
from jararaca.presentation.http_microservice import HttpMicroservice
|
|
@@ -37,49 +38,30 @@ class HttpAppLifecycle:
|
|
|
37
38
|
|
|
38
39
|
@asynccontextmanager
|
|
39
40
|
async def __call__(self, api: FastAPI) -> AsyncGenerator[None, None]:
|
|
40
|
-
|
|
41
|
+
with providing_app_type("http"):
|
|
42
|
+
async with self.lifecycle():
|
|
41
43
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
# for interceptor in self.lifecycle.initialized_interceptors
|
|
45
|
-
# if isinstance(interceptor, WebSocketInterceptor)
|
|
46
|
-
# ]
|
|
44
|
+
for controller_t in self.lifecycle.app.controllers:
|
|
45
|
+
controller = RestController.get_controller(controller_t)
|
|
47
46
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# self.lifecycle.app, self.lifecycle.container, self.uow_provider
|
|
51
|
-
# )
|
|
47
|
+
if controller is None:
|
|
48
|
+
continue
|
|
52
49
|
|
|
53
|
-
|
|
50
|
+
instance: Any = self.lifecycle.container.get_by_type(controller_t)
|
|
54
51
|
|
|
55
|
-
|
|
56
|
-
controller = RestController.get_controller(controller_t)
|
|
52
|
+
router = controller.get_router_factory()(self.lifecycle, instance)
|
|
57
53
|
|
|
58
|
-
|
|
59
|
-
continue
|
|
54
|
+
api.include_router(router)
|
|
60
55
|
|
|
61
|
-
|
|
56
|
+
for middleware in self.http_app.middlewares:
|
|
57
|
+
middleware_instance = self.lifecycle.container.get_by_type(
|
|
58
|
+
middleware
|
|
59
|
+
)
|
|
60
|
+
api.router.dependencies.append(
|
|
61
|
+
Depends(middleware_instance.intercept)
|
|
62
|
+
)
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
# for middleware in controller.middlewares:
|
|
65
|
-
# middleware_instance = self.lifecycle.container.get_by_type(
|
|
66
|
-
# middleware
|
|
67
|
-
# )
|
|
68
|
-
# dependencies.append(Depends(middleware_instance.intercept))
|
|
69
|
-
|
|
70
|
-
router = controller.get_router_factory()(self.lifecycle, instance)
|
|
71
|
-
|
|
72
|
-
api.include_router(router)
|
|
73
|
-
|
|
74
|
-
for middleware in self.http_app.middlewares:
|
|
75
|
-
middleware_instance = self.lifecycle.container.get_by_type(
|
|
76
|
-
middleware
|
|
77
|
-
)
|
|
78
|
-
api.router.dependencies.append(
|
|
79
|
-
Depends(middleware_instance.intercept)
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
yield
|
|
64
|
+
yield
|
|
83
65
|
|
|
84
66
|
|
|
85
67
|
class HttpShutdownState(ShutdownState):
|
|
@@ -31,7 +31,7 @@ from jararaca.broker_backend.mapper import get_message_broker_backend_from_url
|
|
|
31
31
|
from jararaca.core.uow import UnitOfWorkContextProvider
|
|
32
32
|
from jararaca.di import Container
|
|
33
33
|
from jararaca.lifecycle import AppLifecycle
|
|
34
|
-
from jararaca.microservice import Microservice
|
|
34
|
+
from jararaca.microservice import Microservice, providing_app_type
|
|
35
35
|
from jararaca.scheduler.decorators import (
|
|
36
36
|
ScheduledAction,
|
|
37
37
|
ScheduledActionData,
|
|
@@ -572,22 +572,23 @@ class BeatWorker:
|
|
|
572
572
|
Declares the scheduled actions and starts the scheduler.
|
|
573
573
|
This is the main entry point for the scheduler.
|
|
574
574
|
"""
|
|
575
|
-
|
|
575
|
+
with providing_app_type("beat"):
|
|
576
|
+
async with self.lifecycle():
|
|
576
577
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
578
|
+
scheduled_actions = _extract_scheduled_actions(
|
|
579
|
+
self.app, self.container, self.scheduler_names
|
|
580
|
+
)
|
|
580
581
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
582
|
+
# Initialize and wait for connection to be established
|
|
583
|
+
logger.info("Initializing broker connection...")
|
|
584
|
+
await self.broker.initialize(scheduled_actions)
|
|
584
585
|
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
586
|
+
# Wait for connection to be healthy before starting scheduler
|
|
587
|
+
logger.info("Waiting for connection to be established...")
|
|
588
|
+
await self._wait_for_broker_connection()
|
|
588
589
|
|
|
589
|
-
|
|
590
|
-
|
|
590
|
+
logger.info("Connection established, starting scheduler...")
|
|
591
|
+
await self.run_scheduled_actions(scheduled_actions)
|
|
591
592
|
|
|
592
593
|
async def run_scheduled_actions(
|
|
593
594
|
self, scheduled_actions: list[ScheduledActionData]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
2
2
|
README.md,sha256=2qMM__t_MoLKZr4IY9tXjo-Jn6LKjuHMb1qbyXpgL08,3401
|
|
3
|
-
pyproject.toml,sha256=
|
|
4
|
-
jararaca/__init__.py,sha256=
|
|
3
|
+
pyproject.toml,sha256=2-YSpMDgBFSW37MDYlZYmX9p5hTXQaydhNsqs0H0POk,2057
|
|
4
|
+
jararaca/__init__.py,sha256=qWLfavFIGRC3dfcTmiNP3kDh1Iih9wPMTTUOtLjtT_M,22186
|
|
5
5
|
jararaca/__main__.py,sha256=-O3vsB5lHdqNFjUtoELDF81IYFtR-DSiiFMzRaiSsv4,67
|
|
6
6
|
jararaca/broker_backend/__init__.py,sha256=GzEIuHR1xzgCJD4FE3harNjoaYzxHMHoEL0_clUaC-k,3528
|
|
7
7
|
jararaca/broker_backend/mapper.py,sha256=vTsi7sWpNvlga1PWPFg0rCJ5joJ0cdzykkIc2Tuvenc,696
|
|
@@ -23,8 +23,8 @@ jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py,sha256=_DEHwIH
|
|
|
23
23
|
jararaca/messagebus/interceptors/publisher_interceptor.py,sha256=ojy1bRhqMgrkQljcGGS8cd8-8pUjL8ZHjIUkdmaAnNM,1325
|
|
24
24
|
jararaca/messagebus/message.py,sha256=U6cyd2XknX8mtm0333slz5fanky2PFLWCmokAO56vvU,819
|
|
25
25
|
jararaca/messagebus/publisher.py,sha256=JTkxdKbvxvDWT8nK8PVEyyX061vYYbKQMxRHXrZtcEY,2173
|
|
26
|
-
jararaca/messagebus/worker.py,sha256=
|
|
27
|
-
jararaca/microservice.py,sha256=
|
|
26
|
+
jararaca/messagebus/worker.py,sha256=TdWdKHFUc3AAsqhLZI08Y3uc5iqs0GtDHmEhyqYWObI,73968
|
|
27
|
+
jararaca/microservice.py,sha256=OYCw5C4797X_tVnM_9sEz8BdjbICPHSVsCixsA_FwE4,11419
|
|
28
28
|
jararaca/observability/decorators.py,sha256=MOIr2PttPYYvRwEdfQZEwD5RxKHOTv8UEy9n1YQVoKw,2281
|
|
29
29
|
jararaca/observability/interceptor.py,sha256=U4ZLM0f8j6Q7gMUKKnA85bnvD-Qa0ii79Qa_X8KsXAQ,1498
|
|
30
30
|
jararaca/observability/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -42,7 +42,7 @@ jararaca/presentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
|
42
42
|
jararaca/presentation/decorators.py,sha256=dNcK1xYWhdHVBeWDa8dhqh4z8yQcPkJZTQkfgLXz6RI,11655
|
|
43
43
|
jararaca/presentation/hooks.py,sha256=WBbU5DG3-MAm2Ro2YraQyYG_HENfizYfyShL2ktHi6k,1980
|
|
44
44
|
jararaca/presentation/http_microservice.py,sha256=g771JosV6jTY3hQtG-HkLOo-T0e-r3b3rp1ddt99Qf0,533
|
|
45
|
-
jararaca/presentation/server.py,sha256=
|
|
45
|
+
jararaca/presentation/server.py,sha256=YzTcG39xEmEstrtB6nmVUSf2cMP8cSguppKdz_jA_tE,5537
|
|
46
46
|
jararaca/presentation/websocket/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
47
|
jararaca/presentation/websocket/base_types.py,sha256=AvUeeZ1TFhSiRMcYqZU1HaQNqSrcgTkC5R0ArP5dGmA,146
|
|
48
48
|
jararaca/presentation/websocket/context.py,sha256=A6K5W3kqo9Hgeh1m6JiI7Cdz5SfbXcaICSVX7u1ARZo,1903
|
|
@@ -62,7 +62,7 @@ jararaca/rpc/http/backends/otel.py,sha256=Uc6CjHSCZ5hvnK1fNFv3ota5xzUFnvIl1JOpG3
|
|
|
62
62
|
jararaca/rpc/http/decorators.py,sha256=0BCcmP_jolIAB73VeXm3TKyVr3AWbzkXzUVMGqYtqSQ,22145
|
|
63
63
|
jararaca/rpc/http/httpx.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
64
64
|
jararaca/scheduler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
|
-
jararaca/scheduler/beat_worker.py,sha256=
|
|
65
|
+
jararaca/scheduler/beat_worker.py,sha256=5vbvIBDugtHtKLXUtmhOeEOQFPEJ4R7YbemzAkYDTzU,29539
|
|
66
66
|
jararaca/scheduler/decorators.py,sha256=iyWFvPLCRh9c0YReQRemI2mLuaUv7r929So-xuKIWUs,4605
|
|
67
67
|
jararaca/scheduler/types.py,sha256=4HEQOmVIDp-BYLSzqmqSFIio1bd51WFmgFPIzPpVu04,135
|
|
68
68
|
jararaca/tools/app_config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -74,8 +74,8 @@ jararaca/tools/typescript/interface_parser.py,sha256=hJzP-XCwVQ7kjJHBj9VGq8mrSdN
|
|
|
74
74
|
jararaca/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
75
75
|
jararaca/utils/rabbitmq_utils.py,sha256=ytdAFUyv-OBkaVnxezuJaJoLrmN7giZgtKeet_IsMBs,10918
|
|
76
76
|
jararaca/utils/retry.py,sha256=DzPX_fXUvTqej6BQ8Mt2dvLo9nNlTBm7Kx2pFZ26P2Q,4668
|
|
77
|
-
jararaca-0.3.
|
|
78
|
-
jararaca-0.3.
|
|
79
|
-
jararaca-0.3.
|
|
80
|
-
jararaca-0.3.
|
|
81
|
-
jararaca-0.3.
|
|
77
|
+
jararaca-0.3.13.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
78
|
+
jararaca-0.3.13.dist-info/METADATA,sha256=oLyzVkVe28eyKh5Ro_nRruvfgzY2J5k9JAtUGp-z8zQ,5033
|
|
79
|
+
jararaca-0.3.13.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
80
|
+
jararaca-0.3.13.dist-info/entry_points.txt,sha256=WIh3aIvz8LwUJZIDfs4EeH3VoFyCGEk7cWJurW38q0I,45
|
|
81
|
+
jararaca-0.3.13.dist-info/RECORD,,
|
pyproject.toml
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|