jararaca 0.2.37a12__py3-none-any.whl → 0.4.0a5__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 (91) hide show
  1. README.md +121 -0
  2. jararaca/__init__.py +267 -15
  3. jararaca/__main__.py +4 -0
  4. jararaca/broker_backend/__init__.py +106 -0
  5. jararaca/broker_backend/mapper.py +25 -0
  6. jararaca/broker_backend/redis_broker_backend.py +168 -0
  7. jararaca/cli.py +840 -103
  8. jararaca/common/__init__.py +3 -0
  9. jararaca/core/__init__.py +3 -0
  10. jararaca/core/providers.py +4 -0
  11. jararaca/core/uow.py +55 -16
  12. jararaca/di.py +4 -0
  13. jararaca/files/entity.py.mako +4 -0
  14. jararaca/lifecycle.py +6 -2
  15. jararaca/messagebus/__init__.py +5 -1
  16. jararaca/messagebus/bus_message_controller.py +4 -0
  17. jararaca/messagebus/consumers/__init__.py +3 -0
  18. jararaca/messagebus/decorators.py +90 -85
  19. jararaca/messagebus/implicit_headers.py +49 -0
  20. jararaca/messagebus/interceptors/__init__.py +3 -0
  21. jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py +95 -37
  22. jararaca/messagebus/interceptors/publisher_interceptor.py +42 -0
  23. jararaca/messagebus/message.py +31 -0
  24. jararaca/messagebus/publisher.py +47 -4
  25. jararaca/messagebus/worker.py +1615 -135
  26. jararaca/microservice.py +248 -36
  27. jararaca/observability/constants.py +7 -0
  28. jararaca/observability/decorators.py +177 -16
  29. jararaca/observability/fastapi_exception_handler.py +37 -0
  30. jararaca/observability/hooks.py +109 -0
  31. jararaca/observability/interceptor.py +8 -2
  32. jararaca/observability/providers/__init__.py +3 -0
  33. jararaca/observability/providers/otel.py +213 -18
  34. jararaca/persistence/base.py +40 -3
  35. jararaca/persistence/exports.py +4 -0
  36. jararaca/persistence/interceptors/__init__.py +3 -0
  37. jararaca/persistence/interceptors/aiosqa_interceptor.py +187 -23
  38. jararaca/persistence/interceptors/constants.py +5 -0
  39. jararaca/persistence/interceptors/decorators.py +50 -0
  40. jararaca/persistence/session.py +3 -0
  41. jararaca/persistence/sort_filter.py +4 -0
  42. jararaca/persistence/utilities.py +74 -32
  43. jararaca/presentation/__init__.py +3 -0
  44. jararaca/presentation/decorators.py +170 -82
  45. jararaca/presentation/exceptions.py +23 -0
  46. jararaca/presentation/hooks.py +4 -0
  47. jararaca/presentation/http_microservice.py +4 -0
  48. jararaca/presentation/server.py +120 -41
  49. jararaca/presentation/websocket/__init__.py +3 -0
  50. jararaca/presentation/websocket/base_types.py +4 -0
  51. jararaca/presentation/websocket/context.py +34 -4
  52. jararaca/presentation/websocket/decorators.py +8 -41
  53. jararaca/presentation/websocket/redis.py +280 -53
  54. jararaca/presentation/websocket/types.py +6 -2
  55. jararaca/presentation/websocket/websocket_interceptor.py +74 -23
  56. jararaca/reflect/__init__.py +3 -0
  57. jararaca/reflect/controller_inspect.py +81 -0
  58. jararaca/reflect/decorators.py +238 -0
  59. jararaca/reflect/metadata.py +76 -0
  60. jararaca/rpc/__init__.py +3 -0
  61. jararaca/rpc/http/__init__.py +101 -0
  62. jararaca/rpc/http/backends/__init__.py +14 -0
  63. jararaca/rpc/http/backends/httpx.py +43 -9
  64. jararaca/rpc/http/backends/otel.py +4 -0
  65. jararaca/rpc/http/decorators.py +378 -113
  66. jararaca/rpc/http/httpx.py +3 -0
  67. jararaca/scheduler/__init__.py +3 -0
  68. jararaca/scheduler/beat_worker.py +758 -0
  69. jararaca/scheduler/decorators.py +89 -28
  70. jararaca/scheduler/types.py +11 -0
  71. jararaca/tools/app_config/__init__.py +3 -0
  72. jararaca/tools/app_config/decorators.py +7 -19
  73. jararaca/tools/app_config/interceptor.py +10 -4
  74. jararaca/tools/typescript/__init__.py +3 -0
  75. jararaca/tools/typescript/decorators.py +120 -0
  76. jararaca/tools/typescript/interface_parser.py +1126 -189
  77. jararaca/utils/__init__.py +3 -0
  78. jararaca/utils/rabbitmq_utils.py +372 -0
  79. jararaca/utils/retry.py +148 -0
  80. jararaca-0.4.0a5.dist-info/LICENSE +674 -0
  81. jararaca-0.4.0a5.dist-info/LICENSES/GPL-3.0-or-later.txt +232 -0
  82. {jararaca-0.2.37a12.dist-info → jararaca-0.4.0a5.dist-info}/METADATA +14 -7
  83. jararaca-0.4.0a5.dist-info/RECORD +88 -0
  84. {jararaca-0.2.37a12.dist-info → jararaca-0.4.0a5.dist-info}/WHEEL +1 -1
  85. pyproject.toml +131 -0
  86. jararaca/messagebus/types.py +0 -30
  87. jararaca/scheduler/scheduler.py +0 -154
  88. jararaca/tools/metadata.py +0 -47
  89. jararaca-0.2.37a12.dist-info/RECORD +0 -63
  90. /jararaca-0.2.37a12.dist-info/LICENSE → /LICENSE +0 -0
  91. {jararaca-0.2.37a12.dist-info → jararaca-0.4.0a5.dist-info}/entry_points.txt +0 -0
@@ -1,3 +1,8 @@
1
+ # SPDX-FileCopyrightText: 2025 Lucas S
2
+ #
3
+ # SPDX-License-Identifier: GPL-3.0-or-later
4
+
5
+ import time
1
6
  from urllib.parse import urljoin
2
7
 
3
8
  import httpx
@@ -7,34 +12,63 @@ from jararaca.rpc.http.decorators import (
7
12
  HttpRPCRequest,
8
13
  HttpRPCResponse,
9
14
  RPCRequestNetworkError,
15
+ TimeoutException,
10
16
  )
11
17
 
12
18
 
13
19
  class HTTPXHttpRPCAsyncBackend(HttpRPCAsyncBackend):
14
20
 
15
- def __init__(self, prefix_url: str = ""):
21
+ def __init__(self, prefix_url: str = "", default_timeout: float = 30.0):
16
22
  self.prefix_url = prefix_url
23
+ self.default_timeout = default_timeout
17
24
 
18
25
  async def request(
19
26
  self,
20
27
  request: HttpRPCRequest,
21
28
  ) -> HttpRPCResponse:
22
29
 
23
- async with httpx.AsyncClient() as client:
30
+ start_time = time.time()
31
+
32
+ # Prepare timeout
33
+ timeout = (
34
+ request.timeout if request.timeout is not None else self.default_timeout
35
+ )
36
+
37
+ # Prepare request kwargs
38
+ request_kwargs = {
39
+ "method": request.method,
40
+ "url": urljoin(self.prefix_url, request.url),
41
+ "headers": request.headers,
42
+ "params": request.query_params,
43
+ "timeout": timeout,
44
+ }
24
45
 
46
+ # Handle different content types
47
+ if request.form_data and request.files:
48
+ # Multipart form data with files
49
+ request_kwargs["data"] = request.form_data
50
+ request_kwargs["files"] = request.files
51
+ elif request.form_data:
52
+ # Form data only
53
+ request_kwargs["data"] = request.form_data
54
+ elif request.body:
55
+ # Raw body content
56
+ request_kwargs["content"] = request.body
57
+
58
+ async with httpx.AsyncClient() as client:
25
59
  try:
26
- response = await client.request(
27
- method=request.method,
28
- url=urljoin(self.prefix_url, request.url),
29
- headers=request.headers,
30
- params=request.query_params,
31
- content=request.body,
32
- )
60
+ response = await client.request(**request_kwargs) # type: ignore[arg-type]
61
+
62
+ elapsed_time = time.time() - start_time
33
63
 
34
64
  return HttpRPCResponse(
35
65
  status_code=response.status_code,
36
66
  data=response.content,
67
+ headers=dict(response.headers),
68
+ elapsed_time=elapsed_time,
37
69
  )
70
+ except httpx.TimeoutException as err:
71
+ raise TimeoutException(f"Request timed out: {err}") from err
38
72
  except httpx.NetworkError as err:
39
73
  raise RPCRequestNetworkError(
40
74
  request=request, backend_request=err.request
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: 2025 Lucas S
2
+ #
3
+ # SPDX-License-Identifier: GPL-3.0-or-later
4
+
1
5
  from opentelemetry import baggage, trace
2
6
  from opentelemetry.baggage.propagation import W3CBaggagePropagator
3
7
  from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator