fmtr.tools 1.1.1__py3-none-any.whl → 1.4.37__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. fmtr/tools/__init__.py +86 -52
  2. fmtr/tools/ai_tools/__init__.py +2 -2
  3. fmtr/tools/ai_tools/agentic_tools.py +151 -32
  4. fmtr/tools/ai_tools/inference_tools.py +2 -1
  5. fmtr/tools/api_tools.py +73 -12
  6. fmtr/tools/async_tools.py +4 -0
  7. fmtr/tools/av_tools.py +7 -0
  8. fmtr/tools/caching_tools.py +101 -3
  9. fmtr/tools/constants.py +41 -0
  10. fmtr/tools/context_tools.py +23 -0
  11. fmtr/tools/data_modelling_tools.py +227 -14
  12. fmtr/tools/database_tools/__init__.py +6 -0
  13. fmtr/tools/database_tools/document.py +51 -0
  14. fmtr/tools/datatype_tools.py +22 -2
  15. fmtr/tools/datetime_tools.py +12 -0
  16. fmtr/tools/debugging_tools.py +60 -1
  17. fmtr/tools/dns_tools/__init__.py +7 -0
  18. fmtr/tools/dns_tools/client.py +97 -0
  19. fmtr/tools/dns_tools/dm.py +257 -0
  20. fmtr/tools/dns_tools/proxy.py +66 -0
  21. fmtr/tools/dns_tools/server.py +138 -0
  22. fmtr/tools/docker_tools/__init__.py +6 -0
  23. fmtr/tools/entrypoints/__init__.py +0 -0
  24. fmtr/tools/entrypoints/cache_hfh.py +3 -0
  25. fmtr/tools/entrypoints/ep_test.py +2 -0
  26. fmtr/tools/entrypoints/install_yamlscript.py +8 -0
  27. fmtr/tools/{console_script_tools.py → entrypoints/remote_debug_test.py} +1 -6
  28. fmtr/tools/entrypoints/shell_debug.py +8 -0
  29. fmtr/tools/environment_tools.py +3 -2
  30. fmtr/tools/function_tools.py +77 -1
  31. fmtr/tools/google_api_tools.py +15 -4
  32. fmtr/tools/ha_tools/__init__.py +8 -0
  33. fmtr/tools/ha_tools/constants.py +9 -0
  34. fmtr/tools/ha_tools/core.py +16 -0
  35. fmtr/tools/ha_tools/supervisor.py +16 -0
  36. fmtr/tools/ha_tools/utils.py +46 -0
  37. fmtr/tools/http_tools.py +52 -0
  38. fmtr/tools/inherit_tools.py +27 -0
  39. fmtr/tools/interface_tools/__init__.py +8 -0
  40. fmtr/tools/interface_tools/context.py +13 -0
  41. fmtr/tools/interface_tools/controls.py +354 -0
  42. fmtr/tools/interface_tools/interface_tools.py +189 -0
  43. fmtr/tools/iterator_tools.py +122 -1
  44. fmtr/tools/logging_tools.py +99 -18
  45. fmtr/tools/mqtt_tools.py +89 -0
  46. fmtr/tools/networking_tools.py +73 -0
  47. fmtr/tools/packaging_tools.py +14 -0
  48. fmtr/tools/path_tools/__init__.py +12 -0
  49. fmtr/tools/path_tools/app_path_tools.py +40 -0
  50. fmtr/tools/{path_tools.py → path_tools/path_tools.py} +217 -14
  51. fmtr/tools/path_tools/type_path_tools.py +3 -0
  52. fmtr/tools/pattern_tools.py +277 -0
  53. fmtr/tools/pdf_tools.py +39 -1
  54. fmtr/tools/settings_tools.py +27 -6
  55. fmtr/tools/setup_tools/__init__.py +8 -0
  56. fmtr/tools/setup_tools/setup_tools.py +481 -0
  57. fmtr/tools/string_tools.py +92 -13
  58. fmtr/tools/tabular_tools.py +61 -0
  59. fmtr/tools/tools.py +27 -2
  60. fmtr/tools/version +1 -1
  61. fmtr/tools/version_tools/__init__.py +12 -0
  62. fmtr/tools/version_tools/version_tools.py +51 -0
  63. fmtr/tools/webhook_tools.py +17 -0
  64. fmtr/tools/yaml_tools.py +64 -5
  65. fmtr/tools/youtube_tools.py +128 -0
  66. fmtr_tools-1.4.37.data/scripts/add-service +14 -0
  67. fmtr_tools-1.4.37.data/scripts/add-user-path +8 -0
  68. fmtr_tools-1.4.37.data/scripts/apt-headless +23 -0
  69. fmtr_tools-1.4.37.data/scripts/compose-update +10 -0
  70. fmtr_tools-1.4.37.data/scripts/docker-sandbox +43 -0
  71. fmtr_tools-1.4.37.data/scripts/docker-sandbox-init +23 -0
  72. fmtr_tools-1.4.37.data/scripts/docs-deploy +6 -0
  73. fmtr_tools-1.4.37.data/scripts/docs-serve +5 -0
  74. fmtr_tools-1.4.37.data/scripts/download +9 -0
  75. fmtr_tools-1.4.37.data/scripts/fmtr-test-script +3 -0
  76. fmtr_tools-1.4.37.data/scripts/ftu +3 -0
  77. fmtr_tools-1.4.37.data/scripts/ha-addon-launch +16 -0
  78. fmtr_tools-1.4.37.data/scripts/install-browser +8 -0
  79. fmtr_tools-1.4.37.data/scripts/parse-args +43 -0
  80. fmtr_tools-1.4.37.data/scripts/set-password +5 -0
  81. fmtr_tools-1.4.37.data/scripts/snips-install +14 -0
  82. fmtr_tools-1.4.37.data/scripts/ssh-auth +28 -0
  83. fmtr_tools-1.4.37.data/scripts/ssh-serve +15 -0
  84. fmtr_tools-1.4.37.data/scripts/vlc-tn +10 -0
  85. fmtr_tools-1.4.37.data/scripts/vm-launch +17 -0
  86. {fmtr_tools-1.1.1.dist-info → fmtr_tools-1.4.37.dist-info}/METADATA +178 -54
  87. fmtr_tools-1.4.37.dist-info/RECORD +122 -0
  88. {fmtr_tools-1.1.1.dist-info → fmtr_tools-1.4.37.dist-info}/WHEEL +1 -1
  89. fmtr_tools-1.4.37.dist-info/entry_points.txt +6 -0
  90. fmtr_tools-1.4.37.dist-info/top_level.txt +1 -0
  91. fmtr/tools/docker_tools.py +0 -30
  92. fmtr/tools/interface_tools.py +0 -64
  93. fmtr/tools/version_tools.py +0 -62
  94. fmtr_tools-1.1.1.dist-info/RECORD +0 -65
  95. fmtr_tools-1.1.1.dist-info/entry_points.txt +0 -3
  96. fmtr_tools-1.1.1.dist-info/top_level.txt +0 -2
  97. {fmtr_tools-1.1.1.dist-info → fmtr_tools-1.4.37.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.1.1
3
+ Version: 1.4.37
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
@@ -8,56 +8,26 @@ Author-email: innovative.fowler@mask.pro.fmtr.dev
8
8
  License: Copyright © 2025 Frontmatter. All rights reserved.
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
+ Provides-Extra: dev
12
+ Requires-Dist: logfire; extra == "dev"
13
+ Requires-Dist: semver; extra == "dev"
14
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "dev"
15
+ Requires-Dist: pydantic-settings; extra == "dev"
16
+ Requires-Dist: pydantic; extra == "dev"
17
+ Requires-Dist: pydantic-extra-types; extra == "dev"
18
+ Requires-Dist: pycountry; extra == "dev"
19
+ Requires-Dist: yamlscript; extra == "dev"
20
+ Requires-Dist: pyyaml; extra == "dev"
21
+ Requires-Dist: yamlscript; extra == "dev"
22
+ Requires-Dist: pyyaml; extra == "dev"
23
+ Requires-Dist: beanie[odm]; extra == "dev"
11
24
  Provides-Extra: test
12
- Requires-Dist: peft; extra == "test"
13
- Requires-Dist: flet-webview; extra == "test"
14
- Requires-Dist: html2text; extra == "test"
15
- Requires-Dist: deepmerge; extra == "test"
16
- Requires-Dist: tabulate; extra == "test"
17
- Requires-Dist: torchvision; extra == "test"
18
- Requires-Dist: pandas; extra == "test"
19
- Requires-Dist: distributed; extra == "test"
20
- Requires-Dist: google-api-python-client; extra == "test"
21
- Requires-Dist: semver; extra == "test"
22
- Requires-Dist: pymupdf; extra == "test"
23
- Requires-Dist: openpyxl; extra == "test"
24
- Requires-Dist: google-auth; extra == "test"
25
- Requires-Dist: logfire; extra == "test"
26
- Requires-Dist: pymupdf4llm; extra == "test"
27
- Requires-Dist: sentence_transformers; extra == "test"
28
- Requires-Dist: tinynetrc; extra == "test"
29
- Requires-Dist: torchaudio; extra == "test"
30
- Requires-Dist: google-auth-httplib2; extra == "test"
31
- Requires-Dist: flet-video; extra == "test"
32
- Requires-Dist: Unidecode; extra == "test"
33
- Requires-Dist: uvicorn; extra == "test"
34
- Requires-Dist: pyyaml; extra == "test"
35
- Requires-Dist: transformers[sentencepiece]; extra == "test"
36
- Requires-Dist: pydantic-settings; extra == "test"
37
- Requires-Dist: openai; extra == "test"
38
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "test"
39
- Requires-Dist: pydantic; extra == "test"
40
- Requires-Dist: sre_yield; extra == "test"
41
- Requires-Dist: dask[bag]; extra == "test"
42
- Requires-Dist: tokenizers; extra == "test"
43
- Requires-Dist: huggingface_hub; extra == "test"
44
25
  Requires-Dist: pytest-cov; extra == "test"
45
- Requires-Dist: diskcache; extra == "test"
46
- Requires-Dist: json_repair; extra == "test"
47
- Requires-Dist: ollama; extra == "test"
48
- Requires-Dist: bokeh; extra == "test"
49
- Requires-Dist: google-auth-oauthlib; extra == "test"
50
- Requires-Dist: contexttimer; extra == "test"
51
- Requires-Dist: flet[all]; extra == "test"
52
- Requires-Dist: pydevd-pycharm; extra == "test"
53
- Requires-Dist: faker; extra == "test"
54
- Requires-Dist: docker; extra == "test"
55
- Requires-Dist: fastapi; extra == "test"
56
26
  Provides-Extra: yaml
27
+ Requires-Dist: yamlscript; extra == "yaml"
57
28
  Requires-Dist: pyyaml; extra == "yaml"
58
29
  Provides-Extra: logging
59
30
  Requires-Dist: logfire; extra == "logging"
60
- Requires-Dist: semver; extra == "logging"
61
31
  Provides-Extra: parallel
62
32
  Requires-Dist: dask[bag]; extra == "parallel"
63
33
  Requires-Dist: distributed; extra == "parallel"
@@ -69,15 +39,15 @@ Requires-Dist: faker; extra == "augmentation"
69
39
  Requires-Dist: sre_yield; extra == "augmentation"
70
40
  Provides-Extra: process
71
41
  Requires-Dist: logfire; extra == "process"
72
- Requires-Dist: semver; extra == "process"
73
42
  Provides-Extra: profiling
74
43
  Requires-Dist: contexttimer; extra == "profiling"
75
- Provides-Extra: docker-api
76
- Requires-Dist: docker; extra == "docker-api"
44
+ Provides-Extra: docker-client
45
+ Requires-Dist: python-on-whales; extra == "docker-client"
77
46
  Provides-Extra: unicode
78
47
  Requires-Dist: Unidecode; extra == "unicode"
79
48
  Provides-Extra: version
80
- Requires-Dist: semver; extra == "version"
49
+ Provides-Extra: version-dev
50
+ Requires-Dist: semver; extra == "version-dev"
81
51
  Provides-Extra: spaces
82
52
  Requires-Dist: tinynetrc; extra == "spaces"
83
53
  Provides-Extra: netrc
@@ -88,24 +58,31 @@ Provides-Extra: merging
88
58
  Requires-Dist: deepmerge; extra == "merging"
89
59
  Provides-Extra: api
90
60
  Requires-Dist: fastapi; extra == "api"
91
- Requires-Dist: uvicorn; extra == "api"
61
+ Requires-Dist: uvicorn[standard]; extra == "api"
92
62
  Requires-Dist: logfire; extra == "api"
93
- Requires-Dist: semver; extra == "api"
94
63
  Requires-Dist: pydantic; extra == "api"
64
+ Requires-Dist: pydantic-extra-types; extra == "api"
65
+ Requires-Dist: pycountry; extra == "api"
66
+ Requires-Dist: logfire[fastapi]; extra == "api"
95
67
  Provides-Extra: ai
96
68
  Requires-Dist: peft; extra == "ai"
97
69
  Requires-Dist: transformers[sentencepiece]; extra == "ai"
98
70
  Requires-Dist: torchvision; extra == "ai"
99
71
  Requires-Dist: torchaudio; extra == "ai"
100
72
  Requires-Dist: pydantic; extra == "ai"
73
+ Requires-Dist: pydantic-extra-types; extra == "ai"
74
+ Requires-Dist: pycountry; extra == "ai"
101
75
  Provides-Extra: dm
102
76
  Requires-Dist: pydantic; extra == "dm"
77
+ Requires-Dist: pydantic-extra-types; extra == "dm"
78
+ Requires-Dist: pycountry; extra == "dm"
103
79
  Provides-Extra: openai-api
104
80
  Requires-Dist: openai; extra == "openai-api"
105
81
  Provides-Extra: ai-client
106
82
  Requires-Dist: logfire; extra == "ai-client"
107
- Requires-Dist: semver; extra == "ai-client"
108
83
  Requires-Dist: pydantic; extra == "ai-client"
84
+ Requires-Dist: pydantic-extra-types; extra == "ai-client"
85
+ Requires-Dist: pycountry; extra == "ai-client"
109
86
  Requires-Dist: openai; extra == "ai-client"
110
87
  Requires-Dist: pydantic-ai[logfire,openai]; extra == "ai-client"
111
88
  Requires-Dist: ollama; extra == "ai-client"
@@ -116,21 +93,26 @@ Requires-Dist: sentence_transformers; extra == "semantic"
116
93
  Requires-Dist: pandas; extra == "semantic"
117
94
  Requires-Dist: tabulate; extra == "semantic"
118
95
  Requires-Dist: openpyxl; extra == "semantic"
96
+ Requires-Dist: odfpy; extra == "semantic"
97
+ Requires-Dist: deepdiff; extra == "semantic"
119
98
  Provides-Extra: metric
120
99
  Requires-Dist: pandas; extra == "metric"
121
100
  Requires-Dist: tabulate; extra == "metric"
122
101
  Requires-Dist: openpyxl; extra == "metric"
102
+ Requires-Dist: odfpy; extra == "metric"
103
+ Requires-Dist: deepdiff; extra == "metric"
123
104
  Provides-Extra: tabular
124
105
  Requires-Dist: pandas; extra == "tabular"
125
106
  Requires-Dist: tabulate; extra == "tabular"
126
107
  Requires-Dist: openpyxl; extra == "tabular"
108
+ Requires-Dist: odfpy; extra == "tabular"
109
+ Requires-Dist: deepdiff; extra == "tabular"
127
110
  Provides-Extra: html
128
111
  Requires-Dist: html2text; extra == "html"
129
112
  Provides-Extra: interface
130
113
  Requires-Dist: flet[all]; extra == "interface"
131
114
  Requires-Dist: flet-video; extra == "interface"
132
115
  Requires-Dist: flet-webview; extra == "interface"
133
- Requires-Dist: pydantic; extra == "interface"
134
116
  Provides-Extra: google-api
135
117
  Requires-Dist: google-auth; extra == "google-api"
136
118
  Requires-Dist: google-auth-oauthlib; extra == "google-api"
@@ -138,15 +120,155 @@ Requires-Dist: google-auth-httplib2; extra == "google-api"
138
120
  Requires-Dist: google-api-python-client; extra == "google-api"
139
121
  Provides-Extra: caching
140
122
  Requires-Dist: diskcache; extra == "caching"
123
+ Requires-Dist: cachetools; extra == "caching"
141
124
  Provides-Extra: pdf
142
125
  Requires-Dist: pymupdf; extra == "pdf"
143
126
  Requires-Dist: pydantic; extra == "pdf"
127
+ Requires-Dist: pydantic-extra-types; extra == "pdf"
128
+ Requires-Dist: pycountry; extra == "pdf"
144
129
  Requires-Dist: pymupdf4llm; extra == "pdf"
145
130
  Provides-Extra: debug
146
- Requires-Dist: pydevd-pycharm; extra == "debug"
131
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "debug"
147
132
  Provides-Extra: sets
148
133
  Requires-Dist: pydantic-settings; extra == "sets"
149
134
  Requires-Dist: pydantic; extra == "sets"
135
+ Requires-Dist: pydantic-extra-types; extra == "sets"
136
+ Requires-Dist: pycountry; extra == "sets"
137
+ Requires-Dist: yamlscript; extra == "sets"
138
+ Requires-Dist: pyyaml; extra == "sets"
139
+ Provides-Extra: path-app
140
+ Requires-Dist: appdirs; extra == "path-app"
141
+ Provides-Extra: path-type
142
+ Requires-Dist: filetype; extra == "path-type"
143
+ Provides-Extra: dns
144
+ Requires-Dist: dnspython[doh]; extra == "dns"
145
+ Requires-Dist: httpx; extra == "dns"
146
+ Requires-Dist: httpx_retries; extra == "dns"
147
+ Requires-Dist: logfire; extra == "dns"
148
+ Requires-Dist: logfire[httpx]; extra == "dns"
149
+ Provides-Extra: patterns
150
+ Requires-Dist: regex; extra == "patterns"
151
+ Provides-Extra: http
152
+ Requires-Dist: httpx; extra == "http"
153
+ Requires-Dist: httpx_retries; extra == "http"
154
+ Requires-Dist: logfire; extra == "http"
155
+ Requires-Dist: logfire[httpx]; extra == "http"
156
+ Provides-Extra: setup
157
+ Requires-Dist: setuptools; extra == "setup"
158
+ Provides-Extra: webhook
159
+ Requires-Dist: httpx; extra == "webhook"
160
+ Requires-Dist: httpx_retries; extra == "webhook"
161
+ Requires-Dist: logfire; extra == "webhook"
162
+ Requires-Dist: logfire[httpx]; extra == "webhook"
163
+ Provides-Extra: browsers
164
+ Requires-Dist: playwright; extra == "browsers"
165
+ Provides-Extra: db
166
+ Provides-Extra: db-document
167
+ Requires-Dist: beanie[odm]; extra == "db-document"
168
+ Provides-Extra: mqtt
169
+ Requires-Dist: aiomqtt; extra == "mqtt"
170
+ Provides-Extra: av
171
+ Requires-Dist: av; extra == "av"
172
+ Provides-Extra: ha
173
+ Requires-Dist: dotenv; extra == "ha"
174
+ Provides-Extra: ha-api
175
+ Requires-Dist: dotenv; extra == "ha-api"
176
+ Requires-Dist: homeassistant_api; extra == "ha-api"
177
+ Requires-Dist: aiohasupervisor; extra == "ha-api"
178
+ Provides-Extra: doc
179
+ Requires-Dist: mkdocs; extra == "doc"
180
+ Requires-Dist: mkdocs-material; extra == "doc"
181
+ Requires-Dist: mkdocstrings[python]; extra == "doc"
182
+ Requires-Dist: mike; extra == "doc"
183
+ Requires-Dist: mkdocs-include-dir-to-nav; extra == "doc"
184
+ Provides-Extra: youtube
185
+ Requires-Dist: pytubefix; extra == "youtube"
186
+ Provides-Extra: deploy
187
+ Requires-Dist: setuptools; extra == "deploy"
188
+ Requires-Dist: mkdocs; extra == "deploy"
189
+ Requires-Dist: mkdocs-material; extra == "deploy"
190
+ Requires-Dist: mkdocstrings[python]; extra == "deploy"
191
+ Requires-Dist: mike; extra == "deploy"
192
+ Requires-Dist: mkdocs-include-dir-to-nav; extra == "deploy"
193
+ Requires-Dist: build; extra == "deploy"
194
+ Requires-Dist: twine; extra == "deploy"
195
+ Requires-Dist: packaging; extra == "deploy"
196
+ Provides-Extra: all
197
+ Requires-Dist: deepmerge; extra == "all"
198
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
199
+ Requires-Dist: huggingface_hub; extra == "all"
200
+ Requires-Dist: google-auth-httplib2; extra == "all"
201
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
202
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
203
+ Requires-Dist: json_repair; extra == "all"
204
+ Requires-Dist: flet-video; extra == "all"
205
+ Requires-Dist: distributed; extra == "all"
206
+ Requires-Dist: flet-webview; extra == "all"
207
+ Requires-Dist: google-api-python-client; extra == "all"
208
+ Requires-Dist: setuptools; extra == "all"
209
+ Requires-Dist: torchvision; extra == "all"
210
+ Requires-Dist: httpx_retries; extra == "all"
211
+ Requires-Dist: logfire[httpx]; extra == "all"
212
+ Requires-Dist: ollama; extra == "all"
213
+ Requires-Dist: dnspython[doh]; extra == "all"
214
+ Requires-Dist: logfire; extra == "all"
215
+ Requires-Dist: filetype; extra == "all"
216
+ Requires-Dist: aiomqtt; extra == "all"
217
+ Requires-Dist: dask[bag]; extra == "all"
218
+ Requires-Dist: tokenizers; extra == "all"
219
+ Requires-Dist: semver; extra == "all"
220
+ Requires-Dist: aiohasupervisor; extra == "all"
221
+ Requires-Dist: pymupdf; extra == "all"
222
+ Requires-Dist: pytest-cov; extra == "all"
223
+ Requires-Dist: pydantic-settings; extra == "all"
224
+ Requires-Dist: mike; extra == "all"
225
+ Requires-Dist: packaging; extra == "all"
226
+ Requires-Dist: diskcache; extra == "all"
227
+ Requires-Dist: yamlscript; extra == "all"
228
+ Requires-Dist: peft; extra == "all"
229
+ Requires-Dist: torchaudio; extra == "all"
230
+ Requires-Dist: faker; extra == "all"
231
+ Requires-Dist: bokeh; extra == "all"
232
+ Requires-Dist: deepdiff; extra == "all"
233
+ Requires-Dist: python-on-whales; extra == "all"
234
+ Requires-Dist: tabulate; extra == "all"
235
+ Requires-Dist: dotenv; extra == "all"
236
+ Requires-Dist: openai; extra == "all"
237
+ Requires-Dist: pycountry; extra == "all"
238
+ Requires-Dist: odfpy; extra == "all"
239
+ Requires-Dist: homeassistant_api; extra == "all"
240
+ Requires-Dist: sentence_transformers; extra == "all"
241
+ Requires-Dist: mkdocs-include-dir-to-nav; extra == "all"
242
+ Requires-Dist: logfire[fastapi]; extra == "all"
243
+ Requires-Dist: google-auth; extra == "all"
244
+ Requires-Dist: build; extra == "all"
245
+ Requires-Dist: fastapi; extra == "all"
246
+ Requires-Dist: tinynetrc; extra == "all"
247
+ Requires-Dist: av; extra == "all"
248
+ Requires-Dist: contexttimer; extra == "all"
249
+ Requires-Dist: pyyaml; extra == "all"
250
+ Requires-Dist: google-auth-oauthlib; extra == "all"
251
+ Requires-Dist: appdirs; extra == "all"
252
+ Requires-Dist: html2text; extra == "all"
253
+ Requires-Dist: openpyxl; extra == "all"
254
+ Requires-Dist: mkdocstrings[python]; extra == "all"
255
+ Requires-Dist: regex; extra == "all"
256
+ Requires-Dist: mkdocs; extra == "all"
257
+ Requires-Dist: Unidecode; extra == "all"
258
+ Requires-Dist: pandas; extra == "all"
259
+ Requires-Dist: sre_yield; extra == "all"
260
+ Requires-Dist: pydantic-extra-types; extra == "all"
261
+ Requires-Dist: pytubefix; extra == "all"
262
+ Requires-Dist: flet[all]; extra == "all"
263
+ Requires-Dist: playwright; extra == "all"
264
+ Requires-Dist: pymupdf4llm; extra == "all"
265
+ Requires-Dist: httpx; extra == "all"
266
+ Requires-Dist: mkdocs-material; extra == "all"
267
+ Requires-Dist: beanie[odm]; extra == "all"
268
+ Requires-Dist: twine; extra == "all"
269
+ Requires-Dist: uvicorn[standard]; extra == "all"
270
+ Requires-Dist: pydantic; extra == "all"
271
+ Requires-Dist: cachetools; extra == "all"
150
272
  Dynamic: author
151
273
  Dynamic: author-email
152
274
  Dynamic: description
@@ -284,6 +406,8 @@ The included modules, plus any extra requirements, are as follows:
284
406
  -
285
407
  `tools.PackagePaths` class for managing canonical package paths, like settings files, artifact directories, version files.
286
408
  - Extras: None
409
+ - `tools.AppPaths` Wrapper around `appdirs` for application paths.
410
+ - Extras: `paths.app`
287
411
  - `tools.platform`: Detecting if host is WSL, Docker etc.
288
412
  - Extras: None
289
413
  - `tools.ContextProcess`: Manages a function running in a separate process using a context manager. Provides methods to start, stop, and restart the process, with configurable restart delays. Useful for ensuring clean process management and automatic stopping when the context manager exits.
@@ -0,0 +1,122 @@
1
+ fmtr/tools/__init__.py,sha256=RPK4tMye_0jpH8Jjs7HaXfyrK8fb13-Phsrb2a3_US0,6471
2
+ fmtr/tools/api_tools.py,sha256=ltSn66kMH93zgBq5Yobiw9dENdCzduYzPKnVc9IV6yk,3441
3
+ fmtr/tools/async_tools.py,sha256=p6_rJEu8iY5i1MCuq6vHfGv24Ql-rfkW1L6Etsa7kNY,340
4
+ fmtr/tools/augmentation_tools.py,sha256=-6ESbO4CDlKqVOV1J1V6qBeoBMzbFIinkDHRHnCBej0,55
5
+ fmtr/tools/av_tools.py,sha256=0kmhdm0kwIWrAsMSrXl5aLxFFa0e3ypzybDYg9nvF7M,97
6
+ fmtr/tools/caching_tools.py,sha256=74p7m2GLFfeP41LX69wxgfkilxEAoWkMIfFMjKsYpyg,4976
7
+ fmtr/tools/constants.py,sha256=IXow6TDSFVSknOJrL5VcAJsTTmzF6o5FRN7lc_clRtg,2071
8
+ fmtr/tools/context_tools.py,sha256=4UvIHYgLqAh7dXMX9EBrLEpYp81qfzhSVrkffOSAoGA,350
9
+ fmtr/tools/data_modelling_tools.py,sha256=c703EhL2ZIj5iN0wjuohakvUnElRblQhvFSLyfRTWwA,7416
10
+ fmtr/tools/dataclass_tools.py,sha256=0Gt6KeLhtPgubo_2tYkIVqB8oQ91Qzag8OAGZDdjvMU,1209
11
+ fmtr/tools/datatype_tools.py,sha256=V-SeE4fkDJ1rtNha6kJBupJ7lW4t2XOs3bUoSk3RQv0,1989
12
+ fmtr/tools/datetime_tools.py,sha256=L7wmBoQbD9h_pJIL92WQOX32r_vrXgRvE-_0PVPRAGY,232
13
+ fmtr/tools/debugging_tools.py,sha256=q1TXISwOD43uc5RQrXqDSKYbNZh4AiheVmBUfga-EsA,2085
14
+ fmtr/tools/environment_tools.py,sha256=fPMNgITuc8l866i4s6EnXDmi0gc4CmM5EudC8feojK0,1913
15
+ fmtr/tools/function_tools.py,sha256=O1K8HwftXfzrBblNZrj-BhWNbr4poJghrXNr2mFcylI,2831
16
+ fmtr/tools/google_api_tools.py,sha256=QUungBoj5SCaBQnMjn9QpXtWmdNCplbw8ZPK9LXi77U,1691
17
+ fmtr/tools/hash_tools.py,sha256=tr4HXpeT6rRrDk6TvMlRPUSrLRRaov96y128OI2tzsc,729
18
+ fmtr/tools/hfh_tools.py,sha256=DCDIWuWlhtmIGCtp9cLcOTTEw_4yN_NocLX8w5NZsbk,2384
19
+ fmtr/tools/html_tools.py,sha256=0nN8Nz5HtG9bXyApYfHSKEivLlxjsm3Gn6Mg2TK0brI,394
20
+ fmtr/tools/http_tools.py,sha256=nhPL1sfQzUBZ025CdMv_23k8wYkXMQlNG298Q450PLA,985
21
+ fmtr/tools/import_tools.py,sha256=XJmiWLukRncJAcaGReDn4jIz1_IpVBjfYCQHH1hIg7c,588
22
+ fmtr/tools/inherit_tools.py,sha256=gTGL4mRm5RsbFW76s25AbuAJ2vlymbh1c8Q4Hl2uJGU,646
23
+ fmtr/tools/inspection_tools.py,sha256=tLTRvzy9XVomQPi0dfnF_cgwc7KiDVZAr7gPTk4S_bQ,278
24
+ fmtr/tools/iterator_tools.py,sha256=dnweDOKrQZdMb3aSbplPg8_gdpLicrFoVwVOnpeyrDw,3771
25
+ fmtr/tools/json_fix_tools.py,sha256=vNSlswVQnujPmKEqDjFJcO901mjMyv59q3awsT7mlhs,477
26
+ fmtr/tools/json_tools.py,sha256=WkFc5q7oqMtcFejhN1K5zQFULa9TdLOup83Fr0saDRY,348
27
+ fmtr/tools/logging_tools.py,sha256=F8amUNu2xWYez23tMpOqJxp-UcDP421_zG46kBt8B0E,3444
28
+ fmtr/tools/merging_tools.py,sha256=KDxCEFJEQJEwGw1qGKAgR55uUE2X2S5NWLKcfHRmX_k,227
29
+ fmtr/tools/metric_tools.py,sha256=Lvia5CGFRIfrDFA8s37btIfTU5zHbo04cPJdAMtbndQ,272
30
+ fmtr/tools/mqtt_tools.py,sha256=ySUUcOVdRY3Sk1fCjXCpNe5VcllAECzqi4spLg-NR8o,2137
31
+ fmtr/tools/name_tools.py,sha256=5CB_phqhHjl66iI8oLxOGPF2odC1apdul-M8Fv2xBhs,5514
32
+ fmtr/tools/netrc_tools.py,sha256=PpNpz_mWlQi6VHGromKwFfTyLpHUXsd4LY6-OKLCbeI,376
33
+ fmtr/tools/networking_tools.py,sha256=emrJoBBD805arXteSTcDkOrnAllgKA6hkiBBFfD8JYg,1464
34
+ fmtr/tools/openai_tools.py,sha256=6SUgejgzUzmlKKct2_ePXntvMegu3FJgfk9x7aqtqYc,742
35
+ fmtr/tools/packaging_tools.py,sha256=FlgOTnDRHZWQL2iR-wucTsyGEHRE-MlddKL30MPmUqE,253
36
+ fmtr/tools/parallel_tools.py,sha256=QEb_gN1StkxsqYaH4HSjiJX8Y3gpb2uKNsOzG4uFpaM,3071
37
+ fmtr/tools/pattern_tools.py,sha256=VQ5wmZdS-NAlKmQg6KK12ovQIhiiPQVJm55uIXR3Dc4,6659
38
+ fmtr/tools/pdf_tools.py,sha256=6XQCNyytQSnJSc38gdMOFVcPXnPwfOlk6y4QVqmJLp8,4810
39
+ fmtr/tools/platform_tools.py,sha256=7p69CmAHe_sF68Fx9uVhns1k5EewTHTWgUYzkl6ZQKA,308
40
+ fmtr/tools/process_tools.py,sha256=Ysh5Dk2QFBhXQerArjKdt7xZd3JrN5Ho02AaOjH0Nnw,1425
41
+ fmtr/tools/profiling_tools.py,sha256=jpXVjaNKPydTasEQVNXvxzGtMhXPit08AnJddkU8uIc,46
42
+ fmtr/tools/random_tools.py,sha256=4VlQdk5THbR8ka4pZaLbk_ZO_4yy6PF_lHZes_rgenY,2223
43
+ fmtr/tools/semantic_tools.py,sha256=cxY9NSAHWj4nEc6Oj4qA1omR3dWbl2OuH7_PkINc6_E,1386
44
+ fmtr/tools/settings_tools.py,sha256=fkHQ1VTc4s0Ulm9hUGDV6DWOzfeCGJ6VX0rNcxw3464,2599
45
+ fmtr/tools/spaces_tools.py,sha256=D_he3mve6DruB3OPS6QyzqD05ChHnRTb4buViKPe7To,1099
46
+ fmtr/tools/string_tools.py,sha256=ZKHBrl2tui9VjWt7qit4UWbvpuzY6zp5ytiQvhlJVG4,5610
47
+ fmtr/tools/tabular_tools.py,sha256=mw6vOij1Ch-pVAyHMPtm5zj__ULZN_TKeBYOfj33wFM,1634
48
+ fmtr/tools/tokenization_tools.py,sha256=me-IBzSLyNYejLybwjO9CNB6Mj2NYfKPaOVThXyaGNg,4268
49
+ fmtr/tools/tools.py,sha256=sLMXk8juOL8_n_D776cJ-kzjyMHqFI_fctDEjy6PIKs,1115
50
+ fmtr/tools/unicode_tools.py,sha256=yS_9wpu8ogNoiIL7s1G_8bETFFO_YQlo4LNPv1NLDeY,52
51
+ fmtr/tools/version,sha256=Xp4FNom2jzlPk0gOc5UnCGbGlm-HVfZHCd_1__O5YpI,6
52
+ fmtr/tools/webhook_tools.py,sha256=q3pVJ1NCem2SrMuFcLxiWd7DibFs7Q-uGtojfXd3Qcg,380
53
+ fmtr/tools/yaml_tools.py,sha256=CxS1YLu2zJyt6ovqspzbIBK_M0wJjRVG2kvTmkVRtcE,1846
54
+ fmtr/tools/youtube_tools.py,sha256=siGdgsuOIR87oHFK2tt7oRniPedT2ugDNEvX4MX_ap8,3180
55
+ fmtr/tools/ai_tools/__init__.py,sha256=O8VRlPnnQCncg2ZZ2l_VdWLJf4jkKH6dkZFVbv6o7IM,388
56
+ fmtr/tools/ai_tools/agentic_tools.py,sha256=Zj6WcbDc1yLFi3raTSD0BeOkWR3l5RmmccFYGx8-0XE,5534
57
+ fmtr/tools/ai_tools/inference_tools.py,sha256=2UP2gXEyOJUjyyV6zmFIYmIxUsh1rXkRH0IbFvr2bRs,11908
58
+ fmtr/tools/database_tools/__init__.py,sha256=-YXEs3P4nwg7hdvALpaW4K2Pg9FIc49rD53smqnBgT4,221
59
+ fmtr/tools/database_tools/document.py,sha256=wn1JPqFiplRx16qUgOs2tWtEZGaT4L99CTjp_MhpjqY,1198
60
+ fmtr/tools/dns_tools/__init__.py,sha256=HP0Qcwyi1C6vBH_ejuWrGJOWdp-GZ_cmH-QofjD6Mmg,266
61
+ fmtr/tools/dns_tools/client.py,sha256=IBbd7Xgx9ExTn_EPoL7ts9JfXokHHuOiD9m4K6tl1Q0,2817
62
+ fmtr/tools/dns_tools/dm.py,sha256=Lp1HaF7rpVtL_Ji4Bd32B29105H9ZKQ8AcVj_AB7nsA,6678
63
+ fmtr/tools/dns_tools/proxy.py,sha256=gCWfH1pyWjj8xnJ8Pm4id7bsBWqcar3dQ9PeP5XjRXY,1624
64
+ fmtr/tools/dns_tools/server.py,sha256=_Y5w5bGHhBI32fYWl-SmnOALAw_eF9fEbmrOqqgzSq8,4263
65
+ fmtr/tools/docker_tools/__init__.py,sha256=NzUFbOX3eQCJ9ex0YL7xZPKLb65HngvZCBRTz839A8Y,222
66
+ fmtr/tools/entrypoints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
+ fmtr/tools/entrypoints/cache_hfh.py,sha256=fQNs4J9twQuZH_Yj98-oOvEX7-LrSUP3kO8nzw2HrHs,60
68
+ fmtr/tools/entrypoints/ep_test.py,sha256=B8HfWISfSgw_xVX475CbJGh_QnpOe9MH65H8qGjTWbY,46
69
+ fmtr/tools/entrypoints/install_yamlscript.py,sha256=D9-QET4uPkwMvOBQJAgzn1fYb7Z7VAgZzFdHSAXc3Qc,116
70
+ fmtr/tools/entrypoints/remote_debug_test.py,sha256=wmKg9o2pQq7eqeHmaO8oviujNgtnsCVEXOdXLIcQWs4,123
71
+ fmtr/tools/entrypoints/shell_debug.py,sha256=0No3tAg9Ri4_vvSlQCUtAY-11HR0nE45i0VVtiAViwY,106
72
+ fmtr/tools/ha_tools/__init__.py,sha256=aHXaEjAXhxFbatU6P07qDgf1gA2I2SnJYk8m-laOX70,323
73
+ fmtr/tools/ha_tools/constants.py,sha256=_W_X9NCjW40MofUFwOpUokOUTlxOv7wOqv5pttJUDiQ,346
74
+ fmtr/tools/ha_tools/core.py,sha256=q0iRuTlv71I9_UrNsuAAEdCBZCa4VmuW3WvVBG-vJRM,424
75
+ fmtr/tools/ha_tools/supervisor.py,sha256=t3m0J7vaveWKefRSoB-_Rum9QmHFi9MRVqZ5dx7ABC4,437
76
+ fmtr/tools/ha_tools/utils.py,sha256=tI-GJp2AIDOwTZ30hzMYaofJ5LckZsdCmbhOjKoV95s,1220
77
+ fmtr/tools/interface_tools/__init__.py,sha256=_bgZRTqmygtYM75o6_zyQRhT_XZnDERZEHmsYVrzyxw,393
78
+ fmtr/tools/interface_tools/context.py,sha256=VpoR_ZCndDbwS0AzIPKi1hB2QckwJU5dJqAJavF3mqk,151
79
+ fmtr/tools/interface_tools/controls.py,sha256=8cI7Jq4SsxRUD1CFVwQRAr4Ci6GSqyfQ5RDZqmPId2w,7673
80
+ fmtr/tools/interface_tools/interface_tools.py,sha256=jSRwpdHqOTmNLndE-wFqTQdkT4z2BBdclSxmvs11FnU,4400
81
+ fmtr/tools/path_tools/__init__.py,sha256=6KE0XnFNoEGGxjA1rzFXHHJz_xdAsqYOIpbWhgWVUA8,465
82
+ fmtr/tools/path_tools/app_path_tools.py,sha256=JrJvtTDd_gkCKcZtBCDTMktsM77PZwGV_hzQX0g5GU8,1722
83
+ fmtr/tools/path_tools/path_tools.py,sha256=uHquWrtJTzMH-0_i1Zv5JYWOM653G0PT1RynxTjI4DY,10230
84
+ fmtr/tools/path_tools/type_path_tools.py,sha256=Zgs-ek-GXRKDIlVDGdg3muB0PIxTg2ba0NeHw6y8FWQ,40
85
+ fmtr/tools/setup_tools/__init__.py,sha256=Ro_Qj3Xndv8Z68DeWPI7c6X-aWKsdDm0KcX_k1xDhgE,394
86
+ fmtr/tools/setup_tools/setup_tools.py,sha256=X1_NwLLSvpIoNhvenByOqQy-NxkGJTCG4U7-eagxcb0,11613
87
+ fmtr/tools/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
+ fmtr/tools/tests/conftest.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
+ fmtr/tools/tests/helpers.py,sha256=N5sf9YoZV93a7tf_UxpLeyQ9vp6Ec0teNIimFDvc054,1091
90
+ fmtr/tools/tests/test_datatype.py,sha256=C04m_qFuDT239K1OyYzBQ3ImNtR-5l5kKH4GUrRM9kQ,790
91
+ fmtr/tools/tests/test_environment.py,sha256=iHaiMQfECYZPkPKwfuIZV9uHuWe3aE-p_dN_PWmmhnA,2167
92
+ fmtr/tools/tests/test_json.py,sha256=IeSP4ziPvRcmS8kq7k9tHonC9rN5YYq9GSNT2ul6Msk,287
93
+ fmtr/tools/tests/test_path.py,sha256=AkZQa6_8BQ-VaCyL_J-iKmdf2ZaM-xFYR37Kun3k4_g,2188
94
+ fmtr/tools/tests/test_yaml.py,sha256=jc0TwwKu9eC0LvFGNMERdgBue591xwLxYXFbtsRwXVM,287
95
+ fmtr/tools/version_tools/__init__.py,sha256=cjE6nO6AoVOUp3RwgTbqL9wiw8J1l2pHJOz6Gn6bxjA,326
96
+ fmtr/tools/version_tools/version_tools.py,sha256=Hcc6yferZS1hHbugRTdiHhSNmXEEG0hjCiTTXKna-YY,1127
97
+ fmtr_tools-1.4.37.data/scripts/add-service,sha256=H75Ar4s6_Vdqd9Cr3UIMlSX49mz-Gr2KW6oA6lnrOHM,290
98
+ fmtr_tools-1.4.37.data/scripts/add-user-path,sha256=yFeTqid65bzEh6h1QITM7VAXvmJpCXIuSgx7UNZ_rNs,179
99
+ fmtr_tools-1.4.37.data/scripts/apt-headless,sha256=UgiAS_HNWvt8VSrZHLZEnUsccIKTBLfnFvK0jLtCtQM,476
100
+ fmtr_tools-1.4.37.data/scripts/compose-update,sha256=57hbBPyKzaZA784KPjSzP02ONAxMbasbDIeWzTtXLzE,373
101
+ fmtr_tools-1.4.37.data/scripts/docker-sandbox,sha256=hdVTZJ55e0mXgJOL2_DzimhvIZOao2AZVgVNoy9nG-s,1006
102
+ fmtr_tools-1.4.37.data/scripts/docker-sandbox-init,sha256=rWoAS7BpmHiEvKtoa9K3iUHq1GOm2d7BvVFmxkzbrz4,521
103
+ fmtr_tools-1.4.37.data/scripts/docs-deploy,sha256=1hRVLYHiIiWS87vos6Gh4RM6jbLEX7Ed7qtPJtGNSAk,79
104
+ fmtr_tools-1.4.37.data/scripts/docs-serve,sha256=991oeXnSW4xXY-4lYb6SfMQAqsyHF7D1la3JHDyiTm8,97
105
+ fmtr_tools-1.4.37.data/scripts/download,sha256=-0wRlrAhtdLNJDOXe5VLEMZVT-jcoTHCeY81gyL9Yi4,183
106
+ fmtr_tools-1.4.37.data/scripts/fmtr-test-script,sha256=pnw2O9DmxpKZgUqZCSj_Ns4De2cO3TgkdMqDuDBK43I,35
107
+ fmtr_tools-1.4.37.data/scripts/ftu,sha256=LLiSWiHW99wT8C3fJazyLSi78vyD_ULcD3CaSjDfR9U,45
108
+ fmtr_tools-1.4.37.data/scripts/ha-addon-launch,sha256=ZH42DhRvJK_YCiLyZrq3IWT6K-LedDJCXwPO193Ibrw,463
109
+ fmtr_tools-1.4.37.data/scripts/install-browser,sha256=fYUCBNlh6AqSitclIZaj6WzdMyGpxvrMcrXVsnyOxEY,259
110
+ fmtr_tools-1.4.37.data/scripts/parse-args,sha256=usIyri0EndDmdpR6lfJVJdGdTNqZHLpneeOOYrkejNw,822
111
+ fmtr_tools-1.4.37.data/scripts/set-password,sha256=1RXgEE2bWFhDFd3VGuxjXv4STEBxj7yQXxuTRxj5dFM,88
112
+ fmtr_tools-1.4.37.data/scripts/snips-install,sha256=fpWDjbU4AisJpQf-UGESRrigYM7zajNEMmzmzM1vQiU,325
113
+ fmtr_tools-1.4.37.data/scripts/ssh-auth,sha256=grW_Rk68yuiomPd_kPuoTnWAOnfrcBAuIFLn5DZTD0Y,531
114
+ fmtr_tools-1.4.37.data/scripts/ssh-serve,sha256=ZI4Ar5eL771xk0DVjoNsVKaKVPtL9S0GNYyGiptI5Is,435
115
+ fmtr_tools-1.4.37.data/scripts/vlc-tn,sha256=4JBMACTqN5u5eH9SSuf-SLqdacX_tN8MeXOqYA-2rrE,273
116
+ fmtr_tools-1.4.37.data/scripts/vm-launch,sha256=RhQxKaTryX4xj8edRpdxhh3yMIoOgqX_SUI6okMa-JU,527
117
+ fmtr_tools-1.4.37.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
118
+ fmtr_tools-1.4.37.dist-info/METADATA,sha256=byzFOQUakbhGQpelFJ72umE-70nq54GgaxIFssqRX5E,19600
119
+ fmtr_tools-1.4.37.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
120
+ fmtr_tools-1.4.37.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
121
+ fmtr_tools-1.4.37.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
122
+ fmtr_tools-1.4.37.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,6 @@
1
+ [console_scripts]
2
+ fmtr-tools-cache-hfh = fmtr.tools.entrypoints.cache_hfh:main
3
+ fmtr-tools-ep-test = fmtr.tools.entrypoints.ep_test:main
4
+ fmtr-tools-install-yamlscript = fmtr.tools.entrypoints.install_yamlscript:main
5
+ fmtr-tools-remote-debug-test = fmtr.tools.entrypoints.remote_debug_test:main
6
+ fmtr-tools-shell-debug = fmtr.tools.entrypoints.shell_debug:main
@@ -0,0 +1 @@
1
+ fmtr
@@ -1,30 +0,0 @@
1
- import contextlib
2
- import docker
3
-
4
-
5
- @contextlib.contextmanager
6
- def Container(image, ports=None, name=None, **kwargs):
7
- """
8
-
9
- Run a Docker container in a context manager
10
-
11
- """
12
- client = docker.from_env()
13
-
14
- try:
15
- container = client.containers.get(name)
16
- container.stop()
17
- container.remove()
18
- except docker.errors.NotFound:
19
- pass
20
-
21
- ports = {f'{port}/tcp': port for port in ports}
22
- container = client.containers.run(image, ports=ports, detach=True, name=name, **kwargs)
23
-
24
- try:
25
- yield container
26
- finally:
27
- container.stop()
28
- container.remove()
29
-
30
-
@@ -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,62 +0,0 @@
1
- from fmtr.tools.import_tools import MissingExtraMockModule
2
- from fmtr.tools.inspection_tools import get_call_path
3
-
4
- try:
5
- import semver
6
-
7
- semver = semver
8
- parse = semver.VersionInfo.parse
9
- except ImportError as exception:
10
- # Special case to allow module import.
11
- # Should be slit out into separate version.dev subpackage
12
- parse = MissingExtraMockModule('version', exception)
13
- semver = MissingExtraMockModule('version', exception)
14
-
15
-
16
- def read() -> str:
17
- """
18
-
19
- Read a generic version file from the calling package path.
20
-
21
- """
22
-
23
- path = get_call_path(offset=2).parent / 'version'
24
- return read_path(path)
25
-
26
-
27
- def read_path(path) -> str:
28
- """
29
-
30
- Read in version from specified path
31
-
32
- """
33
- from fmtr.tools.tools import Constants
34
- text = path.read_text(encoding=Constants.ENCODING).strip()
35
-
36
- text = get(text)
37
- return text
38
-
39
-
40
- def get(text) -> str:
41
- """
42
-
43
- Optionally add dev build info to raw version string.
44
-
45
- """
46
- import os
47
- from fmtr.tools import datatype_tools
48
-
49
- is_dev = datatype_tools.to_bool(os.getenv('FMTR_DEV', default=False))
50
-
51
- if is_dev:
52
- import datetime
53
- from fmtr.tools.tools import Constants
54
-
55
- timestamp = datetime.datetime.now(datetime.timezone.utc).strftime(Constants.DATETIME_SEMVER_BUILD_FORMAT)
56
-
57
- version = parse(text)
58
- version = version.bump_patch()
59
- version = version.replace(prerelease='dev', build=timestamp)
60
- text = str(version)
61
-
62
- return text