database-wrapper 0.2.12__tar.gz → 0.2.14__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.
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/PKG-INFO +6 -6
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/config.py +3 -3
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/db_data_model.py +132 -112
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper.egg-info/PKG-INFO +6 -6
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper.egg-info/requires.txt +5 -5
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/pyproject.toml +6 -6
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/README.md +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/__init__.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/abc.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/common.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/db_backend.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/db_introspector.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/db_wrapper.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/db_wrapper_async.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/db_wrapper_mixin.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/py.typed +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/serialization.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/utils/__init__.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/utils/dataclass_addons.py +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper.egg-info/SOURCES.txt +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper.egg-info/dependency_links.txt +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper.egg-info/top_level.txt +0 -0
- {database_wrapper-0.2.12 → database_wrapper-0.2.14}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: database_wrapper
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.14
|
|
4
4
|
Summary: A Different Approach to Database Wrappers in Python
|
|
5
5
|
Author-email: Gints Murans <gm@gm.lv>
|
|
6
6
|
License: GNU General Public License v3.0 (GPL-3.0)
|
|
@@ -33,15 +33,15 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
33
33
|
Requires-Python: >=3.8
|
|
34
34
|
Description-Content-Type: text/markdown
|
|
35
35
|
Provides-Extra: pgsql
|
|
36
|
-
Requires-Dist: database_wrapper_pgsql==0.2.
|
|
36
|
+
Requires-Dist: database_wrapper_pgsql==0.2.14; extra == "pgsql"
|
|
37
37
|
Provides-Extra: mysql
|
|
38
|
-
Requires-Dist: database_wrapper_mysql==0.2.
|
|
38
|
+
Requires-Dist: database_wrapper_mysql==0.2.14; extra == "mysql"
|
|
39
39
|
Provides-Extra: mssql
|
|
40
|
-
Requires-Dist: database_wrapper_mssql==0.2.
|
|
40
|
+
Requires-Dist: database_wrapper_mssql==0.2.14; extra == "mssql"
|
|
41
41
|
Provides-Extra: sqlite
|
|
42
|
-
Requires-Dist: database_wrapper_sqlite==0.2.
|
|
42
|
+
Requires-Dist: database_wrapper_sqlite==0.2.14; extra == "sqlite"
|
|
43
43
|
Provides-Extra: redis
|
|
44
|
-
Requires-Dist: database_wrapper_redis==0.2.
|
|
44
|
+
Requires-Dist: database_wrapper_redis==0.2.14; extra == "redis"
|
|
45
45
|
Provides-Extra: all
|
|
46
46
|
Requires-Dist: database_wrapper[mssql,mysql,pgsql,redis,sqlite]; extra == "all"
|
|
47
47
|
Provides-Extra: dev
|
|
@@ -3,7 +3,7 @@ from typing import Any
|
|
|
3
3
|
CONFIG: dict[str, Any] = {
|
|
4
4
|
# These are supposed to be set automatically by a git pre-compile script
|
|
5
5
|
# They are one git commit hash behind, if used automatically
|
|
6
|
-
"git_commit_hash": "
|
|
7
|
-
"git_commit_date": "
|
|
8
|
-
"app_version": "0.2.
|
|
6
|
+
"git_commit_hash": "520e71902c6f09ba35b57fd541d2e82dc5c54478",
|
|
7
|
+
"git_commit_date": "06.01.2026 02:41",
|
|
8
|
+
"app_version": "0.2.14",
|
|
9
9
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
from enum import Enum
|
|
2
1
|
import re
|
|
3
2
|
import json
|
|
4
3
|
import datetime
|
|
5
4
|
import dataclasses
|
|
6
5
|
|
|
7
6
|
from dataclasses import dataclass, field, asdict
|
|
8
|
-
from
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from typing import Any, Callable, ClassVar, Literal, NotRequired, Type, TypeVar, TypedDict, cast
|
|
9
9
|
|
|
10
10
|
from .serialization import (
|
|
11
11
|
SerializeType,
|
|
@@ -91,23 +91,23 @@ class DBDataModel:
|
|
|
91
91
|
# Id should be readonly by default and should be always present if record exists
|
|
92
92
|
id: int = field(
|
|
93
93
|
default=0,
|
|
94
|
-
metadata=
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
94
|
+
metadata=MetadataDict(
|
|
95
|
+
db_field=("id", "bigint"),
|
|
96
|
+
store=False,
|
|
97
|
+
update=False,
|
|
98
|
+
),
|
|
99
99
|
)
|
|
100
100
|
"""id is readonly by default"""
|
|
101
101
|
|
|
102
102
|
# Raw data
|
|
103
103
|
raw_data: dict[str, Any] = field(
|
|
104
104
|
default_factory=dict,
|
|
105
|
-
metadata=
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
105
|
+
metadata=MetadataDict(
|
|
106
|
+
db_field=("raw_data", "jsonb"),
|
|
107
|
+
exclude=True,
|
|
108
|
+
store=False,
|
|
109
|
+
update=False,
|
|
110
|
+
),
|
|
111
111
|
)
|
|
112
112
|
"""This is for storing temporary raw data"""
|
|
113
113
|
|
|
@@ -156,15 +156,16 @@ class DBDataModel:
|
|
|
156
156
|
def __str__(self) -> str:
|
|
157
157
|
return self.to_json_string()
|
|
158
158
|
|
|
159
|
-
# Dict
|
|
160
159
|
def dict_filter(self, pairs: list[tuple[str, Any]]) -> dict[str, Any]:
|
|
161
160
|
new_dict: dict[str, Any] = {}
|
|
162
|
-
for
|
|
163
|
-
class_field = self.__dataclass_fields__.get(
|
|
164
|
-
if class_field is
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
161
|
+
for field_name, value in pairs:
|
|
162
|
+
class_field = self.__dataclass_fields__.get(field_name, None)
|
|
163
|
+
if class_field is None:
|
|
164
|
+
continue
|
|
165
|
+
|
|
166
|
+
metadata = cast(MetadataDict, class_field.metadata)
|
|
167
|
+
if not metadata.get("exclude", False):
|
|
168
|
+
new_dict[field_name] = value
|
|
168
169
|
|
|
169
170
|
return new_dict
|
|
170
171
|
|
|
@@ -185,7 +186,9 @@ class DBDataModel:
|
|
|
185
186
|
for field_name, field_obj in self.__dataclass_fields__.items():
|
|
186
187
|
metadata = cast(MetadataDict, field_obj.metadata)
|
|
187
188
|
assert (
|
|
188
|
-
"db_field" in metadata
|
|
189
|
+
"db_field" in metadata
|
|
190
|
+
and isinstance(metadata["db_field"], tuple)
|
|
191
|
+
and len(metadata["db_field"]) == 2
|
|
189
192
|
), f"db_field metadata is not set for {field_name}"
|
|
190
193
|
field_type: str = metadata["db_field"][1]
|
|
191
194
|
schema["properties"][field_name] = {"type": field_type}
|
|
@@ -252,45 +255,35 @@ class DBDataModel:
|
|
|
252
255
|
|
|
253
256
|
def validate(self) -> Literal[True] | str:
|
|
254
257
|
"""
|
|
255
|
-
|
|
258
|
+
True if the instance is valid, otherwise an error message.
|
|
256
259
|
"""
|
|
257
260
|
raise NotImplementedError("`validate` is not implemented")
|
|
258
261
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
"""
|
|
263
|
-
if field_name in self.__dataclass_fields__:
|
|
264
|
-
current_metadata = cast(
|
|
265
|
-
MetadataDict,
|
|
266
|
-
dict(self.__dataclass_fields__[field_name].metadata),
|
|
267
|
-
)
|
|
268
|
-
current_metadata["store"] = enable
|
|
269
|
-
self.__dataclass_fields__[field_name].metadata = current_metadata
|
|
262
|
+
############################
|
|
263
|
+
### Store/update policies ###
|
|
264
|
+
############################
|
|
270
265
|
|
|
271
|
-
|
|
266
|
+
@classmethod
|
|
267
|
+
def _should_store(cls, field_name: str, metadata: MetadataDict) -> bool:
|
|
272
268
|
"""
|
|
273
|
-
|
|
269
|
+
Decide whether this field should be included in INSERT payload.
|
|
270
|
+
Base behavior: rely on field metadata.
|
|
271
|
+
Subclasses can override.
|
|
274
272
|
"""
|
|
275
|
-
|
|
276
|
-
current_metadata = cast(
|
|
277
|
-
MetadataDict,
|
|
278
|
-
dict(self.__dataclass_fields__[field_name].metadata),
|
|
279
|
-
)
|
|
280
|
-
current_metadata["update"] = enable
|
|
281
|
-
self.__dataclass_fields__[field_name].metadata = current_metadata
|
|
273
|
+
return bool(metadata.get("store", False))
|
|
282
274
|
|
|
283
|
-
|
|
275
|
+
@classmethod
|
|
276
|
+
def _should_update(cls, field_name: str, metadata: MetadataDict) -> bool:
|
|
284
277
|
"""
|
|
285
|
-
|
|
278
|
+
Decide whether this field should be included in UPDATE payload.
|
|
279
|
+
Base behavior: rely on field metadata.
|
|
280
|
+
Subclasses can override.
|
|
286
281
|
"""
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
current_metadata["exclude"] = enable
|
|
293
|
-
self.__dataclass_fields__[field_name].metadata = current_metadata
|
|
282
|
+
return bool(metadata.get("update", False))
|
|
283
|
+
|
|
284
|
+
@classmethod
|
|
285
|
+
def _should_exclude(cls, field_name: str, metadata: MetadataDict) -> bool:
|
|
286
|
+
return bool(metadata.get("exclude", False))
|
|
294
287
|
|
|
295
288
|
########################
|
|
296
289
|
### Database methods ###
|
|
@@ -298,19 +291,19 @@ class DBDataModel:
|
|
|
298
291
|
|
|
299
292
|
def query_base(self) -> Any:
|
|
300
293
|
"""
|
|
301
|
-
|
|
294
|
+
Base query for all queries
|
|
302
295
|
"""
|
|
303
296
|
return None
|
|
304
297
|
|
|
305
298
|
def store_data(self) -> dict[str, Any] | None:
|
|
306
299
|
"""
|
|
307
|
-
|
|
300
|
+
Store data to database
|
|
308
301
|
"""
|
|
309
302
|
store_data: dict[str, Any] = {}
|
|
310
303
|
for field_name, field_obj in self.__dataclass_fields__.items():
|
|
311
304
|
metadata = cast(MetadataDict, field_obj.metadata)
|
|
312
|
-
if
|
|
313
|
-
|
|
305
|
+
if self.__class__._should_store(field_name, metadata):
|
|
306
|
+
value = getattr(self, field_name)
|
|
314
307
|
|
|
315
308
|
# If serialize is set, and serialize is a SerializeType,
|
|
316
309
|
# we use our serialization function.
|
|
@@ -319,22 +312,23 @@ class DBDataModel:
|
|
|
319
312
|
serialize = metadata.get("serialize", None)
|
|
320
313
|
if serialize is not None:
|
|
321
314
|
if isinstance(serialize, SerializeType):
|
|
322
|
-
|
|
315
|
+
value = serialize_value(value, serialize)
|
|
323
316
|
else:
|
|
324
|
-
|
|
317
|
+
value = serialize(value)
|
|
325
318
|
|
|
319
|
+
store_data[field_name] = value
|
|
326
320
|
return store_data
|
|
327
321
|
|
|
328
322
|
def update_data(self) -> dict[str, Any] | None:
|
|
329
323
|
"""
|
|
330
|
-
|
|
324
|
+
Update data to database
|
|
331
325
|
"""
|
|
332
326
|
|
|
333
327
|
update_data: dict[str, Any] = {}
|
|
334
328
|
for field_name, field_obj in self.__dataclass_fields__.items():
|
|
335
329
|
metadata = cast(MetadataDict, field_obj.metadata)
|
|
336
|
-
if
|
|
337
|
-
|
|
330
|
+
if self.__class__._should_update(field_name, metadata):
|
|
331
|
+
value = getattr(self, field_name)
|
|
338
332
|
|
|
339
333
|
# If serialize is set, and serialize is a SerializeType,
|
|
340
334
|
# we use our serialization function.
|
|
@@ -343,94 +337,120 @@ class DBDataModel:
|
|
|
343
337
|
serialize = metadata.get("serialize", None)
|
|
344
338
|
if serialize is not None:
|
|
345
339
|
if isinstance(serialize, SerializeType):
|
|
346
|
-
|
|
340
|
+
value = serialize_value(value, serialize)
|
|
347
341
|
else:
|
|
348
|
-
|
|
342
|
+
value = serialize(value)
|
|
349
343
|
|
|
344
|
+
update_data[field_name] = value
|
|
350
345
|
return update_data
|
|
351
346
|
|
|
352
347
|
|
|
353
348
|
@dataclass
|
|
354
349
|
class DBDefaultsDataModel(DBDataModel):
|
|
355
350
|
"""
|
|
356
|
-
|
|
351
|
+
DBDataModel with conventional default columns.
|
|
352
|
+
Subclasses can set `_defaults_config` to select which defaults are active.
|
|
357
353
|
|
|
358
354
|
Attributes:
|
|
359
355
|
- created_at (datetime.datetime): The timestamp of when the instance was created.
|
|
360
356
|
- updated_at (datetime.datetime): The timestamp of when the instance was last updated.
|
|
361
|
-
-
|
|
362
|
-
-
|
|
357
|
+
- disabled_at (datetime.datetime): The timestamp of when the instance was disabled.
|
|
358
|
+
- deleted_at (datetime.datetime): The timestamp of when the instance was deleted.
|
|
359
|
+
- enabled (bool): Whether the instance is enabled or not. Deprecated.
|
|
360
|
+
- deleted (bool): Whether the instance is deleted or not. Deprecated.
|
|
363
361
|
"""
|
|
364
362
|
|
|
363
|
+
# Subclasses override this as a class attribute, e.g.:
|
|
364
|
+
# _defaults_config = ["created_at", "updated_at"]
|
|
365
|
+
_defaults_config: ClassVar[list[str]] = ["created_at", "updated_at", "disabled_at", "deleted_at"]
|
|
366
|
+
|
|
365
367
|
######################
|
|
366
368
|
### Default fields ###
|
|
367
369
|
######################
|
|
368
370
|
|
|
369
371
|
created_at: datetime.datetime = field(
|
|
370
372
|
default_factory=datetime.datetime.now,
|
|
371
|
-
metadata=
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
373
|
+
metadata=MetadataDict(
|
|
374
|
+
db_field=("created_at", "timestamptz"),
|
|
375
|
+
store=True,
|
|
376
|
+
update=False,
|
|
377
|
+
serialize=SerializeType.DATETIME,
|
|
378
|
+
),
|
|
377
379
|
)
|
|
378
|
-
"""created_at is readonly by default and should be present in all tables"""
|
|
379
380
|
|
|
380
381
|
updated_at: datetime.datetime = field(
|
|
381
382
|
default_factory=datetime.datetime.now,
|
|
382
|
-
metadata=
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
383
|
+
metadata=MetadataDict(
|
|
384
|
+
db_field=("updated_at", "timestamptz"),
|
|
385
|
+
store=True,
|
|
386
|
+
update=True,
|
|
387
|
+
serialize=SerializeType.DATETIME,
|
|
388
|
+
),
|
|
388
389
|
)
|
|
389
|
-
"""updated_at should be present in all tables and is updated automatically"""
|
|
390
390
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
"
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
391
|
+
# Important: default None, otherwise everything becomes disabled/deleted on insert.
|
|
392
|
+
disabled_at: datetime.datetime | None = field(
|
|
393
|
+
default=None,
|
|
394
|
+
metadata=MetadataDict(
|
|
395
|
+
db_field=("disabled_at", "timestamptz"),
|
|
396
|
+
store=True,
|
|
397
|
+
update=True,
|
|
398
|
+
serialize=SerializeType.DATETIME,
|
|
399
|
+
),
|
|
399
400
|
)
|
|
400
401
|
|
|
401
|
-
deleted_at: datetime.datetime = field(
|
|
402
|
-
|
|
403
|
-
metadata=
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
402
|
+
deleted_at: datetime.datetime | None = field(
|
|
403
|
+
default=None,
|
|
404
|
+
metadata=MetadataDict(
|
|
405
|
+
db_field=("deleted_at", "timestamptz"),
|
|
406
|
+
store=True,
|
|
407
|
+
update=True,
|
|
408
|
+
serialize=SerializeType.DATETIME,
|
|
409
|
+
),
|
|
409
410
|
)
|
|
410
411
|
|
|
412
|
+
# @deprecated
|
|
411
413
|
enabled: bool = field(
|
|
412
414
|
default=True,
|
|
413
|
-
metadata=
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
415
|
+
metadata=MetadataDict(
|
|
416
|
+
db_field=("enabled", "boolean"),
|
|
417
|
+
store=False,
|
|
418
|
+
update=False,
|
|
419
|
+
),
|
|
418
420
|
)
|
|
421
|
+
|
|
422
|
+
# @deprecated
|
|
419
423
|
deleted: bool = field(
|
|
420
424
|
default=False,
|
|
421
|
-
metadata=
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
425
|
+
metadata=MetadataDict(
|
|
426
|
+
db_field=("deleted", "boolean"),
|
|
427
|
+
store=False,
|
|
428
|
+
update=False,
|
|
429
|
+
),
|
|
426
430
|
)
|
|
427
431
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
432
|
+
############################
|
|
433
|
+
### Store/update policies ###
|
|
434
|
+
############################
|
|
435
|
+
|
|
436
|
+
@classmethod
|
|
437
|
+
def _should_store(cls, field_name: str, metadata: MetadataDict) -> bool:
|
|
438
|
+
# For the 4 defaults, defer to _defaults_config.
|
|
439
|
+
if field_name in ("created_at", "updated_at", "disabled_at", "deleted_at"):
|
|
440
|
+
return field_name in cls._defaults_config
|
|
441
|
+
return super()._should_store(field_name, metadata)
|
|
442
|
+
|
|
443
|
+
@classmethod
|
|
444
|
+
def _should_update(cls, field_name: str, metadata: MetadataDict) -> bool:
|
|
445
|
+
# created_at is never updated
|
|
446
|
+
if field_name == "created_at":
|
|
447
|
+
return False
|
|
448
|
+
if field_name in ("updated_at", "disabled_at", "deleted_at"):
|
|
449
|
+
return field_name in cls._defaults_config
|
|
450
|
+
return super()._should_update(field_name, metadata)
|
|
435
451
|
|
|
452
|
+
def update_data(self) -> dict[str, Any] | None:
|
|
453
|
+
# Always refresh updated_at if present in this model
|
|
454
|
+
if "updated_at" in self.__dataclass_fields__ and "updated_at" in self._defaults_config:
|
|
455
|
+
self.updated_at = datetime.datetime.now(datetime.UTC)
|
|
436
456
|
return super().update_data()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: database_wrapper
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.14
|
|
4
4
|
Summary: A Different Approach to Database Wrappers in Python
|
|
5
5
|
Author-email: Gints Murans <gm@gm.lv>
|
|
6
6
|
License: GNU General Public License v3.0 (GPL-3.0)
|
|
@@ -33,15 +33,15 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
33
33
|
Requires-Python: >=3.8
|
|
34
34
|
Description-Content-Type: text/markdown
|
|
35
35
|
Provides-Extra: pgsql
|
|
36
|
-
Requires-Dist: database_wrapper_pgsql==0.2.
|
|
36
|
+
Requires-Dist: database_wrapper_pgsql==0.2.14; extra == "pgsql"
|
|
37
37
|
Provides-Extra: mysql
|
|
38
|
-
Requires-Dist: database_wrapper_mysql==0.2.
|
|
38
|
+
Requires-Dist: database_wrapper_mysql==0.2.14; extra == "mysql"
|
|
39
39
|
Provides-Extra: mssql
|
|
40
|
-
Requires-Dist: database_wrapper_mssql==0.2.
|
|
40
|
+
Requires-Dist: database_wrapper_mssql==0.2.14; extra == "mssql"
|
|
41
41
|
Provides-Extra: sqlite
|
|
42
|
-
Requires-Dist: database_wrapper_sqlite==0.2.
|
|
42
|
+
Requires-Dist: database_wrapper_sqlite==0.2.14; extra == "sqlite"
|
|
43
43
|
Provides-Extra: redis
|
|
44
|
-
Requires-Dist: database_wrapper_redis==0.2.
|
|
44
|
+
Requires-Dist: database_wrapper_redis==0.2.14; extra == "redis"
|
|
45
45
|
Provides-Extra: all
|
|
46
46
|
Requires-Dist: database_wrapper[mssql,mysql,pgsql,redis,sqlite]; extra == "all"
|
|
47
47
|
Provides-Extra: dev
|
|
@@ -17,16 +17,16 @@ mysqlclient>=2.2.2
|
|
|
17
17
|
pymssql>=2.2.10
|
|
18
18
|
|
|
19
19
|
[mssql]
|
|
20
|
-
database_wrapper_mssql==0.2.
|
|
20
|
+
database_wrapper_mssql==0.2.14
|
|
21
21
|
|
|
22
22
|
[mysql]
|
|
23
|
-
database_wrapper_mysql==0.2.
|
|
23
|
+
database_wrapper_mysql==0.2.14
|
|
24
24
|
|
|
25
25
|
[pgsql]
|
|
26
|
-
database_wrapper_pgsql==0.2.
|
|
26
|
+
database_wrapper_pgsql==0.2.14
|
|
27
27
|
|
|
28
28
|
[redis]
|
|
29
|
-
database_wrapper_redis==0.2.
|
|
29
|
+
database_wrapper_redis==0.2.14
|
|
30
30
|
|
|
31
31
|
[sqlite]
|
|
32
|
-
database_wrapper_sqlite==0.2.
|
|
32
|
+
database_wrapper_sqlite==0.2.14
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "database_wrapper"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.14"
|
|
8
8
|
description = "A Different Approach to Database Wrappers in Python"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.8"
|
|
@@ -45,11 +45,11 @@ Code = "https://github.com/gintsmurans/py_database_wrapper"
|
|
|
45
45
|
Download = "https://pypi.org/project/database_wrapper/"
|
|
46
46
|
|
|
47
47
|
[project.optional-dependencies]
|
|
48
|
-
pgsql = ["database_wrapper_pgsql == 0.2.
|
|
49
|
-
mysql = ["database_wrapper_mysql == 0.2.
|
|
50
|
-
mssql = ["database_wrapper_mssql == 0.2.
|
|
51
|
-
sqlite = ["database_wrapper_sqlite == 0.2.
|
|
52
|
-
redis = ["database_wrapper_redis == 0.2.
|
|
48
|
+
pgsql = ["database_wrapper_pgsql == 0.2.14"]
|
|
49
|
+
mysql = ["database_wrapper_mysql == 0.2.14"]
|
|
50
|
+
mssql = ["database_wrapper_mssql == 0.2.14"]
|
|
51
|
+
sqlite = ["database_wrapper_sqlite == 0.2.14"]
|
|
52
|
+
redis = ["database_wrapper_redis == 0.2.14"]
|
|
53
53
|
all = ["database_wrapper[pgsql,mysql,mssql,sqlite,redis]"]
|
|
54
54
|
dev = [
|
|
55
55
|
# Development
|
|
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
|
{database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper/utils/dataclass_addons.py
RENAMED
|
File without changes
|
|
File without changes
|
{database_wrapper-0.2.12 → database_wrapper-0.2.14}/database_wrapper.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|