pjdev-sqlmodel 4.3.1__tar.gz → 4.3.3__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pjdev-sqlmodel
3
- Version: 4.3.1
3
+ Version: 4.3.3
4
4
  Project-URL: Documentation, https://gitlab.purplejay.net/keystone/python
5
5
  Project-URL: Issues, https://gitlab.purplejay.net/keystone/python/issues
6
6
  Project-URL: Source, https://gitlab.purplejay.net/keystone/python
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024-present Chris O'Neill <chris@purplejay.io>
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
- __version__ = "4.3.1"
4
+ __version__ = "4.3.3"
@@ -3,6 +3,10 @@ import warnings
3
3
  from pathlib import Path
4
4
  from typing import Type, TypeVar, List, Optional, Tuple, Dict
5
5
 
6
+ from openpyxl.styles import Font, Alignment
7
+ from openpyxl.utils import get_column_letter
8
+ from openpyxl.utils.dataframe import dataframe_to_rows
9
+ from openpyxl.workbook import Workbook
6
10
  from pydantic import ValidationError, BaseModel
7
11
  import pandas as pd
8
12
  from openpyxl.reader.excel import load_workbook
@@ -21,7 +25,8 @@ def get_files_in_directory(directory: Path, file_name='*', force_presence=False)
21
25
  f for f in directory.glob(f"**/{file_name}.csv")
22
26
  ]
23
27
  if force_presence and len(file_obj) == 0:
24
- logger.error(f'Failed to find files matching the {directory}/{file_name} pattern and presence is required. Exiting...')
28
+ logger.error(
29
+ f'Failed to find files matching the {directory}/{file_name} pattern and presence is required. Exiting...')
25
30
  exit(1)
26
31
  return file_obj
27
32
 
@@ -59,7 +64,7 @@ def load_csv_data(model_type: Type[T], data_files: List[Path]) -> None:
59
64
  f
60
65
  for f in data_files
61
66
  if f.name.endswith(".csv")
62
- and len(set(cols).difference(set(get_csv_columns(f)))) == 0
67
+ and len(set(cols).difference(set(get_csv_columns(f)))) == 0
63
68
  ]
64
69
 
65
70
  data: List[model_type] = []
@@ -74,10 +79,11 @@ def load_csv_data(model_type: Type[T], data_files: List[Path]) -> None:
74
79
 
75
80
 
76
81
  def load_excel_data(
77
- model_type: Type[T],
78
- data_files: List[Path],
79
- header_ndx: int = 0,
80
- col_range: Optional[str] = None,
82
+ model_type: Type[T],
83
+ data_files: List[Path],
84
+ header_ndx: int = 0,
85
+ sheet_name: str | int = 0,
86
+ col_range: Optional[str] = None,
81
87
  ) -> None:
82
88
  fields = model_type.model_fields.keys()
83
89
  cols = [
@@ -92,10 +98,10 @@ def load_excel_data(
92
98
  f
93
99
  for f in data_files
94
100
  if f.name.endswith(".xlsx")
95
- and len(
101
+ and len(
96
102
  set(cols).difference(set(get_excel_columns(f, header_ndx + 1, col_range)))
97
103
  )
98
- == 0
104
+ == 0
99
105
  ]
100
106
 
101
107
  data: List[model_type] = []
@@ -106,7 +112,7 @@ def load_excel_data(
106
112
  )
107
113
 
108
114
  for file in filtered_files:
109
- df = __read_excel(file, cols, header_ndx)
115
+ df = __read_excel(file=file, cols=cols, header_ndx=header_ndx, sheet_name=sheet_name)
110
116
  data.extend(__convert_to_models(file.name, df, model_type))
111
117
 
112
118
  with session_context() as session:
@@ -116,7 +122,7 @@ def load_excel_data(
116
122
 
117
123
 
118
124
  def __convert_to_models(
119
- filename: str, df: pd.DataFrame, model_type: Type[T]
125
+ filename: str, df: pd.DataFrame, model_type: Type[T]
120
126
  ) -> List[T]:
121
127
  data: List[model_type] = []
122
128
  try:
@@ -130,10 +136,10 @@ def __convert_to_models(
130
136
 
131
137
 
132
138
  def load_raw_csv_data(
133
- filename: Path,
134
- table_name: str,
135
- data_type_map: Optional[Dict[str, Type]] = None,
136
- engine: Optional[Engine] = None,
139
+ filename: Path,
140
+ table_name: str,
141
+ data_type_map: Optional[Dict[str, Type]] = None,
142
+ engine: Optional[Engine] = None,
137
143
  ) -> None:
138
144
  df = __read_csv(filename, data_type_map=data_type_map)
139
145
 
@@ -151,13 +157,14 @@ def load_raw_csv_data(
151
157
 
152
158
 
153
159
  def load_raw_excel_data(
154
- filename: Path,
155
- table_name: str,
156
- header_ndx: int = 0,
157
- data_type_map: Optional[Dict[str, Type]] = None,
158
- engine: Optional[Engine] = None,
160
+ filename: Path,
161
+ table_name: str,
162
+ header_ndx: int = 0,
163
+ sheet_name: str | int = 0,
164
+ data_type_map: Optional[Dict[str, Type]] = None,
165
+ engine: Optional[Engine] = None,
159
166
  ) -> None:
160
- df = __read_excel(filename, header_ndx=header_ndx, data_type_map=data_type_map)
167
+ df = __read_excel(filename, header_ndx=header_ndx, data_type_map=data_type_map, sheet_name=sheet_name)
161
168
 
162
169
  if df is None:
163
170
  return
@@ -202,7 +209,8 @@ def convert_table_to_csv(InputTable: type[BaseModel], file: Path):
202
209
  df.to_csv(file, index=False)
203
210
 
204
211
 
205
- def export_to_sheet(InputTable: type[BaseModel], wb: Workbook, sheet_name: str, table_name: str = None, hide_sheet=False):
212
+ def export_to_sheet(InputTable: type[BaseModel], wb: Workbook, sheet_name: str, table_name: str = None,
213
+ hide_sheet=False):
206
214
  df = convert_table_to_df(InputTable)
207
215
  ws = wb.create_sheet(title=sheet_name)
208
216
  if hide_sheet:
@@ -242,9 +250,9 @@ def export_to_sheet(InputTable: type[BaseModel], wb: Workbook, sheet_name: str,
242
250
 
243
251
 
244
252
  def __read_csv(
245
- file: Path | str,
246
- cols: Optional[List[str]] = None,
247
- data_type_map: Optional[Dict[str, Type]] = None,
253
+ file: Path | str,
254
+ cols: Optional[List[str]] = None,
255
+ data_type_map: Optional[Dict[str, Type]] = None,
248
256
  ) -> pd.DataFrame:
249
257
  return pd.read_csv(
250
258
  file, engine="pyarrow", usecols=cols, na_filter=False, dtype=data_type_map
@@ -252,14 +260,16 @@ def __read_csv(
252
260
 
253
261
 
254
262
  def __read_excel(
255
- file: Path | str,
256
- cols: Optional[List[str]] = None,
257
- header_ndx: int = 0,
258
- data_type_map: Optional[Dict[str, Type]] = None,
263
+ file: Path | str,
264
+ sheet_name: str | int = 0,
265
+ cols: Optional[List[str]] = None,
266
+ header_ndx: int = 0,
267
+ data_type_map: Optional[Dict[str, Type]] = None,
259
268
  ) -> pd.DataFrame:
260
269
  return pd.read_excel(
261
270
  io=file,
262
271
  usecols=cols,
272
+ sheet_name=sheet_name,
263
273
  na_filter=False,
264
274
  header=header_ndx,
265
275
  engine="calamine",
@@ -268,10 +278,10 @@ def __read_excel(
268
278
 
269
279
 
270
280
  def convert_to_csv(
271
- data: List[BaseModel],
272
- col_mapping_tuple: Tuple[List[str], Dict[str, str], List[str]],
273
- filename: Path,
274
- index=False,
281
+ data: List[BaseModel],
282
+ col_mapping_tuple: Tuple[List[str], Dict[str, str], List[str]],
283
+ filename: Path,
284
+ index=False,
275
285
  ) -> None:
276
286
  include_set, col_mapping, cols = col_mapping_tuple
277
287
  dict_data = [
@@ -282,4 +292,4 @@ def convert_to_csv(
282
292
  df = pd.DataFrame(dict_data)
283
293
 
284
294
  # Export DataFrame to CSV
285
- df.to_csv(filename, index=index, columns=cols)
295
+ df.to_csv(filename, index=index, columns=cols)
File without changes