fmtr.tools 1.3.22__tar.gz → 1.3.24__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 (94) hide show
  1. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/PKG-INFO +45 -45
  2. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/__init__.py +1 -5
  3. fmtr_tools-1.3.24/fmtr/tools/interface_tools/__init__.py +7 -0
  4. fmtr_tools-1.3.24/fmtr/tools/interface_tools/controls.py +73 -0
  5. fmtr_tools-1.3.24/fmtr/tools/interface_tools/interface_tools.py +102 -0
  6. fmtr_tools-1.3.24/fmtr/tools/version +1 -0
  7. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr.tools.egg-info/PKG-INFO +45 -45
  8. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr.tools.egg-info/SOURCES.txt +6 -2
  9. fmtr_tools-1.3.22/fmtr/tools/interface_tools.py +0 -64
  10. fmtr_tools-1.3.22/fmtr/tools/version +0 -1
  11. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/LICENSE +0 -0
  12. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/README.md +0 -0
  13. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/ai_tools/__init__.py +0 -0
  14. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  15. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  16. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/api_tools.py +0 -0
  17. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/async_tools.py +0 -0
  18. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/augmentation_tools.py +0 -0
  19. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/caching_tools.py +0 -0
  20. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/constants.py +0 -0
  21. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/data_modelling_tools.py +0 -0
  22. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/dataclass_tools.py +0 -0
  23. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/datatype_tools.py +0 -0
  24. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/debugging_tools.py +0 -0
  25. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/dns_tools/__init__.py +0 -0
  26. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/dns_tools/client.py +0 -0
  27. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/dns_tools/dm.py +0 -0
  28. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/dns_tools/proxy.py +0 -0
  29. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/dns_tools/server.py +0 -0
  30. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/docker_tools.py +0 -0
  31. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/entrypoints/__init__.py +0 -0
  32. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  33. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/entrypoints/ep_test.py +0 -0
  34. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  35. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  36. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  37. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/environment_tools.py +0 -0
  38. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/function_tools.py +0 -0
  39. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/google_api_tools.py +0 -0
  40. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/hash_tools.py +0 -0
  41. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/hfh_tools.py +0 -0
  42. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/html_tools.py +0 -0
  43. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/http_tools.py +0 -0
  44. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/import_tools.py +0 -0
  45. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/inspection_tools.py +0 -0
  46. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/iterator_tools.py +0 -0
  47. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/json_fix_tools.py +0 -0
  48. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/json_tools.py +0 -0
  49. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/logging_tools.py +0 -0
  50. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/merging_tools.py +0 -0
  51. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/metric_tools.py +0 -0
  52. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/name_tools.py +0 -0
  53. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/netrc_tools.py +0 -0
  54. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/openai_tools.py +0 -0
  55. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/packaging_tools.py +0 -0
  56. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/parallel_tools.py +0 -0
  57. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/path_tools/__init__.py +0 -0
  58. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  59. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/path_tools/path_tools.py +0 -0
  60. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  61. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/pattern_tools.py +0 -0
  62. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/pdf_tools.py +0 -0
  63. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/platform_tools.py +0 -0
  64. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/process_tools.py +0 -0
  65. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/profiling_tools.py +0 -0
  66. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/random_tools.py +0 -0
  67. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/semantic_tools.py +0 -0
  68. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/settings_tools.py +0 -0
  69. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/setup_tools/__init__.py +0 -0
  70. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/setup_tools/setup_tools.py +0 -0
  71. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/spaces_tools.py +0 -0
  72. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/string_tools.py +0 -0
  73. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tabular_tools.py +0 -0
  74. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tests/__init__.py +0 -0
  75. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tests/conftest.py +0 -0
  76. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tests/helpers.py +0 -0
  77. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tests/test_datatype.py +0 -0
  78. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tests/test_environment.py +0 -0
  79. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tests/test_json.py +0 -0
  80. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tests/test_path.py +0 -0
  81. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tests/test_yaml.py +0 -0
  82. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tokenization_tools.py +0 -0
  83. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/tools.py +0 -0
  84. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/unicode_tools.py +0 -0
  85. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/version_tools/__init__.py +0 -0
  86. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/version_tools/version_tools.py +0 -0
  87. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr/tools/yaml_tools.py +0 -0
  88. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  89. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr.tools.egg-info/entry_points.txt +0 -0
  90. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr.tools.egg-info/requires.txt +44 -44
  91. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/fmtr.tools.egg-info/top_level.txt +0 -0
  92. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/pyproject.toml +0 -0
  93. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/setup.cfg +0 -0
  94. {fmtr_tools-1.3.22 → fmtr_tools-1.3.24}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.22
3
+ Version: 1.3.24
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
@@ -126,61 +126,61 @@ Requires-Dist: logfire[httpx]; extra == "http"
126
126
  Provides-Extra: setup
127
127
  Requires-Dist: setuptools; extra == "setup"
128
128
  Provides-Extra: all
129
+ Requires-Dist: google-api-python-client; extra == "all"
130
+ Requires-Dist: ollama; extra == "all"
131
+ Requires-Dist: logfire[fastapi]; extra == "all"
132
+ Requires-Dist: httpx_retries; extra == "all"
133
+ Requires-Dist: dnspython[doh]; extra == "all"
134
+ Requires-Dist: html2text; extra == "all"
135
+ Requires-Dist: logfire[httpx]; extra == "all"
136
+ Requires-Dist: docker; extra == "all"
137
+ Requires-Dist: pymupdf; extra == "all"
138
+ Requires-Dist: json_repair; extra == "all"
139
+ Requires-Dist: semver; extra == "all"
140
+ Requires-Dist: flet-video; extra == "all"
141
+ Requires-Dist: tinynetrc; extra == "all"
129
142
  Requires-Dist: pydantic; extra == "all"
130
143
  Requires-Dist: flet-webview; extra == "all"
131
- Requires-Dist: semver; extra == "all"
144
+ Requires-Dist: google-auth; extra == "all"
145
+ Requires-Dist: faker; extra == "all"
146
+ Requires-Dist: dask[bag]; extra == "all"
147
+ Requires-Dist: yamlscript; extra == "all"
148
+ Requires-Dist: tokenizers; extra == "all"
149
+ Requires-Dist: setuptools; extra == "all"
150
+ Requires-Dist: logfire; extra == "all"
151
+ Requires-Dist: uvicorn[standard]; extra == "all"
152
+ Requires-Dist: peft; extra == "all"
153
+ Requires-Dist: contexttimer; extra == "all"
154
+ Requires-Dist: bokeh; extra == "all"
132
155
  Requires-Dist: flet[all]; extra == "all"
133
- Requires-Dist: pydantic-settings; extra == "all"
134
- Requires-Dist: distributed; extra == "all"
156
+ Requires-Dist: pandas; extra == "all"
157
+ Requires-Dist: deepmerge; extra == "all"
158
+ Requires-Dist: torchvision; extra == "all"
159
+ Requires-Dist: cachetools; extra == "all"
135
160
  Requires-Dist: sre_yield; extra == "all"
136
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
137
- Requires-Dist: appdirs; extra == "all"
161
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
162
+ Requires-Dist: google-auth-httplib2; extra == "all"
138
163
  Requires-Dist: sentence_transformers; extra == "all"
139
- Requires-Dist: flet-video; extra == "all"
164
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
165
+ Requires-Dist: huggingface_hub; extra == "all"
166
+ Requires-Dist: tabulate; extra == "all"
140
167
  Requires-Dist: pymupdf4llm; extra == "all"
141
- Requires-Dist: contexttimer; extra == "all"
142
- Requires-Dist: pytest-cov; extra == "all"
143
- Requires-Dist: yamlscript; extra == "all"
144
- Requires-Dist: bokeh; extra == "all"
145
- Requires-Dist: faker; extra == "all"
146
- Requires-Dist: openpyxl; extra == "all"
147
- Requires-Dist: uvicorn[standard]; extra == "all"
148
- Requires-Dist: torchvision; extra == "all"
149
- Requires-Dist: ollama; extra == "all"
150
- Requires-Dist: pymupdf; extra == "all"
168
+ Requires-Dist: filetype; extra == "all"
151
169
  Requires-Dist: regex; extra == "all"
152
- Requires-Dist: setuptools; extra == "all"
153
- Requires-Dist: tokenizers; extra == "all"
154
- Requires-Dist: google-auth; extra == "all"
155
- Requires-Dist: httpx_retries; extra == "all"
156
- Requires-Dist: httpx; extra == "all"
157
- Requires-Dist: Unidecode; extra == "all"
158
170
  Requires-Dist: openai; extra == "all"
159
- Requires-Dist: pyyaml; extra == "all"
160
- Requires-Dist: docker; extra == "all"
171
+ Requires-Dist: Unidecode; extra == "all"
172
+ Requires-Dist: openpyxl; extra == "all"
173
+ Requires-Dist: distributed; extra == "all"
174
+ Requires-Dist: appdirs; extra == "all"
161
175
  Requires-Dist: fastapi; extra == "all"
162
- Requires-Dist: diskcache; extra == "all"
163
- Requires-Dist: logfire[fastapi]; extra == "all"
164
- Requires-Dist: google-auth-oauthlib; extra == "all"
165
- Requires-Dist: pandas; extra == "all"
166
- Requires-Dist: google-auth-httplib2; extra == "all"
167
- Requires-Dist: peft; extra == "all"
176
+ Requires-Dist: pyyaml; extra == "all"
168
177
  Requires-Dist: torchaudio; extra == "all"
169
- Requires-Dist: dnspython[doh]; extra == "all"
170
- Requires-Dist: logfire; extra == "all"
171
- Requires-Dist: logfire[httpx]; extra == "all"
172
- Requires-Dist: filetype; extra == "all"
173
- Requires-Dist: google-api-python-client; extra == "all"
174
- Requires-Dist: tinynetrc; extra == "all"
175
- Requires-Dist: deepmerge; extra == "all"
176
- Requires-Dist: json_repair; extra == "all"
177
- Requires-Dist: cachetools; extra == "all"
178
- Requires-Dist: html2text; extra == "all"
179
- Requires-Dist: huggingface_hub; extra == "all"
180
- Requires-Dist: tabulate; extra == "all"
181
- Requires-Dist: dask[bag]; extra == "all"
182
178
  Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
183
- Requires-Dist: transformers[sentencepiece]; extra == "all"
179
+ Requires-Dist: google-auth-oauthlib; extra == "all"
180
+ Requires-Dist: pytest-cov; extra == "all"
181
+ Requires-Dist: httpx; extra == "all"
182
+ Requires-Dist: diskcache; extra == "all"
183
+ Requires-Dist: pydantic-settings; extra == "all"
184
184
  Dynamic: author
185
185
  Dynamic: author-email
186
186
  Dynamic: description
@@ -18,6 +18,7 @@ import fmtr.tools.setup_tools as setup
18
18
  import fmtr.tools.string_tools as string
19
19
  from fmtr.tools import ai_tools as ai
20
20
  from fmtr.tools import dns_tools as dns
21
+ from fmtr.tools import interface_tools as interface
21
22
  from fmtr.tools import version_tools as version
22
23
  from fmtr.tools.constants import Constants
23
24
  from fmtr.tools.import_tools import MissingExtraMockModule
@@ -120,11 +121,6 @@ try:
120
121
  except ImportError as exception:
121
122
  html = MissingExtraMockModule('html', exception)
122
123
 
123
- try:
124
- from fmtr.tools import interface_tools as interface
125
- except ImportError as exception:
126
- interface = MissingExtraMockModule('interface', exception)
127
-
128
124
  try:
129
125
  from fmtr.tools import openai_tools as openai
130
126
  except ImportError as exception:
@@ -0,0 +1,7 @@
1
+ from fmtr.tools.import_tools import MissingExtraMockModule
2
+
3
+ try:
4
+ from fmtr.tools.interface_tools.interface_tools import Interface, update
5
+ from fmtr.tools.interface_tools import controls
6
+ except ImportError as exception:
7
+ Interface = update = controls = MissingExtraMockModule('interface', exception)
@@ -0,0 +1,73 @@
1
+ import flet as ft
2
+
3
+
4
+ class ContextRing(ft.ProgressRing):
5
+ """
6
+
7
+ Context manager progress ring.
8
+
9
+ """
10
+
11
+ def __init__(self, *args, **kwargs):
12
+ """
13
+
14
+ Start out not visible.
15
+
16
+ """
17
+ super().__init__(*args, **kwargs, visible=False)
18
+
19
+ def start(self):
20
+ """
21
+
22
+ Update to visible when in context.
23
+
24
+ """
25
+ self.visible = True
26
+ self.page.update()
27
+
28
+ def stop(self):
29
+ """
30
+
31
+ Update to not visible when exiting context.
32
+
33
+ """
34
+ self.visible = False
35
+ self.page.update()
36
+
37
+ def context(self, func):
38
+ """
39
+
40
+ Context manager decorator.
41
+
42
+ """
43
+
44
+ def wrapped(*args, **kwargs):
45
+ with self:
46
+ func(*args, **kwargs)
47
+
48
+ return wrapped
49
+
50
+ def __enter__(self):
51
+ self.start()
52
+ return self
53
+
54
+ def __exit__(self, exc_type, exc_val, exc_tb):
55
+ self.stop()
56
+
57
+
58
+ class ProgressButton(ft.Button):
59
+ """
60
+
61
+ Button with progress ring.
62
+
63
+ """
64
+
65
+ def __init__(self, *args, on_click=None, **kwargs):
66
+ """
67
+
68
+ Run on_click in run context manager
69
+
70
+ """
71
+ self.ring = ContextRing()
72
+ super().__init__(*args, content=self.ring, on_click=self.ring.context(on_click), **kwargs)
73
+ self.context = self.ring.context
@@ -0,0 +1,102 @@
1
+ import flet as ft
2
+ from flet.core.types import AppView
3
+ from flet.core.view import View
4
+
5
+ from fmtr.tools.logging_tools import logger
6
+
7
+
8
+ def update(func):
9
+ """
10
+
11
+ Page update decorator
12
+
13
+ """
14
+
15
+ def wrapped(*args, **kwargs):
16
+ func(*args, **kwargs)
17
+ func.__self__.page.update()
18
+
19
+ return wrapped
20
+
21
+ class Interface(ft.Column):
22
+ """
23
+
24
+ Simple interface base class.
25
+
26
+ """
27
+ TITLE = 'Base Interface'
28
+ HOST = '0.0.0.0'
29
+ PORT = 8080
30
+ URL = None
31
+ APPVIEW = AppView.WEB_BROWSER
32
+ PATH_ASSETS = None
33
+ ROUTE_ROOT = '/'
34
+
35
+ THEME = ft.Theme(color_scheme=ft.ColorScheme(primary=ft.Colors.PINK))
36
+
37
+ @classmethod
38
+ def render(cls, page: ft.Page):
39
+ """
40
+
41
+ Interface entry point. Set relevant callbacks, and add instantiated self to page views
42
+
43
+ """
44
+ if not page.on_route_change:
45
+ page.theme = cls.THEME
46
+ page.views.clear()
47
+ page.views.append(cls())
48
+
49
+ page.on_route_change = cls.route
50
+ page.on_view_pop = cls.pop
51
+
52
+ page.go(cls.ROUTE_ROOT)
53
+
54
+ @classmethod
55
+ def route(cls, event: ft.RouteChangeEvent):
56
+ """
57
+
58
+ Overridable router.
59
+
60
+ """
61
+ logger.debug(f'Route change: {event=}')
62
+
63
+ @classmethod
64
+ def pop(cls, view: View, page: ft.Page):
65
+ """
66
+
67
+ Overridable view pop.
68
+
69
+ """
70
+ logger.debug(f'View popped: {page.route=} {len(page.views)=} {view=}')
71
+
72
+ @classmethod
73
+ def launch(cls):
74
+ """
75
+
76
+ Launch via render method
77
+
78
+ """
79
+
80
+ if cls.URL:
81
+ url = cls.URL
82
+ else:
83
+ url = f'http://{cls.HOST}:{cls.PORT}'
84
+
85
+ logger.info(f"Launching {cls.TITLE} at {url}")
86
+ ft.app(cls.render, view=cls.APPVIEW, host=cls.HOST, port=cls.PORT, assets_dir=cls.PATH_ASSETS)
87
+
88
+
89
+ class Test(Interface):
90
+ """
91
+
92
+ Simple test interface.
93
+
94
+ """
95
+ TITLE = 'Test Interface'
96
+
97
+ def __init__(self):
98
+ controls = [ft.Text(self.TITLE)]
99
+ super().__init__(controls=controls)
100
+
101
+ if __name__ == "__main__":
102
+ Test.launch()
@@ -0,0 +1 @@
1
+ 1.3.24
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.22
3
+ Version: 1.3.24
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
@@ -126,61 +126,61 @@ Requires-Dist: logfire[httpx]; extra == "http"
126
126
  Provides-Extra: setup
127
127
  Requires-Dist: setuptools; extra == "setup"
128
128
  Provides-Extra: all
129
+ Requires-Dist: google-api-python-client; extra == "all"
130
+ Requires-Dist: ollama; extra == "all"
131
+ Requires-Dist: logfire[fastapi]; extra == "all"
132
+ Requires-Dist: httpx_retries; extra == "all"
133
+ Requires-Dist: dnspython[doh]; extra == "all"
134
+ Requires-Dist: html2text; extra == "all"
135
+ Requires-Dist: logfire[httpx]; extra == "all"
136
+ Requires-Dist: docker; extra == "all"
137
+ Requires-Dist: pymupdf; extra == "all"
138
+ Requires-Dist: json_repair; extra == "all"
139
+ Requires-Dist: semver; extra == "all"
140
+ Requires-Dist: flet-video; extra == "all"
141
+ Requires-Dist: tinynetrc; extra == "all"
129
142
  Requires-Dist: pydantic; extra == "all"
130
143
  Requires-Dist: flet-webview; extra == "all"
131
- Requires-Dist: semver; extra == "all"
144
+ Requires-Dist: google-auth; extra == "all"
145
+ Requires-Dist: faker; extra == "all"
146
+ Requires-Dist: dask[bag]; extra == "all"
147
+ Requires-Dist: yamlscript; extra == "all"
148
+ Requires-Dist: tokenizers; extra == "all"
149
+ Requires-Dist: setuptools; extra == "all"
150
+ Requires-Dist: logfire; extra == "all"
151
+ Requires-Dist: uvicorn[standard]; extra == "all"
152
+ Requires-Dist: peft; extra == "all"
153
+ Requires-Dist: contexttimer; extra == "all"
154
+ Requires-Dist: bokeh; extra == "all"
132
155
  Requires-Dist: flet[all]; extra == "all"
133
- Requires-Dist: pydantic-settings; extra == "all"
134
- Requires-Dist: distributed; extra == "all"
156
+ Requires-Dist: pandas; extra == "all"
157
+ Requires-Dist: deepmerge; extra == "all"
158
+ Requires-Dist: torchvision; extra == "all"
159
+ Requires-Dist: cachetools; extra == "all"
135
160
  Requires-Dist: sre_yield; extra == "all"
136
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
137
- Requires-Dist: appdirs; extra == "all"
161
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
162
+ Requires-Dist: google-auth-httplib2; extra == "all"
138
163
  Requires-Dist: sentence_transformers; extra == "all"
139
- Requires-Dist: flet-video; extra == "all"
164
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
165
+ Requires-Dist: huggingface_hub; extra == "all"
166
+ Requires-Dist: tabulate; extra == "all"
140
167
  Requires-Dist: pymupdf4llm; extra == "all"
141
- Requires-Dist: contexttimer; extra == "all"
142
- Requires-Dist: pytest-cov; extra == "all"
143
- Requires-Dist: yamlscript; extra == "all"
144
- Requires-Dist: bokeh; extra == "all"
145
- Requires-Dist: faker; extra == "all"
146
- Requires-Dist: openpyxl; extra == "all"
147
- Requires-Dist: uvicorn[standard]; extra == "all"
148
- Requires-Dist: torchvision; extra == "all"
149
- Requires-Dist: ollama; extra == "all"
150
- Requires-Dist: pymupdf; extra == "all"
168
+ Requires-Dist: filetype; extra == "all"
151
169
  Requires-Dist: regex; extra == "all"
152
- Requires-Dist: setuptools; extra == "all"
153
- Requires-Dist: tokenizers; extra == "all"
154
- Requires-Dist: google-auth; extra == "all"
155
- Requires-Dist: httpx_retries; extra == "all"
156
- Requires-Dist: httpx; extra == "all"
157
- Requires-Dist: Unidecode; extra == "all"
158
170
  Requires-Dist: openai; extra == "all"
159
- Requires-Dist: pyyaml; extra == "all"
160
- Requires-Dist: docker; extra == "all"
171
+ Requires-Dist: Unidecode; extra == "all"
172
+ Requires-Dist: openpyxl; extra == "all"
173
+ Requires-Dist: distributed; extra == "all"
174
+ Requires-Dist: appdirs; extra == "all"
161
175
  Requires-Dist: fastapi; extra == "all"
162
- Requires-Dist: diskcache; extra == "all"
163
- Requires-Dist: logfire[fastapi]; extra == "all"
164
- Requires-Dist: google-auth-oauthlib; extra == "all"
165
- Requires-Dist: pandas; extra == "all"
166
- Requires-Dist: google-auth-httplib2; extra == "all"
167
- Requires-Dist: peft; extra == "all"
176
+ Requires-Dist: pyyaml; extra == "all"
168
177
  Requires-Dist: torchaudio; extra == "all"
169
- Requires-Dist: dnspython[doh]; extra == "all"
170
- Requires-Dist: logfire; extra == "all"
171
- Requires-Dist: logfire[httpx]; extra == "all"
172
- Requires-Dist: filetype; extra == "all"
173
- Requires-Dist: google-api-python-client; extra == "all"
174
- Requires-Dist: tinynetrc; extra == "all"
175
- Requires-Dist: deepmerge; extra == "all"
176
- Requires-Dist: json_repair; extra == "all"
177
- Requires-Dist: cachetools; extra == "all"
178
- Requires-Dist: html2text; extra == "all"
179
- Requires-Dist: huggingface_hub; extra == "all"
180
- Requires-Dist: tabulate; extra == "all"
181
- Requires-Dist: dask[bag]; extra == "all"
182
178
  Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
183
- Requires-Dist: transformers[sentencepiece]; extra == "all"
179
+ Requires-Dist: google-auth-oauthlib; extra == "all"
180
+ Requires-Dist: pytest-cov; extra == "all"
181
+ Requires-Dist: httpx; extra == "all"
182
+ Requires-Dist: diskcache; extra == "all"
183
+ Requires-Dist: pydantic-settings; extra == "all"
184
184
  Dynamic: author
185
185
  Dynamic: author-email
186
186
  Dynamic: description
@@ -22,7 +22,6 @@ setup.py
22
22
  ./fmtr/tools/http_tools.py
23
23
  ./fmtr/tools/import_tools.py
24
24
  ./fmtr/tools/inspection_tools.py
25
- ./fmtr/tools/interface_tools.py
26
25
  ./fmtr/tools/iterator_tools.py
27
26
  ./fmtr/tools/json_fix_tools.py
28
27
  ./fmtr/tools/json_tools.py
@@ -64,6 +63,9 @@ setup.py
64
63
  ./fmtr/tools/entrypoints/install_yamlscript.py
65
64
  ./fmtr/tools/entrypoints/remote_debug_test.py
66
65
  ./fmtr/tools/entrypoints/shell_debug.py
66
+ ./fmtr/tools/interface_tools/__init__.py
67
+ ./fmtr/tools/interface_tools/controls.py
68
+ ./fmtr/tools/interface_tools/interface_tools.py
67
69
  ./fmtr/tools/path_tools/__init__.py
68
70
  ./fmtr/tools/path_tools/app_path_tools.py
69
71
  ./fmtr/tools/path_tools/path_tools.py
@@ -106,7 +108,6 @@ fmtr/tools/html_tools.py
106
108
  fmtr/tools/http_tools.py
107
109
  fmtr/tools/import_tools.py
108
110
  fmtr/tools/inspection_tools.py
109
- fmtr/tools/interface_tools.py
110
111
  fmtr/tools/iterator_tools.py
111
112
  fmtr/tools/json_fix_tools.py
112
113
  fmtr/tools/json_tools.py
@@ -148,6 +149,9 @@ fmtr/tools/entrypoints/ep_test.py
148
149
  fmtr/tools/entrypoints/install_yamlscript.py
149
150
  fmtr/tools/entrypoints/remote_debug_test.py
150
151
  fmtr/tools/entrypoints/shell_debug.py
152
+ fmtr/tools/interface_tools/__init__.py
153
+ fmtr/tools/interface_tools/controls.py
154
+ fmtr/tools/interface_tools/interface_tools.py
151
155
  fmtr/tools/path_tools/__init__.py
152
156
  fmtr/tools/path_tools/app_path_tools.py
153
157
  fmtr/tools/path_tools/path_tools.py
@@ -1,64 +0,0 @@
1
- import flet as ft
2
- from flet.core.event import Event
3
- from flet.core.types import AppView
4
- from flet.core.view import View
5
-
6
- from fmtr.tools.logging_tools import logger
7
-
8
-
9
- class Interface:
10
- """
11
-
12
- Simple interface base class.
13
-
14
- """
15
- TITLE = 'Base Interface'
16
- HOST = '0.0.0.0'
17
- PORT = 8080
18
- APPVIEW = AppView.WEB_BROWSER
19
- PATH_ASSETS = None
20
- ROUTE_ROOT = '/'
21
-
22
- def render(self, page: ft.Page):
23
- """
24
-
25
- Interface entry point.
26
-
27
- """
28
-
29
- if not page.on_route_change:
30
- page.on_route_change = lambda e, page=page: self.route(page, e)
31
- page.on_view_pop = lambda view, page=page: self.pop(page, view)
32
-
33
- page.go(self.ROUTE_ROOT)
34
-
35
- def route(self, page: ft.Page, event: Event):
36
- """
37
-
38
- Overridable router.
39
-
40
- """
41
- raise NotImplementedError
42
-
43
- def pop(self, page: ft.Page, view: View):
44
- """
45
-
46
- Overridable view pop.
47
-
48
- """
49
- raise NotImplementedError
50
-
51
- @classmethod
52
- def launch(cls):
53
- """
54
-
55
- Initialise self and launch.
56
-
57
- """
58
- self = cls()
59
- logger.info(f"Launching {self.TITLE} at http://{self.HOST}:{self.PORT}")
60
- ft.app(self.render, view=self.APPVIEW, host=self.HOST, port=self.PORT, assets_dir=self.PATH_ASSETS)
61
-
62
-
63
- if __name__ == "__main__":
64
- Interface.launch()
@@ -1 +0,0 @@
1
- 1.3.22
File without changes
File without changes
@@ -14,61 +14,61 @@ pydantic-ai[logfire,openai]
14
14
  ollama
15
15
 
16
16
  [all]
17
+ google-api-python-client
18
+ ollama
19
+ logfire[fastapi]
20
+ httpx_retries
21
+ dnspython[doh]
22
+ html2text
23
+ logfire[httpx]
24
+ docker
25
+ pymupdf
26
+ json_repair
27
+ semver
28
+ flet-video
29
+ tinynetrc
17
30
  pydantic
18
31
  flet-webview
19
- semver
32
+ google-auth
33
+ faker
34
+ dask[bag]
35
+ yamlscript
36
+ tokenizers
37
+ setuptools
38
+ logfire
39
+ uvicorn[standard]
40
+ peft
41
+ contexttimer
42
+ bokeh
20
43
  flet[all]
21
- pydantic-settings
22
- distributed
44
+ pandas
45
+ deepmerge
46
+ torchvision
47
+ cachetools
23
48
  sre_yield
24
- pydantic-ai[logfire,openai]
25
- appdirs
49
+ transformers[sentencepiece]
50
+ google-auth-httplib2
26
51
  sentence_transformers
27
- flet-video
52
+ pydantic-ai[logfire,openai]
53
+ huggingface_hub
54
+ tabulate
28
55
  pymupdf4llm
29
- contexttimer
30
- pytest-cov
31
- yamlscript
32
- bokeh
33
- faker
34
- openpyxl
35
- uvicorn[standard]
36
- torchvision
37
- ollama
38
- pymupdf
56
+ filetype
39
57
  regex
40
- setuptools
41
- tokenizers
42
- google-auth
43
- httpx_retries
44
- httpx
45
- Unidecode
46
58
  openai
47
- pyyaml
48
- docker
59
+ Unidecode
60
+ openpyxl
61
+ distributed
62
+ appdirs
49
63
  fastapi
50
- diskcache
51
- logfire[fastapi]
52
- google-auth-oauthlib
53
- pandas
54
- google-auth-httplib2
55
- peft
64
+ pyyaml
56
65
  torchaudio
57
- dnspython[doh]
58
- logfire
59
- logfire[httpx]
60
- filetype
61
- google-api-python-client
62
- tinynetrc
63
- deepmerge
64
- json_repair
65
- cachetools
66
- html2text
67
- huggingface_hub
68
- tabulate
69
- dask[bag]
70
66
  pydevd-pycharm~=251.25410.159
71
- transformers[sentencepiece]
67
+ google-auth-oauthlib
68
+ pytest-cov
69
+ httpx
70
+ diskcache
71
+ pydantic-settings
72
72
 
73
73
  [api]
74
74
  fastapi
File without changes
File without changes
File without changes