database-wrapper 0.2.14__tar.gz → 0.2.17__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 (23) hide show
  1. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/PKG-INFO +8 -8
  2. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/__init__.py +4 -4
  3. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/abc.py +3 -3
  4. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/config.py +3 -3
  5. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/db_backend.py +3 -3
  6. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/db_data_model.py +13 -15
  7. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/db_introspector.py +22 -20
  8. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/db_wrapper.py +6 -8
  9. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/db_wrapper_async.py +6 -8
  10. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/db_wrapper_mixin.py +20 -37
  11. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/serialization.py +3 -4
  12. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/utils/dataclass_addons.py +3 -2
  13. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper.egg-info/PKG-INFO +8 -8
  14. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper.egg-info/requires.txt +7 -7
  15. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/pyproject.toml +27 -16
  16. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/README.md +0 -0
  17. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/common.py +0 -0
  18. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/py.typed +0 -0
  19. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper/utils/__init__.py +0 -0
  20. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper.egg-info/SOURCES.txt +0 -0
  21. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper.egg-info/dependency_links.txt +0 -0
  22. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/database_wrapper.egg-info/top_level.txt +0 -0
  23. {database_wrapper-0.2.14 → database_wrapper-0.2.17}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: database_wrapper
3
- Version: 0.2.14
3
+ Version: 0.2.17
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,23 +33,23 @@ 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.14; extra == "pgsql"
36
+ Requires-Dist: database_wrapper_pgsql==0.2.17; extra == "pgsql"
37
37
  Provides-Extra: mysql
38
- Requires-Dist: database_wrapper_mysql==0.2.14; extra == "mysql"
38
+ Requires-Dist: database_wrapper_mysql==0.2.17; extra == "mysql"
39
39
  Provides-Extra: mssql
40
- Requires-Dist: database_wrapper_mssql==0.2.14; extra == "mssql"
40
+ Requires-Dist: database_wrapper_mssql==0.2.17; extra == "mssql"
41
41
  Provides-Extra: sqlite
42
- Requires-Dist: database_wrapper_sqlite==0.2.14; extra == "sqlite"
42
+ Requires-Dist: database_wrapper_sqlite==0.2.17; extra == "sqlite"
43
43
  Provides-Extra: redis
44
- Requires-Dist: database_wrapper_redis==0.2.14; extra == "redis"
44
+ Requires-Dist: database_wrapper_redis==0.2.17; 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
48
48
  Requires-Dist: ast-comments>=1.1.2; extra == "dev"
49
49
  Requires-Dist: codespell>=2.2; extra == "dev"
50
50
  Requires-Dist: build>=1.2.1; extra == "dev"
51
- Requires-Dist: black>=24.1.0; extra == "dev"
52
- Requires-Dist: mypy>=1.9.0; extra == "dev"
51
+ Requires-Dist: pyrefly; extra == "dev"
52
+ Requires-Dist: ruff; extra == "dev"
53
53
  Requires-Dist: types-setuptools>=61.0.0; extra == "dev"
54
54
  Requires-Dist: types-pymssql>=2.1.0; extra == "dev"
55
55
  Requires-Dist: types-mysqlclient>=2.2.0; extra == "dev"
@@ -6,16 +6,16 @@ database_wrapper package - Base for database wrappers
6
6
 
7
7
  import logging
8
8
 
9
- from .abc import ConnectionABC, CursorABC, CursorAsyncABC, ConnectionAsyncABC
10
9
  from . import utils
10
+ from .abc import ConnectionABC, ConnectionAsyncABC, CursorABC, CursorAsyncABC
11
+ from .common import DataModelType, NoParam, OrderByItem
11
12
  from .db_backend import DatabaseBackend
12
- from .db_data_model import MetadataDict, DBDataModel, DBDefaultsDataModel
13
- from .common import OrderByItem, DataModelType, NoParam
13
+ from .db_data_model import DBDataModel, DBDefaultsDataModel, MetadataDict
14
+ from .db_introspector import ColumnMetaIntrospector, DBIntrospector
14
15
  from .db_wrapper import DBWrapper
15
16
  from .db_wrapper_async import DBWrapperAsync
16
17
  from .serialization import SerializeType
17
18
  from .utils.dataclass_addons import ignore_unknown_kwargs
18
- from .db_introspector import ColumnMetaIntrospector, DBIntrospector
19
19
 
20
20
  # Set the logger to a quiet default, can be enabled if needed
21
21
  logger = logging.getLogger("database_wrapper")
@@ -1,9 +1,9 @@
1
- from typing import Dict, Any, Literal
2
- from typing import Any, Protocol, Sequence
1
+ from collections.abc import Sequence
2
+ from typing import Any, Literal, Protocol
3
3
 
4
4
  from psycopg.sql import Composable
5
5
 
6
- Row = Dict[str, Any]
6
+ Row = dict[str, Any]
7
7
 
8
8
 
9
9
  class CursorABC(Protocol):
@@ -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": "520e71902c6f09ba35b57fd541d2e82dc5c54478",
7
- "git_commit_date": "06.01.2026 02:41",
8
- "app_version": "0.2.14",
6
+ "git_commit_hash": "d8af9d8dad91dd907abadce24d326754e4c57071",
7
+ "git_commit_date": "09.01.2026 00:57",
8
+ "app_version": "0.2.17",
9
9
  }
@@ -1,9 +1,9 @@
1
1
  import logging
2
2
  import socket
3
-
4
- from typing import Any, Coroutine
5
- from threading import Event
3
+ from collections.abc import Coroutine
6
4
  from contextvars import ContextVar
5
+ from threading import Event
6
+ from typing import Any
7
7
 
8
8
 
9
9
  class DatabaseBackend:
@@ -1,11 +1,11 @@
1
- import re
2
- import json
3
- import datetime
4
1
  import dataclasses
5
-
6
- from dataclasses import dataclass, field, asdict
2
+ import datetime
3
+ import json
4
+ import re
5
+ from collections.abc import Callable
6
+ from dataclasses import asdict, dataclass, field
7
7
  from enum import Enum
8
- from typing import Any, Callable, ClassVar, Literal, NotRequired, Type, TypeVar, TypedDict, cast
8
+ from typing import Any, ClassVar, Literal, NotRequired, TypedDict, TypeVar, cast
9
9
 
10
10
  from .serialization import (
11
11
  SerializeType,
@@ -24,7 +24,7 @@ class MetadataDict(TypedDict):
24
24
  exclude: NotRequired[bool]
25
25
  serialize: NotRequired[Callable[[Any], Any] | SerializeType | None]
26
26
  deserialize: NotRequired[Callable[[Any], Any] | None]
27
- enum_class: NotRequired[Type[Enum] | None]
27
+ enum_class: NotRequired[type[Enum] | None]
28
28
  timezone: NotRequired[str | datetime.tzinfo | None]
29
29
 
30
30
 
@@ -151,7 +151,7 @@ class DBDataModel:
151
151
 
152
152
  # String - representation
153
153
  def __repr__(self) -> str:
154
- return "<%s %s>" % (self.__class__.__name__, self.__dict__)
154
+ return f"<{self.__class__.__name__} {self.__dict__}>"
155
155
 
156
156
  def __str__(self) -> str:
157
157
  return self.to_json_string()
@@ -186,9 +186,7 @@ class DBDataModel:
186
186
  for field_name, field_obj in self.__dataclass_fields__.items():
187
187
  metadata = cast(MetadataDict, field_obj.metadata)
188
188
  assert (
189
- "db_field" in metadata
190
- and isinstance(metadata["db_field"], tuple)
191
- and len(metadata["db_field"]) == 2
189
+ "db_field" in metadata and isinstance(metadata["db_field"], tuple) and len(metadata["db_field"]) == 2
192
190
  ), f"db_field metadata is not set for {field_name}"
193
191
  field_type: str = metadata["db_field"][1]
194
192
  schema["properties"][field_name] = {"type": field_type}
@@ -255,7 +253,7 @@ class DBDataModel:
255
253
 
256
254
  def validate(self) -> Literal[True] | str:
257
255
  """
258
- True if the instance is valid, otherwise an error message.
256
+ True if the instance is valid, otherwise an error message.
259
257
  """
260
258
  raise NotImplementedError("`validate` is not implemented")
261
259
 
@@ -291,13 +289,13 @@ class DBDataModel:
291
289
 
292
290
  def query_base(self) -> Any:
293
291
  """
294
- Base query for all queries
292
+ Base query for all queries
295
293
  """
296
294
  return None
297
295
 
298
296
  def store_data(self) -> dict[str, Any] | None:
299
297
  """
300
- Store data to database
298
+ Store data to database
301
299
  """
302
300
  store_data: dict[str, Any] = {}
303
301
  for field_name, field_obj in self.__dataclass_fields__.items():
@@ -321,7 +319,7 @@ class DBDataModel:
321
319
 
322
320
  def update_data(self) -> dict[str, Any] | None:
323
321
  """
324
- Update data to database
322
+ Update data to database
325
323
  """
326
324
 
327
325
  update_data: dict[str, Any] = {}
@@ -1,10 +1,12 @@
1
- from dataclasses import MISSING, dataclass, make_dataclass, field, fields as dc_fields
2
- from datetime import datetime, date
1
+ from dataclasses import MISSING, dataclass, field, make_dataclass
2
+ from dataclasses import fields as dc_fields
3
+ from datetime import date, datetime
3
4
  from enum import Enum
4
5
  from pathlib import Path
5
- from typing import Any, Optional, Type, Union, get_origin, get_args
6
+ from typing import Any, Union, get_args, get_origin
6
7
 
7
- from database_wrapper import DBDefaultsDataModel, MetadataDict, SerializeType
8
+ from .db_data_model import DBDefaultsDataModel, MetadataDict
9
+ from .serialization import SerializeType
8
10
 
9
11
 
10
12
  def type_to_str(t: Any) -> str:
@@ -93,12 +95,12 @@ class DBIntrospector:
93
95
  self,
94
96
  table_name: str,
95
97
  *,
96
- class_name: Optional[str] = None,
97
- base: Type[DBDefaultsDataModel] = DBDefaultsDataModel,
98
- enum_overrides: dict[str, Type[Enum]] | None = None,
98
+ class_name: str | None = None,
99
+ base: type[DBDefaultsDataModel] = DBDefaultsDataModel,
100
+ enum_overrides: dict[str, type[Enum]] | None = None,
99
101
  defaults_for_nullable: bool = True,
100
102
  include_id_field: bool = True,
101
- ) -> Type[DBDefaultsDataModel]:
103
+ ) -> type[DBDefaultsDataModel]:
102
104
  (schema, table) = self.get_schema_table_name(table_name)
103
105
  cols = self.get_table_columns(schema, table)
104
106
  if not cols:
@@ -115,7 +117,7 @@ class DBIntrospector:
115
117
  continue
116
118
 
117
119
  # Enums
118
- enum_class: Optional[Type[Enum]] = None
120
+ enum_class: type[Enum] | None = None
119
121
  if c.enum_labels:
120
122
  enum_class = enum_overrides.get(c.col_name)
121
123
  if not enum_class:
@@ -127,14 +129,14 @@ class DBIntrospector:
127
129
 
128
130
  # Optional typing if nullable
129
131
  if c.is_nullable:
130
- ann = Optional[py_type] # type: ignore
132
+ ann: type[py_type] | None = py_type
131
133
  else:
132
- ann = py_type # type: ignore
134
+ ann = py_type
133
135
 
134
136
  # Default value choice
135
137
  default = None
136
138
  default_factory = None
137
- if c.is_nullable == False:
139
+ if not c.is_nullable:
138
140
  # give some sane defaults for common not-nullables that aren't id/serial
139
141
  if py_type is bool:
140
142
  default = False
@@ -156,7 +158,7 @@ class DBIntrospector:
156
158
  elif py_type is set:
157
159
  default_factory = set
158
160
  elif py_type is bytes:
159
- default = bytes()
161
+ default = b""
160
162
  else:
161
163
  # Leave unset so dataclass enforces passing it explicitly
162
164
  default = None if defaults_for_nullable else None
@@ -202,15 +204,15 @@ class DBIntrospector:
202
204
  def _tableName(self) -> str:
203
205
  return table
204
206
 
205
- setattr(cls, "schemaName", property(_schemaName))
206
- setattr(cls, "tableName", property(_tableName))
207
+ cls.schemaName = property(_schemaName)
208
+ cls.tableName = property(_tableName)
207
209
 
208
210
  return cls
209
211
 
210
212
  # TODO: Need to improve handling of imports for external classes, including enums.
211
213
  def render_dataclass_source(
212
214
  self,
213
- cls: Type,
215
+ cls: type,
214
216
  table_name: str,
215
217
  *,
216
218
  extra_imports: list[str] | None = None,
@@ -242,7 +244,7 @@ class DBIntrospector:
242
244
  dynamic_enums: list[tuple[str, list[tuple[str, Any]]]] = []
243
245
  external_enum_imports: set[tuple[str, str]] = set()
244
246
  for f in dc_fields(cls):
245
- md: MetadataDict = dict(f.metadata) if f.metadata else {} # type: ignore
247
+ md: MetadataDict = dict(f.metadata) if f.metadata else {}
246
248
  enum_class = md.get("enum_class")
247
249
  if enum_class:
248
250
  mod = getattr(enum_class, "__module__", "")
@@ -250,7 +252,7 @@ class DBIntrospector:
250
252
  # If it's the built-in Enum module (meaning we made it dynamically),
251
253
  # embed it. Otherwise, import from its module.
252
254
  if mod == "enum":
253
- members = [(m.name, m.value) for m in enum_class] # type: ignore
255
+ members = [(m.name, m.value) for m in enum_class]
254
256
  dynamic_enums.append((name, members))
255
257
  else:
256
258
  external_enum_imports.add((mod, name))
@@ -298,7 +300,7 @@ class DBIntrospector:
298
300
 
299
301
  # Render fields (skip the inherited ones we know exist on base if they aren't present here)
300
302
  for f in dc_fields(cls):
301
- md: MetadataDict = dict(f.metadata) if f.metadata else {} # type: ignore
303
+ md: MetadataDict = dict(f.metadata) if f.metadata else {}
302
304
  # We always render all fields that exist in this dataclass (your make_dataclass created them)
303
305
  db_field = md.get("db_field", (f.name, "Any"))
304
306
  if not (isinstance(db_field, tuple) and len(db_field) == 2):
@@ -357,7 +359,7 @@ class DBIntrospector:
357
359
  lines.append(" out: dict[str, Any] = {}")
358
360
  lines.append(" # Explicitly list each field (stable order)")
359
361
  for f in dc_fields(cls):
360
- md: MetadataDict = dict(f.metadata) if f.metadata else {} # type: ignore
362
+ md: MetadataDict = dict(f.metadata) if f.metadata else {}
361
363
  serialize = md.get("serialize")
362
364
  key = f.name
363
365
  if serialize == SerializeType.DATETIME:
@@ -1,8 +1,9 @@
1
- from typing import Generator, Any, overload
1
+ from collections.abc import Generator
2
+ from typing import Any, overload
2
3
 
4
+ from .common import DataModelType, OrderByItem
3
5
  from .db_data_model import DBDataModel
4
6
  from .db_wrapper_mixin import DBWrapperMixin
5
- from .common import OrderByItem, DataModelType
6
7
 
7
8
 
8
9
  class DBWrapper(DBWrapperMixin):
@@ -230,8 +231,7 @@ class DBWrapper(DBWrapperMixin):
230
231
  )
231
232
 
232
233
  @overload
233
- def insert(self, records: DataModelType) -> tuple[int, int]: # type: ignore
234
- ...
234
+ def insert(self, records: DataModelType) -> tuple[int, int]: ...
235
235
 
236
236
  @overload
237
237
  def insert(self, records: list[DataModelType]) -> list[tuple[int, int]]: ...
@@ -335,8 +335,7 @@ class DBWrapper(DBWrapperMixin):
335
335
  return affected_rows
336
336
 
337
337
  @overload
338
- def update(self, records: DataModelType) -> int: # type: ignore
339
- ...
338
+ def update(self, records: DataModelType) -> int: ...
340
339
 
341
340
  @overload
342
341
  def update(self, records: list[DataModelType]) -> list[int]: ...
@@ -441,8 +440,7 @@ class DBWrapper(DBWrapperMixin):
441
440
  return affected_rows
442
441
 
443
442
  @overload
444
- def delete(self, records: DataModelType) -> int: # type: ignore
445
- ...
443
+ def delete(self, records: DataModelType) -> int: ...
446
444
 
447
445
  @overload
448
446
  def delete(self, records: list[DataModelType]) -> list[int]: ...
@@ -1,6 +1,7 @@
1
- from typing import AsyncGenerator, Any, overload
1
+ from collections.abc import AsyncGenerator
2
+ from typing import Any, overload
2
3
 
3
- from .common import OrderByItem, DataModelType
4
+ from .common import DataModelType, OrderByItem
4
5
  from .db_data_model import DBDataModel
5
6
  from .db_wrapper_mixin import DBWrapperMixin
6
7
 
@@ -232,8 +233,7 @@ class DBWrapperAsync(DBWrapperMixin):
232
233
  )
233
234
 
234
235
  @overload
235
- async def insert(self, records: DataModelType) -> tuple[int, int]: # type: ignore
236
- ...
236
+ async def insert(self, records: DataModelType) -> tuple[int, int]: ...
237
237
 
238
238
  @overload
239
239
  async def insert(self, records: list[DataModelType]) -> list[tuple[int, int]]: ...
@@ -336,8 +336,7 @@ class DBWrapperAsync(DBWrapperMixin):
336
336
  return affected_rows
337
337
 
338
338
  @overload
339
- async def update(self, records: DataModelType) -> int: # type: ignore
340
- ...
339
+ async def update(self, records: DataModelType) -> int: ...
341
340
 
342
341
  @overload
343
342
  async def update(self, records: list[DataModelType]) -> list[int]: ...
@@ -442,8 +441,7 @@ class DBWrapperAsync(DBWrapperMixin):
442
441
  return affected_rows
443
442
 
444
443
  @overload
445
- async def delete(self, records: DataModelType) -> int: # type: ignore
446
- ...
444
+ async def delete(self, records: DataModelType) -> int: ...
447
445
 
448
446
  @overload
449
447
  async def delete(self, records: list[DataModelType]) -> list[int]: ...
@@ -1,8 +1,7 @@
1
1
  import logging
2
+ from typing import Any, cast
2
3
 
3
- from typing import Type, cast, Any
4
-
5
- from .common import OrderByItem, NoParam, DataModelType
4
+ from .common import DataModelType, NoParam, OrderByItem
6
5
 
7
6
 
8
7
  class DBWrapperMixin:
@@ -113,7 +112,7 @@ class DBWrapperMixin:
113
112
 
114
113
  def turn_data_into_model(
115
114
  self,
116
- empty_data_class: Type[DataModelType],
115
+ empty_data_class: type[DataModelType],
117
116
  db_data: dict[str, Any],
118
117
  ) -> DataModelType:
119
118
  """
@@ -170,11 +169,8 @@ class DBWrapperMixin:
170
169
  if order_by is None:
171
170
  return None
172
171
 
173
- order_list = [
174
- f"{item[0]} {item[1] if len(item) > 1 and item[1] != None else 'ASC'}"
175
- for item in order_by
176
- ]
177
- return "ORDER BY %s" % ", ".join(order_list)
172
+ order_list = [f"{item[0]} {item[1] if len(item) > 1 and item[1] is not None else 'ASC'}" for item in order_by]
173
+ return "ORDER BY {}".format(", ".join(order_list))
178
174
 
179
175
  def limit_query(self, offset: int = 0, limit: int = 100) -> Any | None:
180
176
  """
@@ -204,36 +200,32 @@ class DBWrapperMixin:
204
200
  elif "$ends_with" in filter:
205
201
  return (f"{key} LIKE %s", f"%{filter['$ends_with']}")
206
202
  elif "$min" in filter and "$max" not in filter:
207
- return (f"{key} >= %s", filter["$min"]) # type: ignore
203
+ return (f"{key} >= %s", filter["$min"])
208
204
  elif "$max" in filter and "$min" not in filter:
209
- return (f"{key} <= %s", filter["$max"]) # type: ignore
205
+ return (f"{key} <= %s", filter["$max"])
210
206
  elif "$min" in filter and "$max" in filter:
211
- return (f"{key} BETWEEN %s AND %s", filter["$min"], filter["$max"]) # type: ignore
207
+ return (f"{key} BETWEEN %s AND %s", filter["$min"], filter["$max"])
212
208
  elif "$in" in filter:
213
209
  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)
210
+ return (f"{key} IN (%s)" % ",".join(["%s"] * len(in_filter_1)),) + tuple(in_filter_1)
217
211
  elif "$not_in" in filter:
218
212
  in_filter_2: list[Any] = cast(list[Any], filter["$in"])
219
- return (
220
- f"{key} NOT IN (%s)" % ",".join(["%s"] * len(in_filter_2)),
221
- ) + tuple(in_filter_2)
213
+ return (f"{key} NOT IN (%s)" % ",".join(["%s"] * len(in_filter_2)),) + tuple(in_filter_2)
222
214
  elif "$not" in filter:
223
- return (f"{key} != %s", filter["$not"]) # type: ignore
215
+ return (f"{key} != %s", filter["$not"])
224
216
 
225
217
  elif "$gt" in filter:
226
- return (f"{key} > %s", filter["$gt"]) # type: ignore
218
+ return (f"{key} > %s", filter["$gt"])
227
219
  elif "$gte" in filter:
228
- return (f"{key} >= %s", filter["$gte"]) # type: ignore
220
+ return (f"{key} >= %s", filter["$gte"])
229
221
  elif "$lt" in filter:
230
- return (f"{key} < %s", filter["$lt"]) # type: ignore
222
+ return (f"{key} < %s", filter["$lt"])
231
223
  elif "$lte" in filter:
232
- return (f"{key} <= %s", filter["$lte"]) # type: ignore
224
+ return (f"{key} <= %s", filter["$lte"])
233
225
  elif "$is_null" in filter:
234
- return (f"{key} IS NULL",) # type: ignore
226
+ return (f"{key} IS NULL",)
235
227
  elif "$is_not_null" in filter:
236
- return (f"{key} IS NOT NULL",) # type: ignore
228
+ return (f"{key} IS NOT NULL",)
237
229
 
238
230
  raise NotImplementedError("Filter type not supported")
239
231
  elif type(filter) is str or type(filter) is int or type(filter) is float:
@@ -244,13 +236,9 @@ class DBWrapperMixin:
244
236
  NoParam,
245
237
  )
246
238
  else:
247
- raise NotImplementedError(
248
- f"Filter type not supported: {key} = {type(filter)}"
249
- )
239
+ raise NotImplementedError(f"Filter type not supported: {key} = {type(filter)}")
250
240
 
251
- def create_filter(
252
- self, filter: dict[str, Any] | None
253
- ) -> tuple[Any, tuple[Any, ...]]:
241
+ def create_filter(self, filter: dict[str, Any] | None) -> tuple[Any, tuple[Any, ...]]:
254
242
  if filter is None or len(filter) == 0:
255
243
  return ("", tuple())
256
244
 
@@ -287,12 +275,7 @@ class DBWrapperMixin:
287
275
 
288
276
  columns = ", ".join(keys)
289
277
  values_placeholder = ", ".join(["%s"] * len(values))
290
- return (
291
- f"INSERT INTO {table_identifier} "
292
- f"({columns}) "
293
- f"VALUES ({values_placeholder}) "
294
- f"RETURNING {return_key}"
295
- )
278
+ return f"INSERT INTO {table_identifier} ({columns}) VALUES ({values_placeholder}) RETURNING {return_key}"
296
279
 
297
280
  def _format_update_query(
298
281
  self,
@@ -1,9 +1,8 @@
1
1
  import datetime
2
2
  import json
3
-
4
3
  from decimal import Decimal
5
4
  from enum import Enum
6
- from typing import Any, Type
5
+ from typing import Any
7
6
  from zoneinfo import ZoneInfo
8
7
 
9
8
 
@@ -61,7 +60,7 @@ def serialize_value(value: Any, s_type: SerializeType) -> Any:
61
60
  def deserialize_value(
62
61
  value: Any,
63
62
  s_type: SerializeType,
64
- enum_class: Type[Enum] | None = None,
63
+ enum_class: type[Enum] | None = None,
65
64
  timezone: str | datetime.tzinfo | None = None,
66
65
  ) -> Any:
67
66
  if s_type == SerializeType.DATETIME:
@@ -95,7 +94,7 @@ def deserialize_value(
95
94
 
96
95
  if s_type == SerializeType.JSON:
97
96
  if isinstance(value, dict) or isinstance(value, list) or value is None:
98
- return value # type: ignore
97
+ return value
99
98
 
100
99
  return json.loads(value)
101
100
 
@@ -1,6 +1,7 @@
1
- from typing import Any, Callable, Type, TypeVar
1
+ from collections.abc import Callable
2
+ from typing import Any, TypeVar
2
3
 
3
- AnyDataType = TypeVar("AnyDataType", bound=Type[Any])
4
+ AnyDataType = TypeVar("AnyDataType", bound=type[Any])
4
5
 
5
6
 
6
7
  def ignore_unknown_kwargs() -> Callable[[AnyDataType], AnyDataType]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: database_wrapper
3
- Version: 0.2.14
3
+ Version: 0.2.17
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,23 +33,23 @@ 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.14; extra == "pgsql"
36
+ Requires-Dist: database_wrapper_pgsql==0.2.17; extra == "pgsql"
37
37
  Provides-Extra: mysql
38
- Requires-Dist: database_wrapper_mysql==0.2.14; extra == "mysql"
38
+ Requires-Dist: database_wrapper_mysql==0.2.17; extra == "mysql"
39
39
  Provides-Extra: mssql
40
- Requires-Dist: database_wrapper_mssql==0.2.14; extra == "mssql"
40
+ Requires-Dist: database_wrapper_mssql==0.2.17; extra == "mssql"
41
41
  Provides-Extra: sqlite
42
- Requires-Dist: database_wrapper_sqlite==0.2.14; extra == "sqlite"
42
+ Requires-Dist: database_wrapper_sqlite==0.2.17; extra == "sqlite"
43
43
  Provides-Extra: redis
44
- Requires-Dist: database_wrapper_redis==0.2.14; extra == "redis"
44
+ Requires-Dist: database_wrapper_redis==0.2.17; 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
48
48
  Requires-Dist: ast-comments>=1.1.2; extra == "dev"
49
49
  Requires-Dist: codespell>=2.2; extra == "dev"
50
50
  Requires-Dist: build>=1.2.1; extra == "dev"
51
- Requires-Dist: black>=24.1.0; extra == "dev"
52
- Requires-Dist: mypy>=1.9.0; extra == "dev"
51
+ Requires-Dist: pyrefly; extra == "dev"
52
+ Requires-Dist: ruff; extra == "dev"
53
53
  Requires-Dist: types-setuptools>=61.0.0; extra == "dev"
54
54
  Requires-Dist: types-pymssql>=2.1.0; extra == "dev"
55
55
  Requires-Dist: types-mysqlclient>=2.2.0; extra == "dev"
@@ -6,8 +6,8 @@ database_wrapper[mssql,mysql,pgsql,redis,sqlite]
6
6
  ast-comments>=1.1.2
7
7
  codespell>=2.2
8
8
  build>=1.2.1
9
- black>=24.1.0
10
- mypy>=1.9.0
9
+ pyrefly
10
+ ruff
11
11
  types-setuptools>=61.0.0
12
12
  types-pymssql>=2.1.0
13
13
  types-mysqlclient>=2.2.0
@@ -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.14
20
+ database_wrapper_mssql==0.2.17
21
21
 
22
22
  [mysql]
23
- database_wrapper_mysql==0.2.14
23
+ database_wrapper_mysql==0.2.17
24
24
 
25
25
  [pgsql]
26
- database_wrapper_pgsql==0.2.14
26
+ database_wrapper_pgsql==0.2.17
27
27
 
28
28
  [redis]
29
- database_wrapper_redis==0.2.14
29
+ database_wrapper_redis==0.2.17
30
30
 
31
31
  [sqlite]
32
- database_wrapper_sqlite==0.2.14
32
+ database_wrapper_sqlite==0.2.17
@@ -4,14 +4,12 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "database_wrapper"
7
- version = "0.2.14"
7
+ version = "0.2.17"
8
8
  description = "A Different Approach to Database Wrappers in Python"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
11
- license = {text = "GNU General Public License v3.0 (GPL-3.0)"}
12
- authors = [
13
- {name = "Gints Murans", email = "gm@gm.lv"}
14
- ]
11
+ license = { text = "GNU General Public License v3.0 (GPL-3.0)" }
12
+ authors = [{ name = "Gints Murans", email = "gm@gm.lv" }]
15
13
  classifiers = [
16
14
  "Development Status :: 4 - Beta",
17
15
  "Intended Audience :: Developers",
@@ -31,9 +29,18 @@ classifiers = [
31
29
  "Topic :: Database",
32
30
  "Topic :: Database :: Front-Ends",
33
31
  "Topic :: Software Development",
34
- "Topic :: Software Development :: Libraries :: Python Modules"
32
+ "Topic :: Software Development :: Libraries :: Python Modules",
33
+ ]
34
+ keywords = [
35
+ "database",
36
+ "wrapper",
37
+ "python",
38
+ "pgsql",
39
+ "mysql",
40
+ "mssql",
41
+ "sqlite",
42
+ "redis",
35
43
  ]
36
- keywords = ["database", "wrapper", "python", "pgsql", "mysql", "mssql", "sqlite", "redis"]
37
44
  dependencies = []
38
45
 
39
46
  [project.urls]
@@ -45,28 +52,32 @@ Code = "https://github.com/gintsmurans/py_database_wrapper"
45
52
  Download = "https://pypi.org/project/database_wrapper/"
46
53
 
47
54
  [project.optional-dependencies]
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"]
55
+ pgsql = ["database_wrapper_pgsql == 0.2.17"]
56
+ mysql = ["database_wrapper_mysql == 0.2.17"]
57
+ mssql = ["database_wrapper_mssql == 0.2.17"]
58
+ sqlite = ["database_wrapper_sqlite == 0.2.17"]
59
+ redis = ["database_wrapper_redis == 0.2.17"]
53
60
  all = ["database_wrapper[pgsql,mysql,mssql,sqlite,redis]"]
54
61
  dev = [
55
62
  # Development
56
63
  "ast-comments >= 1.1.2",
57
64
  "codespell >= 2.2",
58
65
  "build >= 1.2.1",
59
- # Formatting & Types
60
- "black >= 24.1.0",
61
- "mypy >= 1.9.0",
66
+
67
+ # Formatting
68
+ "pyrefly",
69
+ "ruff",
70
+
71
+ # Type hints
62
72
  "types-setuptools >= 61.0.0",
63
73
  "types-pymssql >= 2.1.0",
64
74
  "types-mysqlclient >= 2.2.0",
75
+
65
76
  # Database drivers
66
77
  "psycopg[binary] >= 3.2.0",
67
78
  "psycopg[pool] >= 3.2.0",
68
79
  "mysqlclient >= 2.2.2",
69
- "pymssql >= 2.2.10"
80
+ "pymssql >= 2.2.10",
70
81
  ]
71
82
 
72
83
  # [tool.setuptools.packages.find]