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.

Files changed (100) hide show
  1. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/PKG-INFO +51 -51
  2. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/data_modelling_tools.py +12 -0
  3. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/interface_tools/controls.py +40 -3
  4. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/interface_tools/interface_tools.py +9 -2
  5. fmtr_tools-1.3.74/fmtr/tools/version +1 -0
  6. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/PKG-INFO +51 -51
  7. fmtr_tools-1.3.72/fmtr/tools/version +0 -1
  8. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/LICENSE +0 -0
  9. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/README.md +0 -0
  10. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/__init__.py +0 -0
  11. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/ai_tools/__init__.py +0 -0
  12. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  13. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  14. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/api_tools.py +0 -0
  15. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/async_tools.py +0 -0
  16. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/augmentation_tools.py +0 -0
  17. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/caching_tools.py +0 -0
  18. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/constants.py +0 -0
  19. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/context_tools.py +0 -0
  20. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/database_tools/__init__.py +0 -0
  21. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/database_tools/document.py +0 -0
  22. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dataclass_tools.py +0 -0
  23. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/datatype_tools.py +0 -0
  24. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/datetime_tools.py +0 -0
  25. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/debugging_tools.py +0 -0
  26. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dns_tools/__init__.py +0 -0
  27. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dns_tools/client.py +0 -0
  28. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dns_tools/dm.py +0 -0
  29. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dns_tools/proxy.py +0 -0
  30. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/dns_tools/server.py +0 -0
  31. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/docker_tools/__init__.py +0 -0
  32. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/__init__.py +0 -0
  33. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  34. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/ep_test.py +0 -0
  35. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  36. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  37. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  38. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/environment_tools.py +0 -0
  39. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/function_tools.py +0 -0
  40. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/google_api_tools.py +0 -0
  41. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/hash_tools.py +0 -0
  42. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/hfh_tools.py +0 -0
  43. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/html_tools.py +0 -0
  44. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/http_tools.py +0 -0
  45. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/import_tools.py +0 -0
  46. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/inherit_tools.py +0 -0
  47. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/inspection_tools.py +0 -0
  48. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/interface_tools/__init__.py +0 -0
  49. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/interface_tools/context.py +0 -0
  50. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/iterator_tools.py +0 -0
  51. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/json_fix_tools.py +0 -0
  52. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/json_tools.py +0 -0
  53. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/logging_tools.py +0 -0
  54. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/merging_tools.py +0 -0
  55. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/metric_tools.py +0 -0
  56. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/name_tools.py +0 -0
  57. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/netrc_tools.py +0 -0
  58. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/openai_tools.py +0 -0
  59. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/packaging_tools.py +0 -0
  60. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/parallel_tools.py +0 -0
  61. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/path_tools/__init__.py +0 -0
  62. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  63. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/path_tools/path_tools.py +0 -0
  64. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  65. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/pattern_tools.py +0 -0
  66. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/pdf_tools.py +0 -0
  67. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/platform_tools.py +0 -0
  68. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/process_tools.py +0 -0
  69. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/profiling_tools.py +0 -0
  70. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/random_tools.py +0 -0
  71. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/semantic_tools.py +0 -0
  72. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/settings_tools.py +0 -0
  73. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/setup_tools/__init__.py +0 -0
  74. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/setup_tools/setup_tools.py +0 -0
  75. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/spaces_tools.py +0 -0
  76. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/string_tools.py +0 -0
  77. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tabular_tools.py +0 -0
  78. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/__init__.py +0 -0
  79. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/conftest.py +0 -0
  80. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/helpers.py +0 -0
  81. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/test_datatype.py +0 -0
  82. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/test_environment.py +0 -0
  83. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/test_json.py +0 -0
  84. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/test_path.py +0 -0
  85. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tests/test_yaml.py +0 -0
  86. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tokenization_tools.py +0 -0
  87. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/tools.py +0 -0
  88. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/unicode_tools.py +0 -0
  89. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/version_tools/__init__.py +0 -0
  90. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/version_tools/version_tools.py +0 -0
  91. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/webhook_tools.py +0 -0
  92. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr/tools/yaml_tools.py +0 -0
  93. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  94. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  95. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/entry_points.txt +0 -0
  96. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/requires.txt +50 -50
  97. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/fmtr.tools.egg-info/top_level.txt +0 -0
  98. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/pyproject.toml +0 -0
  99. {fmtr_tools-1.3.72 → fmtr_tools-1.3.74}/setup.cfg +0 -0
  100. {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.72
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: pytest-cov; extra == "all"
172
- Requires-Dist: deepmerge; extra == "all"
173
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
174
- Requires-Dist: tabulate; extra == "all"
175
- Requires-Dist: httpx; extra == "all"
176
- Requires-Dist: playwright; extra == "all"
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: google-auth-oauthlib; extra == "all"
183
- Requires-Dist: openpyxl; extra == "all"
184
- Requires-Dist: torchaudio; extra == "all"
185
- Requires-Dist: flet-video; extra == "all"
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: openai; extra == "all"
188
- Requires-Dist: ollama; extra == "all"
189
- Requires-Dist: google-auth; extra == "all"
190
- Requires-Dist: appdirs; extra == "all"
191
- Requires-Dist: logfire[httpx]; extra == "all"
192
- Requires-Dist: bokeh; extra == "all"
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: google-auth-httplib2; extra == "all"
195
+ Requires-Dist: filetype; extra == "all"
199
196
  Requires-Dist: contexttimer; extra == "all"
200
- Requires-Dist: semver; extra == "all"
201
- Requires-Dist: pycountry; extra == "all"
202
- Requires-Dist: peft; extra == "all"
203
- Requires-Dist: uvicorn[standard]; extra == "all"
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: python-on-whales; extra == "all"
212
- Requires-Dist: sentence_transformers; extra == "all"
213
- Requires-Dist: flet[all]; extra == "all"
214
- Requires-Dist: pydantic-extra-types; extra == "all"
215
- Requires-Dist: filetype; extra == "all"
216
- Requires-Dist: fastapi; extra == "all"
217
- Requires-Dist: cachetools; extra == "all"
218
- Requires-Dist: dnspython[doh]; extra == "all"
219
- Requires-Dist: httpx_retries; extra == "all"
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: Unidecode; extra == "all"
223
- Requires-Dist: torchvision; extra == "all"
224
- Requires-Dist: html2text; extra == "all"
225
- Requires-Dist: pymupdf4llm; extra == "all"
226
- Requires-Dist: google-api-python-client; extra == "all"
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: odfpy; extra == "all"
229
- Requires-Dist: distributed; extra == "all"
230
- Requires-Dist: json_repair; extra == "all"
231
- Requires-Dist: beanie[odm]; extra == "all"
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
- ROUTE_ROOT = '/'
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.72
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: pytest-cov; extra == "all"
172
- Requires-Dist: deepmerge; extra == "all"
173
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
174
- Requires-Dist: tabulate; extra == "all"
175
- Requires-Dist: httpx; extra == "all"
176
- Requires-Dist: playwright; extra == "all"
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: google-auth-oauthlib; extra == "all"
183
- Requires-Dist: openpyxl; extra == "all"
184
- Requires-Dist: torchaudio; extra == "all"
185
- Requires-Dist: flet-video; extra == "all"
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: openai; extra == "all"
188
- Requires-Dist: ollama; extra == "all"
189
- Requires-Dist: google-auth; extra == "all"
190
- Requires-Dist: appdirs; extra == "all"
191
- Requires-Dist: logfire[httpx]; extra == "all"
192
- Requires-Dist: bokeh; extra == "all"
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: google-auth-httplib2; extra == "all"
195
+ Requires-Dist: filetype; extra == "all"
199
196
  Requires-Dist: contexttimer; extra == "all"
200
- Requires-Dist: semver; extra == "all"
201
- Requires-Dist: pycountry; extra == "all"
202
- Requires-Dist: peft; extra == "all"
203
- Requires-Dist: uvicorn[standard]; extra == "all"
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: python-on-whales; extra == "all"
212
- Requires-Dist: sentence_transformers; extra == "all"
213
- Requires-Dist: flet[all]; extra == "all"
214
- Requires-Dist: pydantic-extra-types; extra == "all"
215
- Requires-Dist: filetype; extra == "all"
216
- Requires-Dist: fastapi; extra == "all"
217
- Requires-Dist: cachetools; extra == "all"
218
- Requires-Dist: dnspython[doh]; extra == "all"
219
- Requires-Dist: httpx_retries; extra == "all"
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: Unidecode; extra == "all"
223
- Requires-Dist: torchvision; extra == "all"
224
- Requires-Dist: html2text; extra == "all"
225
- Requires-Dist: pymupdf4llm; extra == "all"
226
- Requires-Dist: google-api-python-client; extra == "all"
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: odfpy; extra == "all"
229
- Requires-Dist: distributed; extra == "all"
230
- Requires-Dist: json_repair; extra == "all"
231
- Requires-Dist: beanie[odm]; extra == "all"
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
@@ -18,68 +18,68 @@ pydantic-ai[logfire,openai]
18
18
  ollama
19
19
 
20
20
  [all]
21
- pytest-cov
22
- deepmerge
23
- pydantic-ai[logfire,openai]
24
- tabulate
25
- httpx
26
- playwright
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
- google-auth-oauthlib
33
- openpyxl
34
- torchaudio
35
- flet-video
32
+ odfpy
33
+ httpx_retries
34
+ pydantic-extra-types
35
+ python-on-whales
36
+ peft
36
37
  logfire
37
- openai
38
- ollama
39
- google-auth
40
- appdirs
41
- logfire[httpx]
42
- bokeh
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
- google-auth-httplib2
45
+ filetype
49
46
  contexttimer
50
- semver
51
- pycountry
52
- peft
53
- uvicorn[standard]
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
- python-on-whales
62
- sentence_transformers
63
- flet[all]
64
- pydantic-extra-types
65
- filetype
66
- fastapi
67
- cachetools
68
- dnspython[doh]
69
- httpx_retries
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
- Unidecode
73
- torchvision
74
- html2text
75
- pymupdf4llm
76
- google-api-python-client
72
+ flet[all]
73
+ google-auth-oauthlib
74
+ pytest-cov
75
+ dnspython[doh]
76
+ httpx
77
+ sentence_transformers
77
78
  yamlscript
78
- odfpy
79
- distributed
80
- json_repair
81
- beanie[odm]
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