apexdevkit 1.20.2__tar.gz → 1.20.3__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 (54) hide show
  1. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/PKG-INFO +1 -1
  2. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/service.py +7 -7
  3. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/formatter.py +36 -5
  4. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/query/generator.py +2 -2
  5. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/database.py +2 -2
  6. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/mongo.py +2 -2
  7. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/mssql.py +6 -6
  8. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/sql.py +4 -2
  9. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/sqlite.py +7 -7
  10. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/pyproject.toml +1 -1
  11. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/LICENSE +0 -0
  12. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/README.md +0 -0
  13. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/__init__.py +0 -0
  14. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/annotation/__init__.py +0 -0
  15. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/annotation/deprecate.py +0 -0
  16. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/environment.py +0 -0
  17. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/error.py +0 -0
  18. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/__init__.py +0 -0
  19. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/builder.py +0 -0
  20. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/dependable.py +0 -0
  21. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/docs.py +0 -0
  22. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/name.py +0 -0
  23. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/request.py +0 -0
  24. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/resource.py +0 -0
  25. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/response.py +0 -0
  26. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/router.py +0 -0
  27. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/schema.py +0 -0
  28. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fluent.py +0 -0
  29. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/__init__.py +0 -0
  30. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/fake.py +0 -0
  31. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/fluent.py +0 -0
  32. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/httpx/__init__.py +0 -0
  33. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/httpx/client.py +0 -0
  34. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/httpx/hooks.py +0 -0
  35. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/json.py +0 -0
  36. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/url.py +0 -0
  37. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/id.py +0 -0
  38. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/key_fn.py +0 -0
  39. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/py.typed +0 -0
  40. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/query/__init__.py +0 -0
  41. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/query/query.py +0 -0
  42. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/__init__.py +0 -0
  43. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/base.py +0 -0
  44. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/connector.py +0 -0
  45. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/decorator.py +0 -0
  46. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/in_memory.py +0 -0
  47. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/interface.py +0 -0
  48. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/server.py +0 -0
  49. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/synchronization.py +0 -0
  50. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/testing/__init__.py +0 -0
  51. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/testing/database.py +0 -0
  52. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/testing/fake.py +0 -0
  53. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/testing/rest.py +0 -0
  54. {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/value.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: apexdevkit
3
- Version: 1.20.2
3
+ Version: 1.20.3
4
4
  Summary: Apex Development Tools for python.
5
5
  Author: Apex Dev
6
6
  Author-email: dev@apex.ge
@@ -2,14 +2,14 @@ from __future__ import annotations
2
2
 
3
3
  from abc import ABC
4
4
  from dataclasses import dataclass
5
- from typing import Any, Dict, Generic, Iterable, TypeVar
5
+ from typing import Any, Dict, Generic, Iterable, Mapping, TypeVar
6
6
 
7
7
  from apexdevkit.formatter import Formatter
8
8
  from apexdevkit.query.query import FooterOptions, QueryOptions, Summary
9
9
  from apexdevkit.repository.decorator import BatchRepositoryDecorator
10
10
  from apexdevkit.repository.interface import Repository
11
11
 
12
- RawItem = dict[str, Any]
12
+ RawItem = Mapping[str, Any]
13
13
  RawCollection = Iterable[RawItem]
14
14
 
15
15
 
@@ -64,11 +64,11 @@ ItemT = TypeVar("ItemT")
64
64
 
65
65
  @dataclass(frozen=True)
66
66
  class RestfulRepositoryBuilder(Generic[ItemT]):
67
- formatter: Formatter[dict[str, Any], ItemT] | None = None
67
+ formatter: Formatter[Mapping[str, Any], ItemT] | None = None
68
68
  repository: Repository[ItemT] | None = None
69
69
 
70
70
  def with_formatter(
71
- self, formatter: Formatter[dict[str, Any], ItemT]
71
+ self, formatter: Formatter[Mapping[str, Any], ItemT]
72
72
  ) -> RestfulRepositoryBuilder[ItemT]:
73
73
  return RestfulRepositoryBuilder[ItemT](formatter, self.repository)
74
74
 
@@ -85,7 +85,7 @@ class RestfulRepositoryBuilder(Generic[ItemT]):
85
85
 
86
86
  @dataclass(frozen=True)
87
87
  class _RestfulRepository(RestfulService, Generic[ItemT]):
88
- formatter: Formatter[dict[str, Any], ItemT]
88
+ formatter: Formatter[Mapping[str, Any], ItemT]
89
89
  repository: Repository[ItemT]
90
90
 
91
91
  def create_one(self, item: RawItem) -> RawItem:
@@ -106,7 +106,7 @@ class _RestfulRepository(RestfulService, Generic[ItemT]):
106
106
  return [self.formatter.dump(item) for item in self.repository]
107
107
 
108
108
  def update_one(self, item_id: str, **with_fields: Any) -> RawItem:
109
- data = self.formatter.dump(self.repository.read(item_id))
109
+ data = dict(self.formatter.dump(self.repository.read(item_id)))
110
110
  data.update(**with_fields)
111
111
 
112
112
  self.repository.update(self.formatter.load(data))
@@ -116,7 +116,7 @@ class _RestfulRepository(RestfulService, Generic[ItemT]):
116
116
  def update_many(self, items: RawCollectionWithId) -> RawCollection:
117
117
  updates = []
118
118
  for fields in items:
119
- data = self.formatter.dump(self.repository.read(fields["id"]))
119
+ data = dict(self.formatter.dump(self.repository.read(fields["id"])))
120
120
  data.update(**fields)
121
121
 
122
122
  updates.append(self.formatter.load(data))
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import pickle
4
4
  from copy import deepcopy
5
5
  from dataclasses import asdict, dataclass, field, fields, is_dataclass
6
- from typing import Any, Generic, Protocol, Self, TypeVar, get_args
6
+ from typing import Any, Generic, Mapping, Protocol, Self, TypeVar, get_args
7
7
 
8
8
  from typing_extensions import get_type_hints
9
9
 
@@ -23,6 +23,37 @@ class Formatter(Protocol[_SourceT, _TargetT]): # pragma: no cover
23
23
  pass
24
24
 
25
25
 
26
+ @dataclass(frozen=True)
27
+ class AliasFormatter(Formatter[Mapping[str, Any], _TargetT]):
28
+ inner: Formatter[Mapping[str, Any], _TargetT]
29
+
30
+ alias: AliasMapping
31
+
32
+ def load(self, source: Mapping[str, Any]) -> _TargetT:
33
+ return self.inner.load(self.alias.reverse().translate(source))
34
+
35
+ def dump(self, target: _TargetT) -> Mapping[str, Any]:
36
+ return self.alias.translate(self.inner.dump(target))
37
+
38
+
39
+ @dataclass(frozen=True)
40
+ class AliasMapping:
41
+ alias: Mapping[str, str]
42
+
43
+ @classmethod
44
+ def parse(cls, **alias: str) -> AliasMapping:
45
+ return cls(alias)
46
+
47
+ def reverse(self) -> AliasMapping:
48
+ return AliasMapping({value: key for key, value in self.alias.items()})
49
+
50
+ def translate(self, mapping: Mapping[str, Any]) -> Mapping[str, Any]:
51
+ return {self.value_of(key): value for key, value in mapping.items()}
52
+
53
+ def value_of(self, key: str) -> str:
54
+ return self.alias.get(key, key)
55
+
56
+
26
57
  class PickleFormatter(Generic[_ItemT]):
27
58
  def dump(self, item: _ItemT) -> bytes:
28
59
  return pickle.dumps(item)
@@ -55,7 +86,7 @@ class DataclassFormatter(Generic[_TargetT]):
55
86
 
56
87
  return self
57
88
 
58
- def load(self, raw: dict[str, Any]) -> _TargetT:
89
+ def load(self, raw: Mapping[str, Any]) -> _TargetT:
59
90
  raw = FluentDict[Any](deepcopy(raw)).select(
60
91
  *self.resource.__annotations__.keys()
61
92
  )
@@ -82,13 +113,13 @@ class DataclassFormatter(Generic[_TargetT]):
82
113
 
83
114
  return self.resource(**raw)
84
115
 
85
- def dump(self, item: _TargetT) -> dict[str, Any]:
116
+ def dump(self, item: _TargetT) -> Mapping[str, Any]:
86
117
  return asdict(item) # type: ignore
87
118
 
88
119
 
89
120
  class ValueFormatter:
90
- def load(self, raw: dict[str, Any]) -> Value:
121
+ def load(self, raw: Mapping[str, Any]) -> Value:
91
122
  return DataclassFormatter(Value).load(raw)
92
123
 
93
- def dump(self, value: Value) -> dict[str, Any]:
124
+ def dump(self, value: Value) -> Mapping[str, Any]:
94
125
  return DataclassFormatter(Value).dump(value)
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from collections import defaultdict
4
4
  from dataclasses import dataclass, field
5
- from typing import Any, ClassVar, Generic, Iterable, Protocol, TypeVar
5
+ from typing import Any, ClassVar, Generic, Iterable, Mapping, Protocol, TypeVar
6
6
 
7
7
  from apexdevkit.annotation import deprecated
8
8
  from apexdevkit.error import ForbiddenError
@@ -27,7 +27,7 @@ ItemT = TypeVar("ItemT", covariant=True)
27
27
 
28
28
 
29
29
  class _Loader(Protocol[ItemT]):
30
- def load(self, raw: dict[str, Any]) -> ItemT:
30
+ def load(self, raw: Mapping[str, Any]) -> ItemT:
31
31
  pass
32
32
 
33
33
 
@@ -2,9 +2,9 @@ from __future__ import annotations
2
2
 
3
3
  from copy import deepcopy
4
4
  from dataclasses import dataclass, field
5
- from typing import Any, ContextManager, Iterable, Protocol
5
+ from typing import Any, ContextManager, Iterable, Mapping, Protocol
6
6
 
7
- _RawData = dict[str, Any]
7
+ _RawData = Mapping[str, Any]
8
8
 
9
9
 
10
10
  @dataclass(frozen=True)
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Any, ContextManager, Generic, Iterator, Protocol, TypeVar
4
+ from typing import Any, ContextManager, Generic, Iterator, Mapping, Protocol, TypeVar
5
5
 
6
6
  from pymongo import MongoClient, ReturnDocument
7
7
  from pymongo.collection import Collection
@@ -24,7 +24,7 @@ class MongoRepository(Generic[ItemT]):
24
24
  connector: MongoConnector
25
25
  database_name: str
26
26
  collection_name: str
27
- formatter: Formatter[dict[str, Any], ItemT]
27
+ formatter: Formatter[Mapping[str, Any], ItemT]
28
28
 
29
29
  def collection(self, client: MongoClient[Any]) -> Collection[Any]:
30
30
  return client[self.database_name][self.collection_name]
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Any, Generic, Iterable, Iterator, TypeVar
4
+ from typing import Any, Generic, Iterable, Iterator, Mapping, TypeVar
5
5
 
6
6
  from pymssql.exceptions import DatabaseError
7
7
 
@@ -81,7 +81,7 @@ class SqlTable(Generic[ItemT]): # pragma: no cover
81
81
  def update(self, item: ItemT) -> DatabaseCommand:
82
82
  raise NotImplementedError
83
83
 
84
- def load(self, data: dict[str, Any]) -> ItemT:
84
+ def load(self, data: Mapping[str, Any]) -> ItemT:
85
85
  raise NotImplementedError
86
86
 
87
87
  def exists(self, duplicate: ItemT) -> ExistsError:
@@ -143,7 +143,7 @@ class MsSqlTableBuilder(Generic[ItemT]):
143
143
  username: str | None = None
144
144
  schema: str | None = None
145
145
  table: str | None = None
146
- formatter: Formatter[dict[str, Any], ItemT] | None = None
146
+ formatter: Formatter[Mapping[str, Any], ItemT] | None = None
147
147
  fields: list[_SqlField] | None = None
148
148
 
149
149
  def with_username(self, value: str) -> MsSqlTableBuilder[ItemT]:
@@ -174,7 +174,7 @@ class MsSqlTableBuilder(Generic[ItemT]):
174
174
  )
175
175
 
176
176
  def with_formatter(
177
- self, value: Formatter[dict[str, Any], ItemT]
177
+ self, value: Formatter[Mapping[str, Any], ItemT]
178
178
  ) -> MsSqlTableBuilder[ItemT]:
179
179
  return MsSqlTableBuilder[ItemT](
180
180
  self.username,
@@ -226,7 +226,7 @@ class MsSqlTableBuilder(Generic[ItemT]):
226
226
  class DefaultSqlTable(SqlTable[ItemT]):
227
227
  schema: str
228
228
  table: str
229
- formatter: Formatter[dict[str, Any], ItemT]
229
+ formatter: Formatter[Mapping[str, Any], ItemT]
230
230
  fields: SqlFieldManager
231
231
  username: str | None = None
232
232
 
@@ -336,7 +336,7 @@ class DefaultSqlTable(SqlTable[ItemT]):
336
336
  REVERT
337
337
  """).with_data(self.fields.with_fixed({}))
338
338
 
339
- def load(self, data: dict[str, Any]) -> ItemT:
339
+ def load(self, data: Mapping[str, Any]) -> ItemT:
340
340
  return self.formatter.load(data)
341
341
 
342
342
  def exists(self, duplicate: ItemT) -> ExistsError:
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
- from typing import Any, Iterator
4
+ from typing import Any, Iterator, Mapping
5
5
 
6
6
 
7
7
  @dataclass(frozen=True)
@@ -155,7 +155,9 @@ class SqlFieldManager:
155
155
  else:
156
156
  return ""
157
157
 
158
- def with_fixed(self, data: dict[str, Any]) -> dict[str, Any]:
158
+ def with_fixed(self, raw: Mapping[str, Any]) -> dict[str, Any]:
159
+ data = dict(raw)
160
+
159
161
  for key in self.fields:
160
162
  if key.is_parent:
161
163
  data[key.name] = key.parent_value
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from sqlite3 import IntegrityError
5
- from typing import Any, Generic, Iterable, Iterator
5
+ from typing import Any, Generic, Iterable, Iterator, Mapping
6
6
 
7
7
  from apexdevkit.error import DoesNotExistError, ExistsError
8
8
  from apexdevkit.formatter import Formatter
@@ -87,7 +87,7 @@ class SqlTable(Generic[ItemT]): # pragma: no cover
87
87
  def delete_all(self) -> DatabaseCommand:
88
88
  raise NotImplementedError
89
89
 
90
- def load(self, data: dict[str, Any]) -> ItemT:
90
+ def load(self, data: Mapping[str, Any]) -> ItemT:
91
91
  raise NotImplementedError
92
92
 
93
93
  def duplicate(self, item: ItemT) -> ExistsError:
@@ -96,20 +96,20 @@ class SqlTable(Generic[ItemT]): # pragma: no cover
96
96
 
97
97
  @dataclass
98
98
  class UnknownError(Exception):
99
- raw: dict[str, Any]
99
+ raw: Mapping[str, Any]
100
100
 
101
101
 
102
102
  @dataclass(frozen=True)
103
103
  class SqliteTableBuilder(Generic[ItemT]):
104
104
  table_name: str | None = None
105
- formatter: Formatter[dict[str, Any], ItemT] | None = None
105
+ formatter: Formatter[Mapping[str, Any], ItemT] | None = None
106
106
  fields: list[_SqlField] | None = None
107
107
 
108
108
  def with_name(self, value: str) -> SqliteTableBuilder[ItemT]:
109
109
  return SqliteTableBuilder[ItemT](value, self.formatter, self.fields)
110
110
 
111
111
  def with_formatter(
112
- self, value: Formatter[dict[str, Any], ItemT]
112
+ self, value: Formatter[Mapping[str, Any], ItemT]
113
113
  ) -> SqliteTableBuilder[ItemT]:
114
114
  return SqliteTableBuilder[ItemT](self.table_name, value, self.fields)
115
115
 
@@ -150,7 +150,7 @@ class SqliteTableBuilder(Generic[ItemT]):
150
150
  @dataclass(frozen=True)
151
151
  class _DefaultSqlTable(SqlTable[ItemT]):
152
152
  table_name: str
153
- formatter: Formatter[dict[str, Any], ItemT]
153
+ formatter: Formatter[Mapping[str, Any], ItemT]
154
154
  fields: SqlFieldManager
155
155
 
156
156
  def count_all(self) -> DatabaseCommand:
@@ -244,7 +244,7 @@ class _DefaultSqlTable(SqlTable[ItemT]):
244
244
  {self.fields.where_statement(include_id=False)};
245
245
  """).with_data(self.fields.with_fixed({}))
246
246
 
247
- def load(self, data: dict[str, Any]) -> ItemT:
247
+ def load(self, data: Mapping[str, Any]) -> ItemT:
248
248
  return self.formatter.load(data)
249
249
 
250
250
  def duplicate(self, item: ItemT) -> ExistsError:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "apexdevkit"
3
- version = "1.20.2"
3
+ version = "1.20.3"
4
4
  description = "Apex Development Tools for python."
5
5
  authors = ["Apex Dev <dev@apex.ge>"]
6
6
  readme = "README.md"
File without changes
File without changes