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.
Files changed (47) hide show
  1. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/PKG-INFO +1 -1
  2. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/mssql.py +3 -3
  3. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/sqlite.py +101 -16
  4. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/pyproject.toml +1 -1
  5. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/LICENSE +0 -0
  6. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/README.md +0 -0
  7. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/__init__.py +0 -0
  8. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/annotation/__init__.py +0 -0
  9. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/annotation/deprecate.py +0 -0
  10. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/environment.py +0 -0
  11. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/error.py +0 -0
  12. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/__init__.py +0 -0
  13. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/builder.py +0 -0
  14. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/dependable.py +0 -0
  15. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/docs.py +0 -0
  16. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/name.py +0 -0
  17. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/request.py +0 -0
  18. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/resource.py +0 -0
  19. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/response.py +0 -0
  20. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/router.py +0 -0
  21. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/schema.py +0 -0
  22. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fastapi/service.py +0 -0
  23. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/fluent.py +0 -0
  24. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/formatter.py +0 -0
  25. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/__init__.py +0 -0
  26. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/fake.py +0 -0
  27. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/fluent.py +0 -0
  28. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/httpx.py +0 -0
  29. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/json.py +0 -0
  30. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/http/url.py +0 -0
  31. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/key_fn.py +0 -0
  32. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/py.typed +0 -0
  33. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/__init__.py +0 -0
  34. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/base.py +0 -0
  35. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/connector.py +0 -0
  36. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/database.py +0 -0
  37. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/decorator.py +0 -0
  38. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/in_memory.py +0 -0
  39. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/interface.py +0 -0
  40. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/repository/mongo.py +0 -0
  41. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/server.py +0 -0
  42. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/synchronization.py +0 -0
  43. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/testing/__init__.py +0 -0
  44. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/testing/database.py +0 -0
  45. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/testing/fake.py +0 -0
  46. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/testing/rest.py +0 -0
  47. {apexdevkit-1.17.6 → apexdevkit-1.17.7}/apexdevkit/value.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: apexdevkit
3
- Version: 1.17.6
3
+ Version: 1.17.7
4
4
  Summary: Apex Development Tools for python.
5
5
  Author: Apex Dev
6
6
  Author-email: dev@apex.ge
@@ -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
- ", [" + self.parent_key + "] = %(" + self.parent_key + ")s"
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
- ", [" + self.parent_key + "] = %(" + self.parent_key + ")s"
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
- ", [" + self.parent_key + "] = %(" + self.parent_key + ")s"
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](value, self.formatter, self.fields)
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](self.table_name, value, self.fields)
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(self.table_name, self.formatter, self.fields)
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(self.formatter.dump(item))
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
- WHERE {self._id} = :{self._id};
194
- """).with_data({self._id: item_id})
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
- WHERE
232
- {self._id} = :{self._id};
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
- WHERE
240
- {self._id} = :{self._id};
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:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "apexdevkit"
3
- version = "1.17.6"
3
+ version = "1.17.7"
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