fmtr.tools 1.3.76__py3-none-any.whl → 1.3.78__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.

Potentially problematic release.


This version of fmtr.tools might be problematic. Click here for more details.

@@ -1,7 +1,10 @@
1
- from typing import Optional
2
-
3
1
  import flet as ft
2
+ from dataclasses import dataclass
4
3
  from flet.core.gesture_detector import TapEvent
4
+ from flet.core.page import Page
5
+ from flet.core.types import ColorValue, IconValue
6
+ from functools import cached_property
7
+ from typing import Optional
5
8
 
6
9
  from fmtr.tools.logging_tools import logger
7
10
 
@@ -127,8 +130,40 @@ class Row(ft.DataRow):
127
130
 
128
131
  def __init__(self, series):
129
132
  self.series = series
130
- cells = [self.TypeCell(series, col) for col in series.index]
131
- super().__init__(cells, color=self.row_color)
133
+ super().__init__(self.cells_controls, color=self.row_color)
134
+
135
+ @cached_property
136
+ def cells_data(self) -> dict[str, list[Cell]]:
137
+ """
138
+
139
+ Cell controls lookup
140
+
141
+ """
142
+ data = {}
143
+ for col in self.series.index:
144
+ data.setdefault(col, []).append(self.TypeCell(self.series, col))
145
+ return data
146
+
147
+ @cached_property
148
+ def cells_controls(self) -> list[Cell]:
149
+ """
150
+
151
+ Flat list of controls
152
+
153
+ """
154
+ controls = []
155
+ for cells in self.cells_data.values():
156
+ for cell in cells:
157
+ controls.append(cell)
158
+ return controls
159
+
160
+ def __getitem__(self, item) -> list[Cell]:
161
+ """
162
+
163
+ Get cells by column name
164
+
165
+ """
166
+ return self.cells_data[item]
132
167
 
133
168
  @property
134
169
  def row_color(self):
@@ -195,5 +230,96 @@ class Table(ft.DataTable):
195
230
  """
196
231
  self.df = df
197
232
  columns = [self.TypeColumn(col) for col in df.columns]
198
- rows = [self.TypeRow(row) for _, row in df.iterrows()]
199
- super().__init__(columns=columns, rows=rows)
233
+ super().__init__(columns=columns, rows=self.rows_controls)
234
+
235
+ @cached_property
236
+ def rows_data(self) -> dict[str, list[Row]]:
237
+ """
238
+
239
+ Row controls lookup
240
+
241
+ """
242
+ data = {}
243
+ for index, row in self.df.iterrows():
244
+ data.setdefault(index, []).append(self.TypeRow(row))
245
+ return data
246
+
247
+ @cached_property
248
+ def rows_controls(self) -> list[Row]:
249
+ """
250
+
251
+ Flat list of controls
252
+
253
+ """
254
+ controls = []
255
+ for rows in self.rows_data.values():
256
+ for row in rows:
257
+ controls.append(row)
258
+ return controls
259
+
260
+ def __getitem__(self, item) -> list[Row]:
261
+ """
262
+
263
+ Get row by index
264
+
265
+ """
266
+
267
+ return self.rows_data[item]
268
+
269
+
270
+ @dataclass
271
+ class NotificationDatum:
272
+ """
273
+
274
+ Color and icon for notification bar
275
+
276
+ """
277
+ color: ColorValue
278
+ icon: IconValue
279
+
280
+
281
+ class NotificationBar(ft.SnackBar):
282
+ """
283
+
284
+ Combined logging and notification bar: infers the appropriate UI representation from the log level
285
+
286
+ """
287
+ DATA = {
288
+ logger.info: NotificationDatum(color=ft.Colors.BLUE, icon=ft.Icons.INFO),
289
+ logger.warning: NotificationDatum(color=ft.Colors.AMBER, icon=ft.Icons.WARNING),
290
+ logger.error: NotificationDatum(color=ft.Colors.RED, icon=ft.Icons.ERROR),
291
+ logger.debug: NotificationDatum(color=ft.Colors.GREY, icon=ft.Icons.BUG_REPORT),
292
+ logger.exception: NotificationDatum(color=ft.Colors.RED_ACCENT, icon=ft.Icons.REPORT),
293
+ }
294
+
295
+ def __init__(self, msg: str, method=logger.info):
296
+ """
297
+
298
+ Log the message immediately, otherwise configure notification bar icon/color.
299
+
300
+ """
301
+ self.msg = msg
302
+ self.method = method
303
+ self.method(msg)
304
+
305
+ icon = ft.Icon(self.data.icon, color=self.data.color)
306
+ text = ft.Text(self.msg)
307
+ content = ft.Row(controls=[icon, text])
308
+ super().__init__(content=content)
309
+
310
+ @cached_property
311
+ def data(self) -> NotificationDatum:
312
+ """
313
+
314
+ Fetching data using logging method.
315
+
316
+ """
317
+ return self.DATA[self.method]
318
+
319
+ def show(self, page: Page):
320
+ """
321
+
322
+ Show the notification on the relevant page.
323
+
324
+ """
325
+ page.open(self)
fmtr/tools/version CHANGED
@@ -1 +1 @@
1
- 1.3.76
1
+ 1.3.78
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.76
3
+ Version: 1.3.78
4
4
  Summary: Collection of high-level tools to simplify everyday development tasks, with a focus on AI/ML
5
5
  Home-page: https://github.com/fmtr/fmtr.tools
6
6
  Author: Frontmatter
@@ -166,67 +166,67 @@ Provides-Extra: db
166
166
  Provides-Extra: db-document
167
167
  Requires-Dist: beanie[odm]; extra == "db-document"
168
168
  Provides-Extra: all
169
+ Requires-Dist: tokenizers; extra == "all"
170
+ Requires-Dist: filetype; extra == "all"
171
+ Requires-Dist: uvicorn[standard]; extra == "all"
172
+ Requires-Dist: json_repair; extra == "all"
173
+ Requires-Dist: logfire; extra == "all"
174
+ Requires-Dist: deepdiff; extra == "all"
175
+ Requires-Dist: google-api-python-client; extra == "all"
176
+ Requires-Dist: deepmerge; extra == "all"
177
+ Requires-Dist: flet-video; extra == "all"
169
178
  Requires-Dist: pytest-cov; extra == "all"
170
- Requires-Dist: peft; extra == "all"
171
- Requires-Dist: openpyxl; extra == "all"
172
179
  Requires-Dist: pymupdf; extra == "all"
173
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
174
- Requires-Dist: tinynetrc; extra == "all"
175
180
  Requires-Dist: torchvision; extra == "all"
176
- Requires-Dist: google-auth-httplib2; extra == "all"
181
+ Requires-Dist: appdirs; extra == "all"
182
+ Requires-Dist: yamlscript; extra == "all"
183
+ Requires-Dist: tabulate; extra == "all"
184
+ Requires-Dist: torchaudio; extra == "all"
185
+ Requires-Dist: faker; extra == "all"
186
+ Requires-Dist: regex; extra == "all"
187
+ Requires-Dist: ollama; extra == "all"
188
+ Requires-Dist: google-auth-oauthlib; extra == "all"
177
189
  Requires-Dist: logfire[fastapi]; extra == "all"
178
- Requires-Dist: uvicorn[standard]; extra == "all"
190
+ Requires-Dist: diskcache; extra == "all"
191
+ Requires-Dist: setuptools; extra == "all"
192
+ Requires-Dist: peft; extra == "all"
193
+ Requires-Dist: httpx; extra == "all"
179
194
  Requires-Dist: pandas; extra == "all"
180
- Requires-Dist: transformers[sentencepiece]; extra == "all"
181
- Requires-Dist: google-auth-oauthlib; extra == "all"
182
195
  Requires-Dist: flet[all]; extra == "all"
183
- Requires-Dist: pyyaml; extra == "all"
184
- Requires-Dist: tokenizers; extra == "all"
185
- Requires-Dist: tabulate; extra == "all"
186
- Requires-Dist: dask[bag]; extra == "all"
187
- Requires-Dist: pydantic-settings; extra == "all"
188
- Requires-Dist: httpx; extra == "all"
189
- Requires-Dist: google-api-python-client; extra == "all"
190
- Requires-Dist: flet-webview; extra == "all"
191
- Requires-Dist: yamlscript; extra == "all"
192
- Requires-Dist: semver; extra == "all"
193
- Requires-Dist: json_repair; extra == "all"
196
+ Requires-Dist: pydantic; extra == "all"
197
+ Requires-Dist: beanie[odm]; extra == "all"
194
198
  Requires-Dist: distributed; extra == "all"
195
- Requires-Dist: diskcache; extra == "all"
196
- Requires-Dist: contexttimer; extra == "all"
197
- Requires-Dist: ollama; extra == "all"
198
- Requires-Dist: appdirs; extra == "all"
199
- Requires-Dist: google-auth; extra == "all"
200
199
  Requires-Dist: pycountry; extra == "all"
201
- Requires-Dist: deepmerge; extra == "all"
202
- Requires-Dist: pydantic-extra-types; extra == "all"
203
- Requires-Dist: python-on-whales; extra == "all"
204
- Requires-Dist: regex; extra == "all"
205
- Requires-Dist: flet-video; extra == "all"
206
- Requires-Dist: sentence_transformers; extra == "all"
207
- Requires-Dist: openai; extra == "all"
208
- Requires-Dist: deepdiff; extra == "all"
209
- Requires-Dist: fastapi; extra == "all"
210
- Requires-Dist: bokeh; extra == "all"
211
- Requires-Dist: logfire; extra == "all"
212
- Requires-Dist: beanie[odm]; extra == "all"
213
200
  Requires-Dist: pymupdf4llm; extra == "all"
214
201
  Requires-Dist: dnspython[doh]; extra == "all"
215
- Requires-Dist: setuptools; extra == "all"
216
202
  Requires-Dist: playwright; extra == "all"
217
- Requires-Dist: filetype; extra == "all"
218
- Requires-Dist: pydantic; extra == "all"
219
- Requires-Dist: sre_yield; extra == "all"
220
- Requires-Dist: huggingface_hub; extra == "all"
221
- Requires-Dist: Unidecode; extra == "all"
222
- Requires-Dist: faker; extra == "all"
223
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
224
203
  Requires-Dist: odfpy; extra == "all"
204
+ Requires-Dist: python-on-whales; extra == "all"
205
+ Requires-Dist: bokeh; extra == "all"
206
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
207
+ Requires-Dist: google-auth-httplib2; extra == "all"
208
+ Requires-Dist: pyyaml; extra == "all"
209
+ Requires-Dist: fastapi; extra == "all"
210
+ Requires-Dist: Unidecode; extra == "all"
211
+ Requires-Dist: flet-webview; extra == "all"
225
212
  Requires-Dist: logfire[httpx]; extra == "all"
226
- Requires-Dist: html2text; extra == "all"
227
- Requires-Dist: httpx_retries; extra == "all"
228
- Requires-Dist: torchaudio; extra == "all"
213
+ Requires-Dist: openpyxl; extra == "all"
214
+ Requires-Dist: openai; extra == "all"
215
+ Requires-Dist: sre_yield; extra == "all"
216
+ Requires-Dist: huggingface_hub; extra == "all"
217
+ Requires-Dist: pydantic-extra-types; extra == "all"
218
+ Requires-Dist: google-auth; extra == "all"
219
+ Requires-Dist: sentence_transformers; extra == "all"
220
+ Requires-Dist: dask[bag]; extra == "all"
221
+ Requires-Dist: contexttimer; extra == "all"
222
+ Requires-Dist: semver; extra == "all"
223
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
229
224
  Requires-Dist: cachetools; extra == "all"
225
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
226
+ Requires-Dist: httpx_retries; extra == "all"
227
+ Requires-Dist: pydantic-settings; extra == "all"
228
+ Requires-Dist: html2text; extra == "all"
229
+ Requires-Dist: tinynetrc; extra == "all"
230
230
  Dynamic: author
231
231
  Dynamic: author-email
232
232
  Dynamic: description
@@ -45,7 +45,7 @@ fmtr/tools/tabular_tools.py,sha256=mw6vOij1Ch-pVAyHMPtm5zj__ULZN_TKeBYOfj33wFM,1
45
45
  fmtr/tools/tokenization_tools.py,sha256=me-IBzSLyNYejLybwjO9CNB6Mj2NYfKPaOVThXyaGNg,4268
46
46
  fmtr/tools/tools.py,sha256=sLMXk8juOL8_n_D776cJ-kzjyMHqFI_fctDEjy6PIKs,1115
47
47
  fmtr/tools/unicode_tools.py,sha256=yS_9wpu8ogNoiIL7s1G_8bETFFO_YQlo4LNPv1NLDeY,52
48
- fmtr/tools/version,sha256=NsbF2x120gFOktRo0UW0oi60P8h7eq7HQIUtLO66Zy8,6
48
+ fmtr/tools/version,sha256=44MKGTtDIpnJNALvNTzMb92ej4gSGvmp9z8gUKxi5A4,6
49
49
  fmtr/tools/webhook_tools.py,sha256=q3pVJ1NCem2SrMuFcLxiWd7DibFs7Q-uGtojfXd3Qcg,380
50
50
  fmtr/tools/yaml_tools.py,sha256=Bhhyd6GQVKO72Lp8ky7bAUjIB_65Hdh0Q45SKIEe6S8,1901
51
51
  fmtr/tools/ai_tools/__init__.py,sha256=O8VRlPnnQCncg2ZZ2l_VdWLJf4jkKH6dkZFVbv6o7IM,388
@@ -67,7 +67,7 @@ fmtr/tools/entrypoints/remote_debug_test.py,sha256=wmKg9o2pQq7eqeHmaO8oviujNgtns
67
67
  fmtr/tools/entrypoints/shell_debug.py,sha256=0No3tAg9Ri4_vvSlQCUtAY-11HR0nE45i0VVtiAViwY,106
68
68
  fmtr/tools/interface_tools/__init__.py,sha256=_bgZRTqmygtYM75o6_zyQRhT_XZnDERZEHmsYVrzyxw,393
69
69
  fmtr/tools/interface_tools/context.py,sha256=VpoR_ZCndDbwS0AzIPKi1hB2QckwJU5dJqAJavF3mqk,151
70
- fmtr/tools/interface_tools/controls.py,sha256=gm8mlgrV014r8fQYHd5pVwnDIvxWiNkS8g_9sYSir5Y,3870
70
+ fmtr/tools/interface_tools/controls.py,sha256=NoKau9oZtAUn9UNqrOdefc4iKp-IUhguv1i-oD9VbX4,6804
71
71
  fmtr/tools/interface_tools/interface_tools.py,sha256=jSRwpdHqOTmNLndE-wFqTQdkT4z2BBdclSxmvs11FnU,4400
72
72
  fmtr/tools/path_tools/__init__.py,sha256=XrJXt7Zzo90tYUVksMlDfKkWt775zJ9OSi2NbhnqMDI,459
73
73
  fmtr/tools/path_tools/app_path_tools.py,sha256=JrJvtTDd_gkCKcZtBCDTMktsM77PZwGV_hzQX0g5GU8,1722
@@ -85,9 +85,9 @@ fmtr/tools/tests/test_path.py,sha256=AkZQa6_8BQ-VaCyL_J-iKmdf2ZaM-xFYR37Kun3k4_g
85
85
  fmtr/tools/tests/test_yaml.py,sha256=jc0TwwKu9eC0LvFGNMERdgBue591xwLxYXFbtsRwXVM,287
86
86
  fmtr/tools/version_tools/__init__.py,sha256=cjE6nO6AoVOUp3RwgTbqL9wiw8J1l2pHJOz6Gn6bxjA,326
87
87
  fmtr/tools/version_tools/version_tools.py,sha256=Hcc6yferZS1hHbugRTdiHhSNmXEEG0hjCiTTXKna-YY,1127
88
- fmtr_tools-1.3.76.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
89
- fmtr_tools-1.3.76.dist-info/METADATA,sha256=qceqhfyIUdA5X0mZdsbNpOg2f59Mk_W0zxEiulcydIs,17916
90
- fmtr_tools-1.3.76.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
91
- fmtr_tools-1.3.76.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
92
- fmtr_tools-1.3.76.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
93
- fmtr_tools-1.3.76.dist-info/RECORD,,
88
+ fmtr_tools-1.3.78.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
89
+ fmtr_tools-1.3.78.dist-info/METADATA,sha256=WO3YLT3mBryS_7VMQ_PWt2782eJ6KtTkJjw9pRLfP-4,17916
90
+ fmtr_tools-1.3.78.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
91
+ fmtr_tools-1.3.78.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
92
+ fmtr_tools-1.3.78.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
93
+ fmtr_tools-1.3.78.dist-info/RECORD,,