fmtr.tools 1.3.71__tar.gz → 1.3.73__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.

Files changed (100) hide show
  1. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/PKG-INFO +51 -51
  2. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/data_modelling_tools.py +29 -12
  3. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/interface_tools/controls.py +40 -3
  4. fmtr_tools-1.3.73/fmtr/tools/version +1 -0
  5. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr.tools.egg-info/PKG-INFO +51 -51
  6. fmtr_tools-1.3.71/fmtr/tools/version +0 -1
  7. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/LICENSE +0 -0
  8. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/README.md +0 -0
  9. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/__init__.py +0 -0
  10. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/ai_tools/__init__.py +0 -0
  11. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  12. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  13. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/api_tools.py +0 -0
  14. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/async_tools.py +0 -0
  15. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/augmentation_tools.py +0 -0
  16. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/caching_tools.py +0 -0
  17. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/constants.py +0 -0
  18. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/context_tools.py +0 -0
  19. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/database_tools/__init__.py +0 -0
  20. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/database_tools/document.py +0 -0
  21. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/dataclass_tools.py +0 -0
  22. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/datatype_tools.py +0 -0
  23. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/datetime_tools.py +0 -0
  24. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/debugging_tools.py +0 -0
  25. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/dns_tools/__init__.py +0 -0
  26. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/dns_tools/client.py +0 -0
  27. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/dns_tools/dm.py +0 -0
  28. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/dns_tools/proxy.py +0 -0
  29. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/dns_tools/server.py +0 -0
  30. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/docker_tools/__init__.py +0 -0
  31. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/entrypoints/__init__.py +0 -0
  32. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  33. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/entrypoints/ep_test.py +0 -0
  34. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  35. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  36. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  37. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/environment_tools.py +0 -0
  38. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/function_tools.py +0 -0
  39. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/google_api_tools.py +0 -0
  40. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/hash_tools.py +0 -0
  41. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/hfh_tools.py +0 -0
  42. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/html_tools.py +0 -0
  43. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/http_tools.py +0 -0
  44. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/import_tools.py +0 -0
  45. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/inherit_tools.py +0 -0
  46. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/inspection_tools.py +0 -0
  47. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/interface_tools/__init__.py +0 -0
  48. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/interface_tools/context.py +0 -0
  49. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/interface_tools/interface_tools.py +0 -0
  50. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/iterator_tools.py +0 -0
  51. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/json_fix_tools.py +0 -0
  52. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/json_tools.py +0 -0
  53. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/logging_tools.py +0 -0
  54. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/merging_tools.py +0 -0
  55. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/metric_tools.py +0 -0
  56. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/name_tools.py +0 -0
  57. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/netrc_tools.py +0 -0
  58. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/openai_tools.py +0 -0
  59. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/packaging_tools.py +0 -0
  60. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/parallel_tools.py +0 -0
  61. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/path_tools/__init__.py +0 -0
  62. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  63. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/path_tools/path_tools.py +0 -0
  64. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  65. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/pattern_tools.py +0 -0
  66. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/pdf_tools.py +0 -0
  67. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/platform_tools.py +0 -0
  68. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/process_tools.py +0 -0
  69. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/profiling_tools.py +0 -0
  70. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/random_tools.py +0 -0
  71. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/semantic_tools.py +0 -0
  72. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/settings_tools.py +0 -0
  73. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/setup_tools/__init__.py +0 -0
  74. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/setup_tools/setup_tools.py +0 -0
  75. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/spaces_tools.py +0 -0
  76. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/string_tools.py +0 -0
  77. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tabular_tools.py +0 -0
  78. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tests/__init__.py +0 -0
  79. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tests/conftest.py +0 -0
  80. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tests/helpers.py +0 -0
  81. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tests/test_datatype.py +0 -0
  82. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tests/test_environment.py +0 -0
  83. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tests/test_json.py +0 -0
  84. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tests/test_path.py +0 -0
  85. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tests/test_yaml.py +0 -0
  86. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tokenization_tools.py +0 -0
  87. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/tools.py +0 -0
  88. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/unicode_tools.py +0 -0
  89. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/version_tools/__init__.py +0 -0
  90. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/version_tools/version_tools.py +0 -0
  91. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/webhook_tools.py +0 -0
  92. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr/tools/yaml_tools.py +0 -0
  93. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  94. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  95. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr.tools.egg-info/entry_points.txt +0 -0
  96. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr.tools.egg-info/requires.txt +50 -50
  97. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/fmtr.tools.egg-info/top_level.txt +0 -0
  98. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/pyproject.toml +0 -0
  99. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/setup.cfg +0 -0
  100. {fmtr_tools-1.3.71 → fmtr_tools-1.3.73}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.71
3
+ Version: 1.3.73
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: regex; extra == "all"
172
- Requires-Dist: playwright; extra == "all"
173
- Requires-Dist: sre_yield; extra == "all"
171
+ Requires-Dist: contexttimer; extra == "all"
172
+ Requires-Dist: html2text; extra == "all"
173
+ Requires-Dist: httpx; extra == "all"
174
+ Requires-Dist: flet[all]; extra == "all"
175
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
176
+ Requires-Dist: dask[bag]; extra == "all"
177
+ Requires-Dist: deepdiff; extra == "all"
178
+ Requires-Dist: huggingface_hub; extra == "all"
179
+ Requires-Dist: torchaudio; extra == "all"
180
+ Requires-Dist: openpyxl; extra == "all"
181
+ Requires-Dist: setuptools; extra == "all"
182
+ Requires-Dist: httpx_retries; extra == "all"
183
+ Requires-Dist: beanie[odm]; extra == "all"
184
+ Requires-Dist: tabulate; extra == "all"
185
+ Requires-Dist: odfpy; extra == "all"
174
186
  Requires-Dist: pytest-cov; extra == "all"
187
+ Requires-Dist: uvicorn[standard]; extra == "all"
188
+ Requires-Dist: distributed; extra == "all"
175
189
  Requires-Dist: pyyaml; extra == "all"
190
+ Requires-Dist: filetype; extra == "all"
191
+ Requires-Dist: pycountry; extra == "all"
192
+ Requires-Dist: cachetools; extra == "all"
193
+ Requires-Dist: flet-video; extra == "all"
194
+ Requires-Dist: dnspython[doh]; extra == "all"
195
+ Requires-Dist: faker; extra == "all"
196
+ Requires-Dist: sentence_transformers; extra == "all"
176
197
  Requires-Dist: torchvision; extra == "all"
177
- Requires-Dist: odfpy; extra == "all"
178
- Requires-Dist: setuptools; extra == "all"
179
- Requires-Dist: google-auth-oauthlib; extra == "all"
180
- Requires-Dist: dask[bag]; extra == "all"
181
- Requires-Dist: peft; extra == "all"
182
198
  Requires-Dist: pydantic-settings; extra == "all"
199
+ Requires-Dist: bokeh; extra == "all"
200
+ Requires-Dist: pandas; extra == "all"
201
+ Requires-Dist: google-auth; extra == "all"
202
+ Requires-Dist: diskcache; extra == "all"
203
+ Requires-Dist: appdirs; extra == "all"
183
204
  Requires-Dist: ollama; extra == "all"
184
- Requires-Dist: transformers[sentencepiece]; extra == "all"
185
- Requires-Dist: tabulate; extra == "all"
205
+ Requires-Dist: pymupdf; extra == "all"
206
+ Requires-Dist: pydantic-extra-types; extra == "all"
207
+ Requires-Dist: json_repair; extra == "all"
208
+ Requires-Dist: Unidecode; extra == "all"
209
+ Requires-Dist: google-api-python-client; extra == "all"
210
+ Requires-Dist: google-auth-httplib2; extra == "all"
211
+ Requires-Dist: yamlscript; extra == "all"
212
+ Requires-Dist: pydantic; extra == "all"
213
+ Requires-Dist: fastapi; extra == "all"
214
+ Requires-Dist: sre_yield; extra == "all"
186
215
  Requires-Dist: tinynetrc; extra == "all"
216
+ Requires-Dist: logfire[fastapi]; extra == "all"
217
+ Requires-Dist: flet-webview; extra == "all"
218
+ Requires-Dist: google-auth-oauthlib; extra == "all"
219
+ Requires-Dist: logfire; extra == "all"
187
220
  Requires-Dist: motor; extra == "all"
188
- Requires-Dist: bokeh; extra == "all"
189
- Requires-Dist: google-auth-httplib2; extra == "all"
190
- Requires-Dist: dnspython[doh]; extra == "all"
221
+ Requires-Dist: playwright; extra == "all"
222
+ Requires-Dist: peft; extra == "all"
223
+ Requires-Dist: openai; extra == "all"
191
224
  Requires-Dist: semver; extra == "all"
192
- Requires-Dist: yamlscript; extra == "all"
193
- Requires-Dist: Unidecode; extra == "all"
194
- Requires-Dist: uvicorn[standard]; extra == "all"
195
- Requires-Dist: pydantic-extra-types; extra == "all"
196
- Requires-Dist: flet[all]; extra == "all"
197
225
  Requires-Dist: deepmerge; extra == "all"
198
- Requires-Dist: torchaudio; extra == "all"
199
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
200
- Requires-Dist: flet-video; extra == "all"
226
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
201
227
  Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
202
- Requires-Dist: distributed; extra == "all"
203
- Requires-Dist: deepdiff; extra == "all"
204
- Requires-Dist: google-api-python-client; extra == "all"
205
- Requires-Dist: faker; extra == "all"
206
- Requires-Dist: beanie[odm]; extra == "all"
207
- Requires-Dist: pymupdf; extra == "all"
208
- Requires-Dist: pandas; extra == "all"
209
- Requires-Dist: fastapi; extra == "all"
210
- Requires-Dist: huggingface_hub; extra == "all"
211
- Requires-Dist: logfire; extra == "all"
228
+ Requires-Dist: logfire[httpx]; extra == "all"
229
+ Requires-Dist: regex; extra == "all"
230
+ Requires-Dist: pymupdf4llm; extra == "all"
212
231
  Requires-Dist: tokenizers; extra == "all"
213
- Requires-Dist: html2text; extra == "all"
214
- Requires-Dist: json_repair; extra == "all"
215
232
  Requires-Dist: python-on-whales; extra == "all"
216
- Requires-Dist: openai; extra == "all"
217
- Requires-Dist: flet-webview; extra == "all"
218
- Requires-Dist: openpyxl; extra == "all"
219
- Requires-Dist: filetype; extra == "all"
220
- Requires-Dist: appdirs; extra == "all"
221
- Requires-Dist: pydantic; extra == "all"
222
- Requires-Dist: sentence_transformers; extra == "all"
223
- Requires-Dist: httpx_retries; extra == "all"
224
- Requires-Dist: pymupdf4llm; extra == "all"
225
- Requires-Dist: logfire[fastapi]; extra == "all"
226
- Requires-Dist: logfire[httpx]; extra == "all"
227
- Requires-Dist: pycountry; extra == "all"
228
- Requires-Dist: google-auth; extra == "all"
229
- Requires-Dist: cachetools; extra == "all"
230
- Requires-Dist: contexttimer; extra == "all"
231
- Requires-Dist: diskcache; extra == "all"
232
- Requires-Dist: httpx; extra == "all"
233
233
  Dynamic: author
234
234
  Dynamic: author-email
235
235
  Dynamic: description
@@ -224,23 +224,30 @@ class Base(BaseModel, MixinFromJson):
224
224
  setattr(cls, name, field)
225
225
  cls.__annotations__[name] = field.annotation
226
226
 
227
- def to_df(self, name_value='value'):
227
+ def to_df(self, **kwargs):
228
228
  """
229
229
 
230
- DataFrame representation with Fields as rows.
230
+ DataFrame representation of Data Model.
231
231
 
232
232
  """
233
+ from fmtr.tools import tabular
233
234
 
234
- objs = []
235
- for name in self.model_fields.keys():
236
- val = getattr(self, name)
237
- objs.append(val)
238
-
239
- df = to_df(*objs, name_value=name_value)
240
- df['id'] = list(self.model_fields.keys())
241
- df = df.set_index('id', drop=True)
235
+ data = self.model_dump(**kwargs)
236
+ df = tabular.pd.json_normalize(data, sep='_')
242
237
  return df
243
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
244
251
 
245
252
  class Root(RootModel, MixinFromJson):
246
253
  """
@@ -249,11 +256,21 @@ class Root(RootModel, MixinFromJson):
249
256
 
250
257
  """
251
258
 
252
- def to_df(self):
259
+ def to_df(self, **kwargs):
253
260
  """
254
261
 
255
262
  DataFrame representation with items as rows.
256
263
 
257
264
  """
258
265
 
259
- return to_df(*self.items)
266
+ """
267
+
268
+ DataFrame representation of Data Model.
269
+
270
+ """
271
+ from fmtr.tools import tabular
272
+
273
+ data = [item.model_dump(**kwargs) for item in self.items]
274
+ dfs = [tabular.pd.json_normalize(datum, sep='_') for datum in data]
275
+ df = tabular.pd.concat(dfs, axis=tabular.CONCAT_VERTICALLY)
276
+ return df
@@ -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):
@@ -0,0 +1 @@
1
+ 1.3.73
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.71
3
+ Version: 1.3.73
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: regex; extra == "all"
172
- Requires-Dist: playwright; extra == "all"
173
- Requires-Dist: sre_yield; extra == "all"
171
+ Requires-Dist: contexttimer; extra == "all"
172
+ Requires-Dist: html2text; extra == "all"
173
+ Requires-Dist: httpx; extra == "all"
174
+ Requires-Dist: flet[all]; extra == "all"
175
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
176
+ Requires-Dist: dask[bag]; extra == "all"
177
+ Requires-Dist: deepdiff; extra == "all"
178
+ Requires-Dist: huggingface_hub; extra == "all"
179
+ Requires-Dist: torchaudio; extra == "all"
180
+ Requires-Dist: openpyxl; extra == "all"
181
+ Requires-Dist: setuptools; extra == "all"
182
+ Requires-Dist: httpx_retries; extra == "all"
183
+ Requires-Dist: beanie[odm]; extra == "all"
184
+ Requires-Dist: tabulate; extra == "all"
185
+ Requires-Dist: odfpy; extra == "all"
174
186
  Requires-Dist: pytest-cov; extra == "all"
187
+ Requires-Dist: uvicorn[standard]; extra == "all"
188
+ Requires-Dist: distributed; extra == "all"
175
189
  Requires-Dist: pyyaml; extra == "all"
190
+ Requires-Dist: filetype; extra == "all"
191
+ Requires-Dist: pycountry; extra == "all"
192
+ Requires-Dist: cachetools; extra == "all"
193
+ Requires-Dist: flet-video; extra == "all"
194
+ Requires-Dist: dnspython[doh]; extra == "all"
195
+ Requires-Dist: faker; extra == "all"
196
+ Requires-Dist: sentence_transformers; extra == "all"
176
197
  Requires-Dist: torchvision; extra == "all"
177
- Requires-Dist: odfpy; extra == "all"
178
- Requires-Dist: setuptools; extra == "all"
179
- Requires-Dist: google-auth-oauthlib; extra == "all"
180
- Requires-Dist: dask[bag]; extra == "all"
181
- Requires-Dist: peft; extra == "all"
182
198
  Requires-Dist: pydantic-settings; extra == "all"
199
+ Requires-Dist: bokeh; extra == "all"
200
+ Requires-Dist: pandas; extra == "all"
201
+ Requires-Dist: google-auth; extra == "all"
202
+ Requires-Dist: diskcache; extra == "all"
203
+ Requires-Dist: appdirs; extra == "all"
183
204
  Requires-Dist: ollama; extra == "all"
184
- Requires-Dist: transformers[sentencepiece]; extra == "all"
185
- Requires-Dist: tabulate; extra == "all"
205
+ Requires-Dist: pymupdf; extra == "all"
206
+ Requires-Dist: pydantic-extra-types; extra == "all"
207
+ Requires-Dist: json_repair; extra == "all"
208
+ Requires-Dist: Unidecode; extra == "all"
209
+ Requires-Dist: google-api-python-client; extra == "all"
210
+ Requires-Dist: google-auth-httplib2; extra == "all"
211
+ Requires-Dist: yamlscript; extra == "all"
212
+ Requires-Dist: pydantic; extra == "all"
213
+ Requires-Dist: fastapi; extra == "all"
214
+ Requires-Dist: sre_yield; extra == "all"
186
215
  Requires-Dist: tinynetrc; extra == "all"
216
+ Requires-Dist: logfire[fastapi]; extra == "all"
217
+ Requires-Dist: flet-webview; extra == "all"
218
+ Requires-Dist: google-auth-oauthlib; extra == "all"
219
+ Requires-Dist: logfire; extra == "all"
187
220
  Requires-Dist: motor; extra == "all"
188
- Requires-Dist: bokeh; extra == "all"
189
- Requires-Dist: google-auth-httplib2; extra == "all"
190
- Requires-Dist: dnspython[doh]; extra == "all"
221
+ Requires-Dist: playwright; extra == "all"
222
+ Requires-Dist: peft; extra == "all"
223
+ Requires-Dist: openai; extra == "all"
191
224
  Requires-Dist: semver; extra == "all"
192
- Requires-Dist: yamlscript; extra == "all"
193
- Requires-Dist: Unidecode; extra == "all"
194
- Requires-Dist: uvicorn[standard]; extra == "all"
195
- Requires-Dist: pydantic-extra-types; extra == "all"
196
- Requires-Dist: flet[all]; extra == "all"
197
225
  Requires-Dist: deepmerge; extra == "all"
198
- Requires-Dist: torchaudio; extra == "all"
199
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
200
- Requires-Dist: flet-video; extra == "all"
226
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
201
227
  Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
202
- Requires-Dist: distributed; extra == "all"
203
- Requires-Dist: deepdiff; extra == "all"
204
- Requires-Dist: google-api-python-client; extra == "all"
205
- Requires-Dist: faker; extra == "all"
206
- Requires-Dist: beanie[odm]; extra == "all"
207
- Requires-Dist: pymupdf; extra == "all"
208
- Requires-Dist: pandas; extra == "all"
209
- Requires-Dist: fastapi; extra == "all"
210
- Requires-Dist: huggingface_hub; extra == "all"
211
- Requires-Dist: logfire; extra == "all"
228
+ Requires-Dist: logfire[httpx]; extra == "all"
229
+ Requires-Dist: regex; extra == "all"
230
+ Requires-Dist: pymupdf4llm; extra == "all"
212
231
  Requires-Dist: tokenizers; extra == "all"
213
- Requires-Dist: html2text; extra == "all"
214
- Requires-Dist: json_repair; extra == "all"
215
232
  Requires-Dist: python-on-whales; extra == "all"
216
- Requires-Dist: openai; extra == "all"
217
- Requires-Dist: flet-webview; extra == "all"
218
- Requires-Dist: openpyxl; extra == "all"
219
- Requires-Dist: filetype; extra == "all"
220
- Requires-Dist: appdirs; extra == "all"
221
- Requires-Dist: pydantic; extra == "all"
222
- Requires-Dist: sentence_transformers; extra == "all"
223
- Requires-Dist: httpx_retries; extra == "all"
224
- Requires-Dist: pymupdf4llm; extra == "all"
225
- Requires-Dist: logfire[fastapi]; extra == "all"
226
- Requires-Dist: logfire[httpx]; extra == "all"
227
- Requires-Dist: pycountry; extra == "all"
228
- Requires-Dist: google-auth; extra == "all"
229
- Requires-Dist: cachetools; extra == "all"
230
- Requires-Dist: contexttimer; extra == "all"
231
- Requires-Dist: diskcache; extra == "all"
232
- Requires-Dist: httpx; extra == "all"
233
233
  Dynamic: author
234
234
  Dynamic: author-email
235
235
  Dynamic: description
@@ -1 +0,0 @@
1
- 1.3.71
File without changes
File without changes
@@ -18,68 +18,68 @@ pydantic-ai[logfire,openai]
18
18
  ollama
19
19
 
20
20
  [all]
21
- regex
22
- playwright
23
- sre_yield
21
+ contexttimer
22
+ html2text
23
+ httpx
24
+ flet[all]
25
+ pydevd-pycharm~=251.25410.159
26
+ dask[bag]
27
+ deepdiff
28
+ huggingface_hub
29
+ torchaudio
30
+ openpyxl
31
+ setuptools
32
+ httpx_retries
33
+ beanie[odm]
34
+ tabulate
35
+ odfpy
24
36
  pytest-cov
37
+ uvicorn[standard]
38
+ distributed
25
39
  pyyaml
40
+ filetype
41
+ pycountry
42
+ cachetools
43
+ flet-video
44
+ dnspython[doh]
45
+ faker
46
+ sentence_transformers
26
47
  torchvision
27
- odfpy
28
- setuptools
29
- google-auth-oauthlib
30
- dask[bag]
31
- peft
32
48
  pydantic-settings
49
+ bokeh
50
+ pandas
51
+ google-auth
52
+ diskcache
53
+ appdirs
33
54
  ollama
34
- transformers[sentencepiece]
35
- tabulate
55
+ pymupdf
56
+ pydantic-extra-types
57
+ json_repair
58
+ Unidecode
59
+ google-api-python-client
60
+ google-auth-httplib2
61
+ yamlscript
62
+ pydantic
63
+ fastapi
64
+ sre_yield
36
65
  tinynetrc
66
+ logfire[fastapi]
67
+ flet-webview
68
+ google-auth-oauthlib
69
+ logfire
37
70
  motor
38
- bokeh
39
- google-auth-httplib2
40
- dnspython[doh]
71
+ playwright
72
+ peft
73
+ openai
41
74
  semver
42
- yamlscript
43
- Unidecode
44
- uvicorn[standard]
45
- pydantic-extra-types
46
- flet[all]
47
75
  deepmerge
48
- torchaudio
49
- pydevd-pycharm~=251.25410.159
50
- flet-video
76
+ transformers[sentencepiece]
51
77
  pydantic-ai[logfire,openai]
52
- distributed
53
- deepdiff
54
- google-api-python-client
55
- faker
56
- beanie[odm]
57
- pymupdf
58
- pandas
59
- fastapi
60
- huggingface_hub
61
- logfire
78
+ logfire[httpx]
79
+ regex
80
+ pymupdf4llm
62
81
  tokenizers
63
- html2text
64
- json_repair
65
82
  python-on-whales
66
- openai
67
- flet-webview
68
- openpyxl
69
- filetype
70
- appdirs
71
- pydantic
72
- sentence_transformers
73
- httpx_retries
74
- pymupdf4llm
75
- logfire[fastapi]
76
- logfire[httpx]
77
- pycountry
78
- google-auth
79
- cachetools
80
- contexttimer
81
- diskcache
82
- httpx
83
83
 
84
84
  [api]
85
85
  fastapi
File without changes
File without changes
File without changes