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.
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/PKG-INFO +1 -1
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/service.py +7 -7
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/formatter.py +36 -5
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/query/generator.py +2 -2
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/database.py +2 -2
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/mongo.py +2 -2
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/mssql.py +6 -6
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/sql.py +4 -2
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/sqlite.py +7 -7
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/pyproject.toml +1 -1
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/LICENSE +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/README.md +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/__init__.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/annotation/__init__.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/annotation/deprecate.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/environment.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/error.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/__init__.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/builder.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/dependable.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/docs.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/name.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/request.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/resource.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/response.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/router.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fastapi/schema.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/fluent.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/__init__.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/fake.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/fluent.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/httpx/__init__.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/httpx/client.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/httpx/hooks.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/json.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/http/url.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/id.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/key_fn.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/py.typed +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/query/__init__.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/query/query.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/__init__.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/base.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/connector.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/decorator.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/in_memory.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/repository/interface.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/server.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/synchronization.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/testing/__init__.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/testing/database.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/testing/fake.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/testing/rest.py +0 -0
- {apexdevkit-1.20.2 → apexdevkit-1.20.3}/apexdevkit/value.py +0 -0
|
@@ -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 =
|
|
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[
|
|
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[
|
|
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[
|
|
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:
|
|
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) ->
|
|
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:
|
|
121
|
+
def load(self, raw: Mapping[str, Any]) -> Value:
|
|
91
122
|
return DataclassFormatter(Value).load(raw)
|
|
92
123
|
|
|
93
|
-
def dump(self, value: Value) ->
|
|
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:
|
|
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 =
|
|
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[
|
|
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:
|
|
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[
|
|
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[
|
|
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[
|
|
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:
|
|
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,
|
|
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:
|
|
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:
|
|
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[
|
|
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[
|
|
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[
|
|
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:
|
|
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:
|
|
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
|
|
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
|