asyncapi-python 0.3.0rc3__tar.gz → 0.3.0rc4__tar.gz

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 (129) hide show
  1. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/PKG-INFO +1 -1
  2. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/pyproject.toml +1 -1
  3. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/templates/application.py.j2 +33 -15
  4. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/uv.lock +1 -1
  5. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/.asyncapi-tool +0 -0
  6. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/.devcontainer/Dockerfile +0 -0
  7. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/.devcontainer/devcontainer.json +0 -0
  8. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/.devcontainer/docker-compose.yml +0 -0
  9. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/.github/workflows/release.yml +0 -0
  10. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/.github/workflows/test.yml +0 -0
  11. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/.gitignore +0 -0
  12. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/LICENSE +0 -0
  13. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/README.md +0 -0
  14. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-pub-sub/.gitignore +0 -0
  15. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-pub-sub/Makefile +0 -0
  16. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-pub-sub/README.md +0 -0
  17. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-pub-sub/main-publisher.py +0 -0
  18. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-pub-sub/main-subscriber.py +0 -0
  19. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-pub-sub/spec/common.asyncapi.yaml +0 -0
  20. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-pub-sub/spec/publisher.asyncapi.yaml +0 -0
  21. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-pub-sub/spec/subscriber.asyncapi.yaml +0 -0
  22. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-rpc/.gitignore +0 -0
  23. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-rpc/Makefile +0 -0
  24. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-rpc/README.md +0 -0
  25. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-rpc/main-client.py +0 -0
  26. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-rpc/main-server.py +0 -0
  27. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-rpc/spec/client.asyncapi.yaml +0 -0
  28. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-rpc/spec/common.asyncapi.yaml +0 -0
  29. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-rpc/spec/server.asyncapi.yaml +0 -0
  30. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-work-queue/.gitignore +0 -0
  31. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-work-queue/Makefile +0 -0
  32. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-work-queue/README.md +0 -0
  33. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-work-queue/main-producer.py +0 -0
  34. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-work-queue/main-worker.py +0 -0
  35. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-work-queue/spec/common.asyncapi.yaml +0 -0
  36. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-work-queue/spec/producer.asyncapi.yaml +0 -0
  37. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/amqp-work-queue/spec/worker.asyncapi.yaml +0 -0
  38. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/examples/specs/financial-trading-system.yaml +0 -0
  39. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/__init__.py +0 -0
  40. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/__init__.py +0 -0
  41. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/codec/__init__.py +0 -0
  42. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/codec/json.py +0 -0
  43. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/codec/registry.py +0 -0
  44. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/wire/__init__.py +0 -0
  45. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/wire/amqp/__init__.py +0 -0
  46. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/wire/amqp/config.py +0 -0
  47. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/wire/amqp/consumer.py +0 -0
  48. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/wire/amqp/factory.py +0 -0
  49. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/wire/amqp/message.py +0 -0
  50. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/wire/amqp/producer.py +0 -0
  51. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/wire/amqp/resolver.py +0 -0
  52. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/wire/amqp/utils.py +0 -0
  53. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/contrib/wire/in_memory.py +0 -0
  54. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/__init__.py +0 -0
  55. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/application.py +0 -0
  56. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/codec.py +0 -0
  57. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/document/__init__.py +0 -0
  58. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/document/bindings.py +0 -0
  59. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/document/channel.py +0 -0
  60. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/document/common.py +0 -0
  61. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/document/message.py +0 -0
  62. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/document/operation.py +0 -0
  63. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/endpoint/__init__.py +0 -0
  64. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/endpoint/abc.py +0 -0
  65. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/endpoint/exceptions.py +0 -0
  66. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/endpoint/message.py +0 -0
  67. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/endpoint/publisher.py +0 -0
  68. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/endpoint/rpc_client.py +0 -0
  69. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/endpoint/rpc_reply_handler.py +0 -0
  70. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/endpoint/rpc_server.py +0 -0
  71. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/endpoint/subscriber.py +0 -0
  72. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/exceptions.py +0 -0
  73. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/typing.py +0 -0
  74. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/wire/__init__.py +0 -0
  75. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/kernel/wire/typing.py +0 -0
  76. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/py.typed +0 -0
  77. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python/utils.py +0 -0
  78. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/__init__.py +0 -0
  79. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/cli.py +0 -0
  80. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/generators/__init__.py +0 -0
  81. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/generators/main.py +0 -0
  82. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/generators/messages.py +0 -0
  83. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/generators/parameters.py +0 -0
  84. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/generators/routers.py +0 -0
  85. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/generators/templates.py +0 -0
  86. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/parser/__init__.py +0 -0
  87. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/parser/context.py +0 -0
  88. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/parser/document_loader.py +0 -0
  89. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/parser/extractors.py +0 -0
  90. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/parser/references.py +0 -0
  91. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/parser/types.py +0 -0
  92. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/templates/__init__.py.j2 +0 -0
  93. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/templates/messages.py.j2 +0 -0
  94. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/templates/messages_datamodel.py.j2 +0 -0
  95. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/templates/parameters.py.j2 +0 -0
  96. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_codegen/templates/router.py.j2 +0 -0
  97. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_pants/__init__.py +0 -0
  98. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_pants/py.typed +0 -0
  99. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_pants/register.py +0 -0
  100. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_pants/rules.py +0 -0
  101. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/src/asyncapi_python_pants/targets.py +0 -0
  102. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/__init__.py +0 -0
  103. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/codegen/__init__.py +0 -0
  104. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/codegen/specs/relative_refs/common/channels.yaml +0 -0
  105. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/codegen/specs/relative_refs/main.yaml +0 -0
  106. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/codegen/specs/relative_refs/shared/messages.yaml +0 -0
  107. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/codegen/specs/relative_refs/shared/notifications.yaml +0 -0
  108. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/codegen/specs/rpc.yaml +0 -0
  109. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/codegen/specs/simple.yaml +0 -0
  110. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/codegen/test_parser.py +0 -0
  111. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/conftest.py +0 -0
  112. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/__init__.py +0 -0
  113. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/scenarios/__init__.py +0 -0
  114. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/scenarios/batch_processing.py +0 -0
  115. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/scenarios/error_handling.py +0 -0
  116. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/scenarios/fan_in_logging.py +0 -0
  117. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/scenarios/fan_out_broadcasting.py +0 -0
  118. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/scenarios/malformed_messages.py +0 -0
  119. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/scenarios/many_to_many_microservices.py +0 -0
  120. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/scenarios/producer_consumer.py +0 -0
  121. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/scenarios/reply_channel.py +0 -0
  122. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/test_app/__init__.py +0 -0
  123. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/test_app/messages/__init__.py +0 -0
  124. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/test_app/messages/json.py +0 -0
  125. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/integration/test_wire_codec_scenarios.py +0 -0
  126. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/kernel/endpoint/test_batch_processing.py +0 -0
  127. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/kernel/endpoint/test_exception_handling.py +0 -0
  128. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/kernel/endpoint/test_handler_enforcement.py +0 -0
  129. {asyncapi_python-0.3.0rc3 → asyncapi_python-0.3.0rc4}/tests/kernel/endpoint/test_rpc_endpoints.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: asyncapi-python
3
- Version: 0.3.0rc3
3
+ Version: 0.3.0rc4
4
4
  Summary: Easily generate type-safe and async Python applications from AsyncAPI 3 specifications.
5
5
  Author-email: Yaroslav Petrov <yaroslav.v.petrov@gmail.com>
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "asyncapi-python"
3
- version = "0.3.0rc3"
3
+ version = "0.3.0rc4"
4
4
  license = { text = "Apache-2.0" }
5
5
  description = "Easily generate type-safe and async Python applications from AsyncAPI 3 specifications."
6
6
  authors = [{ name = "Yaroslav Petrov", email = "yaroslav.v.petrov@gmail.com" }]
@@ -1,4 +1,5 @@
1
1
  """Generated AsyncAPI application."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  from typing import Any
@@ -7,6 +8,7 @@ from asyncapi_python.kernel.wire import AbstractWireFactory
7
8
  from asyncapi_python.kernel.codec import CodecFactory
8
9
  from asyncapi_python.contrib.codec.registry import CodecRegistry
9
10
  from asyncapi_python.kernel.endpoint import AbstractEndpoint
11
+ from asyncapi_python.kernel.endpoint.abc import EndpointParams
10
12
 
11
13
  from .router import ProducerRouter, ConsumerRouter
12
14
  import sys
@@ -14,45 +16,61 @@ import sys
14
16
 
15
17
  class Application(BaseApplication):
16
18
  """{{ app_title }} - {{ app_description }}
17
-
19
+
18
20
  AsyncAPI Version: {{ asyncapi_version }}
19
21
  Application Version: {{ app_version }}
20
22
  """
21
-
22
- def __init__(self, wire_factory: AbstractWireFactory[Any, Any]):
23
+
24
+ def __init__(
25
+ self,
26
+ wire_factory: AbstractWireFactory[Any, Any],
27
+ *,
28
+ endpoint_params: EndpointParams | None = None,
29
+ ):
23
30
  """Initialize the AsyncAPI application.
24
-
31
+
25
32
  Args:
26
33
  wire_factory: Wire protocol factory for message transport
34
+ endpoint_params: Optional endpoint configuration (service_name, default_rpc_timeout, etc.)
27
35
  """
28
36
  # Use CodecRegistry with current module for message serialization
29
- current_module = sys.modules[self.__module__.rsplit('.', 1)[0]]
37
+ current_module = sys.modules[self.__module__.rsplit(".", 1)[0]]
30
38
  codec_factory = CodecRegistry(current_module)
31
-
32
- super().__init__(wire_factory=wire_factory, codec_factory=codec_factory)
33
-
39
+
40
+ # Pass endpoint_params to BaseApplication if provided
41
+ if endpoint_params is not None:
42
+ super().__init__(
43
+ wire_factory=wire_factory,
44
+ codec_factory=codec_factory,
45
+ endpoint_params=endpoint_params,
46
+ )
47
+ else:
48
+ super().__init__(wire_factory=wire_factory, codec_factory=codec_factory)
49
+
34
50
  # Initialize semantic routers with factories
35
51
  self.producer = ProducerRouter(wire_factory, codec_factory)
36
52
  self.consumer = ConsumerRouter(wire_factory, codec_factory)
37
-
53
+
38
54
  # Register all endpoints from routers
39
55
  self._register_router_endpoints(self.producer)
40
56
  self._register_router_endpoints(self.consumer)
41
-
57
+
42
58
  def _register_router_endpoints(self, router: object) -> None:
43
59
  """Recursively register all endpoints from router tree.
44
-
60
+
45
61
  Args:
46
62
  router: Router object to scan for endpoints
47
63
  """
48
64
  if isinstance(router, AbstractEndpoint):
49
65
  # This router is an endpoint - register it directly
50
66
  self._add_endpoint(router)
51
- elif hasattr(router, '__dict__'):
67
+ elif hasattr(router, "__dict__"):
52
68
  # This router aggregates others - recurse through attributes
53
69
  for attr_name in dir(router):
54
- if not attr_name.startswith('_'):
70
+ if not attr_name.startswith("_"):
55
71
  attr = getattr(router, attr_name, None)
56
72
  # Check if it's a router-like object (has __dict__ or is an endpoint)
57
- if attr is not None and (isinstance(attr, AbstractEndpoint) or hasattr(attr, '__dict__')):
58
- self._register_router_endpoints(attr)
73
+ if attr is not None and (
74
+ isinstance(attr, AbstractEndpoint) or hasattr(attr, "__dict__")
75
+ ):
76
+ self._register_router_endpoints(attr)
@@ -64,7 +64,7 @@ wheels = [
64
64
 
65
65
  [[package]]
66
66
  name = "asyncapi-python"
67
- version = "0.3.0rc3"
67
+ version = "0.3.0rc4"
68
68
  source = { editable = "." }
69
69
  dependencies = [
70
70
  { name = "pydantic" },