database-wrapper 0.1.85__py3-none-any.whl → 0.2.2__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.
@@ -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 dbCursor: Database cursor object.
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
- dbCursor: Any
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
- dbCursor: Any = None,
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.dbCursor = dbCursor
47
+ self.db_cursor = db_cursor
48
48
 
49
49
  if logger is None:
50
- loggerName = f"{__name__}.{self.__class__.__name__}"
51
- self.logger = logging.getLogger(loggerName)
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, "dbCursor") and self.dbCursor:
63
- del self.dbCursor
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 setDbCursor(self, dbCursor: Any) -> None:
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
- dbCursor (Any): The new database cursor object.
74
+ db_cursor (Any): The new database cursor object.
75
75
  """
76
76
 
77
- if dbCursor is None:
78
- del self.dbCursor
77
+ if db_cursor is None:
78
+ del self.db_cursor
79
79
  return
80
80
 
81
- self.dbCursor = dbCursor
81
+ self.db_cursor = db_cursor
82
82
 
83
83
  ######################
84
84
  ### Helper methods ###
85
85
  ######################
86
86
 
87
- def makeIdentifier(self, schema: str | None, name: str) -> Any:
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 logQuery(self, cursor: Any, query: Any, params: tuple[Any, ...]) -> None:
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 turnDataIntoModel(
114
+ def turn_data_into_model(
115
115
  self,
116
- emptyDataClass: Type[DataModelType],
117
- dbData: dict[str, Any],
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
- emptyDataClass (DataModelType): The data model to use.
126
- dbData (dict[str, Any]): The data to turn into a model.
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 = emptyDataClass()
133
- result.fillDataFromDict(dbData)
134
- result.raw_data = dbData
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.idKey != "id":
138
- result.id = dbData.get(result.idKey, None)
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 filterQuery(self, schemaName: str | None, tableName: str) -> Any:
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
- schemaName (str | None): The name of the schema to filter data from.
152
- tableName (str): The name of the table to filter data from.
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
- fullTableName = self.makeIdentifier(schemaName, tableName)
158
- return f"SELECT * FROM {fullTableName}"
157
+ full_table_name = self.make_identifier(schema_name, table_name)
158
+ return f"SELECT * FROM {full_table_name}"
159
159
 
160
- def orderQuery(self, orderBy: OrderByItem | None = None) -> Any | None:
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
- orderBy (OrderByItem | None, optional): The column to order the results by. Defaults to None.
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 orderBy is None:
170
+ if order_by is None:
171
171
  return None
172
172
 
173
- orderList = [
173
+ order_list = [
174
174
  f"{item[0]} {item[1] if len(item) > 1 and item[1] != None else 'ASC'}"
175
- for item in orderBy
175
+ for item in order_by
176
176
  ]
177
- return "ORDER BY %s" % ", ".join(orderList)
177
+ return "ORDER BY %s" % ", ".join(order_list)
178
178
 
179
- def limitQuery(self, offset: int = 0, limit: int = 100) -> Any | None:
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 formatFilter(self, key: str, filter: Any) -> tuple[Any, ...]:
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
- inFilter1: list[Any] = cast(list[Any], filter["$in"])
214
- return (f"{key} IN (%s)" % ",".join(["%s"] * len(inFilter1)),) + tuple(
215
- inFilter1
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
- inFilter2: list[Any] = cast(list[Any], filter["$in"])
218
+ in_filter_2: list[Any] = cast(list[Any], filter["$in"])
219
219
  return (
220
- f"{key} NOT IN (%s)" % ",".join(["%s"] * len(inFilter2)),
221
- ) + tuple(inFilter2)
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 createFilter(
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.formatFilter(key, filter[key]) for key in filter]
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 _formatFilterQuery(
264
+ def _format_filter_query(
265
265
  self,
266
266
  query: Any,
267
- qFilter: Any,
267
+ q_filter: Any,
268
268
  order: Any,
269
269
  limit: Any,
270
270
  ) -> Any:
271
- if qFilter is None:
272
- qFilter = ""
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} {qFilter} {order} {limit}"
277
+ return f"{query} {q_filter} {order} {limit}"
278
278
 
279
- def _formatInsertQuery(
279
+ def _format_insert_query(
280
280
  self,
281
- tableIdentifier: Any,
282
- storeData: dict[str, Any],
283
- returnKey: Any,
281
+ table_identifier: Any,
282
+ store_data: dict[str, Any],
283
+ return_key: Any,
284
284
  ) -> Any:
285
- keys = storeData.keys()
286
- values = list(storeData.values())
285
+ keys = store_data.keys()
286
+ values = list(store_data.values())
287
287
 
288
288
  columns = ", ".join(keys)
289
- valuesPlaceholder = ", ".join(["%s"] * len(values))
289
+ values_placeholder = ", ".join(["%s"] * len(values))
290
290
  return (
291
- f"INSERT INTO {tableIdentifier} "
291
+ f"INSERT INTO {table_identifier} "
292
292
  f"({columns}) "
293
- f"VALUES ({valuesPlaceholder}) "
294
- f"RETURNING {returnKey}"
293
+ f"VALUES ({values_placeholder}) "
294
+ f"RETURNING {return_key}"
295
295
  )
296
296
 
297
- def _formatUpdateQuery(
297
+ def _format_update_query(
298
298
  self,
299
- tableIdentifier: Any,
300
- updateKey: Any,
301
- updateData: dict[str, Any],
299
+ table_identifier: Any,
300
+ update_key: Any,
301
+ update_data: dict[str, Any],
302
302
  ) -> Any:
303
- keys = updateData.keys()
303
+ keys = update_data.keys()
304
304
  set_clause = ", ".join(f"{key} = %s" for key in keys)
305
- return f"UPDATE {tableIdentifier} SET {set_clause} WHERE {updateKey} = %s"
305
+ return f"UPDATE {table_identifier} SET {set_clause} WHERE {update_key} = %s"
306
306
 
307
- def _formatDeleteQuery(
307
+ def _format_delete_query(
308
308
  self,
309
- tableIdentifier: Any,
310
- deleteKey: Any,
309
+ table_identifier: Any,
310
+ delete_key: Any,
311
311
  ) -> Any:
312
- return f"DELETE FROM {tableIdentifier} WHERE {deleteKey} = %s"
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 jsonEncoder(obj: Any) -> Any:
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 serializeValue(value: Any, sType: SerializeType) -> Any:
32
- if sType == SerializeType.DATETIME:
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 sType == SerializeType.JSON:
39
- return json.dumps(value, default=jsonEncoder)
38
+ if s_type == SerializeType.JSON:
39
+ return json.dumps(value, default=json_encoder)
40
40
 
41
- if sType == SerializeType.ENUM:
41
+ if s_type == SerializeType.ENUM:
42
42
  return value.value
43
43
  return value
44
44
 
45
45
 
46
- def deserializeValue(
46
+ def deserialize_value(
47
47
  value: Any,
48
- sType: SerializeType,
49
- enumClass: Type[Enum] | None = None,
48
+ s_type: SerializeType,
49
+ enum_class: Type[Enum] | None = None,
50
50
  ) -> Any:
51
- if sType == SerializeType.DATETIME:
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 sType == SerializeType.JSON:
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 sType == SerializeType.ENUM:
71
- if enumClass is None:
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 enumClass(value)
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
- originalInit = cls.__init__
12
+ original_init = cls.__init__
13
13
 
14
- # @wraps(originalInit)
15
- def newInit(self: Any, *args: Any, **kwargs: Any) -> None:
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
- originalInit(self, *args, **valid_kwargs)
18
+ original_init(self, *args, **valid_kwargs)
19
19
 
20
- cls.__init__ = newInit # type: ignore
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.1.85
3
+ Version: 0.2.2
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,13 +33,13 @@ 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.1.85; extra == "pgsql"
36
+ Requires-Dist: database_wrapper_pgsql==0.2.2; extra == "pgsql"
37
37
  Provides-Extra: mysql
38
- Requires-Dist: database_wrapper_mysql==0.1.85; extra == "mysql"
38
+ Requires-Dist: database_wrapper_mysql==0.2.2; extra == "mysql"
39
39
  Provides-Extra: mssql
40
- Requires-Dist: database_wrapper_mssql==0.1.85; extra == "mssql"
40
+ Requires-Dist: database_wrapper_mssql==0.2.2; extra == "mssql"
41
41
  Provides-Extra: sqlite
42
- Requires-Dist: database_wrapper_sqlite==0.1.85; extra == "sqlite"
42
+ Requires-Dist: database_wrapper_sqlite==0.2.2; extra == "sqlite"
43
43
  Provides-Extra: all
44
44
  Requires-Dist: database_wrapper[mssql,mysql,pgsql,sqlite]; extra == "all"
45
45
  Provides-Extra: dev
@@ -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=rV9zKNEikP2M94gYOgbsEuUiMWaTBjVIpYuWzJtTxIw,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.2.dist-info/METADATA,sha256=j4QhhWVAJjFscc9FLn6eAdj2Ky2RJFvb7hgqz3mBgtU,3435
15
+ database_wrapper-0.2.2.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
16
+ database_wrapper-0.2.2.dist-info/top_level.txt,sha256=QcnS4ocJygxcKE5eoOqriuja306oVu-zJRn6yjRRhBw,17
17
+ database_wrapper-0.2.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: setuptools (80.7.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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=0AInnjpW9HNGqSc1thfMFrDw4SnMwP2k-b479s5qZ5o,334
5
- database_wrapper/db_backend.py,sha256=TGqnRJ1Jsk3GZibpXRanMDTEJlkc4POEoZZH506vtVs,7480
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.85.dist-info/METADATA,sha256=tR3XuAxD-v6BAc45VQNVthf5bQ0vryGblSQg-rN_HSQ,3440
15
- database_wrapper-0.1.85.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
16
- database_wrapper-0.1.85.dist-info/top_level.txt,sha256=QcnS4ocJygxcKE5eoOqriuja306oVu-zJRn6yjRRhBw,17
17
- database_wrapper-0.1.85.dist-info/RECORD,,