database-wrapper 0.1.86__py3-none-any.whl → 0.2.4__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_backend.py +41 -40
- database_wrapper/db_data_model.py +102 -102
- database_wrapper/db_wrapper.py +179 -159
- database_wrapper/db_wrapper_async.py +177 -165
- database_wrapper/db_wrapper_mixin.py +72 -72
- database_wrapper/serialization.py +15 -17
- database_wrapper/utils/dataclass_addons.py +5 -5
- {database_wrapper-0.1.86.dist-info → database_wrapper-0.2.4.dist-info}/METADATA +10 -7
- database_wrapper-0.2.4.dist-info/RECORD +17 -0
- {database_wrapper-0.1.86.dist-info → database_wrapper-0.2.4.dist-info}/WHEEL +1 -1
- database_wrapper-0.1.86.dist-info/RECORD +0 -17
- {database_wrapper-0.1.86.dist-info → database_wrapper-0.2.4.dist-info}/top_level.txt +0 -0
|
@@ -10,7 +10,7 @@ class DBWrapperMixin:
|
|
|
10
10
|
Mixin class for the DBWrapper class to provide methods that can be
|
|
11
11
|
used by both sync and async versions of the DBWrapper class.
|
|
12
12
|
|
|
13
|
-
:property
|
|
13
|
+
:property db_cursor: Database cursor object.
|
|
14
14
|
:property logger: Logger object
|
|
15
15
|
"""
|
|
16
16
|
|
|
@@ -18,7 +18,7 @@ class DBWrapperMixin:
|
|
|
18
18
|
### Instance properties ###
|
|
19
19
|
###########################
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
db_cursor: Any
|
|
22
22
|
"""
|
|
23
23
|
Database cursor object.
|
|
24
24
|
"""
|
|
@@ -34,7 +34,7 @@ class DBWrapperMixin:
|
|
|
34
34
|
# Meta methods
|
|
35
35
|
def __init__(
|
|
36
36
|
self,
|
|
37
|
-
|
|
37
|
+
db_cursor: Any = None,
|
|
38
38
|
logger: logging.Logger | None = None,
|
|
39
39
|
) -> None:
|
|
40
40
|
"""
|
|
@@ -44,11 +44,11 @@ class DBWrapperMixin:
|
|
|
44
44
|
db (DatabaseBackend): The DatabaseBackend object.
|
|
45
45
|
logger (logging.Logger, optional): The logger object. Defaults to None.
|
|
46
46
|
"""
|
|
47
|
-
self.
|
|
47
|
+
self.db_cursor = db_cursor
|
|
48
48
|
|
|
49
49
|
if logger is None:
|
|
50
|
-
|
|
51
|
-
self.logger = logging.getLogger(
|
|
50
|
+
logger_name = f"{__name__}.{self.__class__.__name__}"
|
|
51
|
+
self.logger = logging.getLogger(logger_name)
|
|
52
52
|
else:
|
|
53
53
|
self.logger = logger
|
|
54
54
|
|
|
@@ -59,32 +59,32 @@ class DBWrapperMixin:
|
|
|
59
59
|
self.logger.debug("Dealloc")
|
|
60
60
|
|
|
61
61
|
# Force remove instances so that there are no circular references
|
|
62
|
-
if hasattr(self, "
|
|
63
|
-
del self.
|
|
62
|
+
if hasattr(self, "db_cursor") and self.db_cursor:
|
|
63
|
+
del self.db_cursor
|
|
64
64
|
|
|
65
65
|
###############
|
|
66
66
|
### Setters ###
|
|
67
67
|
###############
|
|
68
68
|
|
|
69
|
-
def
|
|
69
|
+
def set_db_cursor(self, db_cursor: Any) -> None:
|
|
70
70
|
"""
|
|
71
71
|
Updates the database cursor object.
|
|
72
72
|
|
|
73
73
|
Args:
|
|
74
|
-
|
|
74
|
+
db_cursor (Any): The new database cursor object.
|
|
75
75
|
"""
|
|
76
76
|
|
|
77
|
-
if
|
|
78
|
-
del self.
|
|
77
|
+
if db_cursor is None:
|
|
78
|
+
del self.db_cursor
|
|
79
79
|
return
|
|
80
80
|
|
|
81
|
-
self.
|
|
81
|
+
self.db_cursor = db_cursor
|
|
82
82
|
|
|
83
83
|
######################
|
|
84
84
|
### Helper methods ###
|
|
85
85
|
######################
|
|
86
86
|
|
|
87
|
-
def
|
|
87
|
+
def make_identifier(self, schema: str | None, name: str) -> Any:
|
|
88
88
|
"""
|
|
89
89
|
Creates a SQL identifier object from the given name.
|
|
90
90
|
|
|
@@ -100,7 +100,7 @@ class DBWrapperMixin:
|
|
|
100
100
|
|
|
101
101
|
return name
|
|
102
102
|
|
|
103
|
-
def
|
|
103
|
+
def log_query(self, cursor: Any, query: Any, params: tuple[Any, ...]) -> None:
|
|
104
104
|
"""
|
|
105
105
|
Logs the given query and parameters.
|
|
106
106
|
|
|
@@ -111,10 +111,10 @@ class DBWrapperMixin:
|
|
|
111
111
|
"""
|
|
112
112
|
logging.getLogger().debug(f"Query: {query} with params: {params}")
|
|
113
113
|
|
|
114
|
-
def
|
|
114
|
+
def turn_data_into_model(
|
|
115
115
|
self,
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
empty_data_class: Type[DataModelType],
|
|
117
|
+
db_data: dict[str, Any],
|
|
118
118
|
) -> DataModelType:
|
|
119
119
|
"""
|
|
120
120
|
Turns the given data into a data model.
|
|
@@ -122,20 +122,20 @@ class DBWrapperMixin:
|
|
|
122
122
|
So we need to create a new instance of the data model and fill it with data
|
|
123
123
|
|
|
124
124
|
Args:
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
empty_data_class (DataModelType): The data model to use.
|
|
126
|
+
db_data (dict[str, Any]): The data to turn into a model.
|
|
127
127
|
|
|
128
128
|
Returns:
|
|
129
129
|
DataModelType: The data model filled with data.
|
|
130
130
|
"""
|
|
131
131
|
|
|
132
|
-
result =
|
|
133
|
-
result.
|
|
134
|
-
result.raw_data =
|
|
132
|
+
result = empty_data_class()
|
|
133
|
+
result.fill_data_from_dict(db_data)
|
|
134
|
+
result.raw_data = db_data
|
|
135
135
|
|
|
136
136
|
# If the id key is not "id", we set it manually so that its filled correctly
|
|
137
|
-
if result.
|
|
138
|
-
result.id =
|
|
137
|
+
if result.id_key != "id":
|
|
138
|
+
result.id = db_data.get(result.id_key, None)
|
|
139
139
|
|
|
140
140
|
return result
|
|
141
141
|
|
|
@@ -143,40 +143,40 @@ class DBWrapperMixin:
|
|
|
143
143
|
### Query methods ###
|
|
144
144
|
#####################
|
|
145
145
|
|
|
146
|
-
def
|
|
146
|
+
def filter_query(self, schema_name: str | None, table_name: str) -> Any:
|
|
147
147
|
"""
|
|
148
148
|
Creates a SQL query to filter data from the given table.
|
|
149
149
|
|
|
150
150
|
Args:
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
schema_name (str | None): The name of the schema to filter data from.
|
|
152
|
+
table_name (str): The name of the table to filter data from.
|
|
153
153
|
|
|
154
154
|
Returns:
|
|
155
155
|
Any: The created SQL query object.
|
|
156
156
|
"""
|
|
157
|
-
|
|
158
|
-
return f"SELECT * FROM {
|
|
157
|
+
full_table_name = self.make_identifier(schema_name, table_name)
|
|
158
|
+
return f"SELECT * FROM {full_table_name}"
|
|
159
159
|
|
|
160
|
-
def
|
|
160
|
+
def order_query(self, order_by: OrderByItem | None = None) -> Any | None:
|
|
161
161
|
"""
|
|
162
162
|
Creates a SQL query to order the results by the given column.
|
|
163
163
|
|
|
164
164
|
Args:
|
|
165
|
-
|
|
165
|
+
order_by (OrderByItem | None, optional): The column to order the results by. Defaults to None.
|
|
166
166
|
|
|
167
167
|
Returns:
|
|
168
168
|
Any: The created SQL query object.
|
|
169
169
|
"""
|
|
170
|
-
if
|
|
170
|
+
if order_by is None:
|
|
171
171
|
return None
|
|
172
172
|
|
|
173
|
-
|
|
173
|
+
order_list = [
|
|
174
174
|
f"{item[0]} {item[1] if len(item) > 1 and item[1] != None else 'ASC'}"
|
|
175
|
-
for item in
|
|
175
|
+
for item in order_by
|
|
176
176
|
]
|
|
177
|
-
return "ORDER BY %s" % ", ".join(
|
|
177
|
+
return "ORDER BY %s" % ", ".join(order_list)
|
|
178
178
|
|
|
179
|
-
def
|
|
179
|
+
def limit_query(self, offset: int = 0, limit: int = 100) -> Any | None:
|
|
180
180
|
"""
|
|
181
181
|
Creates a SQL query to limit the number of results returned.
|
|
182
182
|
|
|
@@ -192,7 +192,7 @@ class DBWrapperMixin:
|
|
|
192
192
|
|
|
193
193
|
return f"LIMIT {limit} OFFSET {offset}"
|
|
194
194
|
|
|
195
|
-
def
|
|
195
|
+
def format_filter(self, key: str, filter: Any) -> tuple[Any, ...]:
|
|
196
196
|
if type(filter) is dict:
|
|
197
197
|
if "$contains" in filter:
|
|
198
198
|
return (
|
|
@@ -210,15 +210,15 @@ class DBWrapperMixin:
|
|
|
210
210
|
elif "$min" in filter and "$max" in filter:
|
|
211
211
|
return (f"{key} BETWEEN %s AND %s", filter["$min"], filter["$max"]) # type: ignore
|
|
212
212
|
elif "$in" in filter:
|
|
213
|
-
|
|
214
|
-
return (
|
|
215
|
-
|
|
216
|
-
)
|
|
213
|
+
in_filter_1: list[Any] = cast(list[Any], filter["$in"])
|
|
214
|
+
return (
|
|
215
|
+
f"{key} IN (%s)" % ",".join(["%s"] * len(in_filter_1)),
|
|
216
|
+
) + tuple(in_filter_1)
|
|
217
217
|
elif "$not_in" in filter:
|
|
218
|
-
|
|
218
|
+
in_filter_2: list[Any] = cast(list[Any], filter["$in"])
|
|
219
219
|
return (
|
|
220
|
-
f"{key} NOT IN (%s)" % ",".join(["%s"] * len(
|
|
221
|
-
) + tuple(
|
|
220
|
+
f"{key} NOT IN (%s)" % ",".join(["%s"] * len(in_filter_2)),
|
|
221
|
+
) + tuple(in_filter_2)
|
|
222
222
|
elif "$not" in filter:
|
|
223
223
|
return (f"{key} != %s", filter["$not"]) # type: ignore
|
|
224
224
|
|
|
@@ -248,65 +248,65 @@ class DBWrapperMixin:
|
|
|
248
248
|
f"Filter type not supported: {key} = {type(filter)}"
|
|
249
249
|
)
|
|
250
250
|
|
|
251
|
-
def
|
|
251
|
+
def create_filter(
|
|
252
252
|
self, filter: dict[str, Any] | None
|
|
253
253
|
) -> tuple[Any, tuple[Any, ...]]:
|
|
254
254
|
if filter is None or len(filter) == 0:
|
|
255
255
|
return ("", tuple())
|
|
256
256
|
|
|
257
|
-
raw = [self.
|
|
257
|
+
raw = [self.format_filter(key, filter[key]) for key in filter]
|
|
258
258
|
_query = " AND ".join([tup[0] for tup in raw])
|
|
259
259
|
_query = f"WHERE {_query}"
|
|
260
260
|
_params = tuple([val for tup in raw for val in tup[1:] if val is not NoParam])
|
|
261
261
|
|
|
262
262
|
return (_query, _params)
|
|
263
263
|
|
|
264
|
-
def
|
|
264
|
+
def _format_filter_query(
|
|
265
265
|
self,
|
|
266
266
|
query: Any,
|
|
267
|
-
|
|
267
|
+
q_filter: Any,
|
|
268
268
|
order: Any,
|
|
269
269
|
limit: Any,
|
|
270
270
|
) -> Any:
|
|
271
|
-
if
|
|
272
|
-
|
|
271
|
+
if q_filter is None:
|
|
272
|
+
q_filter = ""
|
|
273
273
|
if order is None:
|
|
274
274
|
order = ""
|
|
275
275
|
if limit is None:
|
|
276
276
|
limit = ""
|
|
277
|
-
return f"{query} {
|
|
277
|
+
return f"{query} {q_filter} {order} {limit}"
|
|
278
278
|
|
|
279
|
-
def
|
|
279
|
+
def _format_insert_query(
|
|
280
280
|
self,
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
281
|
+
table_identifier: Any,
|
|
282
|
+
store_data: dict[str, Any],
|
|
283
|
+
return_key: Any,
|
|
284
284
|
) -> Any:
|
|
285
|
-
keys =
|
|
286
|
-
values = list(
|
|
285
|
+
keys = store_data.keys()
|
|
286
|
+
values = list(store_data.values())
|
|
287
287
|
|
|
288
288
|
columns = ", ".join(keys)
|
|
289
|
-
|
|
289
|
+
values_placeholder = ", ".join(["%s"] * len(values))
|
|
290
290
|
return (
|
|
291
|
-
f"INSERT INTO {
|
|
291
|
+
f"INSERT INTO {table_identifier} "
|
|
292
292
|
f"({columns}) "
|
|
293
|
-
f"VALUES ({
|
|
294
|
-
f"RETURNING {
|
|
293
|
+
f"VALUES ({values_placeholder}) "
|
|
294
|
+
f"RETURNING {return_key}"
|
|
295
295
|
)
|
|
296
296
|
|
|
297
|
-
def
|
|
297
|
+
def _format_update_query(
|
|
298
298
|
self,
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
299
|
+
table_identifier: Any,
|
|
300
|
+
update_key: Any,
|
|
301
|
+
update_data: dict[str, Any],
|
|
302
302
|
) -> Any:
|
|
303
|
-
keys =
|
|
303
|
+
keys = update_data.keys()
|
|
304
304
|
set_clause = ", ".join(f"{key} = %s" for key in keys)
|
|
305
|
-
return f"UPDATE {
|
|
305
|
+
return f"UPDATE {table_identifier} SET {set_clause} WHERE {update_key} = %s"
|
|
306
306
|
|
|
307
|
-
def
|
|
307
|
+
def _format_delete_query(
|
|
308
308
|
self,
|
|
309
|
-
|
|
310
|
-
|
|
309
|
+
table_identifier: Any,
|
|
310
|
+
delete_key: Any,
|
|
311
311
|
) -> Any:
|
|
312
|
-
return f"DELETE FROM {
|
|
312
|
+
return f"DELETE FROM {table_identifier} WHERE {delete_key} = %s"
|
|
@@ -12,7 +12,7 @@ class SerializeType(Enum):
|
|
|
12
12
|
ENUM = "enum"
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
def
|
|
15
|
+
def json_encoder(obj: Any) -> Any:
|
|
16
16
|
if isinstance(obj, Decimal):
|
|
17
17
|
return float(obj)
|
|
18
18
|
|
|
@@ -28,27 +28,27 @@ def jsonEncoder(obj: Any) -> Any:
|
|
|
28
28
|
return str(obj)
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
def
|
|
32
|
-
if
|
|
31
|
+
def serialize_value(value: Any, s_type: SerializeType) -> Any:
|
|
32
|
+
if s_type == SerializeType.DATETIME:
|
|
33
33
|
if not isinstance(value, datetime.datetime):
|
|
34
34
|
return value
|
|
35
35
|
|
|
36
36
|
return value.isoformat()
|
|
37
37
|
|
|
38
|
-
if
|
|
39
|
-
return json.dumps(value, default=
|
|
38
|
+
if s_type == SerializeType.JSON:
|
|
39
|
+
return json.dumps(value, default=json_encoder)
|
|
40
40
|
|
|
41
|
-
if
|
|
41
|
+
if s_type == SerializeType.ENUM:
|
|
42
42
|
return value.value
|
|
43
43
|
return value
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
def
|
|
46
|
+
def deserialize_value(
|
|
47
47
|
value: Any,
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
s_type: SerializeType,
|
|
49
|
+
enum_class: Type[Enum] | None = None,
|
|
50
50
|
) -> Any:
|
|
51
|
-
if
|
|
51
|
+
if s_type == SerializeType.DATETIME:
|
|
52
52
|
if isinstance(value, datetime.datetime):
|
|
53
53
|
return value
|
|
54
54
|
|
|
@@ -61,21 +61,19 @@ def deserializeValue(
|
|
|
61
61
|
|
|
62
62
|
return datetime.datetime.fromisoformat(value)
|
|
63
63
|
|
|
64
|
-
if
|
|
64
|
+
if s_type == SerializeType.JSON:
|
|
65
65
|
if isinstance(value, dict) or isinstance(value, list) or value is None:
|
|
66
66
|
return value # type: ignore
|
|
67
67
|
|
|
68
68
|
return json.loads(value)
|
|
69
69
|
|
|
70
|
-
if
|
|
71
|
-
if
|
|
72
|
-
raise ValueError(
|
|
73
|
-
"enumClass (enum_class) must be provided when deserializing Enum"
|
|
74
|
-
)
|
|
70
|
+
if s_type == SerializeType.ENUM:
|
|
71
|
+
if enum_class is None:
|
|
72
|
+
raise ValueError("enum_class must be provided when deserializing Enum")
|
|
75
73
|
|
|
76
74
|
if isinstance(value, Enum) or value is None:
|
|
77
75
|
return value
|
|
78
76
|
|
|
79
|
-
return
|
|
77
|
+
return enum_class(value)
|
|
80
78
|
|
|
81
79
|
return value
|
|
@@ -9,15 +9,15 @@ def ignore_unknown_kwargs() -> Callable[[AnyDataType], AnyDataType]:
|
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
def decorator(cls: AnyDataType) -> AnyDataType:
|
|
12
|
-
|
|
12
|
+
original_init = cls.__init__
|
|
13
13
|
|
|
14
|
-
# @wraps(
|
|
15
|
-
def
|
|
14
|
+
# @wraps(original_init)
|
|
15
|
+
def new_init(self: Any, *args: Any, **kwargs: Any) -> None:
|
|
16
16
|
# Filter out kwargs that are not properties of the class
|
|
17
17
|
valid_kwargs = {k: v for k, v in kwargs.items() if hasattr(self, k)}
|
|
18
|
-
|
|
18
|
+
original_init(self, *args, **valid_kwargs)
|
|
19
19
|
|
|
20
|
-
cls.__init__ =
|
|
20
|
+
cls.__init__ = new_init
|
|
21
21
|
return cls
|
|
22
22
|
|
|
23
23
|
return decorator
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: database_wrapper
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.4
|
|
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)
|
|
@@ -10,7 +10,7 @@ Project-URL: Changes, https://github.com/gintsmurans/py_database_wrapper
|
|
|
10
10
|
Project-URL: Code, https://github.com/gintsmurans/py_database_wrapper
|
|
11
11
|
Project-URL: Issue Tracker, https://github.com/gintsmurans/py_database_wrapper/issues
|
|
12
12
|
Project-URL: Download, https://pypi.org/project/database_wrapper/
|
|
13
|
-
Keywords: database,wrapper,python,pgsql,mysql,mssql,sqlite
|
|
13
|
+
Keywords: database,wrapper,python,pgsql,mysql,mssql,sqlite,redis
|
|
14
14
|
Classifier: Development Status :: 4 - Beta
|
|
15
15
|
Classifier: Intended Audience :: Developers
|
|
16
16
|
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
@@ -33,15 +33,17 @@ 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.
|
|
36
|
+
Requires-Dist: database_wrapper_pgsql==0.2.4; extra == "pgsql"
|
|
37
37
|
Provides-Extra: mysql
|
|
38
|
-
Requires-Dist: database_wrapper_mysql==0.
|
|
38
|
+
Requires-Dist: database_wrapper_mysql==0.2.4; extra == "mysql"
|
|
39
39
|
Provides-Extra: mssql
|
|
40
|
-
Requires-Dist: database_wrapper_mssql==0.
|
|
40
|
+
Requires-Dist: database_wrapper_mssql==0.2.4; extra == "mssql"
|
|
41
41
|
Provides-Extra: sqlite
|
|
42
|
-
Requires-Dist: database_wrapper_sqlite==0.
|
|
42
|
+
Requires-Dist: database_wrapper_sqlite==0.2.4; extra == "sqlite"
|
|
43
|
+
Provides-Extra: redis
|
|
44
|
+
Requires-Dist: database_wrapper_redis==0.2.4; extra == "redis"
|
|
43
45
|
Provides-Extra: all
|
|
44
|
-
Requires-Dist: database_wrapper[mssql,mysql,pgsql,sqlite]; extra == "all"
|
|
46
|
+
Requires-Dist: database_wrapper[mssql,mysql,pgsql,redis,sqlite]; extra == "all"
|
|
45
47
|
Provides-Extra: dev
|
|
46
48
|
Requires-Dist: ast-comments>=1.1.2; extra == "dev"
|
|
47
49
|
Requires-Dist: codespell>=2.2; extra == "dev"
|
|
@@ -69,3 +71,4 @@ See the README.md files in the database specific packages for more information.
|
|
|
69
71
|
* [database_wrapper_mysql](https://pypi.org/project/database_wrapper_mysql/)
|
|
70
72
|
* [database_wrapper_mssql](https://pypi.org/project/database_wrapper_mssql/)
|
|
71
73
|
* [database_wrapper_sqlite](https://pypi.org/project/database_wrapper_sqlite/)
|
|
74
|
+
* [database_wrapper_redis](https://pypi.org/project/database_wrapper_redis/)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
database_wrapper/__init__.py,sha256=p-HLz9_zByIUeAS1tVxS7ZieslsryHSLw_IKZphqB7w,1200
|
|
2
|
+
database_wrapper/abc.py,sha256=JiQo6Yfv7xALrrHeICJCSgmyP2gHrp16Ov83mPBTGbE,2058
|
|
3
|
+
database_wrapper/common.py,sha256=fsxe28o_4xCrotPbB274dmzQ9rOyes0sBtcHog-9RVc,258
|
|
4
|
+
database_wrapper/config.py,sha256=EZvKZiKqte2N_uRJXO6yEDr5qq2Jb7UgVUuNvsGXTb0,333
|
|
5
|
+
database_wrapper/db_backend.py,sha256=pV_XGu0tR5naz7Ni6BvpqcmN9U7TdQ0bRkg7YiNZlO0,7928
|
|
6
|
+
database_wrapper/db_data_model.py,sha256=XCQr3Z3XMwPlISsBqjRRBSd6qt21JBN1vfJHA3S5d0A,14330
|
|
7
|
+
database_wrapper/db_wrapper.py,sha256=zwaA-5BfUhBTG3eI-Im4BKztbKN0DQLg5heIR-rbQCo,14928
|
|
8
|
+
database_wrapper/db_wrapper_async.py,sha256=EnF66zOJ9BEH2tQF-5v8hywEHl8KiryDM9l610ES7O0,15244
|
|
9
|
+
database_wrapper/db_wrapper_mixin.py,sha256=QCB9qjWLxeFY5f2_apJVL1rtp75spvZ1HuEApBkzID8,10071
|
|
10
|
+
database_wrapper/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
+
database_wrapper/serialization.py,sha256=ghPEWXHdr2QAQlESCVibGxg4nd6Vr2eAvjX8E5Ub4cw,2041
|
|
12
|
+
database_wrapper/utils/__init__.py,sha256=uC8YaJqfyFIZIeNdTRTbZwcOUVhmnS5eyOG-9gMs70c,96
|
|
13
|
+
database_wrapper/utils/dataclass_addons.py,sha256=Og98FTL8_m07AjpAsbIdSkHQO099xt9asD3W2QasypY,759
|
|
14
|
+
database_wrapper-0.2.4.dist-info/METADATA,sha256=L18UTzvG-Qpj75AfrCnjb_yp5HmHpVyoGm7j2nI3Hqw,3609
|
|
15
|
+
database_wrapper-0.2.4.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
|
|
16
|
+
database_wrapper-0.2.4.dist-info/top_level.txt,sha256=QcnS4ocJygxcKE5eoOqriuja306oVu-zJRn6yjRRhBw,17
|
|
17
|
+
database_wrapper-0.2.4.dist-info/RECORD,,
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
database_wrapper/__init__.py,sha256=p-HLz9_zByIUeAS1tVxS7ZieslsryHSLw_IKZphqB7w,1200
|
|
2
|
-
database_wrapper/abc.py,sha256=JiQo6Yfv7xALrrHeICJCSgmyP2gHrp16Ov83mPBTGbE,2058
|
|
3
|
-
database_wrapper/common.py,sha256=fsxe28o_4xCrotPbB274dmzQ9rOyes0sBtcHog-9RVc,258
|
|
4
|
-
database_wrapper/config.py,sha256=kWelGxk53aaNirxNWNFJXhT9O7zKOMM9avqAeKIe4Tw,334
|
|
5
|
-
database_wrapper/db_backend.py,sha256=cMpUj-GOcrr-wVFG2ztKyTd65u50R0kmQ71Lx6GXgd0,7866
|
|
6
|
-
database_wrapper/db_data_model.py,sha256=3NcxWr6Sk_Ixx1QPLWZfJLwxVqN391IZ1_K4WZMNJRE,14181
|
|
7
|
-
database_wrapper/db_wrapper.py,sha256=nsFHax43Zz8L3sBih9kVlnAvZWC2hv9U7V_MICbE0RY,14353
|
|
8
|
-
database_wrapper/db_wrapper_async.py,sha256=8D4Oa0F6uPdjpH-cvmUPXLmbz35NLA7oa2MShIPourc,14737
|
|
9
|
-
database_wrapper/db_wrapper_mixin.py,sha256=GR6Zn-2GygzzSaFWPIqkiI6mZ8oWqKY_Sc-MeUp6SG8,9966
|
|
10
|
-
database_wrapper/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
-
database_wrapper/serialization.py,sha256=McLVLRlJ60OI2xHwnKD-0d3qHb5U8KTpz1P19SphxL8,2068
|
|
12
|
-
database_wrapper/utils/__init__.py,sha256=uC8YaJqfyFIZIeNdTRTbZwcOUVhmnS5eyOG-9gMs70c,96
|
|
13
|
-
database_wrapper/utils/dataclass_addons.py,sha256=r8DD40tXA_DLMQJx62UqVaRe4Gr9BSOmChLRhxawet4,770
|
|
14
|
-
database_wrapper-0.1.86.dist-info/METADATA,sha256=V4VLeqJRAQojIJa6kPfqNHOs9k5C9Db_mrzpluJAH_M,3440
|
|
15
|
-
database_wrapper-0.1.86.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
|
|
16
|
-
database_wrapper-0.1.86.dist-info/top_level.txt,sha256=QcnS4ocJygxcKE5eoOqriuja306oVu-zJRn6yjRRhBw,17
|
|
17
|
-
database_wrapper-0.1.86.dist-info/RECORD,,
|
|
File without changes
|