fmtr.tools 1.3.72__py3-none-any.whl → 1.3.74__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.
- fmtr/tools/data_modelling_tools.py +12 -0
- fmtr/tools/interface_tools/controls.py +40 -3
- fmtr/tools/interface_tools/interface_tools.py +9 -2
- fmtr/tools/version +1 -1
- {fmtr_tools-1.3.72.dist-info → fmtr_tools-1.3.74.dist-info}/METADATA +48 -48
- {fmtr_tools-1.3.72.dist-info → fmtr_tools-1.3.74.dist-info}/RECORD +10 -10
- {fmtr_tools-1.3.72.dist-info → fmtr_tools-1.3.74.dist-info}/WHEEL +0 -0
- {fmtr_tools-1.3.72.dist-info → fmtr_tools-1.3.74.dist-info}/entry_points.txt +0 -0
- {fmtr_tools-1.3.72.dist-info → fmtr_tools-1.3.74.dist-info}/licenses/LICENSE +0 -0
- {fmtr_tools-1.3.72.dist-info → fmtr_tools-1.3.74.dist-info}/top_level.txt +0 -0
|
@@ -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]):
|
fmtr/tools/version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.3.
|
|
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
|
|
@@ -169,67 +169,67 @@ Requires-Dist: beanie[odm]; extra == "db-document"
|
|
|
169
169
|
Requires-Dist: motor; extra == "db-document"
|
|
170
170
|
Provides-Extra: all
|
|
171
171
|
Requires-Dist: google-auth-httplib2; extra == "all"
|
|
172
|
-
Requires-Dist:
|
|
173
|
-
Requires-Dist: huggingface_hub; extra == "all"
|
|
172
|
+
Requires-Dist: pydantic; extra == "all"
|
|
174
173
|
Requires-Dist: openpyxl; extra == "all"
|
|
175
|
-
Requires-Dist:
|
|
174
|
+
Requires-Dist: regex; extra == "all"
|
|
175
|
+
Requires-Dist: html2text; extra == "all"
|
|
176
|
+
Requires-Dist: google-auth; extra == "all"
|
|
177
|
+
Requires-Dist: deepdiff; extra == "all"
|
|
176
178
|
Requires-Dist: google-auth-oauthlib; extra == "all"
|
|
177
|
-
Requires-Dist:
|
|
178
|
-
Requires-Dist:
|
|
179
|
+
Requires-Dist: distributed; extra == "all"
|
|
180
|
+
Requires-Dist: bokeh; extra == "all"
|
|
181
|
+
Requires-Dist: Unidecode; extra == "all"
|
|
182
|
+
Requires-Dist: dask[bag]; extra == "all"
|
|
183
|
+
Requires-Dist: dnspython[doh]; extra == "all"
|
|
179
184
|
Requires-Dist: setuptools; extra == "all"
|
|
180
|
-
Requires-Dist:
|
|
185
|
+
Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
|
|
186
|
+
Requires-Dist: python-on-whales; extra == "all"
|
|
187
|
+
Requires-Dist: pycountry; extra == "all"
|
|
188
|
+
Requires-Dist: pytest-cov; extra == "all"
|
|
181
189
|
Requires-Dist: httpx; extra == "all"
|
|
182
|
-
Requires-Dist:
|
|
183
|
-
Requires-Dist:
|
|
184
|
-
Requires-Dist: json_repair; extra == "all"
|
|
185
|
-
Requires-Dist: pymupdf; extra == "all"
|
|
190
|
+
Requires-Dist: peft; extra == "all"
|
|
191
|
+
Requires-Dist: odfpy; extra == "all"
|
|
186
192
|
Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
|
|
187
|
-
Requires-Dist:
|
|
188
|
-
Requires-Dist: faker; extra == "all"
|
|
189
|
-
Requires-Dist: deepdiff; extra == "all"
|
|
190
|
-
Requires-Dist: beanie[odm]; extra == "all"
|
|
191
|
-
Requires-Dist: bokeh; extra == "all"
|
|
192
|
-
Requires-Dist: pandas; extra == "all"
|
|
193
|
-
Requires-Dist: sentence_transformers; extra == "all"
|
|
194
|
-
Requires-Dist: cachetools; extra == "all"
|
|
193
|
+
Requires-Dist: flet-video; extra == "all"
|
|
195
194
|
Requires-Dist: fastapi; extra == "all"
|
|
195
|
+
Requires-Dist: openai; extra == "all"
|
|
196
|
+
Requires-Dist: sre_yield; extra == "all"
|
|
197
|
+
Requires-Dist: tinynetrc; extra == "all"
|
|
198
|
+
Requires-Dist: json_repair; extra == "all"
|
|
199
|
+
Requires-Dist: pydantic-extra-types; extra == "all"
|
|
196
200
|
Requires-Dist: logfire[fastapi]; extra == "all"
|
|
201
|
+
Requires-Dist: tokenizers; extra == "all"
|
|
202
|
+
Requires-Dist: yamlscript; extra == "all"
|
|
203
|
+
Requires-Dist: huggingface_hub; extra == "all"
|
|
204
|
+
Requires-Dist: pydantic-settings; extra == "all"
|
|
205
|
+
Requires-Dist: pandas; extra == "all"
|
|
206
|
+
Requires-Dist: sentence_transformers; extra == "all"
|
|
197
207
|
Requires-Dist: flet[all]; extra == "all"
|
|
198
|
-
Requires-Dist:
|
|
208
|
+
Requires-Dist: appdirs; extra == "all"
|
|
209
|
+
Requires-Dist: faker; extra == "all"
|
|
210
|
+
Requires-Dist: torchaudio; extra == "all"
|
|
211
|
+
Requires-Dist: logfire[httpx]; extra == "all"
|
|
199
212
|
Requires-Dist: playwright; extra == "all"
|
|
200
|
-
Requires-Dist:
|
|
213
|
+
Requires-Dist: beanie[odm]; extra == "all"
|
|
214
|
+
Requires-Dist: cachetools; extra == "all"
|
|
215
|
+
Requires-Dist: torchvision; extra == "all"
|
|
216
|
+
Requires-Dist: logfire; extra == "all"
|
|
217
|
+
Requires-Dist: transformers[sentencepiece]; extra == "all"
|
|
218
|
+
Requires-Dist: contexttimer; extra == "all"
|
|
219
|
+
Requires-Dist: semver; extra == "all"
|
|
201
220
|
Requires-Dist: ollama; extra == "all"
|
|
202
|
-
Requires-Dist:
|
|
203
|
-
Requires-Dist:
|
|
204
|
-
Requires-Dist: sre_yield; extra == "all"
|
|
221
|
+
Requires-Dist: pyyaml; extra == "all"
|
|
222
|
+
Requires-Dist: deepmerge; extra == "all"
|
|
205
223
|
Requires-Dist: uvicorn[standard]; extra == "all"
|
|
206
|
-
Requires-Dist:
|
|
224
|
+
Requires-Dist: tabulate; extra == "all"
|
|
207
225
|
Requires-Dist: flet-webview; extra == "all"
|
|
208
|
-
Requires-Dist:
|
|
209
|
-
Requires-Dist:
|
|
210
|
-
Requires-Dist: tinynetrc; extra == "all"
|
|
211
|
-
Requires-Dist: deepmerge; extra == "all"
|
|
226
|
+
Requires-Dist: google-api-python-client; extra == "all"
|
|
227
|
+
Requires-Dist: pymupdf; extra == "all"
|
|
212
228
|
Requires-Dist: pymupdf4llm; extra == "all"
|
|
213
|
-
Requires-Dist:
|
|
214
|
-
Requires-Dist:
|
|
215
|
-
Requires-Dist: python-on-whales; extra == "all"
|
|
216
|
-
Requires-Dist: peft; extra == "all"
|
|
217
|
-
Requires-Dist: tabulate; extra == "all"
|
|
218
|
-
Requires-Dist: distributed; extra == "all"
|
|
219
|
-
Requires-Dist: tokenizers; extra == "all"
|
|
220
|
-
Requires-Dist: odfpy; extra == "all"
|
|
221
|
-
Requires-Dist: Unidecode; extra == "all"
|
|
229
|
+
Requires-Dist: diskcache; extra == "all"
|
|
230
|
+
Requires-Dist: motor; extra == "all"
|
|
222
231
|
Requires-Dist: filetype; extra == "all"
|
|
223
|
-
Requires-Dist:
|
|
224
|
-
Requires-Dist: google-auth; extra == "all"
|
|
225
|
-
Requires-Dist: semver; extra == "all"
|
|
226
|
-
Requires-Dist: pytest-cov; extra == "all"
|
|
227
|
-
Requires-Dist: transformers[sentencepiece]; extra == "all"
|
|
228
|
-
Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
|
|
229
|
-
Requires-Dist: pyyaml; extra == "all"
|
|
230
|
-
Requires-Dist: torchaudio; extra == "all"
|
|
231
|
-
Requires-Dist: pydantic; extra == "all"
|
|
232
|
-
Requires-Dist: logfire; extra == "all"
|
|
232
|
+
Requires-Dist: httpx_retries; extra == "all"
|
|
233
233
|
Dynamic: author
|
|
234
234
|
Dynamic: author-email
|
|
235
235
|
Dynamic: description
|
|
@@ -5,7 +5,7 @@ fmtr/tools/augmentation_tools.py,sha256=-6ESbO4CDlKqVOV1J1V6qBeoBMzbFIinkDHRHnCB
|
|
|
5
5
|
fmtr/tools/caching_tools.py,sha256=74p7m2GLFfeP41LX69wxgfkilxEAoWkMIfFMjKsYpyg,4976
|
|
6
6
|
fmtr/tools/constants.py,sha256=90wCirUpw4bWMAbjhip0LL6k57eS5VmxRUP9pLCChBg,1812
|
|
7
7
|
fmtr/tools/context_tools.py,sha256=4UvIHYgLqAh7dXMX9EBrLEpYp81qfzhSVrkffOSAoGA,350
|
|
8
|
-
fmtr/tools/data_modelling_tools.py,sha256=
|
|
8
|
+
fmtr/tools/data_modelling_tools.py,sha256=KZlY0BkGY1DWro0lhWE1ezgbnv9wPWaj9E2CEqMnTXM,6605
|
|
9
9
|
fmtr/tools/dataclass_tools.py,sha256=0Gt6KeLhtPgubo_2tYkIVqB8oQ91Qzag8OAGZDdjvMU,1209
|
|
10
10
|
fmtr/tools/datatype_tools.py,sha256=qFPFrZK70-an4w7H46g8eT5j6Jez--U2XnmFdrQibeE,1983
|
|
11
11
|
fmtr/tools/datetime_tools.py,sha256=L7wmBoQbD9h_pJIL92WQOX32r_vrXgRvE-_0PVPRAGY,232
|
|
@@ -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=
|
|
48
|
+
fmtr/tools/version,sha256=B3Xtuw9_A6Id0CrCWQQftz0Oj5vDLgssxBg7Z6rb6ec,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,8 +67,8 @@ 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=
|
|
71
|
-
fmtr/tools/interface_tools/interface_tools.py,sha256=
|
|
70
|
+
fmtr/tools/interface_tools/controls.py,sha256=gm8mlgrV014r8fQYHd5pVwnDIvxWiNkS8g_9sYSir5Y,3870
|
|
71
|
+
fmtr/tools/interface_tools/interface_tools.py,sha256=U_gAddhejbdrAoLSIBN2cPpiziyYhAfr0lArVl6BFp8,4534
|
|
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
|
|
74
74
|
fmtr/tools/path_tools/path_tools.py,sha256=s3RTXsjnr2Ah7vXQGjpGs-4DlWaVGvChu0aTFXX3gsE,8867
|
|
@@ -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.
|
|
89
|
-
fmtr_tools-1.3.
|
|
90
|
-
fmtr_tools-1.3.
|
|
91
|
-
fmtr_tools-1.3.
|
|
92
|
-
fmtr_tools-1.3.
|
|
93
|
-
fmtr_tools-1.3.
|
|
88
|
+
fmtr_tools-1.3.74.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
|
|
89
|
+
fmtr_tools-1.3.74.dist-info/METADATA,sha256=Nrf5OwGxRYJ6uhayBywuwYh_vtmL_EaQz4aLeHGODiM,18035
|
|
90
|
+
fmtr_tools-1.3.74.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
91
|
+
fmtr_tools-1.3.74.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
|
|
92
|
+
fmtr_tools-1.3.74.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
|
|
93
|
+
fmtr_tools-1.3.74.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|