fmtr.tools 1.3.51__tar.gz → 1.3.52__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.51 → fmtr_tools-1.3.52}/PKG-INFO +53 -53
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/interface_tools/__init__.py +1 -1
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/interface_tools/interface_tools.py +55 -60
- fmtr_tools-1.3.52/fmtr/tools/version +1 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/PKG-INFO +53 -53
- fmtr_tools-1.3.51/fmtr/tools/version +0 -1
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/LICENSE +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/README.md +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/__init__.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/ai_tools/__init__.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/ai_tools/inference_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/api_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/async_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/augmentation_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/caching_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/constants.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/context_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/data_modelling_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/database_tools/__init__.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/database_tools/document.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/dataclass_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/datatype_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/datetime_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/debugging_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/dns_tools/__init__.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/dns_tools/client.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/dns_tools/dm.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/dns_tools/proxy.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/dns_tools/server.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/docker_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/__init__.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/ep_test.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/shell_debug.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/environment_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/function_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/google_api_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/hash_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/hfh_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/html_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/http_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/import_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/inherit_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/inspection_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/interface_tools/context.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/interface_tools/controls.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/iterator_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/json_fix_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/json_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/logging_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/merging_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/metric_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/name_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/netrc_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/openai_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/packaging_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/parallel_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/path_tools/__init__.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/path_tools/app_path_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/path_tools/path_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/path_tools/type_path_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/pattern_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/pdf_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/platform_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/process_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/profiling_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/random_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/semantic_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/settings_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/setup_tools/__init__.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/setup_tools/setup_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/spaces_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/string_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tabular_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tests/__init__.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tests/conftest.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tests/helpers.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tests/test_datatype.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tests/test_environment.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tests/test_json.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tests/test_path.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tests/test_yaml.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tokenization_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/unicode_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/version_tools/__init__.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/version_tools/version_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/webhook_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr/tools/yaml_tools.py +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/SOURCES.txt +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/dependency_links.txt +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/entry_points.txt +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/requires.txt +52 -52
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/top_level.txt +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/pyproject.toml +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/setup.cfg +0 -0
- {fmtr_tools-1.3.51 → fmtr_tools-1.3.52}/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.52
|
|
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
|
|
@@ -154,68 +154,68 @@ Provides-Extra: db-document
|
|
|
154
154
|
Requires-Dist: beanie[odm]; extra == "db-document"
|
|
155
155
|
Requires-Dist: motor; extra == "db-document"
|
|
156
156
|
Provides-Extra: all
|
|
157
|
-
Requires-Dist:
|
|
158
|
-
Requires-Dist:
|
|
159
|
-
Requires-Dist:
|
|
160
|
-
Requires-Dist:
|
|
161
|
-
Requires-Dist:
|
|
162
|
-
Requires-Dist:
|
|
163
|
-
Requires-Dist:
|
|
164
|
-
Requires-Dist:
|
|
165
|
-
Requires-Dist:
|
|
166
|
-
Requires-Dist:
|
|
167
|
-
Requires-Dist:
|
|
168
|
-
Requires-Dist:
|
|
169
|
-
Requires-Dist:
|
|
170
|
-
Requires-Dist:
|
|
171
|
-
Requires-Dist: google-auth-oauthlib; extra == "all"
|
|
172
|
-
Requires-Dist: pydantic; extra == "all"
|
|
173
|
-
Requires-Dist: playwright; extra == "all"
|
|
157
|
+
Requires-Dist: bokeh; extra == "all"
|
|
158
|
+
Requires-Dist: distributed; extra == "all"
|
|
159
|
+
Requires-Dist: motor; extra == "all"
|
|
160
|
+
Requires-Dist: faker; extra == "all"
|
|
161
|
+
Requires-Dist: peft; extra == "all"
|
|
162
|
+
Requires-Dist: openai; extra == "all"
|
|
163
|
+
Requires-Dist: pandas; extra == "all"
|
|
164
|
+
Requires-Dist: deepdiff; extra == "all"
|
|
165
|
+
Requires-Dist: pycountry; extra == "all"
|
|
166
|
+
Requires-Dist: regex; extra == "all"
|
|
167
|
+
Requires-Dist: dask[bag]; extra == "all"
|
|
168
|
+
Requires-Dist: filetype; extra == "all"
|
|
169
|
+
Requires-Dist: logfire[httpx]; extra == "all"
|
|
170
|
+
Requires-Dist: yamlscript; extra == "all"
|
|
174
171
|
Requires-Dist: google-auth-httplib2; extra == "all"
|
|
172
|
+
Requires-Dist: pymupdf; extra == "all"
|
|
173
|
+
Requires-Dist: pymupdf4llm; extra == "all"
|
|
174
|
+
Requires-Dist: httpx_retries; extra == "all"
|
|
175
|
+
Requires-Dist: google-auth; extra == "all"
|
|
176
|
+
Requires-Dist: logfire[fastapi]; extra == "all"
|
|
175
177
|
Requires-Dist: torchvision; extra == "all"
|
|
176
|
-
Requires-Dist:
|
|
177
|
-
Requires-Dist: openpyxl; extra == "all"
|
|
178
|
+
Requires-Dist: diskcache; extra == "all"
|
|
178
179
|
Requires-Dist: cachetools; extra == "all"
|
|
179
|
-
Requires-Dist:
|
|
180
|
-
Requires-Dist:
|
|
180
|
+
Requires-Dist: semver; extra == "all"
|
|
181
|
+
Requires-Dist: tinynetrc; extra == "all"
|
|
181
182
|
Requires-Dist: sentence_transformers; extra == "all"
|
|
182
|
-
Requires-Dist:
|
|
183
|
-
Requires-Dist:
|
|
184
|
-
Requires-Dist: ollama; extra == "all"
|
|
185
|
-
Requires-Dist: dask[bag]; extra == "all"
|
|
186
|
-
Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
|
|
183
|
+
Requires-Dist: Unidecode; extra == "all"
|
|
184
|
+
Requires-Dist: openpyxl; extra == "all"
|
|
187
185
|
Requires-Dist: html2text; extra == "all"
|
|
186
|
+
Requires-Dist: appdirs; extra == "all"
|
|
187
|
+
Requires-Dist: ollama; extra == "all"
|
|
188
|
+
Requires-Dist: docker; extra == "all"
|
|
189
|
+
Requires-Dist: playwright; extra == "all"
|
|
190
|
+
Requires-Dist: pytest-cov; extra == "all"
|
|
191
|
+
Requires-Dist: pyyaml; extra == "all"
|
|
192
|
+
Requires-Dist: fastapi; extra == "all"
|
|
188
193
|
Requires-Dist: setuptools; extra == "all"
|
|
189
|
-
Requires-Dist: diskcache; extra == "all"
|
|
190
|
-
Requires-Dist: logfire[fastapi]; extra == "all"
|
|
191
|
-
Requires-Dist: huggingface_hub; extra == "all"
|
|
192
|
-
Requires-Dist: regex; extra == "all"
|
|
193
|
-
Requires-Dist: torchaudio; extra == "all"
|
|
194
|
-
Requires-Dist: httpx; extra == "all"
|
|
195
|
-
Requires-Dist: flet-video; extra == "all"
|
|
196
|
-
Requires-Dist: sre_yield; extra == "all"
|
|
197
|
-
Requires-Dist: tokenizers; extra == "all"
|
|
198
|
-
Requires-Dist: tabulate; extra == "all"
|
|
199
|
-
Requires-Dist: google-auth; extra == "all"
|
|
200
|
-
Requires-Dist: yamlscript; extra == "all"
|
|
201
194
|
Requires-Dist: beanie[odm]; extra == "all"
|
|
202
|
-
Requires-Dist:
|
|
195
|
+
Requires-Dist: google-auth-oauthlib; extra == "all"
|
|
196
|
+
Requires-Dist: json_repair; extra == "all"
|
|
203
197
|
Requires-Dist: google-api-python-client; extra == "all"
|
|
198
|
+
Requires-Dist: logfire; extra == "all"
|
|
199
|
+
Requires-Dist: deepmerge; extra == "all"
|
|
200
|
+
Requires-Dist: sre_yield; extra == "all"
|
|
204
201
|
Requires-Dist: uvicorn[standard]; extra == "all"
|
|
205
|
-
Requires-Dist:
|
|
206
|
-
Requires-Dist:
|
|
207
|
-
Requires-Dist:
|
|
208
|
-
Requires-Dist:
|
|
209
|
-
Requires-Dist:
|
|
210
|
-
Requires-Dist:
|
|
211
|
-
Requires-Dist:
|
|
212
|
-
Requires-Dist:
|
|
213
|
-
Requires-Dist: pymupdf; extra == "all"
|
|
214
|
-
Requires-Dist: peft; extra == "all"
|
|
215
|
-
Requires-Dist: flet[all]; extra == "all"
|
|
216
|
-
Requires-Dist: motor; extra == "all"
|
|
202
|
+
Requires-Dist: flet-webview; extra == "all"
|
|
203
|
+
Requires-Dist: huggingface_hub; extra == "all"
|
|
204
|
+
Requires-Dist: tabulate; extra == "all"
|
|
205
|
+
Requires-Dist: tokenizers; extra == "all"
|
|
206
|
+
Requires-Dist: httpx; extra == "all"
|
|
207
|
+
Requires-Dist: contexttimer; extra == "all"
|
|
208
|
+
Requires-Dist: flet-video; extra == "all"
|
|
209
|
+
Requires-Dist: pydantic-settings; extra == "all"
|
|
217
210
|
Requires-Dist: dnspython[doh]; extra == "all"
|
|
218
|
-
Requires-Dist:
|
|
211
|
+
Requires-Dist: odfpy; extra == "all"
|
|
212
|
+
Requires-Dist: flet[all]; extra == "all"
|
|
213
|
+
Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
|
|
214
|
+
Requires-Dist: torchaudio; extra == "all"
|
|
215
|
+
Requires-Dist: pydantic; extra == "all"
|
|
216
|
+
Requires-Dist: transformers[sentencepiece]; extra == "all"
|
|
217
|
+
Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
|
|
218
|
+
Requires-Dist: pydantic-extra-types; extra == "all"
|
|
219
219
|
Dynamic: author
|
|
220
220
|
Dynamic: author-email
|
|
221
221
|
Dynamic: description
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from fmtr.tools.import_tools import MissingExtraMockModule
|
|
2
2
|
|
|
3
3
|
try:
|
|
4
|
-
from fmtr.tools.interface_tools.interface_tools import
|
|
4
|
+
from fmtr.tools.interface_tools.interface_tools import Base, update, progress
|
|
5
5
|
from fmtr.tools.interface_tools import controls
|
|
6
6
|
from fmtr.tools.interface_tools.context import Context
|
|
7
7
|
except ModuleNotFoundError as exception:
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
from typing import TypeVar, Generic, Type
|
|
2
|
+
|
|
1
3
|
import flet as ft
|
|
4
|
+
from flet.core.control_event import ControlEvent
|
|
2
5
|
from flet.core.types import AppView
|
|
3
6
|
from flet.core.view import View
|
|
4
|
-
from functools import cached_property
|
|
5
|
-
from typing import TypeVar, Generic, Type, Self
|
|
6
7
|
|
|
7
8
|
from fmtr.tools import environment_tools
|
|
8
9
|
from fmtr.tools.constants import Constants
|
|
@@ -18,7 +19,7 @@ class update(MethodDecorator):
|
|
|
18
19
|
|
|
19
20
|
"""
|
|
20
21
|
|
|
21
|
-
def stop(self, instance):
|
|
22
|
+
def stop(self, instance, *args, **kwargs):
|
|
22
23
|
instance.page.update()
|
|
23
24
|
|
|
24
25
|
|
|
@@ -37,7 +38,7 @@ class progress(update):
|
|
|
37
38
|
"""
|
|
38
39
|
return instance.context
|
|
39
40
|
|
|
40
|
-
def start(self, instance):
|
|
41
|
+
def start(self, instance, *args, **kwargs):
|
|
41
42
|
"""
|
|
42
43
|
|
|
43
44
|
Make progress visible and update.
|
|
@@ -46,7 +47,7 @@ class progress(update):
|
|
|
46
47
|
instance.progress.visible = True
|
|
47
48
|
instance.page.update()
|
|
48
49
|
|
|
49
|
-
def stop(self, instance):
|
|
50
|
+
def stop(self, instance, *args, **kwargs):
|
|
50
51
|
"""
|
|
51
52
|
|
|
52
53
|
Make progress not visible and update.
|
|
@@ -59,7 +60,7 @@ class progress(update):
|
|
|
59
60
|
T = TypeVar('T', bound=Context)
|
|
60
61
|
|
|
61
62
|
|
|
62
|
-
class
|
|
63
|
+
class Base(Generic[T], ft.Column):
|
|
63
64
|
"""
|
|
64
65
|
|
|
65
66
|
Simple interface base class.
|
|
@@ -76,58 +77,31 @@ class Interface(Generic[T], ft.Column):
|
|
|
76
77
|
|
|
77
78
|
TypeContext: Type[T] = Context
|
|
78
79
|
|
|
79
|
-
def __init__(self, context: T, *args, **kwargs):
|
|
80
|
-
"""
|
|
81
|
-
|
|
82
|
-
Instantiate and apply interface config
|
|
83
|
-
|
|
84
|
-
"""
|
|
85
|
-
self.context = context
|
|
86
|
-
super().__init__(*args, **kwargs, scroll=self.SCROLL)
|
|
87
|
-
|
|
88
80
|
@classmethod
|
|
89
|
-
async def
|
|
90
|
-
"""
|
|
91
|
-
|
|
92
|
-
Interface entry point. Set relevant callbacks, and add instantiated self to page views
|
|
93
|
-
|
|
81
|
+
async def new(cls, page: ft.Page):
|
|
94
82
|
"""
|
|
95
|
-
if not page.on_route_change:
|
|
96
|
-
page.title = cls.TITLE
|
|
97
|
-
page.theme = cls.get_theme()
|
|
98
|
-
page.views.clear()
|
|
99
|
-
context = cls.TypeContext(page=page)
|
|
100
|
-
|
|
101
|
-
self = await cls.create(context)
|
|
102
83
|
|
|
103
|
-
|
|
104
|
-
if not view:
|
|
105
|
-
view = self
|
|
106
|
-
page.views.append(view)
|
|
107
|
-
page.on_route_change = cls.route
|
|
108
|
-
page.on_view_pop = cls.pop
|
|
84
|
+
Interface entry point/async constructor. Set relevant callbacks, and add instantiated self to page views.
|
|
109
85
|
|
|
110
|
-
|
|
86
|
+
Override this to work with `Context`, do async setup. Otherwise, override __init__ (which is regular Column __init__) for a simple interface.
|
|
111
87
|
|
|
112
|
-
@classmethod
|
|
113
|
-
async def create(cls, context: T) -> Self:
|
|
114
88
|
"""
|
|
89
|
+
page.scroll = cls.SCROLL
|
|
90
|
+
page.title = cls.TITLE
|
|
91
|
+
page.on_connect = cls.on_connect
|
|
92
|
+
page.on_disconnect = cls.on_disconnect
|
|
93
|
+
page.on_route_change = cls.route
|
|
94
|
+
page.on_view_pop = cls.pop
|
|
95
|
+
page.theme = cls.get_theme()
|
|
115
96
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
self = cls(context)
|
|
120
|
-
return self
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
@cached_property
|
|
124
|
-
def view(self):
|
|
125
|
-
"""
|
|
97
|
+
context = cls.TypeContext(page=page)
|
|
98
|
+
self = cls()
|
|
99
|
+
self.context = context
|
|
126
100
|
|
|
127
|
-
|
|
101
|
+
page.controls.append(self)
|
|
102
|
+
page.update()
|
|
128
103
|
|
|
129
|
-
|
|
130
|
-
return None
|
|
104
|
+
return self
|
|
131
105
|
|
|
132
106
|
@classmethod
|
|
133
107
|
def route(cls, event: ft.RouteChangeEvent):
|
|
@@ -148,20 +122,25 @@ class Interface(Generic[T], ft.Column):
|
|
|
148
122
|
logger.debug(f'View popped: {page.route=} {len(page.views)=} {view=}')
|
|
149
123
|
|
|
150
124
|
@classmethod
|
|
151
|
-
def
|
|
125
|
+
def on_connect(cls, event: ControlEvent):
|
|
152
126
|
"""
|
|
153
127
|
|
|
154
|
-
|
|
128
|
+
Log connections
|
|
155
129
|
|
|
156
130
|
"""
|
|
131
|
+
page = event.control
|
|
132
|
+
logger.warning(f'Connect: {page.client_user_agent=} {page.platform.name=}')
|
|
157
133
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
134
|
+
@classmethod
|
|
135
|
+
def on_disconnect(cls, event: ControlEvent):
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
Log disconnections
|
|
139
|
+
|
|
140
|
+
"""
|
|
141
|
+
page = event.control
|
|
142
|
+
logger.warning(f'Disconnect {page.client_user_agent=} {page.platform.name=}')
|
|
162
143
|
|
|
163
|
-
logger.info(f"Launching {cls.TITLE} at {url}")
|
|
164
|
-
ft.app(cls.render, view=cls.APPVIEW, host=cls.HOST, port=cls.PORT, assets_dir=cls.PATH_ASSETS)
|
|
165
144
|
|
|
166
145
|
@classmethod
|
|
167
146
|
def get_theme(self):
|
|
@@ -176,8 +155,24 @@ class Interface(Generic[T], ft.Column):
|
|
|
176
155
|
)
|
|
177
156
|
return theme
|
|
178
157
|
|
|
158
|
+
@classmethod
|
|
159
|
+
def launch(cls):
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
Launch via async constructor method
|
|
163
|
+
|
|
164
|
+
"""
|
|
165
|
+
|
|
166
|
+
if cls.URL:
|
|
167
|
+
url = cls.URL
|
|
168
|
+
else:
|
|
169
|
+
url = f'http://{cls.HOST}:{cls.PORT}'
|
|
170
|
+
|
|
171
|
+
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, )
|
|
173
|
+
|
|
179
174
|
|
|
180
|
-
class Test(
|
|
175
|
+
class Test(Base[Context]):
|
|
181
176
|
"""
|
|
182
177
|
|
|
183
178
|
Simple test interface, showing typing example.
|
|
@@ -187,9 +182,9 @@ class Test(Interface[Context]):
|
|
|
187
182
|
|
|
188
183
|
TITLE = 'Test Interface'
|
|
189
184
|
|
|
190
|
-
def __init__(self
|
|
185
|
+
def __init__(self):
|
|
191
186
|
controls = [ft.Text(self.TITLE)]
|
|
192
|
-
super().__init__(
|
|
187
|
+
super().__init__(controls=controls)
|
|
193
188
|
|
|
194
189
|
if __name__ == "__main__":
|
|
195
190
|
Test.launch()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.3.52
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fmtr.tools
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.52
|
|
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
|
|
@@ -154,68 +154,68 @@ Provides-Extra: db-document
|
|
|
154
154
|
Requires-Dist: beanie[odm]; extra == "db-document"
|
|
155
155
|
Requires-Dist: motor; extra == "db-document"
|
|
156
156
|
Provides-Extra: all
|
|
157
|
-
Requires-Dist:
|
|
158
|
-
Requires-Dist:
|
|
159
|
-
Requires-Dist:
|
|
160
|
-
Requires-Dist:
|
|
161
|
-
Requires-Dist:
|
|
162
|
-
Requires-Dist:
|
|
163
|
-
Requires-Dist:
|
|
164
|
-
Requires-Dist:
|
|
165
|
-
Requires-Dist:
|
|
166
|
-
Requires-Dist:
|
|
167
|
-
Requires-Dist:
|
|
168
|
-
Requires-Dist:
|
|
169
|
-
Requires-Dist:
|
|
170
|
-
Requires-Dist:
|
|
171
|
-
Requires-Dist: google-auth-oauthlib; extra == "all"
|
|
172
|
-
Requires-Dist: pydantic; extra == "all"
|
|
173
|
-
Requires-Dist: playwright; extra == "all"
|
|
157
|
+
Requires-Dist: bokeh; extra == "all"
|
|
158
|
+
Requires-Dist: distributed; extra == "all"
|
|
159
|
+
Requires-Dist: motor; extra == "all"
|
|
160
|
+
Requires-Dist: faker; extra == "all"
|
|
161
|
+
Requires-Dist: peft; extra == "all"
|
|
162
|
+
Requires-Dist: openai; extra == "all"
|
|
163
|
+
Requires-Dist: pandas; extra == "all"
|
|
164
|
+
Requires-Dist: deepdiff; extra == "all"
|
|
165
|
+
Requires-Dist: pycountry; extra == "all"
|
|
166
|
+
Requires-Dist: regex; extra == "all"
|
|
167
|
+
Requires-Dist: dask[bag]; extra == "all"
|
|
168
|
+
Requires-Dist: filetype; extra == "all"
|
|
169
|
+
Requires-Dist: logfire[httpx]; extra == "all"
|
|
170
|
+
Requires-Dist: yamlscript; extra == "all"
|
|
174
171
|
Requires-Dist: google-auth-httplib2; extra == "all"
|
|
172
|
+
Requires-Dist: pymupdf; extra == "all"
|
|
173
|
+
Requires-Dist: pymupdf4llm; extra == "all"
|
|
174
|
+
Requires-Dist: httpx_retries; extra == "all"
|
|
175
|
+
Requires-Dist: google-auth; extra == "all"
|
|
176
|
+
Requires-Dist: logfire[fastapi]; extra == "all"
|
|
175
177
|
Requires-Dist: torchvision; extra == "all"
|
|
176
|
-
Requires-Dist:
|
|
177
|
-
Requires-Dist: openpyxl; extra == "all"
|
|
178
|
+
Requires-Dist: diskcache; extra == "all"
|
|
178
179
|
Requires-Dist: cachetools; extra == "all"
|
|
179
|
-
Requires-Dist:
|
|
180
|
-
Requires-Dist:
|
|
180
|
+
Requires-Dist: semver; extra == "all"
|
|
181
|
+
Requires-Dist: tinynetrc; extra == "all"
|
|
181
182
|
Requires-Dist: sentence_transformers; extra == "all"
|
|
182
|
-
Requires-Dist:
|
|
183
|
-
Requires-Dist:
|
|
184
|
-
Requires-Dist: ollama; extra == "all"
|
|
185
|
-
Requires-Dist: dask[bag]; extra == "all"
|
|
186
|
-
Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
|
|
183
|
+
Requires-Dist: Unidecode; extra == "all"
|
|
184
|
+
Requires-Dist: openpyxl; extra == "all"
|
|
187
185
|
Requires-Dist: html2text; extra == "all"
|
|
186
|
+
Requires-Dist: appdirs; extra == "all"
|
|
187
|
+
Requires-Dist: ollama; extra == "all"
|
|
188
|
+
Requires-Dist: docker; extra == "all"
|
|
189
|
+
Requires-Dist: playwright; extra == "all"
|
|
190
|
+
Requires-Dist: pytest-cov; extra == "all"
|
|
191
|
+
Requires-Dist: pyyaml; extra == "all"
|
|
192
|
+
Requires-Dist: fastapi; extra == "all"
|
|
188
193
|
Requires-Dist: setuptools; extra == "all"
|
|
189
|
-
Requires-Dist: diskcache; extra == "all"
|
|
190
|
-
Requires-Dist: logfire[fastapi]; extra == "all"
|
|
191
|
-
Requires-Dist: huggingface_hub; extra == "all"
|
|
192
|
-
Requires-Dist: regex; extra == "all"
|
|
193
|
-
Requires-Dist: torchaudio; extra == "all"
|
|
194
|
-
Requires-Dist: httpx; extra == "all"
|
|
195
|
-
Requires-Dist: flet-video; extra == "all"
|
|
196
|
-
Requires-Dist: sre_yield; extra == "all"
|
|
197
|
-
Requires-Dist: tokenizers; extra == "all"
|
|
198
|
-
Requires-Dist: tabulate; extra == "all"
|
|
199
|
-
Requires-Dist: google-auth; extra == "all"
|
|
200
|
-
Requires-Dist: yamlscript; extra == "all"
|
|
201
194
|
Requires-Dist: beanie[odm]; extra == "all"
|
|
202
|
-
Requires-Dist:
|
|
195
|
+
Requires-Dist: google-auth-oauthlib; extra == "all"
|
|
196
|
+
Requires-Dist: json_repair; extra == "all"
|
|
203
197
|
Requires-Dist: google-api-python-client; extra == "all"
|
|
198
|
+
Requires-Dist: logfire; extra == "all"
|
|
199
|
+
Requires-Dist: deepmerge; extra == "all"
|
|
200
|
+
Requires-Dist: sre_yield; extra == "all"
|
|
204
201
|
Requires-Dist: uvicorn[standard]; extra == "all"
|
|
205
|
-
Requires-Dist:
|
|
206
|
-
Requires-Dist:
|
|
207
|
-
Requires-Dist:
|
|
208
|
-
Requires-Dist:
|
|
209
|
-
Requires-Dist:
|
|
210
|
-
Requires-Dist:
|
|
211
|
-
Requires-Dist:
|
|
212
|
-
Requires-Dist:
|
|
213
|
-
Requires-Dist: pymupdf; extra == "all"
|
|
214
|
-
Requires-Dist: peft; extra == "all"
|
|
215
|
-
Requires-Dist: flet[all]; extra == "all"
|
|
216
|
-
Requires-Dist: motor; extra == "all"
|
|
202
|
+
Requires-Dist: flet-webview; extra == "all"
|
|
203
|
+
Requires-Dist: huggingface_hub; extra == "all"
|
|
204
|
+
Requires-Dist: tabulate; extra == "all"
|
|
205
|
+
Requires-Dist: tokenizers; extra == "all"
|
|
206
|
+
Requires-Dist: httpx; extra == "all"
|
|
207
|
+
Requires-Dist: contexttimer; extra == "all"
|
|
208
|
+
Requires-Dist: flet-video; extra == "all"
|
|
209
|
+
Requires-Dist: pydantic-settings; extra == "all"
|
|
217
210
|
Requires-Dist: dnspython[doh]; extra == "all"
|
|
218
|
-
Requires-Dist:
|
|
211
|
+
Requires-Dist: odfpy; extra == "all"
|
|
212
|
+
Requires-Dist: flet[all]; extra == "all"
|
|
213
|
+
Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
|
|
214
|
+
Requires-Dist: torchaudio; extra == "all"
|
|
215
|
+
Requires-Dist: pydantic; extra == "all"
|
|
216
|
+
Requires-Dist: transformers[sentencepiece]; extra == "all"
|
|
217
|
+
Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
|
|
218
|
+
Requires-Dist: pydantic-extra-types; extra == "all"
|
|
219
219
|
Dynamic: author
|
|
220
220
|
Dynamic: author-email
|
|
221
221
|
Dynamic: description
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
1.3.51
|
|
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
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
google-auth-oauthlib
|
|
36
|
-
pydantic
|
|
37
|
-
playwright
|
|
21
|
+
bokeh
|
|
22
|
+
distributed
|
|
23
|
+
motor
|
|
24
|
+
faker
|
|
25
|
+
peft
|
|
26
|
+
openai
|
|
27
|
+
pandas
|
|
28
|
+
deepdiff
|
|
29
|
+
pycountry
|
|
30
|
+
regex
|
|
31
|
+
dask[bag]
|
|
32
|
+
filetype
|
|
33
|
+
logfire[httpx]
|
|
34
|
+
yamlscript
|
|
38
35
|
google-auth-httplib2
|
|
36
|
+
pymupdf
|
|
37
|
+
pymupdf4llm
|
|
38
|
+
httpx_retries
|
|
39
|
+
google-auth
|
|
40
|
+
logfire[fastapi]
|
|
39
41
|
torchvision
|
|
40
|
-
|
|
41
|
-
openpyxl
|
|
42
|
+
diskcache
|
|
42
43
|
cachetools
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
semver
|
|
45
|
+
tinynetrc
|
|
45
46
|
sentence_transformers
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
ollama
|
|
49
|
-
dask[bag]
|
|
50
|
-
pydantic-ai[logfire,openai]
|
|
47
|
+
Unidecode
|
|
48
|
+
openpyxl
|
|
51
49
|
html2text
|
|
50
|
+
appdirs
|
|
51
|
+
ollama
|
|
52
|
+
docker
|
|
53
|
+
playwright
|
|
54
|
+
pytest-cov
|
|
55
|
+
pyyaml
|
|
56
|
+
fastapi
|
|
52
57
|
setuptools
|
|
53
|
-
diskcache
|
|
54
|
-
logfire[fastapi]
|
|
55
|
-
huggingface_hub
|
|
56
|
-
regex
|
|
57
|
-
torchaudio
|
|
58
|
-
httpx
|
|
59
|
-
flet-video
|
|
60
|
-
sre_yield
|
|
61
|
-
tokenizers
|
|
62
|
-
tabulate
|
|
63
|
-
google-auth
|
|
64
|
-
yamlscript
|
|
65
58
|
beanie[odm]
|
|
66
|
-
|
|
59
|
+
google-auth-oauthlib
|
|
60
|
+
json_repair
|
|
67
61
|
google-api-python-client
|
|
62
|
+
logfire
|
|
63
|
+
deepmerge
|
|
64
|
+
sre_yield
|
|
68
65
|
uvicorn[standard]
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
pymupdf
|
|
78
|
-
peft
|
|
79
|
-
flet[all]
|
|
80
|
-
motor
|
|
66
|
+
flet-webview
|
|
67
|
+
huggingface_hub
|
|
68
|
+
tabulate
|
|
69
|
+
tokenizers
|
|
70
|
+
httpx
|
|
71
|
+
contexttimer
|
|
72
|
+
flet-video
|
|
73
|
+
pydantic-settings
|
|
81
74
|
dnspython[doh]
|
|
82
|
-
|
|
75
|
+
odfpy
|
|
76
|
+
flet[all]
|
|
77
|
+
pydevd-pycharm~=251.25410.159
|
|
78
|
+
torchaudio
|
|
79
|
+
pydantic
|
|
80
|
+
transformers[sentencepiece]
|
|
81
|
+
pydantic-ai[logfire,openai]
|
|
82
|
+
pydantic-extra-types
|
|
83
83
|
|
|
84
84
|
[api]
|
|
85
85
|
fastapi
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|