jararaca 0.2.29__tar.gz → 0.2.31__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.29 → jararaca-0.2.31}/PKG-INFO +1 -1
- {jararaca-0.2.29 → jararaca-0.2.31}/pyproject.toml +1 -1
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/sort_filter.py +44 -4
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/utilities.py +20 -1
- {jararaca-0.2.29 → jararaca-0.2.31}/LICENSE +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/README.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Message Bus/Decorators.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Message Bus/Interceptors.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Observability/Decorators.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Observability/Interceptors.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Presentation/Decorators.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/RPC/RestClients/Decorators.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/RPC/RestClients/Middlewared.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Schedule/Decorators.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Websocket/Decorators.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Websocket/Interceptors.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Concept/Adapters.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Concept/Hexagonal Architecture.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/Concept/Ports.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.jpeg +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.webp +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/assets/tracing_example.png +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/docs/index.md +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/__main__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/cli.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/common/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/core/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/core/providers.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/core/uow.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/di.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/files/entity.py.mako +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/lifecycle.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/decorators.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/interceptors/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/interceptors/publisher_interceptor.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/publisher.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/types.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/worker.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/microservice.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/observability/decorators.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/observability/interceptor.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/observability/providers/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/observability/providers/otel.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/base.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/exports.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/interceptors/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/session.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/decorators.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/hooks.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/http_microservice.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/server.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/base_types.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/context.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/decorators.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/redis.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/types.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/websocket_interceptor.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/py.typed +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/backends/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/backends/httpx.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/backends/otel.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/decorators.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/httpx.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/scheduler/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/scheduler/decorators.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/scheduler/scheduler.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/tools/app_config/__init__.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/tools/app_config/decorators.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/tools/app_config/interceptor.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/tools/metadata.py +0 -0
- {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/tools/typescript/interface_parser.py +0 -0
|
@@ -10,7 +10,7 @@ from sqlalchemy.orm.attributes import InstrumentedAttribute
|
|
|
10
10
|
from jararaca import BaseEntity
|
|
11
11
|
|
|
12
12
|
FILTER_SORT_ENTITY_ATTR_MAP = dict[
|
|
13
|
-
str, InstrumentedAttribute[str | int | datetime | date | UUID]
|
|
13
|
+
str, InstrumentedAttribute[str | int | datetime | date | UUID | None]
|
|
14
14
|
]
|
|
15
15
|
|
|
16
16
|
|
|
@@ -54,14 +54,12 @@ class FilterModel(BaseModel):
|
|
|
54
54
|
INHERITS_BASE_ENTITY = TypeVar("INHERITS_BASE_ENTITY", bound=BaseEntity)
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
class
|
|
57
|
+
class FilterRuleApplier:
|
|
58
58
|
def __init__(
|
|
59
59
|
self,
|
|
60
60
|
allowed_filters: FILTER_SORT_ENTITY_ATTR_MAP,
|
|
61
|
-
allowed_sorts: FILTER_SORT_ENTITY_ATTR_MAP,
|
|
62
61
|
):
|
|
63
62
|
self.allowed_filters = allowed_filters
|
|
64
|
-
self.allowed_sorts = allowed_sorts
|
|
65
63
|
|
|
66
64
|
def create_query_for_filter(
|
|
67
65
|
self, query: Select[Tuple[INHERITS_BASE_ENTITY]], filter: FilterModel
|
|
@@ -103,6 +101,8 @@ class SortFilterRunner:
|
|
|
103
101
|
__value = (
|
|
104
102
|
filter.value[0] if isinstance(filter.value, list) else filter.value
|
|
105
103
|
)
|
|
104
|
+
if not __value.strip():
|
|
105
|
+
return query
|
|
106
106
|
if field_type is date:
|
|
107
107
|
value = datetime.strptime(__value, "%Y-%m-%d").date()
|
|
108
108
|
else:
|
|
@@ -166,6 +166,14 @@ class SortFilterRunner:
|
|
|
166
166
|
) -> Select[Tuple[INHERITS_BASE_ENTITY]]:
|
|
167
167
|
return reduce(lambda q, f: self.create_query_for_filter(q, f), filters, query)
|
|
168
168
|
|
|
169
|
+
|
|
170
|
+
class SortRuleApplier:
|
|
171
|
+
def __init__(
|
|
172
|
+
self,
|
|
173
|
+
allowed_sorts: FILTER_SORT_ENTITY_ATTR_MAP,
|
|
174
|
+
):
|
|
175
|
+
self.allowed_sorts = allowed_sorts
|
|
176
|
+
|
|
169
177
|
def create_query_for_sorting(
|
|
170
178
|
self, query: Select[Tuple[INHERITS_BASE_ENTITY]], sort: SortModel
|
|
171
179
|
) -> Select[Tuple[INHERITS_BASE_ENTITY]]:
|
|
@@ -180,6 +188,38 @@ class SortFilterRunner:
|
|
|
180
188
|
return reduce(lambda q, s: self.create_query_for_sorting(q, s), sorts, query)
|
|
181
189
|
|
|
182
190
|
|
|
191
|
+
class SortFilterRunner:
|
|
192
|
+
def __init__(
|
|
193
|
+
self,
|
|
194
|
+
allowed_filters: FILTER_SORT_ENTITY_ATTR_MAP,
|
|
195
|
+
allowed_sorts: FILTER_SORT_ENTITY_ATTR_MAP,
|
|
196
|
+
):
|
|
197
|
+
self.allowed_filters = allowed_filters
|
|
198
|
+
self.allowed_sorts = allowed_sorts
|
|
199
|
+
self.filter_rule_applier = FilterRuleApplier(allowed_filters)
|
|
200
|
+
self.sort_rule_applier = SortRuleApplier(allowed_sorts)
|
|
201
|
+
|
|
202
|
+
def create_query_for_filter(
|
|
203
|
+
self, query: Select[Tuple[INHERITS_BASE_ENTITY]], filter: FilterModel
|
|
204
|
+
) -> Select[Tuple[INHERITS_BASE_ENTITY]]:
|
|
205
|
+
return self.filter_rule_applier.create_query_for_filter(query, filter)
|
|
206
|
+
|
|
207
|
+
def create_query_for_filter_list(
|
|
208
|
+
self, query: Select[Tuple[INHERITS_BASE_ENTITY]], filters: list[FilterModel]
|
|
209
|
+
) -> Select[Tuple[INHERITS_BASE_ENTITY]]:
|
|
210
|
+
return self.filter_rule_applier.create_query_for_filter_list(query, filters)
|
|
211
|
+
|
|
212
|
+
def create_query_for_sorting(
|
|
213
|
+
self, query: Select[Tuple[INHERITS_BASE_ENTITY]], sort: SortModel
|
|
214
|
+
) -> Select[Tuple[INHERITS_BASE_ENTITY]]:
|
|
215
|
+
return self.sort_rule_applier.create_query_for_sorting(query, sort)
|
|
216
|
+
|
|
217
|
+
def create_query_for_sorting_list(
|
|
218
|
+
self, query: Select[Tuple[INHERITS_BASE_ENTITY]], sorts: list[SortModel]
|
|
219
|
+
) -> Select[Tuple[INHERITS_BASE_ENTITY]]:
|
|
220
|
+
return self.sort_rule_applier.create_query_for_sorting_list(query, sorts)
|
|
221
|
+
|
|
222
|
+
|
|
183
223
|
__all__ = [
|
|
184
224
|
"SortFilterRunner",
|
|
185
225
|
"FilterModel",
|
|
@@ -29,7 +29,12 @@ from jararaca.persistence.base import (
|
|
|
29
29
|
BaseEntity,
|
|
30
30
|
recursive_get_dict,
|
|
31
31
|
)
|
|
32
|
-
from jararaca.persistence.sort_filter import
|
|
32
|
+
from jararaca.persistence.sort_filter import (
|
|
33
|
+
FilterModel,
|
|
34
|
+
FilterRuleApplier,
|
|
35
|
+
SortModel,
|
|
36
|
+
SortRuleApplier,
|
|
37
|
+
)
|
|
33
38
|
|
|
34
39
|
logger = logging.getLogger(__name__)
|
|
35
40
|
|
|
@@ -257,11 +262,15 @@ class QueryOperations(Generic[QUERY_FILTER_T, QUERY_ENTITY_T]):
|
|
|
257
262
|
session_provider: Callable[[], AsyncSession],
|
|
258
263
|
filters_functions: list[QueryInjector],
|
|
259
264
|
unique: bool = False,
|
|
265
|
+
sort_rule_applier: SortRuleApplier | None = None,
|
|
266
|
+
filter_rule_applier: FilterRuleApplier | None = None,
|
|
260
267
|
) -> None:
|
|
261
268
|
self.entity_type: type[QUERY_ENTITY_T] = entity_type
|
|
262
269
|
self.session_provider = session_provider
|
|
263
270
|
self.filters_functions = filters_functions
|
|
264
271
|
self.unique = unique
|
|
272
|
+
self.sort_rule_applier = sort_rule_applier
|
|
273
|
+
self.filter_rule_applier = filter_rule_applier
|
|
265
274
|
|
|
266
275
|
@property
|
|
267
276
|
def session(self) -> AsyncSession:
|
|
@@ -281,6 +290,16 @@ class QueryOperations(Generic[QUERY_FILTER_T, QUERY_ENTITY_T]):
|
|
|
281
290
|
select(self.entity_type),
|
|
282
291
|
)
|
|
283
292
|
|
|
293
|
+
if self.sort_rule_applier:
|
|
294
|
+
query = self.sort_rule_applier.create_query_for_sorting_list(
|
|
295
|
+
query, filter.sort_models
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
if self.filter_rule_applier:
|
|
299
|
+
query = self.filter_rule_applier.create_query_for_filter_list(
|
|
300
|
+
query, filter.filter_models
|
|
301
|
+
)
|
|
302
|
+
|
|
284
303
|
unpaginated_total = (
|
|
285
304
|
await self.session.execute(
|
|
286
305
|
select(func.count()).select_from(query.subquery())
|
|
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
|
|
File without changes
|
{jararaca-0.2.29 → jararaca-0.2.31}/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
|
|
File without changes
|
{jararaca-0.2.29 → jararaca-0.2.31}/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
|
{jararaca-0.2.29 → jararaca-0.2.31}/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
|