database-wrapper 0.2.9__py3-none-any.whl → 0.2.13__py3-none-any.whl
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/config.py +3 -3
- database_wrapper/db_data_model.py +122 -45
- database_wrapper/db_introspector.py +2 -4
- database_wrapper/db_wrapper.py +16 -3
- database_wrapper/db_wrapper_async.py +20 -12
- {database_wrapper-0.2.9.dist-info → database_wrapper-0.2.13.dist-info}/METADATA +6 -6
- database_wrapper-0.2.13.dist-info/RECORD +18 -0
- database_wrapper-0.2.9.dist-info/RECORD +0 -18
- {database_wrapper-0.2.9.dist-info → database_wrapper-0.2.13.dist-info}/WHEEL +0 -0
- {database_wrapper-0.2.9.dist-info → database_wrapper-0.2.13.dist-info}/top_level.txt +0 -0
database_wrapper/config.py
CHANGED
|
@@ -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": "450d82cbaaf0997ef1aba44a809ce8358e3b1ccd",
|
|
7
|
+
"git_commit_date": "06.01.2026 04:31",
|
|
8
|
+
"app_version": "0.2.13",
|
|
9
9
|
}
|
|
@@ -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
|
|
|
@@ -366,63 +366,140 @@ class DBDefaultsDataModel(DBDataModel):
|
|
|
366
366
|
### Default fields ###
|
|
367
367
|
######################
|
|
368
368
|
|
|
369
|
+
#
|
|
369
370
|
created_at: datetime.datetime = field(
|
|
370
371
|
default_factory=datetime.datetime.now,
|
|
371
|
-
metadata=
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
372
|
+
metadata=MetadataDict(
|
|
373
|
+
db_field=("created_at", "timestamptz"),
|
|
374
|
+
store=True,
|
|
375
|
+
update=False,
|
|
376
|
+
serialize=SerializeType.DATETIME,
|
|
377
|
+
),
|
|
377
378
|
)
|
|
378
379
|
"""created_at is readonly by default and should be present in all tables"""
|
|
379
380
|
|
|
381
|
+
#
|
|
380
382
|
updated_at: datetime.datetime = field(
|
|
381
383
|
default_factory=datetime.datetime.now,
|
|
382
|
-
metadata=
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
384
|
+
metadata=MetadataDict(
|
|
385
|
+
db_field=("updated_at", "timestamptz"),
|
|
386
|
+
store=True,
|
|
387
|
+
update=True,
|
|
388
|
+
serialize=SerializeType.DATETIME,
|
|
389
|
+
),
|
|
388
390
|
)
|
|
389
391
|
"""updated_at should be present in all tables and is updated automatically"""
|
|
390
392
|
|
|
393
|
+
# full
|
|
391
394
|
disabled_at: datetime.datetime = field(
|
|
392
395
|
default_factory=datetime.datetime.now,
|
|
393
|
-
metadata=
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
396
|
+
metadata=MetadataDict(
|
|
397
|
+
db_field=("disabled_at", "timestamptz"),
|
|
398
|
+
store=False,
|
|
399
|
+
update=False,
|
|
400
|
+
serialize=SerializeType.DATETIME,
|
|
401
|
+
),
|
|
399
402
|
)
|
|
400
403
|
|
|
404
|
+
#
|
|
401
405
|
deleted_at: datetime.datetime = field(
|
|
402
406
|
default_factory=datetime.datetime.now,
|
|
403
|
-
metadata=
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
407
|
+
metadata=MetadataDict(
|
|
408
|
+
db_field=("deleted_at", "timestamptz"),
|
|
409
|
+
store=False,
|
|
410
|
+
update=False,
|
|
411
|
+
serialize=SerializeType.DATETIME,
|
|
412
|
+
),
|
|
409
413
|
)
|
|
410
414
|
|
|
411
415
|
enabled: bool = field(
|
|
412
416
|
default=True,
|
|
413
|
-
metadata=
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
417
|
+
metadata=MetadataDict(
|
|
418
|
+
db_field=("enabled", "boolean"),
|
|
419
|
+
store=False,
|
|
420
|
+
update=False,
|
|
421
|
+
),
|
|
418
422
|
)
|
|
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
|
+
),
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
def update_data(self) -> dict[str, Any] | None:
|
|
433
|
+
"""
|
|
434
|
+
Update data to database
|
|
435
|
+
"""
|
|
436
|
+
|
|
437
|
+
# Update updated_at
|
|
438
|
+
self.updated_at = datetime.datetime.now(datetime.UTC)
|
|
439
|
+
|
|
440
|
+
return super().update_data()
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
@dataclass
|
|
444
|
+
class DBDefaultsDataModelV2(DBDataModel):
|
|
445
|
+
"""
|
|
446
|
+
This class includes default fields for all database models.
|
|
447
|
+
|
|
448
|
+
Attributes:
|
|
449
|
+
- created_at (datetime.datetime): The timestamp of when the instance was created.
|
|
450
|
+
- updated_at (datetime.datetime): The timestamp of when the instance was last updated.
|
|
451
|
+
- enabled (bool): Whether the instance is enabled or not.
|
|
452
|
+
- deleted (bool): Whether the instance is deleted or not.
|
|
453
|
+
"""
|
|
454
|
+
|
|
455
|
+
######################
|
|
456
|
+
### Default fields ###
|
|
457
|
+
######################
|
|
458
|
+
|
|
459
|
+
#
|
|
460
|
+
created_at: datetime.datetime = field(
|
|
461
|
+
default_factory=datetime.datetime.now,
|
|
462
|
+
metadata=MetadataDict(
|
|
463
|
+
db_field=("created_at", "timestamptz"),
|
|
464
|
+
store=True,
|
|
465
|
+
update=False,
|
|
466
|
+
serialize=SerializeType.DATETIME,
|
|
467
|
+
),
|
|
468
|
+
)
|
|
469
|
+
"""created_at is readonly by default and should be present in all tables"""
|
|
470
|
+
|
|
471
|
+
#
|
|
472
|
+
updated_at: datetime.datetime = field(
|
|
473
|
+
default_factory=datetime.datetime.now,
|
|
474
|
+
metadata=MetadataDict(
|
|
475
|
+
db_field=("updated_at", "timestamptz"),
|
|
476
|
+
store=True,
|
|
477
|
+
update=True,
|
|
478
|
+
serialize=SerializeType.DATETIME,
|
|
479
|
+
),
|
|
480
|
+
)
|
|
481
|
+
"""updated_at should be present in all tables and is updated automatically"""
|
|
482
|
+
|
|
483
|
+
#
|
|
484
|
+
disabled_at: datetime.datetime = field(
|
|
485
|
+
default_factory=datetime.datetime.now,
|
|
486
|
+
metadata=MetadataDict(
|
|
487
|
+
db_field=("disabled_at", "timestamptz"),
|
|
488
|
+
store=True,
|
|
489
|
+
update=True,
|
|
490
|
+
serialize=SerializeType.DATETIME,
|
|
491
|
+
),
|
|
492
|
+
)
|
|
493
|
+
|
|
494
|
+
#
|
|
495
|
+
deleted_at: datetime.datetime = field(
|
|
496
|
+
default_factory=datetime.datetime.now,
|
|
497
|
+
metadata=MetadataDict(
|
|
498
|
+
db_field=("deleted_at", "timestamptz"),
|
|
499
|
+
store=True,
|
|
500
|
+
update=True,
|
|
501
|
+
serialize=SerializeType.DATETIME,
|
|
502
|
+
),
|
|
426
503
|
)
|
|
427
504
|
|
|
428
505
|
def update_data(self) -> dict[str, Any] | None:
|
|
@@ -134,9 +134,7 @@ class DBIntrospector:
|
|
|
134
134
|
# Default value choice
|
|
135
135
|
default = None
|
|
136
136
|
default_factory = None
|
|
137
|
-
if c.is_nullable:
|
|
138
|
-
default = None
|
|
139
|
-
else:
|
|
137
|
+
if c.is_nullable == False:
|
|
140
138
|
# give some sane defaults for common not-nullables that aren't id/serial
|
|
141
139
|
if py_type is bool:
|
|
142
140
|
default = False
|
|
@@ -370,7 +368,7 @@ class DBIntrospector:
|
|
|
370
368
|
|
|
371
369
|
return "\n".join(lines)
|
|
372
370
|
|
|
373
|
-
def save_to_file(self, class_model_source: str, filepath: str, overwrite: bool) -> str:
|
|
371
|
+
def save_to_file(self, class_model_source: str, filepath: str | Path, overwrite: bool) -> str:
|
|
374
372
|
"""
|
|
375
373
|
Render `cls` to a Python source file and save it to `filepath`.
|
|
376
374
|
|
database_wrapper/db_wrapper.py
CHANGED
|
@@ -281,6 +281,21 @@ class DBWrapper(DBWrapperMixin):
|
|
|
281
281
|
|
|
282
282
|
return status
|
|
283
283
|
|
|
284
|
+
def insert_data(
|
|
285
|
+
self,
|
|
286
|
+
record: DBDataModel,
|
|
287
|
+
store_data: dict[str, Any],
|
|
288
|
+
) -> tuple[int, int]:
|
|
289
|
+
status = self._insert(
|
|
290
|
+
record,
|
|
291
|
+
record.schema_name,
|
|
292
|
+
record.table_name,
|
|
293
|
+
store_data,
|
|
294
|
+
record.id_key,
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
return status
|
|
298
|
+
|
|
284
299
|
def _update(
|
|
285
300
|
self,
|
|
286
301
|
empty_data_class: DBDataModel,
|
|
@@ -308,9 +323,7 @@ class DBWrapper(DBWrapperMixin):
|
|
|
308
323
|
|
|
309
324
|
table_identifier = self.make_identifier(schema_name, table_name)
|
|
310
325
|
update_key = self.make_identifier(empty_data_class.table_alias, id_key)
|
|
311
|
-
update_query = self._format_update_query(
|
|
312
|
-
table_identifier, update_key, update_data
|
|
313
|
-
)
|
|
326
|
+
update_query = self._format_update_query(table_identifier, update_key, update_data)
|
|
314
327
|
|
|
315
328
|
# Log
|
|
316
329
|
self.log_query(self.db_cursor, update_query, tuple(values))
|
|
@@ -41,7 +41,7 @@ class DBWrapperAsync(DBWrapperMixin):
|
|
|
41
41
|
raise ValueError("Id value is not set")
|
|
42
42
|
|
|
43
43
|
# Get the record
|
|
44
|
-
res = self.
|
|
44
|
+
res = self.get_all(
|
|
45
45
|
empty_data_class,
|
|
46
46
|
id_key,
|
|
47
47
|
id_value,
|
|
@@ -73,7 +73,7 @@ class DBWrapperAsync(DBWrapperMixin):
|
|
|
73
73
|
DataModelType | None: The result of the query.
|
|
74
74
|
"""
|
|
75
75
|
# Get the record
|
|
76
|
-
res = self.
|
|
76
|
+
res = self.get_all(
|
|
77
77
|
empty_data_class,
|
|
78
78
|
id_key,
|
|
79
79
|
id_value,
|
|
@@ -85,7 +85,7 @@ class DBWrapperAsync(DBWrapperMixin):
|
|
|
85
85
|
else:
|
|
86
86
|
return None
|
|
87
87
|
|
|
88
|
-
async def
|
|
88
|
+
async def get_all(
|
|
89
89
|
self,
|
|
90
90
|
empty_data_class: DataModelType,
|
|
91
91
|
id_key: str | None = None,
|
|
@@ -283,6 +283,20 @@ class DBWrapperAsync(DBWrapperMixin):
|
|
|
283
283
|
|
|
284
284
|
return status
|
|
285
285
|
|
|
286
|
+
async def insert_data(
|
|
287
|
+
self,
|
|
288
|
+
record: DBDataModel,
|
|
289
|
+
store_data: dict[str, Any],
|
|
290
|
+
) -> tuple[int, int]:
|
|
291
|
+
status = await self._insert(
|
|
292
|
+
record,
|
|
293
|
+
record.schema_name,
|
|
294
|
+
record.table_name,
|
|
295
|
+
store_data,
|
|
296
|
+
record.id_key,
|
|
297
|
+
)
|
|
298
|
+
return status
|
|
299
|
+
|
|
286
300
|
async def _update(
|
|
287
301
|
self,
|
|
288
302
|
empty_data_class: DBDataModel,
|
|
@@ -310,9 +324,7 @@ class DBWrapperAsync(DBWrapperMixin):
|
|
|
310
324
|
|
|
311
325
|
table_identifier = self.make_identifier(schema_name, table_name)
|
|
312
326
|
update_key = self.make_identifier(empty_data_class.table_alias, id_key)
|
|
313
|
-
update_query = self._format_update_query(
|
|
314
|
-
table_identifier, update_key, update_data
|
|
315
|
-
)
|
|
327
|
+
update_query = self._format_update_query(table_identifier, update_key, update_data)
|
|
316
328
|
|
|
317
329
|
# Log
|
|
318
330
|
self.log_query(self.db_cursor, update_query, tuple(values))
|
|
@@ -330,9 +342,7 @@ class DBWrapperAsync(DBWrapperMixin):
|
|
|
330
342
|
@overload
|
|
331
343
|
async def update(self, records: list[DataModelType]) -> list[int]: ...
|
|
332
344
|
|
|
333
|
-
async def update(
|
|
334
|
-
self, records: DataModelType | list[DataModelType]
|
|
335
|
-
) -> int | list[int]:
|
|
345
|
+
async def update(self, records: DataModelType | list[DataModelType]) -> int | list[int]:
|
|
336
346
|
"""
|
|
337
347
|
Updates a record or a list of records in the database.
|
|
338
348
|
|
|
@@ -438,9 +448,7 @@ class DBWrapperAsync(DBWrapperMixin):
|
|
|
438
448
|
@overload
|
|
439
449
|
async def delete(self, records: list[DataModelType]) -> list[int]: ...
|
|
440
450
|
|
|
441
|
-
async def delete(
|
|
442
|
-
self, records: DataModelType | list[DataModelType]
|
|
443
|
-
) -> int | list[int]:
|
|
451
|
+
async def delete(self, records: DataModelType | list[DataModelType]) -> int | list[int]:
|
|
444
452
|
"""
|
|
445
453
|
Deletes a record or a list of records from the database.
|
|
446
454
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: database_wrapper
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.13
|
|
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.13; extra == "pgsql"
|
|
37
37
|
Provides-Extra: mysql
|
|
38
|
-
Requires-Dist: database_wrapper_mysql==0.2.
|
|
38
|
+
Requires-Dist: database_wrapper_mysql==0.2.13; extra == "mysql"
|
|
39
39
|
Provides-Extra: mssql
|
|
40
|
-
Requires-Dist: database_wrapper_mssql==0.2.
|
|
40
|
+
Requires-Dist: database_wrapper_mssql==0.2.13; extra == "mssql"
|
|
41
41
|
Provides-Extra: sqlite
|
|
42
|
-
Requires-Dist: database_wrapper_sqlite==0.2.
|
|
42
|
+
Requires-Dist: database_wrapper_sqlite==0.2.13; extra == "sqlite"
|
|
43
43
|
Provides-Extra: redis
|
|
44
|
-
Requires-Dist: database_wrapper_redis==0.2.
|
|
44
|
+
Requires-Dist: database_wrapper_redis==0.2.13; 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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
database_wrapper/__init__.py,sha256=cGqsWr7imdMOO7vrcGye8FVul_v3-32mw4wgrfxnhJA,1320
|
|
2
|
+
database_wrapper/abc.py,sha256=JiQo6Yfv7xALrrHeICJCSgmyP2gHrp16Ov83mPBTGbE,2058
|
|
3
|
+
database_wrapper/common.py,sha256=fsxe28o_4xCrotPbB274dmzQ9rOyes0sBtcHog-9RVc,258
|
|
4
|
+
database_wrapper/config.py,sha256=y4Y2g4sEbD1kgqLNpxsfkDqXHurMFfaJQiellYs09PE,334
|
|
5
|
+
database_wrapper/db_backend.py,sha256=pV_XGu0tR5naz7Ni6BvpqcmN9U7TdQ0bRkg7YiNZlO0,7928
|
|
6
|
+
database_wrapper/db_data_model.py,sha256=zhD_c1H5YV2f29DjBTQ5Oln99iO8hWdtcf-ijelWQnA,17000
|
|
7
|
+
database_wrapper/db_introspector.py,sha256=8sWNmBeumCE0D-cbpBvpMSTbCU6dpDLxCPB8HaNf6KA,15463
|
|
8
|
+
database_wrapper/db_wrapper.py,sha256=x6xsMW0epCOaj3RWWi9mj1EE1JmqM27PyS_Khvsxdvo,15231
|
|
9
|
+
database_wrapper/db_wrapper_async.py,sha256=ud7kCDfsfrbp3FHfRS7FjbsVTnnf87sHsxctpNWuhnk,15500
|
|
10
|
+
database_wrapper/db_wrapper_mixin.py,sha256=QCB9qjWLxeFY5f2_apJVL1rtp75spvZ1HuEApBkzID8,10071
|
|
11
|
+
database_wrapper/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
+
database_wrapper/serialization.py,sha256=Tti1-nA7H4g3hzqr3mE2WurxOnEjFaxBJZTOR3ONZSo,2906
|
|
13
|
+
database_wrapper/utils/__init__.py,sha256=uC8YaJqfyFIZIeNdTRTbZwcOUVhmnS5eyOG-9gMs70c,96
|
|
14
|
+
database_wrapper/utils/dataclass_addons.py,sha256=Og98FTL8_m07AjpAsbIdSkHQO099xt9asD3W2QasypY,759
|
|
15
|
+
database_wrapper-0.2.13.dist-info/METADATA,sha256=sD36XRl-81M6pJOM8QESSUVgQd7SrkPg4n9Bfvms1Pw,3615
|
|
16
|
+
database_wrapper-0.2.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
17
|
+
database_wrapper-0.2.13.dist-info/top_level.txt,sha256=QcnS4ocJygxcKE5eoOqriuja306oVu-zJRn6yjRRhBw,17
|
|
18
|
+
database_wrapper-0.2.13.dist-info/RECORD,,
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
database_wrapper/__init__.py,sha256=cGqsWr7imdMOO7vrcGye8FVul_v3-32mw4wgrfxnhJA,1320
|
|
2
|
-
database_wrapper/abc.py,sha256=JiQo6Yfv7xALrrHeICJCSgmyP2gHrp16Ov83mPBTGbE,2058
|
|
3
|
-
database_wrapper/common.py,sha256=fsxe28o_4xCrotPbB274dmzQ9rOyes0sBtcHog-9RVc,258
|
|
4
|
-
database_wrapper/config.py,sha256=ETbnBY7XXHlIiseyafmCP59I6DBYCFZdk4JO2v2fldQ,333
|
|
5
|
-
database_wrapper/db_backend.py,sha256=pV_XGu0tR5naz7Ni6BvpqcmN9U7TdQ0bRkg7YiNZlO0,7928
|
|
6
|
-
database_wrapper/db_data_model.py,sha256=6yMArPQPfbiFn9GvfRKYQzEh67LfaUn7JqkKTTCc7W8,14888
|
|
7
|
-
database_wrapper/db_introspector.py,sha256=OsQDPr4Bp0SkekrIHIyKh4QX_bLrk7SOq4rbvzicKjE,15496
|
|
8
|
-
database_wrapper/db_wrapper.py,sha256=zwaA-5BfUhBTG3eI-Im4BKztbKN0DQLg5heIR-rbQCo,14928
|
|
9
|
-
database_wrapper/db_wrapper_async.py,sha256=EnF66zOJ9BEH2tQF-5v8hywEHl8KiryDM9l610ES7O0,15244
|
|
10
|
-
database_wrapper/db_wrapper_mixin.py,sha256=QCB9qjWLxeFY5f2_apJVL1rtp75spvZ1HuEApBkzID8,10071
|
|
11
|
-
database_wrapper/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
-
database_wrapper/serialization.py,sha256=Tti1-nA7H4g3hzqr3mE2WurxOnEjFaxBJZTOR3ONZSo,2906
|
|
13
|
-
database_wrapper/utils/__init__.py,sha256=uC8YaJqfyFIZIeNdTRTbZwcOUVhmnS5eyOG-9gMs70c,96
|
|
14
|
-
database_wrapper/utils/dataclass_addons.py,sha256=Og98FTL8_m07AjpAsbIdSkHQO099xt9asD3W2QasypY,759
|
|
15
|
-
database_wrapper-0.2.9.dist-info/METADATA,sha256=8chFSBLQVJN7072NkmVtC0rO4Fp9L6KIe6veVsjQBcw,3609
|
|
16
|
-
database_wrapper-0.2.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
17
|
-
database_wrapper-0.2.9.dist-info/top_level.txt,sha256=QcnS4ocJygxcKE5eoOqriuja306oVu-zJRn6yjRRhBw,17
|
|
18
|
-
database_wrapper-0.2.9.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|