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.

Files changed (78) hide show
  1. {jararaca-0.2.29 → jararaca-0.2.31}/PKG-INFO +1 -1
  2. {jararaca-0.2.29 → jararaca-0.2.31}/pyproject.toml +1 -1
  3. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/sort_filter.py +44 -4
  4. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/utilities.py +20 -1
  5. {jararaca-0.2.29 → jararaca-0.2.31}/LICENSE +0 -0
  6. {jararaca-0.2.29 → jararaca-0.2.31}/README.md +0 -0
  7. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Message Bus/Decorators.md +0 -0
  8. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Message Bus/Interceptors.md +0 -0
  9. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Observability/Decorators.md +0 -0
  10. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Observability/Interceptors.md +0 -0
  11. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Presentation/Decorators.md +0 -0
  12. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/RPC/RestClients/Decorators.md +0 -0
  13. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/RPC/RestClients/Middlewared.md +0 -0
  14. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Schedule/Decorators.md +0 -0
  15. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Websocket/Decorators.md +0 -0
  16. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Architecture/Websocket/Interceptors.md +0 -0
  17. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Concept/Adapters.md +0 -0
  18. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Concept/Hexagonal Architecture.md +0 -0
  19. {jararaca-0.2.29 → jararaca-0.2.31}/docs/Concept/Ports.md +0 -0
  20. {jararaca-0.2.29 → jararaca-0.2.31}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.jpeg +0 -0
  21. {jararaca-0.2.29 → jararaca-0.2.31}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.webp +0 -0
  22. {jararaca-0.2.29 → jararaca-0.2.31}/docs/assets/tracing_example.png +0 -0
  23. {jararaca-0.2.29 → jararaca-0.2.31}/docs/index.md +0 -0
  24. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/__init__.py +0 -0
  25. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/__main__.py +0 -0
  26. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/cli.py +0 -0
  27. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/common/__init__.py +0 -0
  28. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/core/__init__.py +0 -0
  29. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/core/providers.py +0 -0
  30. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/core/uow.py +0 -0
  31. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/di.py +0 -0
  32. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/files/entity.py.mako +0 -0
  33. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/lifecycle.py +0 -0
  34. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/__init__.py +0 -0
  35. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/decorators.py +0 -0
  36. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/interceptors/__init__.py +0 -0
  37. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/interceptors/publisher_interceptor.py +0 -0
  38. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/publisher.py +0 -0
  39. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/types.py +0 -0
  40. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/messagebus/worker.py +0 -0
  41. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/microservice.py +0 -0
  42. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/observability/decorators.py +0 -0
  43. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/observability/interceptor.py +0 -0
  44. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/observability/providers/__init__.py +0 -0
  45. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/observability/providers/otel.py +0 -0
  46. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/base.py +0 -0
  47. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/exports.py +0 -0
  48. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/interceptors/__init__.py +0 -0
  49. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py +0 -0
  50. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/persistence/session.py +0 -0
  51. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/__init__.py +0 -0
  52. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/decorators.py +0 -0
  53. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/hooks.py +0 -0
  54. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/http_microservice.py +0 -0
  55. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/server.py +0 -0
  56. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/__init__.py +0 -0
  57. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/base_types.py +0 -0
  58. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/context.py +0 -0
  59. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/decorators.py +0 -0
  60. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/redis.py +0 -0
  61. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/types.py +0 -0
  62. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/presentation/websocket/websocket_interceptor.py +0 -0
  63. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/py.typed +0 -0
  64. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/__init__.py +0 -0
  65. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/__init__.py +0 -0
  66. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/backends/__init__.py +0 -0
  67. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/backends/httpx.py +0 -0
  68. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/backends/otel.py +0 -0
  69. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/decorators.py +0 -0
  70. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/rpc/http/httpx.py +0 -0
  71. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/scheduler/__init__.py +0 -0
  72. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/scheduler/decorators.py +0 -0
  73. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/scheduler/scheduler.py +0 -0
  74. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/tools/app_config/__init__.py +0 -0
  75. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/tools/app_config/decorators.py +0 -0
  76. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/tools/app_config/interceptor.py +0 -0
  77. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/tools/metadata.py +0 -0
  78. {jararaca-0.2.29 → jararaca-0.2.31}/src/jararaca/tools/typescript/interface_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jararaca
3
- Version: 0.2.29
3
+ Version: 0.2.31
4
4
  Summary: A simple and fast API framework for Python
5
5
  Home-page: https://github.com/LuscasLeo/jararaca
6
6
  Author: Lucas S
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "jararaca"
3
- version = "0.2.29"
3
+ version = "0.2.31"
4
4
  description = "A simple and fast API framework for Python"
5
5
  authors = ["Lucas S <me@luscasleo.dev>"]
6
6
  readme = "README.md"
@@ -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 SortFilterRunner:
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 FilterModel, SortModel
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