apexdevkit 1.23.9__tar.gz → 1.23.11__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 (55) hide show
  1. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/PKG-INFO +1 -1
  2. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/annotation/deprecate.py +1 -1
  3. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/dependable.py +7 -2
  4. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/sql.py +40 -13
  5. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/pyproject.toml +1 -1
  6. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/LICENSE +0 -0
  7. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/README.md +0 -0
  8. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/__init__.py +0 -0
  9. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/annotation/__init__.py +0 -0
  10. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/date.py +0 -0
  11. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/environment.py +0 -0
  12. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/error.py +0 -0
  13. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/__init__.py +0 -0
  14. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/builder.py +0 -0
  15. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/docs.py +0 -0
  16. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/name.py +0 -0
  17. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/request.py +0 -0
  18. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/resource.py +0 -0
  19. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/response.py +0 -0
  20. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/router.py +0 -0
  21. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/schema.py +0 -0
  22. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fastapi/service.py +0 -0
  23. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/fluent.py +0 -0
  24. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/formatter.py +0 -0
  25. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/http/__init__.py +0 -0
  26. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/http/fake.py +0 -0
  27. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/http/fluent.py +0 -0
  28. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/http/httpx/__init__.py +0 -0
  29. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/http/httpx/client.py +0 -0
  30. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/http/httpx/hooks.py +0 -0
  31. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/http/json.py +0 -0
  32. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/http/url.py +0 -0
  33. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/id.py +0 -0
  34. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/key_fn.py +0 -0
  35. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/py.typed +0 -0
  36. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/query/__init__.py +0 -0
  37. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/query/generator.py +0 -0
  38. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/query/query.py +0 -0
  39. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/__init__.py +0 -0
  40. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/base.py +0 -0
  41. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/connector.py +0 -0
  42. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/database.py +0 -0
  43. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/decorator.py +0 -0
  44. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/in_memory.py +0 -0
  45. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/interface.py +0 -0
  46. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/mssql.py +0 -0
  47. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/repository.py +0 -0
  48. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/repository/sqlite.py +0 -0
  49. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/server.py +0 -0
  50. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/synchronization.py +0 -0
  51. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/testing/__init__.py +0 -0
  52. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/testing/database.py +0 -0
  53. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/testing/fake.py +0 -0
  54. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/testing/rest.py +0 -0
  55. {apexdevkit-1.23.9 → apexdevkit-1.23.11}/apexdevkit/value.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: apexdevkit
3
- Version: 1.23.9
3
+ Version: 1.23.11
4
4
  Summary: Apex Development Tools for python.
5
5
  Author: Apex Dev
6
6
  Author-email: dev@apex.ge
@@ -23,7 +23,7 @@ def deprecated(warning: str) -> Callable[[F], F]:
23
23
 
24
24
  def decorator(obj: F) -> F:
25
25
  if inspect.isfunction(obj) or inspect.ismethod(obj):
26
- return cast(F, _wrap_function(obj, warning))
26
+ return _wrap_function(obj, warning)
27
27
  if inspect.isclass(obj):
28
28
  return cast(F, _deprecate_class(obj, warning))
29
29
  raise TypeError(
@@ -5,7 +5,7 @@ from typing import Annotated, Any, Protocol
5
5
  from fastapi import Depends, Path
6
6
  from fastapi.requests import Request
7
7
 
8
- from apexdevkit.error import ApiError, DoesNotExistError
8
+ from apexdevkit.error import ApiError, DoesNotExistError, ForbiddenError
9
9
  from apexdevkit.fastapi import RestfulServiceBuilder
10
10
  from apexdevkit.fastapi.builder import PreBuilt
11
11
  from apexdevkit.fastapi.name import RestfulName
@@ -33,7 +33,12 @@ class ServiceDependency:
33
33
  Builder = self.dependency.as_dependable()
34
34
 
35
35
  def _(builder: Builder) -> RestfulService:
36
- return builder.build()
36
+ try:
37
+ return builder.build()
38
+ except ForbiddenError as e:
39
+ raise ApiError(
40
+ 403, RestfulResponse(RestfulName("unknown")).forbidden(e)
41
+ ) from e
37
42
 
38
43
  return Annotated[RestfulService, Depends(_)]
39
44
 
@@ -14,6 +14,7 @@ class NotNone:
14
14
  class _SqlField:
15
15
  name: str
16
16
  is_id: bool = False
17
+ is_selectable: bool = False
17
18
  is_composite: bool = False
18
19
  include_in_insert: bool = True
19
20
  include_in_update: bool = True
@@ -35,6 +36,7 @@ class _SqlField:
35
36
  class SqlFieldBuilder:
36
37
  _name: str = field(init=False)
37
38
  _is_id: bool = False
39
+ _is_selectable: bool = False
38
40
  _is_composite: bool = False
39
41
  _include_in_insert: bool = True
40
42
  _include_in_update: bool = True
@@ -61,6 +63,11 @@ class SqlFieldBuilder:
61
63
 
62
64
  return self
63
65
 
66
+ def as_selectable(self) -> SqlFieldBuilder:
67
+ self._is_selectable = True
68
+
69
+ return self
70
+
64
71
  def as_composite(self) -> SqlFieldBuilder:
65
72
  self._is_composite = True
66
73
 
@@ -104,6 +111,7 @@ class SqlFieldBuilder:
104
111
  return _SqlField(
105
112
  name=self._name,
106
113
  is_id=self._is_id,
114
+ is_selectable=self._is_selectable,
107
115
  is_composite=self._is_composite,
108
116
  include_in_insert=self._include_in_insert,
109
117
  include_in_update=self._include_in_update,
@@ -194,21 +202,40 @@ class SqlFieldManager:
194
202
  return ""
195
203
 
196
204
  def _id_filter(self, include_id: bool, read_id: bool) -> str:
197
- return (
198
- self.key_formatter.replace("x", self.id)
199
- + " = "
200
- + (
201
- self.value_formatter.replace("x", self.id)
202
- if not read_id
203
- or next( # type: ignore
204
- (key for key in self.fields if key.is_id), None
205
- ).include_in_insert
206
- else "SCOPE_IDENTITY()"
207
- )
208
- if include_id
209
- else ""
205
+ if not include_id:
206
+ return ""
207
+
208
+ clauses = []
209
+
210
+ id_field = next((key for key in self.fields if key.is_id), None)
211
+ if id_field is None:
212
+ raise ValueError("Id field is required.")
213
+
214
+ value_expr = (
215
+ self.value_formatter.replace("x", id_field.name)
216
+ if not read_id or id_field.include_in_insert
217
+ else "SCOPE_IDENTITY()"
218
+ )
219
+ clauses.append(
220
+ f"{self.key_formatter.replace('x', id_field.name)} = {value_expr}"
210
221
  )
211
222
 
223
+ if not read_id:
224
+ selectable_fields = [
225
+ selectable
226
+ for selectable in self.fields
227
+ if selectable.is_selectable and not selectable.is_id
228
+ ]
229
+ for selectable in selectable_fields:
230
+ key_expr = self.key_formatter.replace("x", selectable.name)
231
+ val_expr = self.value_formatter.replace("x", id_field.name)
232
+ clauses.append(f"{key_expr} = {val_expr}")
233
+
234
+ if len(clauses) == 1:
235
+ return clauses[0]
236
+
237
+ return "(" + " OR ".join(clauses) + ")"
238
+
212
239
  def _general_filters(self) -> str:
213
240
  statements: list[str] = [] + self.custom_filters
214
241
  for key in self.fields:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "apexdevkit"
3
- version = "1.23.9"
3
+ version = "1.23.11"
4
4
  description = "Apex Development Tools for python."
5
5
  readme = "README.md"
6
6
  authors = [
File without changes
File without changes