apexdevkit 1.17.6__tar.gz → 1.17.7__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.17.6 → apexdevkit-1.17.7}/PKG-INFO +1 -1
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/mssql.py +3 -3
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/sqlite.py +101 -16
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/pyproject.toml +1 -1
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/LICENSE +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/README.md +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/__init__.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/annotation/__init__.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/annotation/deprecate.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/environment.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/error.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/__init__.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/builder.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/dependable.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/docs.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/name.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/request.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/resource.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/response.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/router.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/schema.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/service.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fluent.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/formatter.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/__init__.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/fake.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/fluent.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/httpx.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/json.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/url.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/key_fn.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/py.typed +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/__init__.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/base.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/connector.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/database.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/decorator.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/in_memory.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/interface.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/mongo.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/server.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/synchronization.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/testing/__init__.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/testing/database.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/testing/fake.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/testing/rest.py +0 -0
- {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/value.py +0 -0
|
@@ -331,7 +331,7 @@ class DefaultSqlTable(SqlTable[ItemT]):
|
|
|
331
331
|
if self.parent_key is not None:
|
|
332
332
|
raw[self.parent_key] = self.parent_value
|
|
333
333
|
where_statement += (
|
|
334
|
-
"
|
|
334
|
+
" AND [" + self.parent_key + "] = %(" + self.parent_key + ")s"
|
|
335
335
|
)
|
|
336
336
|
|
|
337
337
|
columns = ", ".join(["[" + field.name + "]" for field in self.fields])
|
|
@@ -371,7 +371,7 @@ class DefaultSqlTable(SqlTable[ItemT]):
|
|
|
371
371
|
where_statement = f"WHERE [{self._id}] = %({self._id})s"
|
|
372
372
|
if self.parent_key is not None:
|
|
373
373
|
where_statement += (
|
|
374
|
-
"
|
|
374
|
+
" AND [" + self.parent_key + "] = %(" + self.parent_key + ")s"
|
|
375
375
|
)
|
|
376
376
|
|
|
377
377
|
updates = ", ".join(
|
|
@@ -397,7 +397,7 @@ class DefaultSqlTable(SqlTable[ItemT]):
|
|
|
397
397
|
if self.parent_key is not None:
|
|
398
398
|
raw[self.parent_key] = self.parent_value
|
|
399
399
|
where_statement += (
|
|
400
|
-
"
|
|
400
|
+
" AND [" + self.parent_key + "] = %(" + self.parent_key + ")s"
|
|
401
401
|
)
|
|
402
402
|
|
|
403
403
|
return DatabaseCommand(f"""
|
|
@@ -103,20 +103,28 @@ class SqliteTableBuilder(Generic[ItemT]):
|
|
|
103
103
|
table_name: str | None = None
|
|
104
104
|
formatter: Formatter[dict[str, Any], ItemT] | None = None
|
|
105
105
|
fields: list[SqliteField] | None = None
|
|
106
|
+
parent_field: str | None = None
|
|
107
|
+
parent_value: Any | None = None
|
|
106
108
|
|
|
107
109
|
def with_name(self, value: str) -> SqliteTableBuilder[ItemT]:
|
|
108
|
-
return SqliteTableBuilder[ItemT](
|
|
110
|
+
return SqliteTableBuilder[ItemT](
|
|
111
|
+
value, self.formatter, self.fields, self.parent_field, self.parent_value
|
|
112
|
+
)
|
|
109
113
|
|
|
110
114
|
def with_formatter(
|
|
111
115
|
self, value: Formatter[dict[str, Any], ItemT]
|
|
112
116
|
) -> SqliteTableBuilder[ItemT]:
|
|
113
|
-
return SqliteTableBuilder[ItemT](
|
|
117
|
+
return SqliteTableBuilder[ItemT](
|
|
118
|
+
self.table_name, value, self.fields, self.parent_field, self.parent_value
|
|
119
|
+
)
|
|
114
120
|
|
|
115
121
|
def with_fields(self, fields: Iterable[str]) -> SqliteTableBuilder[ItemT]:
|
|
116
122
|
return SqliteTableBuilder[ItemT](
|
|
117
123
|
self.table_name,
|
|
118
124
|
self.formatter,
|
|
119
125
|
[SqliteField(field, field == "id", False) for field in list(fields)],
|
|
126
|
+
self.parent_field,
|
|
127
|
+
self.parent_value,
|
|
120
128
|
)
|
|
121
129
|
|
|
122
130
|
def with_id(self, identifier: str) -> SqliteTableBuilder[ItemT]:
|
|
@@ -131,6 +139,8 @@ class SqliteTableBuilder(Generic[ItemT]):
|
|
|
131
139
|
SqliteField(field.name, field.name == identifier, field.is_composite)
|
|
132
140
|
for field in self.fields
|
|
133
141
|
],
|
|
142
|
+
self.parent_field,
|
|
143
|
+
self.parent_value,
|
|
134
144
|
)
|
|
135
145
|
|
|
136
146
|
def with_composite_key(
|
|
@@ -149,13 +159,36 @@ class SqliteTableBuilder(Generic[ItemT]):
|
|
|
149
159
|
SqliteField(field.name, field.is_id, field.name in list(composites))
|
|
150
160
|
for field in self.fields
|
|
151
161
|
],
|
|
162
|
+
self.parent_field,
|
|
163
|
+
self.parent_value,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
def with_parent(
|
|
167
|
+
self, parent_field: str, parent_value: Any
|
|
168
|
+
) -> SqliteTableBuilder[ItemT]:
|
|
169
|
+
assert self.fields is not None, "Set fields first."
|
|
170
|
+
if parent_field not in [field.name for field in self.fields]:
|
|
171
|
+
raise ValueError("Missing fields in the table.")
|
|
172
|
+
|
|
173
|
+
return SqliteTableBuilder[ItemT](
|
|
174
|
+
self.table_name,
|
|
175
|
+
self.formatter,
|
|
176
|
+
self.fields,
|
|
177
|
+
parent_field,
|
|
178
|
+
parent_value,
|
|
152
179
|
)
|
|
153
180
|
|
|
154
181
|
def build(self) -> SqlTable[ItemT]:
|
|
155
182
|
if not self.table_name or not self.formatter or not self.fields:
|
|
156
183
|
raise ValueError("Cannot build sql table.")
|
|
157
184
|
|
|
158
|
-
return _DefaultSqlTable(
|
|
185
|
+
return _DefaultSqlTable(
|
|
186
|
+
self.table_name,
|
|
187
|
+
self.formatter,
|
|
188
|
+
self.fields,
|
|
189
|
+
self.parent_field,
|
|
190
|
+
self.parent_value,
|
|
191
|
+
)
|
|
159
192
|
|
|
160
193
|
|
|
161
194
|
@dataclass(frozen=True)
|
|
@@ -163,14 +196,27 @@ class _DefaultSqlTable(SqlTable[ItemT]):
|
|
|
163
196
|
table_name: str
|
|
164
197
|
formatter: Formatter[dict[str, Any], ItemT]
|
|
165
198
|
fields: list[SqliteField]
|
|
199
|
+
parent_key: str | None
|
|
200
|
+
parent_value: Any | None
|
|
166
201
|
|
|
167
202
|
def count_all(self) -> DatabaseCommand:
|
|
203
|
+
where_statement = ""
|
|
204
|
+
if self.parent_key is not None:
|
|
205
|
+
where_statement += (
|
|
206
|
+
"WHERE " + self.parent_key + " = " + self._parent_value_sql
|
|
207
|
+
)
|
|
208
|
+
|
|
168
209
|
return DatabaseCommand(f"""
|
|
169
210
|
SELECT count(*) as n_items
|
|
170
|
-
FROM {self.table_name.capitalize()}
|
|
211
|
+
FROM {self.table_name.capitalize()}
|
|
212
|
+
{where_statement};
|
|
171
213
|
""")
|
|
172
214
|
|
|
173
215
|
def insert(self, item: ItemT) -> DatabaseCommand:
|
|
216
|
+
dumped = self.formatter.dump(item)
|
|
217
|
+
if self.parent_key is not None:
|
|
218
|
+
dumped[self.parent_key] = self.parent_value
|
|
219
|
+
|
|
174
220
|
columns = ", ".join([field.name for field in self.fields])
|
|
175
221
|
placeholders = ", ".join([f":{key.name}" for key in self.fields])
|
|
176
222
|
|
|
@@ -181,17 +227,23 @@ class _DefaultSqlTable(SqlTable[ItemT]):
|
|
|
181
227
|
{placeholders}
|
|
182
228
|
)
|
|
183
229
|
RETURNING {columns};
|
|
184
|
-
""").with_data(
|
|
230
|
+
""").with_data(dumped)
|
|
185
231
|
|
|
186
232
|
def select(self, item_id: str) -> DatabaseCommand:
|
|
233
|
+
raw: dict[str, Any] = {self._id: item_id}
|
|
234
|
+
where_statement = f"WHERE {self._id} = :{self._id}"
|
|
235
|
+
if self.parent_key is not None:
|
|
236
|
+
raw[self.parent_key] = self.parent_value
|
|
237
|
+
where_statement += " AND " + self.parent_key + " = :" + self.parent_key
|
|
238
|
+
|
|
187
239
|
columns = ", ".join([field.name for field in self.fields])
|
|
188
240
|
|
|
189
241
|
return DatabaseCommand(f"""
|
|
190
242
|
SELECT
|
|
191
243
|
{columns}
|
|
192
244
|
FROM {self.table_name.capitalize()}
|
|
193
|
-
|
|
194
|
-
""").with_data(
|
|
245
|
+
{where_statement};
|
|
246
|
+
""").with_data(raw)
|
|
195
247
|
|
|
196
248
|
def select_duplicate(self, item: ItemT) -> DatabaseCommand:
|
|
197
249
|
raw = self.formatter.dump(item)
|
|
@@ -207,20 +259,35 @@ class _DefaultSqlTable(SqlTable[ItemT]):
|
|
|
207
259
|
""").with_data({key: raw[key] for key in raw if key in self._composite})
|
|
208
260
|
|
|
209
261
|
def select_all(self) -> DatabaseCommand:
|
|
262
|
+
where_statement = ""
|
|
263
|
+
if self.parent_key is not None:
|
|
264
|
+
where_statement += (
|
|
265
|
+
"WHERE " + self.parent_key + " = " + self._parent_value_sql
|
|
266
|
+
)
|
|
267
|
+
|
|
210
268
|
columns = ", ".join([field.name for field in self.fields])
|
|
211
269
|
|
|
212
270
|
return DatabaseCommand(f"""
|
|
213
271
|
SELECT
|
|
214
272
|
{columns}
|
|
215
|
-
FROM {self.table_name.capitalize()}
|
|
273
|
+
FROM {self.table_name.capitalize()}
|
|
274
|
+
{where_statement};
|
|
216
275
|
""")
|
|
217
276
|
|
|
218
277
|
def update(self, item: ItemT) -> DatabaseCommand:
|
|
278
|
+
dumped = self.formatter.dump(item)
|
|
279
|
+
if self.parent_key is not None:
|
|
280
|
+
dumped[self.parent_key] = self.parent_value
|
|
281
|
+
|
|
282
|
+
where_statement = f"WHERE {self._id} = :{self._id}"
|
|
283
|
+
if self.parent_key is not None:
|
|
284
|
+
where_statement += " AND " + self.parent_key + " = :" + self.parent_key
|
|
285
|
+
|
|
219
286
|
updates = ", ".join(
|
|
220
287
|
[
|
|
221
288
|
f"{field.name} = :{field.name}"
|
|
222
289
|
for field in self.fields
|
|
223
|
-
if not field.is_id
|
|
290
|
+
if not field.is_id and field.name != self.parent_key
|
|
224
291
|
]
|
|
225
292
|
)
|
|
226
293
|
|
|
@@ -228,22 +295,33 @@ class _DefaultSqlTable(SqlTable[ItemT]):
|
|
|
228
295
|
UPDATE {self.table_name.capitalize()}
|
|
229
296
|
SET
|
|
230
297
|
{updates}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
""").with_data(self.formatter.dump(item))
|
|
298
|
+
{where_statement};
|
|
299
|
+
""").with_data(dumped)
|
|
234
300
|
|
|
235
301
|
def delete(self, item_id: str) -> DatabaseCommand:
|
|
302
|
+
raw: dict[str, Any] = {self._id: item_id}
|
|
303
|
+
where_statement = f"WHERE {self._id} = :{self._id}"
|
|
304
|
+
if self.parent_key is not None:
|
|
305
|
+
raw[self.parent_key] = self.parent_value
|
|
306
|
+
where_statement += " AND " + self.parent_key + " = :" + self.parent_key
|
|
307
|
+
|
|
236
308
|
return DatabaseCommand(f"""
|
|
237
309
|
DELETE
|
|
238
310
|
FROM {self.table_name.capitalize()}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
""").with_data({self._id: item_id})
|
|
311
|
+
{where_statement};
|
|
312
|
+
""").with_data(raw)
|
|
242
313
|
|
|
243
314
|
def delete_all(self) -> DatabaseCommand:
|
|
315
|
+
where_statement = ""
|
|
316
|
+
if self.parent_key is not None:
|
|
317
|
+
where_statement += (
|
|
318
|
+
"WHERE " + self.parent_key + " = " + self._parent_value_sql
|
|
319
|
+
)
|
|
320
|
+
|
|
244
321
|
return DatabaseCommand(f"""
|
|
245
322
|
DELETE
|
|
246
|
-
FROM {self.table_name.capitalize()}
|
|
323
|
+
FROM {self.table_name.capitalize()}
|
|
324
|
+
{where_statement};
|
|
247
325
|
""")
|
|
248
326
|
|
|
249
327
|
def load(self, data: dict[str, Any]) -> ItemT:
|
|
@@ -269,6 +347,13 @@ class _DefaultSqlTable(SqlTable[ItemT]):
|
|
|
269
347
|
names = [field.name for field in self.fields if field.is_composite]
|
|
270
348
|
return [self._id] if len(names) == 0 else names
|
|
271
349
|
|
|
350
|
+
@property
|
|
351
|
+
def _parent_value_sql(self) -> str:
|
|
352
|
+
if isinstance(self.parent_value, str):
|
|
353
|
+
return "'" + self.parent_value + "'"
|
|
354
|
+
else:
|
|
355
|
+
return str(self.parent_value)
|
|
356
|
+
|
|
272
357
|
|
|
273
358
|
@dataclass(frozen=True)
|
|
274
359
|
class SqliteField:
|
|
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
|