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

@@ -41,7 +41,7 @@ class Cell(ft.DataCell):
41
41
 
42
42
  super().__init__(self.gesture_detector)
43
43
 
44
- @property
44
+ @cached_property
45
45
  def text(self):
46
46
  """
47
47
 
@@ -72,8 +72,7 @@ class Cell(ft.DataCell):
72
72
  """
73
73
  return None
74
74
 
75
-
76
- @property
75
+ @cached_property
77
76
  def gesture_detector(self):
78
77
  """
79
78
 
@@ -98,7 +97,7 @@ class Cell(ft.DataCell):
98
97
  Default cell click behavior — override in subclass if needed
99
98
 
100
99
  """
101
- logger.info(f"Clicked {self.column=} {self.series.id=} {self.value=}")
100
+ logger.info(f"Clicked {self.column=} {self.series.name=} {self.value=}")
102
101
 
103
102
  async def click_double_tap(self, event: TapEvent):
104
103
  """
@@ -126,7 +125,7 @@ class Row(ft.DataRow):
126
125
 
127
126
  """
128
127
 
129
- TypeCell = Cell
128
+ TypesCells = {None: Cell}
130
129
 
131
130
  def __init__(self, series):
132
131
  self.series = series
@@ -141,7 +140,9 @@ class Row(ft.DataRow):
141
140
  """
142
141
  data = {}
143
142
  for col in self.series.index:
144
- data.setdefault(col, []).append(self.TypeCell(self.series, col))
143
+ default = self.TypesCells[None]
144
+ TypeCell = self.TypesCells.get(col, default)
145
+ data.setdefault(col, []).append(TypeCell(self.series, col))
145
146
  return data
146
147
 
147
148
  @cached_property
@@ -193,7 +194,7 @@ class Column(ft.DataColumn):
193
194
 
194
195
  super().__init__(label=self.text)
195
196
 
196
- @property
197
+ @cached_property
197
198
  def text(self):
198
199
  """
199
200
 
@@ -219,8 +220,8 @@ class Table(ft.DataTable):
219
220
 
220
221
  """
221
222
 
222
- TypeRow = Row
223
- TypeColumn = Column
223
+ TypesRows = {None: Row}
224
+ TypesColumns = {None: Column}
224
225
 
225
226
  def __init__(self, df): # todo move to submodule with tabular deps
226
227
  """
@@ -229,8 +230,34 @@ class Table(ft.DataTable):
229
230
 
230
231
  """
231
232
  self.df = df
232
- columns = [self.TypeColumn(col) for col in df.columns]
233
- super().__init__(columns=columns, rows=self.rows_controls)
233
+ super().__init__(columns=self.columns_controls, rows=self.rows_controls)
234
+
235
+ @cached_property
236
+ def columns_data(self) -> dict[str, list[Column]]:
237
+ """
238
+
239
+ Columns controls lookup
240
+
241
+ """
242
+ data = {}
243
+ for col in self.df.columns:
244
+ default = self.TypesColumns[None]
245
+ TypeColumn = self.TypesColumns.get(col, default)
246
+ data.setdefault(col, []).append(TypeColumn(col))
247
+ return data
248
+
249
+ @cached_property
250
+ def columns_controls(self) -> list[Column]:
251
+ """
252
+
253
+ Flat list of controls
254
+
255
+ """
256
+ controls = []
257
+ for columns in self.columns_data.values():
258
+ for column in columns:
259
+ controls.append(column)
260
+ return controls
234
261
 
235
262
  @cached_property
236
263
  def rows_data(self) -> dict[str, list[Row]]:
@@ -241,7 +268,9 @@ class Table(ft.DataTable):
241
268
  """
242
269
  data = {}
243
270
  for index, row in self.df.iterrows():
244
- data.setdefault(index, []).append(self.TypeRow(row))
271
+ default = self.TypesRows[None]
272
+ TypeRow = self.TypesRows.get(index, default)
273
+ data.setdefault(index, []).append(TypeRow(row))
245
274
  return data
246
275
 
247
276
  @cached_property
fmtr/tools/version CHANGED
@@ -1 +1 @@
1
- 1.3.78
1
+ 1.3.80
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.78
3
+ Version: 1.3.80
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"
169
+ Requires-Dist: sre_yield; extra == "all"
170
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
172
171
  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"
178
- Requires-Dist: pytest-cov; extra == "all"
172
+ Requires-Dist: semver; extra == "all"
173
+ Requires-Dist: filetype; extra == "all"
174
+ Requires-Dist: playwright; extra == "all"
175
+ Requires-Dist: pyyaml; extra == "all"
176
+ Requires-Dist: logfire[fastapi]; extra == "all"
177
+ Requires-Dist: google-auth; extra == "all"
178
+ Requires-Dist: google-auth-httplib2; extra == "all"
179
179
  Requires-Dist: pymupdf; extra == "all"
180
180
  Requires-Dist: torchvision; extra == "all"
181
+ Requires-Dist: openpyxl; extra == "all"
182
+ Requires-Dist: dask[bag]; extra == "all"
183
+ Requires-Dist: pytest-cov; extra == "all"
184
+ Requires-Dist: Unidecode; extra == "all"
185
+ Requires-Dist: regex; extra == "all"
186
+ Requires-Dist: deepmerge; extra == "all"
187
+ Requires-Dist: pycountry; extra == "all"
188
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
189
+ Requires-Dist: odfpy; extra == "all"
190
+ Requires-Dist: pandas; extra == "all"
181
191
  Requires-Dist: appdirs; extra == "all"
192
+ Requires-Dist: flet[all]; extra == "all"
193
+ Requires-Dist: ollama; extra == "all"
194
+ Requires-Dist: uvicorn[standard]; extra == "all"
182
195
  Requires-Dist: yamlscript; extra == "all"
183
- Requires-Dist: tabulate; extra == "all"
184
- Requires-Dist: torchaudio; extra == "all"
196
+ Requires-Dist: html2text; extra == "all"
197
+ Requires-Dist: sentence_transformers; extra == "all"
185
198
  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"
189
- Requires-Dist: logfire[fastapi]; extra == "all"
199
+ Requires-Dist: huggingface_hub; extra == "all"
200
+ Requires-Dist: httpx_retries; extra == "all"
201
+ Requires-Dist: logfire[httpx]; extra == "all"
202
+ Requires-Dist: logfire; extra == "all"
203
+ Requires-Dist: distributed; extra == "all"
204
+ Requires-Dist: tinynetrc; extra == "all"
190
205
  Requires-Dist: diskcache; extra == "all"
191
- Requires-Dist: setuptools; extra == "all"
192
206
  Requires-Dist: peft; extra == "all"
207
+ Requires-Dist: contexttimer; extra == "all"
208
+ Requires-Dist: deepdiff; extra == "all"
209
+ Requires-Dist: pydantic-extra-types; extra == "all"
193
210
  Requires-Dist: httpx; extra == "all"
194
- Requires-Dist: pandas; extra == "all"
195
- Requires-Dist: flet[all]; extra == "all"
211
+ Requires-Dist: flet-webview; extra == "all"
212
+ Requires-Dist: pydantic-settings; extra == "all"
213
+ Requires-Dist: fastapi; extra == "all"
214
+ Requires-Dist: openai; extra == "all"
196
215
  Requires-Dist: pydantic; extra == "all"
197
- Requires-Dist: beanie[odm]; extra == "all"
198
- Requires-Dist: distributed; extra == "all"
199
- Requires-Dist: pycountry; extra == "all"
200
- Requires-Dist: pymupdf4llm; extra == "all"
216
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
217
+ Requires-Dist: flet-video; extra == "all"
218
+ Requires-Dist: tokenizers; extra == "all"
201
219
  Requires-Dist: dnspython[doh]; extra == "all"
202
- Requires-Dist: playwright; extra == "all"
203
- Requires-Dist: odfpy; extra == "all"
220
+ Requires-Dist: google-api-python-client; extra == "all"
204
221
  Requires-Dist: python-on-whales; extra == "all"
222
+ Requires-Dist: setuptools; extra == "all"
223
+ Requires-Dist: torchaudio; extra == "all"
224
+ Requires-Dist: beanie[odm]; extra == "all"
225
+ Requires-Dist: tabulate; extra == "all"
205
226
  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"
212
- Requires-Dist: logfire[httpx]; 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"
227
+ Requires-Dist: pymupdf4llm; extra == "all"
228
+ Requires-Dist: google-auth-oauthlib; extra == "all"
224
229
  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=44MKGTtDIpnJNALvNTzMb92ej4gSGvmp9z8gUKxi5A4,6
48
+ fmtr/tools/version,sha256=56AUcdQogqzsIrs56Mo-4LZmWCw_xrUs-x8c1DwJd8Q,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=NoKau9oZtAUn9UNqrOdefc4iKp-IUhguv1i-oD9VbX4,6804
70
+ fmtr/tools/interface_tools/controls.py,sha256=8cI7Jq4SsxRUD1CFVwQRAr4Ci6GSqyfQ5RDZqmPId2w,7673
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.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,,
88
+ fmtr_tools-1.3.80.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
89
+ fmtr_tools-1.3.80.dist-info/METADATA,sha256=jvaj6sPXxLQx_FH4IouebVrETAAm6DkSfVsK8Zcz2p8,17916
90
+ fmtr_tools-1.3.80.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
91
+ fmtr_tools-1.3.80.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
92
+ fmtr_tools-1.3.80.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
93
+ fmtr_tools-1.3.80.dist-info/RECORD,,