fmtr.tools 1.3.72__tar.gz → 1.3.74__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.
Potentially problematic release.
This version of fmtr.tools might be problematic. Click here for more details.
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/PKG-INFO +51 -51
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/data_modelling_tools.py +12 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/interface_tools/controls.py +40 -3
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/interface_tools/interface_tools.py +9 -2
- fmtr_tools-1.3.74/fmtr/tools/version +1 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/PKG-INFO +51 -51
- fmtr_tools-1.3.72/fmtr/tools/version +0 -1
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/LICENSE +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/README.md +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/ai_tools/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/ai_tools/inference_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/api_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/async_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/augmentation_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/caching_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/constants.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/context_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/database_tools/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/database_tools/document.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dataclass_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/datatype_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/datetime_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/debugging_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dns_tools/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dns_tools/client.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dns_tools/dm.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dns_tools/proxy.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dns_tools/server.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/docker_tools/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/ep_test.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/shell_debug.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/environment_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/function_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/google_api_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/hash_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/hfh_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/html_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/http_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/import_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/inherit_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/inspection_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/interface_tools/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/interface_tools/context.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/iterator_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/json_fix_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/json_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/logging_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/merging_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/metric_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/name_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/netrc_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/openai_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/packaging_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/parallel_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/path_tools/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/path_tools/app_path_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/path_tools/path_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/path_tools/type_path_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/pattern_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/pdf_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/platform_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/process_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/profiling_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/random_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/semantic_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/settings_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/setup_tools/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/setup_tools/setup_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/spaces_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/string_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tabular_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/conftest.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/helpers.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/test_datatype.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/test_environment.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/test_json.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/test_path.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/test_yaml.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tokenization_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/unicode_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/version_tools/__init__.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/version_tools/version_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/webhook_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/yaml_tools.py +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/SOURCES.txt +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/dependency_links.txt +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/entry_points.txt +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/requires.txt +50 -50
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/top_level.txt +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/pyproject.toml +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/setup.cfg +0 -0
- {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fmtr.tools
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.74
|
|
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
|
|
@@ -168,68 +168,68 @@ Provides-Extra: db-document
|
|
|
168
168
|
Requires-Dist: beanie[odm]; extra == "db-document"
|
|
169
169
|
Requires-Dist: motor; extra == "db-document"
|
|
170
170
|
Provides-Extra: all
|
|
171
|
-
Requires-Dist:
|
|
172
|
-
Requires-Dist:
|
|
173
|
-
Requires-Dist:
|
|
174
|
-
Requires-Dist:
|
|
175
|
-
Requires-Dist:
|
|
176
|
-
Requires-Dist:
|
|
171
|
+
Requires-Dist: tinynetrc; extra == "all"
|
|
172
|
+
Requires-Dist: cachetools; extra == "all"
|
|
173
|
+
Requires-Dist: appdirs; extra == "all"
|
|
174
|
+
Requires-Dist: json_repair; extra == "all"
|
|
175
|
+
Requires-Dist: openai; extra == "all"
|
|
176
|
+
Requires-Dist: logfire[httpx]; extra == "all"
|
|
177
|
+
Requires-Dist: setuptools; extra == "all"
|
|
178
|
+
Requires-Dist: pydantic-settings; extra == "all"
|
|
177
179
|
Requires-Dist: pydantic; extra == "all"
|
|
178
180
|
Requires-Dist: pyyaml; extra == "all"
|
|
179
|
-
Requires-Dist: deepdiff; extra == "all"
|
|
180
|
-
Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
|
|
181
181
|
Requires-Dist: logfire[fastapi]; extra == "all"
|
|
182
|
-
Requires-Dist:
|
|
183
|
-
Requires-Dist:
|
|
184
|
-
Requires-Dist:
|
|
185
|
-
Requires-Dist:
|
|
182
|
+
Requires-Dist: odfpy; extra == "all"
|
|
183
|
+
Requires-Dist: httpx_retries; extra == "all"
|
|
184
|
+
Requires-Dist: pydantic-extra-types; extra == "all"
|
|
185
|
+
Requires-Dist: python-on-whales; extra == "all"
|
|
186
|
+
Requires-Dist: peft; extra == "all"
|
|
186
187
|
Requires-Dist: logfire; extra == "all"
|
|
187
|
-
Requires-Dist:
|
|
188
|
-
Requires-Dist:
|
|
189
|
-
Requires-Dist:
|
|
190
|
-
Requires-Dist:
|
|
191
|
-
Requires-Dist: logfire
|
|
192
|
-
Requires-Dist:
|
|
193
|
-
Requires-Dist: transformers[sentencepiece]; extra == "all"
|
|
194
|
-
Requires-Dist: pydantic-settings; extra == "all"
|
|
195
|
-
Requires-Dist: flet-webview; extra == "all"
|
|
196
|
-
Requires-Dist: regex; extra == "all"
|
|
188
|
+
Requires-Dist: uvicorn[standard]; extra == "all"
|
|
189
|
+
Requires-Dist: flet-video; extra == "all"
|
|
190
|
+
Requires-Dist: diskcache; extra == "all"
|
|
191
|
+
Requires-Dist: pymupdf4llm; extra == "all"
|
|
192
|
+
Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
|
|
193
|
+
Requires-Dist: html2text; extra == "all"
|
|
197
194
|
Requires-Dist: pandas; extra == "all"
|
|
198
|
-
Requires-Dist:
|
|
195
|
+
Requires-Dist: filetype; extra == "all"
|
|
199
196
|
Requires-Dist: contexttimer; extra == "all"
|
|
200
|
-
Requires-Dist:
|
|
201
|
-
Requires-Dist:
|
|
202
|
-
Requires-Dist:
|
|
203
|
-
Requires-Dist:
|
|
197
|
+
Requires-Dist: flet-webview; extra == "all"
|
|
198
|
+
Requires-Dist: distributed; extra == "all"
|
|
199
|
+
Requires-Dist: fastapi; extra == "all"
|
|
200
|
+
Requires-Dist: ollama; extra == "all"
|
|
201
|
+
Requires-Dist: motor; extra == "all"
|
|
204
202
|
Requires-Dist: pymupdf; extra == "all"
|
|
203
|
+
Requires-Dist: google-api-python-client; extra == "all"
|
|
204
|
+
Requires-Dist: regex; extra == "all"
|
|
205
|
+
Requires-Dist: torchaudio; extra == "all"
|
|
206
|
+
Requires-Dist: torchvision; extra == "all"
|
|
207
|
+
Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
|
|
208
|
+
Requires-Dist: beanie[odm]; extra == "all"
|
|
205
209
|
Requires-Dist: faker; extra == "all"
|
|
206
|
-
Requires-Dist: setuptools; extra == "all"
|
|
207
|
-
Requires-Dist: motor; extra == "all"
|
|
208
|
-
Requires-Dist: tokenizers; extra == "all"
|
|
209
|
-
Requires-Dist: diskcache; extra == "all"
|
|
210
210
|
Requires-Dist: huggingface_hub; extra == "all"
|
|
211
|
-
Requires-Dist:
|
|
212
|
-
Requires-Dist:
|
|
213
|
-
Requires-Dist:
|
|
214
|
-
Requires-Dist:
|
|
215
|
-
Requires-Dist:
|
|
216
|
-
Requires-Dist:
|
|
217
|
-
Requires-Dist:
|
|
218
|
-
Requires-Dist:
|
|
219
|
-
Requires-Dist:
|
|
211
|
+
Requires-Dist: tabulate; extra == "all"
|
|
212
|
+
Requires-Dist: semver; extra == "all"
|
|
213
|
+
Requires-Dist: openpyxl; extra == "all"
|
|
214
|
+
Requires-Dist: google-auth; extra == "all"
|
|
215
|
+
Requires-Dist: playwright; extra == "all"
|
|
216
|
+
Requires-Dist: transformers[sentencepiece]; extra == "all"
|
|
217
|
+
Requires-Dist: Unidecode; extra == "all"
|
|
218
|
+
Requires-Dist: pycountry; extra == "all"
|
|
219
|
+
Requires-Dist: deepmerge; extra == "all"
|
|
220
220
|
Requires-Dist: dask[bag]; extra == "all"
|
|
221
221
|
Requires-Dist: sre_yield; extra == "all"
|
|
222
|
-
Requires-Dist:
|
|
223
|
-
Requires-Dist:
|
|
224
|
-
Requires-Dist:
|
|
225
|
-
Requires-Dist:
|
|
226
|
-
Requires-Dist:
|
|
222
|
+
Requires-Dist: flet[all]; extra == "all"
|
|
223
|
+
Requires-Dist: google-auth-oauthlib; extra == "all"
|
|
224
|
+
Requires-Dist: pytest-cov; extra == "all"
|
|
225
|
+
Requires-Dist: dnspython[doh]; extra == "all"
|
|
226
|
+
Requires-Dist: httpx; extra == "all"
|
|
227
|
+
Requires-Dist: sentence_transformers; extra == "all"
|
|
227
228
|
Requires-Dist: yamlscript; extra == "all"
|
|
228
|
-
Requires-Dist:
|
|
229
|
-
Requires-Dist:
|
|
230
|
-
Requires-Dist:
|
|
231
|
-
Requires-Dist:
|
|
232
|
-
Requires-Dist: tinynetrc; extra == "all"
|
|
229
|
+
Requires-Dist: tokenizers; extra == "all"
|
|
230
|
+
Requires-Dist: google-auth-httplib2; extra == "all"
|
|
231
|
+
Requires-Dist: deepdiff; extra == "all"
|
|
232
|
+
Requires-Dist: bokeh; extra == "all"
|
|
233
233
|
Dynamic: author
|
|
234
234
|
Dynamic: author-email
|
|
235
235
|
Dynamic: description
|
|
@@ -236,6 +236,18 @@ class Base(BaseModel, MixinFromJson):
|
|
|
236
236
|
df = tabular.pd.json_normalize(data, sep='_')
|
|
237
237
|
return df
|
|
238
238
|
|
|
239
|
+
@classmethod
|
|
240
|
+
def to_df_empty(cls):
|
|
241
|
+
"""
|
|
242
|
+
|
|
243
|
+
Empty DataFrame
|
|
244
|
+
|
|
245
|
+
"""
|
|
246
|
+
from fmtr.tools import tabular
|
|
247
|
+
|
|
248
|
+
row = {name: None for name in cls.model_fields.keys()}
|
|
249
|
+
df = tabular.pd.DataFrame([row])
|
|
250
|
+
return df
|
|
239
251
|
|
|
240
252
|
class Root(RootModel, MixinFromJson):
|
|
241
253
|
"""
|
|
@@ -46,7 +46,7 @@ class Cell(ft.DataCell):
|
|
|
46
46
|
|
|
47
47
|
"""
|
|
48
48
|
|
|
49
|
-
return ft.Text(str(self.value), color=self.color)
|
|
49
|
+
return ft.Text(str(self.value), color=self.color, bgcolor=self.bgcolor)
|
|
50
50
|
|
|
51
51
|
@property
|
|
52
52
|
def color(self):
|
|
@@ -60,6 +60,16 @@ class Cell(ft.DataCell):
|
|
|
60
60
|
else:
|
|
61
61
|
return None
|
|
62
62
|
|
|
63
|
+
@property
|
|
64
|
+
def bgcolor(self):
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
Basic conditional formatting
|
|
68
|
+
|
|
69
|
+
"""
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
|
|
63
73
|
@property
|
|
64
74
|
def gesture_detector(self):
|
|
65
75
|
"""
|
|
@@ -67,7 +77,7 @@ class Cell(ft.DataCell):
|
|
|
67
77
|
Make arbitrary content clickable
|
|
68
78
|
|
|
69
79
|
"""
|
|
70
|
-
return ft.GestureDetector(content=self.text, on_tap=self.click_tap)
|
|
80
|
+
return ft.GestureDetector(content=self.text, on_tap=self.click_tap, on_double_tap=self.click_double_tap)
|
|
71
81
|
|
|
72
82
|
async def click_tap(self, event: TapEvent):
|
|
73
83
|
"""
|
|
@@ -87,6 +97,24 @@ class Cell(ft.DataCell):
|
|
|
87
97
|
"""
|
|
88
98
|
logger.info(f"Clicked {self.column=} {self.series.id=} {self.value=}")
|
|
89
99
|
|
|
100
|
+
async def click_double_tap(self, event: TapEvent):
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
Default cell click behavior — override in subclass if needed
|
|
104
|
+
|
|
105
|
+
"""
|
|
106
|
+
value = await self.double_click(event=event)
|
|
107
|
+
event.page.update()
|
|
108
|
+
return value
|
|
109
|
+
|
|
110
|
+
async def double_click(self, event: Optional[TapEvent] = None):
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
Default cell double click behavior — override in subclass if needed
|
|
114
|
+
|
|
115
|
+
"""
|
|
116
|
+
logger.info(f"Double-clicked {self.column=} {self.series.id=} {self.value=}")
|
|
117
|
+
|
|
90
118
|
|
|
91
119
|
class Row(ft.DataRow):
|
|
92
120
|
"""
|
|
@@ -100,7 +128,16 @@ class Row(ft.DataRow):
|
|
|
100
128
|
def __init__(self, series):
|
|
101
129
|
self.series = series
|
|
102
130
|
cells = [self.TypeCell(series, col) for col in series.index]
|
|
103
|
-
super().__init__(cells)
|
|
131
|
+
super().__init__(cells, color=self.row_color)
|
|
132
|
+
|
|
133
|
+
@property
|
|
134
|
+
def row_color(self):
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
Basic conditional formatting
|
|
138
|
+
|
|
139
|
+
"""
|
|
140
|
+
return None
|
|
104
141
|
|
|
105
142
|
|
|
106
143
|
class Column(ft.DataColumn):
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
from typing import TypeVar, Generic, Type
|
|
2
3
|
|
|
3
4
|
import flet as ft
|
|
@@ -72,9 +73,12 @@ class Base(Generic[T], ft.Column):
|
|
|
72
73
|
URL = Constants.FMTR_DEV_INTERFACE_URL if environment_tools.IS_DEV else None
|
|
73
74
|
APPVIEW = AppView.WEB_BROWSER
|
|
74
75
|
PATH_ASSETS = None
|
|
75
|
-
|
|
76
|
+
PATH_UPLOADS = None
|
|
76
77
|
SCROLL = ft.ScrollMode.AUTO
|
|
77
78
|
|
|
79
|
+
SECRET_KEY_KEY = 'FLET_SECRET_KEY'
|
|
80
|
+
ROUTE_ROOT = '/'
|
|
81
|
+
|
|
78
82
|
TypeContext: Type[T] = Context
|
|
79
83
|
|
|
80
84
|
@classmethod
|
|
@@ -168,8 +172,11 @@ class Base(Generic[T], ft.Column):
|
|
|
168
172
|
else:
|
|
169
173
|
url = f'http://{cls.HOST}:{cls.PORT}'
|
|
170
174
|
|
|
175
|
+
if not environment_tools.get(cls.SECRET_KEY_KEY, default=None):
|
|
176
|
+
os.environ["FLET_SECRET_KEY"] = os.urandom(12).hex()
|
|
177
|
+
|
|
171
178
|
logger.info(f"Launching {cls.TITLE} at {url}")
|
|
172
|
-
ft.app(cls.new, view=cls.APPVIEW, host=cls.HOST, port=cls.PORT, assets_dir=cls.PATH_ASSETS, )
|
|
179
|
+
ft.app(cls.new, view=cls.APPVIEW, host=cls.HOST, port=cls.PORT, assets_dir=cls.PATH_ASSETS, upload_dir=cls.PATH_UPLOADS)
|
|
173
180
|
|
|
174
181
|
|
|
175
182
|
class Test(Base[Context]):
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.3.74
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fmtr.tools
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.74
|
|
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
|
|
@@ -168,68 +168,68 @@ Provides-Extra: db-document
|
|
|
168
168
|
Requires-Dist: beanie[odm]; extra == "db-document"
|
|
169
169
|
Requires-Dist: motor; extra == "db-document"
|
|
170
170
|
Provides-Extra: all
|
|
171
|
-
Requires-Dist:
|
|
172
|
-
Requires-Dist:
|
|
173
|
-
Requires-Dist:
|
|
174
|
-
Requires-Dist:
|
|
175
|
-
Requires-Dist:
|
|
176
|
-
Requires-Dist:
|
|
171
|
+
Requires-Dist: tinynetrc; extra == "all"
|
|
172
|
+
Requires-Dist: cachetools; extra == "all"
|
|
173
|
+
Requires-Dist: appdirs; extra == "all"
|
|
174
|
+
Requires-Dist: json_repair; extra == "all"
|
|
175
|
+
Requires-Dist: openai; extra == "all"
|
|
176
|
+
Requires-Dist: logfire[httpx]; extra == "all"
|
|
177
|
+
Requires-Dist: setuptools; extra == "all"
|
|
178
|
+
Requires-Dist: pydantic-settings; extra == "all"
|
|
177
179
|
Requires-Dist: pydantic; extra == "all"
|
|
178
180
|
Requires-Dist: pyyaml; extra == "all"
|
|
179
|
-
Requires-Dist: deepdiff; extra == "all"
|
|
180
|
-
Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
|
|
181
181
|
Requires-Dist: logfire[fastapi]; extra == "all"
|
|
182
|
-
Requires-Dist:
|
|
183
|
-
Requires-Dist:
|
|
184
|
-
Requires-Dist:
|
|
185
|
-
Requires-Dist:
|
|
182
|
+
Requires-Dist: odfpy; extra == "all"
|
|
183
|
+
Requires-Dist: httpx_retries; extra == "all"
|
|
184
|
+
Requires-Dist: pydantic-extra-types; extra == "all"
|
|
185
|
+
Requires-Dist: python-on-whales; extra == "all"
|
|
186
|
+
Requires-Dist: peft; extra == "all"
|
|
186
187
|
Requires-Dist: logfire; extra == "all"
|
|
187
|
-
Requires-Dist:
|
|
188
|
-
Requires-Dist:
|
|
189
|
-
Requires-Dist:
|
|
190
|
-
Requires-Dist:
|
|
191
|
-
Requires-Dist: logfire
|
|
192
|
-
Requires-Dist:
|
|
193
|
-
Requires-Dist: transformers[sentencepiece]; extra == "all"
|
|
194
|
-
Requires-Dist: pydantic-settings; extra == "all"
|
|
195
|
-
Requires-Dist: flet-webview; extra == "all"
|
|
196
|
-
Requires-Dist: regex; extra == "all"
|
|
188
|
+
Requires-Dist: uvicorn[standard]; extra == "all"
|
|
189
|
+
Requires-Dist: flet-video; extra == "all"
|
|
190
|
+
Requires-Dist: diskcache; extra == "all"
|
|
191
|
+
Requires-Dist: pymupdf4llm; extra == "all"
|
|
192
|
+
Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
|
|
193
|
+
Requires-Dist: html2text; extra == "all"
|
|
197
194
|
Requires-Dist: pandas; extra == "all"
|
|
198
|
-
Requires-Dist:
|
|
195
|
+
Requires-Dist: filetype; extra == "all"
|
|
199
196
|
Requires-Dist: contexttimer; extra == "all"
|
|
200
|
-
Requires-Dist:
|
|
201
|
-
Requires-Dist:
|
|
202
|
-
Requires-Dist:
|
|
203
|
-
Requires-Dist:
|
|
197
|
+
Requires-Dist: flet-webview; extra == "all"
|
|
198
|
+
Requires-Dist: distributed; extra == "all"
|
|
199
|
+
Requires-Dist: fastapi; extra == "all"
|
|
200
|
+
Requires-Dist: ollama; extra == "all"
|
|
201
|
+
Requires-Dist: motor; extra == "all"
|
|
204
202
|
Requires-Dist: pymupdf; extra == "all"
|
|
203
|
+
Requires-Dist: google-api-python-client; extra == "all"
|
|
204
|
+
Requires-Dist: regex; extra == "all"
|
|
205
|
+
Requires-Dist: torchaudio; extra == "all"
|
|
206
|
+
Requires-Dist: torchvision; extra == "all"
|
|
207
|
+
Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
|
|
208
|
+
Requires-Dist: beanie[odm]; extra == "all"
|
|
205
209
|
Requires-Dist: faker; extra == "all"
|
|
206
|
-
Requires-Dist: setuptools; extra == "all"
|
|
207
|
-
Requires-Dist: motor; extra == "all"
|
|
208
|
-
Requires-Dist: tokenizers; extra == "all"
|
|
209
|
-
Requires-Dist: diskcache; extra == "all"
|
|
210
210
|
Requires-Dist: huggingface_hub; extra == "all"
|
|
211
|
-
Requires-Dist:
|
|
212
|
-
Requires-Dist:
|
|
213
|
-
Requires-Dist:
|
|
214
|
-
Requires-Dist:
|
|
215
|
-
Requires-Dist:
|
|
216
|
-
Requires-Dist:
|
|
217
|
-
Requires-Dist:
|
|
218
|
-
Requires-Dist:
|
|
219
|
-
Requires-Dist:
|
|
211
|
+
Requires-Dist: tabulate; extra == "all"
|
|
212
|
+
Requires-Dist: semver; extra == "all"
|
|
213
|
+
Requires-Dist: openpyxl; extra == "all"
|
|
214
|
+
Requires-Dist: google-auth; extra == "all"
|
|
215
|
+
Requires-Dist: playwright; extra == "all"
|
|
216
|
+
Requires-Dist: transformers[sentencepiece]; extra == "all"
|
|
217
|
+
Requires-Dist: Unidecode; extra == "all"
|
|
218
|
+
Requires-Dist: pycountry; extra == "all"
|
|
219
|
+
Requires-Dist: deepmerge; extra == "all"
|
|
220
220
|
Requires-Dist: dask[bag]; extra == "all"
|
|
221
221
|
Requires-Dist: sre_yield; extra == "all"
|
|
222
|
-
Requires-Dist:
|
|
223
|
-
Requires-Dist:
|
|
224
|
-
Requires-Dist:
|
|
225
|
-
Requires-Dist:
|
|
226
|
-
Requires-Dist:
|
|
222
|
+
Requires-Dist: flet[all]; extra == "all"
|
|
223
|
+
Requires-Dist: google-auth-oauthlib; extra == "all"
|
|
224
|
+
Requires-Dist: pytest-cov; extra == "all"
|
|
225
|
+
Requires-Dist: dnspython[doh]; extra == "all"
|
|
226
|
+
Requires-Dist: httpx; extra == "all"
|
|
227
|
+
Requires-Dist: sentence_transformers; extra == "all"
|
|
227
228
|
Requires-Dist: yamlscript; extra == "all"
|
|
228
|
-
Requires-Dist:
|
|
229
|
-
Requires-Dist:
|
|
230
|
-
Requires-Dist:
|
|
231
|
-
Requires-Dist:
|
|
232
|
-
Requires-Dist: tinynetrc; extra == "all"
|
|
229
|
+
Requires-Dist: tokenizers; extra == "all"
|
|
230
|
+
Requires-Dist: google-auth-httplib2; extra == "all"
|
|
231
|
+
Requires-Dist: deepdiff; extra == "all"
|
|
232
|
+
Requires-Dist: bokeh; extra == "all"
|
|
233
233
|
Dynamic: author
|
|
234
234
|
Dynamic: author-email
|
|
235
235
|
Dynamic: description
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
1.3.72
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -18,68 +18,68 @@ pydantic-ai[logfire,openai]
|
|
|
18
18
|
ollama
|
|
19
19
|
|
|
20
20
|
[all]
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
tinynetrc
|
|
22
|
+
cachetools
|
|
23
|
+
appdirs
|
|
24
|
+
json_repair
|
|
25
|
+
openai
|
|
26
|
+
logfire[httpx]
|
|
27
|
+
setuptools
|
|
28
|
+
pydantic-settings
|
|
27
29
|
pydantic
|
|
28
30
|
pyyaml
|
|
29
|
-
deepdiff
|
|
30
|
-
pydevd-pycharm~=251.25410.159
|
|
31
31
|
logfire[fastapi]
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
odfpy
|
|
33
|
+
httpx_retries
|
|
34
|
+
pydantic-extra-types
|
|
35
|
+
python-on-whales
|
|
36
|
+
peft
|
|
36
37
|
logfire
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
logfire
|
|
42
|
-
|
|
43
|
-
transformers[sentencepiece]
|
|
44
|
-
pydantic-settings
|
|
45
|
-
flet-webview
|
|
46
|
-
regex
|
|
38
|
+
uvicorn[standard]
|
|
39
|
+
flet-video
|
|
40
|
+
diskcache
|
|
41
|
+
pymupdf4llm
|
|
42
|
+
pydantic-ai[logfire,openai]
|
|
43
|
+
html2text
|
|
47
44
|
pandas
|
|
48
|
-
|
|
45
|
+
filetype
|
|
49
46
|
contexttimer
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
47
|
+
flet-webview
|
|
48
|
+
distributed
|
|
49
|
+
fastapi
|
|
50
|
+
ollama
|
|
51
|
+
motor
|
|
54
52
|
pymupdf
|
|
53
|
+
google-api-python-client
|
|
54
|
+
regex
|
|
55
|
+
torchaudio
|
|
56
|
+
torchvision
|
|
57
|
+
pydevd-pycharm~=251.25410.159
|
|
58
|
+
beanie[odm]
|
|
55
59
|
faker
|
|
56
|
-
setuptools
|
|
57
|
-
motor
|
|
58
|
-
tokenizers
|
|
59
|
-
diskcache
|
|
60
60
|
huggingface_hub
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
61
|
+
tabulate
|
|
62
|
+
semver
|
|
63
|
+
openpyxl
|
|
64
|
+
google-auth
|
|
65
|
+
playwright
|
|
66
|
+
transformers[sentencepiece]
|
|
67
|
+
Unidecode
|
|
68
|
+
pycountry
|
|
69
|
+
deepmerge
|
|
70
70
|
dask[bag]
|
|
71
71
|
sre_yield
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
flet[all]
|
|
73
|
+
google-auth-oauthlib
|
|
74
|
+
pytest-cov
|
|
75
|
+
dnspython[doh]
|
|
76
|
+
httpx
|
|
77
|
+
sentence_transformers
|
|
77
78
|
yamlscript
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
tinynetrc
|
|
79
|
+
tokenizers
|
|
80
|
+
google-auth-httplib2
|
|
81
|
+
deepdiff
|
|
82
|
+
bokeh
|
|
83
83
|
|
|
84
84
|
[api]
|
|
85
85
|
fastapi
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|