jararaca 0.2.23__tar.gz → 0.2.25__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.
Potentially problematic release.
This version of jararaca might be problematic. Click here for more details.
- {jararaca-0.2.23 → jararaca-0.2.25}/PKG-INFO +1 -1
- {jararaca-0.2.23 → jararaca-0.2.25}/pyproject.toml +1 -1
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/__init__.py +24 -21
- jararaca-0.2.25/src/jararaca/persistence/base.py +33 -0
- jararaca-0.2.23/src/jararaca/persistence/base.py → jararaca-0.2.25/src/jararaca/persistence/utilities.py +11 -29
- {jararaca-0.2.23 → jararaca-0.2.25}/LICENSE +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/README.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Architecture/Message Bus/Decorators.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Architecture/Message Bus/Interceptors.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Architecture/Observability/Decorators.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Architecture/Observability/Interceptors.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Architecture/Presentation/Decorators.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Architecture/RPC/RestClients/Decorators.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Architecture/RPC/RestClients/Middlewared.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Architecture/Schedule/Decorators.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Architecture/Websocket/Decorators.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Architecture/Websocket/Interceptors.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Concept/Adapters.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Concept/Hexagonal Architecture.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/Concept/Ports.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.jpeg +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.webp +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/assets/tracing_example.png +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/docs/index.md +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/__main__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/cli.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/common/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/core/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/core/providers.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/core/uow.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/di.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/files/entity.py.mako +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/lifecycle.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/messagebus/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/messagebus/decorators.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/messagebus/interceptors/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/messagebus/interceptors/publisher_interceptor.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/messagebus/publisher.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/messagebus/types.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/messagebus/worker.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/microservice.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/observability/decorators.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/observability/interceptor.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/observability/providers/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/observability/providers/otel.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/persistence/exports.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/persistence/interceptors/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/persistence/session.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/persistence/sort_filter.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/decorators.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/hooks.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/http_microservice.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/server.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/websocket/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/websocket/base_types.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/websocket/context.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/websocket/decorators.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/websocket/redis.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/websocket/types.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/websocket/websocket_interceptor.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/py.typed +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/rpc/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/rpc/http/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/rpc/http/backends/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/rpc/http/backends/httpx.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/rpc/http/backends/otel.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/rpc/http/decorators.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/rpc/http/httpx.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/scheduler/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/scheduler/decorators.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/scheduler/scheduler.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/tools/app_config/__init__.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/tools/app_config/decorators.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/tools/app_config/interceptor.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/tools/metadata.py +0 -0
- {jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/tools/typescript/interface_parser.py +0 -0
|
@@ -54,9 +54,13 @@ if TYPE_CHECKING:
|
|
|
54
54
|
from .messagebus.types import Message, MessageOf
|
|
55
55
|
from .messagebus.worker import MessageBusWorker
|
|
56
56
|
from .microservice import Microservice, use_app_context, use_current_container
|
|
57
|
-
from .persistence.base import
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
from .persistence.base import T_BASEMODEL, BaseEntity
|
|
58
|
+
from .persistence.interceptors.aiosqa_interceptor import (
|
|
59
|
+
AIOSQAConfig,
|
|
60
|
+
AIOSqlAlchemySessionInterceptor,
|
|
61
|
+
use_session,
|
|
62
|
+
)
|
|
63
|
+
from .persistence.utilities import (
|
|
60
64
|
CriteriaBasedAttributeQueryInjector,
|
|
61
65
|
CRUDOperations,
|
|
62
66
|
DateCriteria,
|
|
@@ -71,11 +75,6 @@ if TYPE_CHECKING:
|
|
|
71
75
|
QueryOperations,
|
|
72
76
|
StringCriteria,
|
|
73
77
|
)
|
|
74
|
-
from .persistence.interceptors.aiosqa_interceptor import (
|
|
75
|
-
AIOSQAConfig,
|
|
76
|
-
AIOSqlAlchemySessionInterceptor,
|
|
77
|
-
use_session,
|
|
78
|
-
)
|
|
79
78
|
from .presentation.decorators import (
|
|
80
79
|
Delete,
|
|
81
80
|
Get,
|
|
@@ -232,27 +231,31 @@ _dynamic_imports: "dict[str, tuple[str, str, str | None]]" = {
|
|
|
232
231
|
"HttpPut": (__SPEC_PARENT__, "rpc.http.decorators", "Put"),
|
|
233
232
|
"HttpDelete": (__SPEC_PARENT__, "rpc.http.decorators", "Delete"),
|
|
234
233
|
"ObservabilityInterceptor": (__SPEC_PARENT__, "observability.interceptor", None),
|
|
235
|
-
"QueryInjector": (__SPEC_PARENT__, "persistence.
|
|
234
|
+
"QueryInjector": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
236
235
|
"HttpMicroservice": (__SPEC_PARENT__, "presentation.http_microservice", None),
|
|
237
236
|
"use_current_container": (__SPEC_PARENT__, "microservice", None),
|
|
238
237
|
"T_BASEMODEL": (__SPEC_PARENT__, "persistence.base", None),
|
|
239
|
-
"DatedEntity": (__SPEC_PARENT__, "persistence.
|
|
238
|
+
"DatedEntity": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
240
239
|
"BaseEntity": (__SPEC_PARENT__, "persistence.base", None),
|
|
241
240
|
"use_ws_manager": (__SPEC_PARENT__, "presentation.websocket.context", None),
|
|
242
241
|
"WebSocketEndpoint": (__SPEC_PARENT__, "presentation.websocket.decorators", None),
|
|
243
|
-
"CriteriaBasedAttributeQueryInjector": (
|
|
244
|
-
|
|
245
|
-
|
|
242
|
+
"CriteriaBasedAttributeQueryInjector": (
|
|
243
|
+
__SPEC_PARENT__,
|
|
244
|
+
"persistence.utilities",
|
|
245
|
+
None,
|
|
246
|
+
),
|
|
247
|
+
"Identifiable": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
248
|
+
"IdentifiableEntity": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
246
249
|
"MessageOf": (__SPEC_PARENT__, "messagebus.types", None),
|
|
247
250
|
"Message": (__SPEC_PARENT__, "messagebus.types", None),
|
|
248
|
-
"StringCriteria": (__SPEC_PARENT__, "persistence.
|
|
249
|
-
"DateCriteria": (__SPEC_PARENT__, "persistence.
|
|
250
|
-
"DateOrderedFilter": (__SPEC_PARENT__, "persistence.
|
|
251
|
-
"DateOrderedQueryInjector": (__SPEC_PARENT__, "persistence.
|
|
252
|
-
"Paginated": (__SPEC_PARENT__, "persistence.
|
|
253
|
-
"PaginatedFilter": (__SPEC_PARENT__, "persistence.
|
|
254
|
-
"QueryOperations": (__SPEC_PARENT__, "persistence.
|
|
255
|
-
"CRUDOperations": (__SPEC_PARENT__, "persistence.
|
|
251
|
+
"StringCriteria": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
252
|
+
"DateCriteria": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
253
|
+
"DateOrderedFilter": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
254
|
+
"DateOrderedQueryInjector": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
255
|
+
"Paginated": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
256
|
+
"PaginatedFilter": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
257
|
+
"QueryOperations": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
258
|
+
"CRUDOperations": (__SPEC_PARENT__, "persistence.utilities", None),
|
|
256
259
|
"RestController": (__SPEC_PARENT__, "presentation.decorators", None),
|
|
257
260
|
"MessageBusController": (__SPEC_PARENT__, "messagebus.decorators", None),
|
|
258
261
|
"MessageHandler": (__SPEC_PARENT__, "messagebus.decorators", None),
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from typing import Any, Self, Type, TypeVar
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
from sqlalchemy.orm import DeclarativeBase
|
|
5
|
+
|
|
6
|
+
IDENTIFIABLE_SCHEMA_T = TypeVar("IDENTIFIABLE_SCHEMA_T")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
T_BASEMODEL = TypeVar("T_BASEMODEL", bound=BaseModel)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def recursive_get_dict(obj: Any) -> Any:
|
|
13
|
+
if isinstance(obj, list):
|
|
14
|
+
return [recursive_get_dict(v) for v in obj]
|
|
15
|
+
elif hasattr(obj, "__dict__"):
|
|
16
|
+
return {
|
|
17
|
+
k: recursive_get_dict(v) for k, v in obj.__dict__.items() if k[0] != "_"
|
|
18
|
+
}
|
|
19
|
+
else:
|
|
20
|
+
return obj
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class BaseEntity(DeclarativeBase):
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def from_basemodel(cls, mutation: T_BASEMODEL) -> "Self":
|
|
27
|
+
intersection = set(cls.__annotations__.keys()) & set(
|
|
28
|
+
mutation.model_fields.keys()
|
|
29
|
+
)
|
|
30
|
+
return cls(**{k: getattr(mutation, k) for k in intersection})
|
|
31
|
+
|
|
32
|
+
def to_basemodel(self, model: Type[T_BASEMODEL]) -> T_BASEMODEL:
|
|
33
|
+
return model.model_validate(recursive_get_dict(self))
|
|
@@ -21,9 +21,16 @@ from uuid import UUID, uuid4
|
|
|
21
21
|
from pydantic import BaseModel, Field, ValidationError
|
|
22
22
|
from sqlalchemy import DateTime, Result, Select, delete, func, select, update
|
|
23
23
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
24
|
-
from sqlalchemy.orm import
|
|
24
|
+
from sqlalchemy.orm import Mapped, mapped_column
|
|
25
|
+
|
|
26
|
+
from jararaca.persistence.base import (
|
|
27
|
+
IDENTIFIABLE_SCHEMA_T,
|
|
28
|
+
T_BASEMODEL,
|
|
29
|
+
BaseEntity,
|
|
30
|
+
recursive_get_dict,
|
|
31
|
+
)
|
|
32
|
+
from jararaca.persistence.sort_filter import FilterModel, SortModel
|
|
25
33
|
|
|
26
|
-
IDENTIFIABLE_SCHEMA_T = TypeVar("IDENTIFIABLE_SCHEMA_T")
|
|
27
34
|
logger = logging.getLogger(__name__)
|
|
28
35
|
|
|
29
36
|
|
|
@@ -38,33 +45,6 @@ class Identifiable(BaseModel, Generic[IDENTIFIABLE_SCHEMA_T]):
|
|
|
38
45
|
return Identifiable[IDENTIFIABLE_SCHEMA_T](id=id, data=data)
|
|
39
46
|
|
|
40
47
|
|
|
41
|
-
T_BASEMODEL = TypeVar("T_BASEMODEL", bound=BaseModel)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def recursive_get_dict(obj: Any) -> Any:
|
|
45
|
-
if isinstance(obj, list):
|
|
46
|
-
return [recursive_get_dict(v) for v in obj]
|
|
47
|
-
elif hasattr(obj, "__dict__"):
|
|
48
|
-
return {
|
|
49
|
-
k: recursive_get_dict(v) for k, v in obj.__dict__.items() if k[0] != "_"
|
|
50
|
-
}
|
|
51
|
-
else:
|
|
52
|
-
return obj
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
class BaseEntity(DeclarativeBase):
|
|
56
|
-
|
|
57
|
-
@classmethod
|
|
58
|
-
def from_basemodel(cls, mutation: T_BASEMODEL) -> "Self":
|
|
59
|
-
intersection = set(cls.__annotations__.keys()) & set(
|
|
60
|
-
mutation.model_fields.keys()
|
|
61
|
-
)
|
|
62
|
-
return cls(**{k: getattr(mutation, k) for k in intersection})
|
|
63
|
-
|
|
64
|
-
def to_basemodel(self, model: Type[T_BASEMODEL]) -> T_BASEMODEL:
|
|
65
|
-
return model.model_validate(recursive_get_dict(self))
|
|
66
|
-
|
|
67
|
-
|
|
68
48
|
def nowutc() -> datetime:
|
|
69
49
|
return datetime.now(UTC)
|
|
70
50
|
|
|
@@ -205,6 +185,8 @@ class CRUDOperations(Generic[IDENTIFIABLE_T]):
|
|
|
205
185
|
class PaginatedFilter(BaseModel):
|
|
206
186
|
page: Annotated[int, Field(gt=-1)] = 1
|
|
207
187
|
page_size: int = 10
|
|
188
|
+
sort_models: list[SortModel] = []
|
|
189
|
+
filter_model: list[FilterModel] = []
|
|
208
190
|
|
|
209
191
|
|
|
210
192
|
class QueryInjector(Protocol):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/messagebus/interceptors/publisher_interceptor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jararaca-0.2.23 → jararaca-0.2.25}/src/jararaca/presentation/websocket/websocket_interceptor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|