fmtr.tools 1.3.50__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.

Files changed (100) hide show
  1. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/PKG-INFO +50 -50
  2. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/interface_tools/__init__.py +1 -1
  3. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/interface_tools/interface_tools.py +55 -60
  4. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/logging_tools.py +10 -1
  5. fmtr_tools-1.3.52/fmtr/tools/version +1 -0
  6. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/PKG-INFO +50 -50
  7. fmtr_tools-1.3.50/fmtr/tools/version +0 -1
  8. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/LICENSE +0 -0
  9. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/README.md +0 -0
  10. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/__init__.py +0 -0
  11. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/ai_tools/__init__.py +0 -0
  12. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  13. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  14. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/api_tools.py +0 -0
  15. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/async_tools.py +0 -0
  16. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/augmentation_tools.py +0 -0
  17. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/caching_tools.py +0 -0
  18. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/constants.py +0 -0
  19. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/context_tools.py +0 -0
  20. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/data_modelling_tools.py +0 -0
  21. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/database_tools/__init__.py +0 -0
  22. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/database_tools/document.py +0 -0
  23. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/dataclass_tools.py +0 -0
  24. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/datatype_tools.py +0 -0
  25. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/datetime_tools.py +0 -0
  26. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/debugging_tools.py +0 -0
  27. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/dns_tools/__init__.py +0 -0
  28. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/dns_tools/client.py +0 -0
  29. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/dns_tools/dm.py +0 -0
  30. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/dns_tools/proxy.py +0 -0
  31. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/dns_tools/server.py +0 -0
  32. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/docker_tools.py +0 -0
  33. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/__init__.py +0 -0
  34. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  35. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/ep_test.py +0 -0
  36. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  37. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  38. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  39. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/environment_tools.py +0 -0
  40. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/function_tools.py +0 -0
  41. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/google_api_tools.py +0 -0
  42. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/hash_tools.py +0 -0
  43. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/hfh_tools.py +0 -0
  44. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/html_tools.py +0 -0
  45. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/http_tools.py +0 -0
  46. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/import_tools.py +0 -0
  47. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/inherit_tools.py +0 -0
  48. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/inspection_tools.py +0 -0
  49. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/interface_tools/context.py +0 -0
  50. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/interface_tools/controls.py +0 -0
  51. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/iterator_tools.py +0 -0
  52. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/json_fix_tools.py +0 -0
  53. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/json_tools.py +0 -0
  54. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/merging_tools.py +0 -0
  55. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/metric_tools.py +0 -0
  56. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/name_tools.py +0 -0
  57. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/netrc_tools.py +0 -0
  58. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/openai_tools.py +0 -0
  59. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/packaging_tools.py +0 -0
  60. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/parallel_tools.py +0 -0
  61. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/path_tools/__init__.py +0 -0
  62. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  63. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/path_tools/path_tools.py +0 -0
  64. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  65. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/pattern_tools.py +0 -0
  66. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/pdf_tools.py +0 -0
  67. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/platform_tools.py +0 -0
  68. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/process_tools.py +0 -0
  69. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/profiling_tools.py +0 -0
  70. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/random_tools.py +0 -0
  71. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/semantic_tools.py +0 -0
  72. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/settings_tools.py +0 -0
  73. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/setup_tools/__init__.py +0 -0
  74. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/setup_tools/setup_tools.py +0 -0
  75. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/spaces_tools.py +0 -0
  76. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/string_tools.py +0 -0
  77. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tabular_tools.py +0 -0
  78. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tests/__init__.py +0 -0
  79. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tests/conftest.py +0 -0
  80. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tests/helpers.py +0 -0
  81. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tests/test_datatype.py +0 -0
  82. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tests/test_environment.py +0 -0
  83. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tests/test_json.py +0 -0
  84. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tests/test_path.py +0 -0
  85. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tests/test_yaml.py +0 -0
  86. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tokenization_tools.py +0 -0
  87. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/tools.py +0 -0
  88. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/unicode_tools.py +0 -0
  89. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/version_tools/__init__.py +0 -0
  90. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/version_tools/version_tools.py +0 -0
  91. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/webhook_tools.py +0 -0
  92. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr/tools/yaml_tools.py +0 -0
  93. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  94. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  95. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/entry_points.txt +0 -0
  96. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/requires.txt +49 -49
  97. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/fmtr.tools.egg-info/top_level.txt +0 -0
  98. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/pyproject.toml +0 -0
  99. {fmtr_tools-1.3.50 → fmtr_tools-1.3.52}/setup.cfg +0 -0
  100. {fmtr_tools-1.3.50 → 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.50
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: flet[all]; extra == "all"
158
- Requires-Dist: regex; extra == "all"
157
+ Requires-Dist: bokeh; extra == "all"
159
158
  Requires-Dist: distributed; extra == "all"
160
- Requires-Dist: tokenizers; extra == "all"
161
- Requires-Dist: pydantic-extra-types; extra == "all"
162
- Requires-Dist: transformers[sentencepiece]; extra == "all"
163
- Requires-Dist: sentence_transformers; extra == "all"
164
- Requires-Dist: json_repair; extra == "all"
165
- Requires-Dist: Unidecode; extra == "all"
166
- Requires-Dist: google-auth; extra == "all"
167
- Requires-Dist: pydantic-settings; extra == "all"
168
- Requires-Dist: flet-video; extra == "all"
169
- Requires-Dist: fastapi; extra == "all"
170
- Requires-Dist: pyyaml; extra == "all"
171
- Requires-Dist: huggingface_hub; extra == "all"
172
- Requires-Dist: dnspython[doh]; extra == "all"
173
159
  Requires-Dist: motor; extra == "all"
174
- Requires-Dist: semver; extra == "all"
160
+ Requires-Dist: faker; extra == "all"
161
+ Requires-Dist: peft; extra == "all"
175
162
  Requires-Dist: openai; extra == "all"
176
- Requires-Dist: logfire[fastapi]; extra == "all"
177
163
  Requires-Dist: pandas; extra == "all"
178
- Requires-Dist: diskcache; extra == "all"
179
- Requires-Dist: bokeh; extra == "all"
180
- Requires-Dist: google-api-python-client; extra == "all"
181
- Requires-Dist: deepmerge; extra == "all"
182
- Requires-Dist: torchaudio; extra == "all"
183
- Requires-Dist: contexttimer; extra == "all"
164
+ Requires-Dist: deepdiff; extra == "all"
184
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"
171
+ Requires-Dist: google-auth-httplib2; extra == "all"
185
172
  Requires-Dist: pymupdf; extra == "all"
186
- Requires-Dist: logfire; extra == "all"
173
+ Requires-Dist: pymupdf4llm; extra == "all"
187
174
  Requires-Dist: httpx_retries; extra == "all"
188
- Requires-Dist: beanie[odm]; extra == "all"
189
- Requires-Dist: httpx; extra == "all"
190
- Requires-Dist: deepdiff; extra == "all"
191
- Requires-Dist: ollama; extra == "all"
192
- Requires-Dist: filetype; extra == "all"
175
+ Requires-Dist: google-auth; extra == "all"
176
+ Requires-Dist: logfire[fastapi]; extra == "all"
193
177
  Requires-Dist: torchvision; extra == "all"
194
- Requires-Dist: sre_yield; extra == "all"
195
- Requires-Dist: appdirs; extra == "all"
196
- Requires-Dist: setuptools; extra == "all"
197
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
198
- Requires-Dist: yamlscript; extra == "all"
178
+ Requires-Dist: diskcache; extra == "all"
179
+ Requires-Dist: cachetools; extra == "all"
180
+ Requires-Dist: semver; extra == "all"
199
181
  Requires-Dist: tinynetrc; extra == "all"
200
- Requires-Dist: faker; extra == "all"
201
- Requires-Dist: flet-webview; extra == "all"
202
- Requires-Dist: pytest-cov; extra == "all"
203
- Requires-Dist: logfire[httpx]; extra == "all"
204
- Requires-Dist: dask[bag]; extra == "all"
182
+ Requires-Dist: sentence_transformers; extra == "all"
183
+ Requires-Dist: Unidecode; extra == "all"
205
184
  Requires-Dist: openpyxl; extra == "all"
206
- Requires-Dist: playwright; extra == "all"
207
- Requires-Dist: google-auth-httplib2; extra == "all"
208
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
209
- Requires-Dist: peft; extra == "all"
185
+ Requires-Dist: html2text; extra == "all"
186
+ Requires-Dist: appdirs; extra == "all"
187
+ Requires-Dist: ollama; extra == "all"
210
188
  Requires-Dist: docker; extra == "all"
211
- Requires-Dist: pydantic; extra == "all"
212
- Requires-Dist: odfpy; extra == "all"
213
- Requires-Dist: pymupdf4llm; extra == "all"
214
- Requires-Dist: cachetools; extra == "all"
215
- Requires-Dist: uvicorn[standard]; 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"
193
+ Requires-Dist: setuptools; extra == "all"
194
+ Requires-Dist: beanie[odm]; extra == "all"
216
195
  Requires-Dist: google-auth-oauthlib; extra == "all"
217
- Requires-Dist: html2text; extra == "all"
196
+ Requires-Dist: json_repair; extra == "all"
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"
201
+ Requires-Dist: uvicorn[standard]; extra == "all"
202
+ Requires-Dist: flet-webview; extra == "all"
203
+ Requires-Dist: huggingface_hub; extra == "all"
218
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"
210
+ Requires-Dist: dnspython[doh]; extra == "all"
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 Interface, update, progress
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 Interface(Generic[T], ft.Column):
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 render(cls, page: ft.Page):
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
- view = self.view
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
- page.go(cls.ROUTE_ROOT)
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
- Overridable async interface constructor.
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
- Overridable view definition.
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 launch(cls):
125
+ def on_connect(cls, event: ControlEvent):
152
126
  """
153
127
 
154
- Launch via render method
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
- if cls.URL:
159
- url = cls.URL
160
- else:
161
- url = f'http://{cls.HOST}:{cls.PORT}'
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(Interface[Context]):
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, context: Context):
185
+ def __init__(self):
191
186
  controls = [ft.Text(self.TITLE)]
192
- super().__init__(context=context, controls=controls)
187
+ super().__init__(controls=controls)
193
188
 
194
189
  if __name__ == "__main__":
195
190
  Test.launch()
@@ -14,6 +14,14 @@ IS_DEBUG = environment_tools.get(Constants.FMTR_LOG_LEVEL_KEY, None, converter=s
14
14
  LEVEL_DEFAULT = logging.DEBUG if IS_DEBUG else logging.INFO
15
15
 
16
16
 
17
+ def null_scrubber(match):
18
+ """
19
+
20
+ Effectively disable scrubbing
21
+
22
+ """
23
+ return match.value
24
+
17
25
  def get_logger(name, version=None, host=Constants.FMTR_OBS_HOST, key=None, org=Constants.ORG_NAME,
18
26
  stream=STREAM_DEFAULT, environment=ENVIRONMENT_DEFAULT, level=LEVEL_DEFAULT):
19
27
  """
@@ -64,7 +72,8 @@ def get_logger(name, version=None, host=Constants.FMTR_OBS_HOST, key=None, org=C
64
72
  service_version=version,
65
73
  environment=environment,
66
74
  send_to_logfire=False,
67
- console=console_opts
75
+ console=console_opts,
76
+ scrubbing=logfire.ScrubbingOptions(callback=null_scrubber)
68
77
  )
69
78
 
70
79
  if key is None:
@@ -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.50
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: flet[all]; extra == "all"
158
- Requires-Dist: regex; extra == "all"
157
+ Requires-Dist: bokeh; extra == "all"
159
158
  Requires-Dist: distributed; extra == "all"
160
- Requires-Dist: tokenizers; extra == "all"
161
- Requires-Dist: pydantic-extra-types; extra == "all"
162
- Requires-Dist: transformers[sentencepiece]; extra == "all"
163
- Requires-Dist: sentence_transformers; extra == "all"
164
- Requires-Dist: json_repair; extra == "all"
165
- Requires-Dist: Unidecode; extra == "all"
166
- Requires-Dist: google-auth; extra == "all"
167
- Requires-Dist: pydantic-settings; extra == "all"
168
- Requires-Dist: flet-video; extra == "all"
169
- Requires-Dist: fastapi; extra == "all"
170
- Requires-Dist: pyyaml; extra == "all"
171
- Requires-Dist: huggingface_hub; extra == "all"
172
- Requires-Dist: dnspython[doh]; extra == "all"
173
159
  Requires-Dist: motor; extra == "all"
174
- Requires-Dist: semver; extra == "all"
160
+ Requires-Dist: faker; extra == "all"
161
+ Requires-Dist: peft; extra == "all"
175
162
  Requires-Dist: openai; extra == "all"
176
- Requires-Dist: logfire[fastapi]; extra == "all"
177
163
  Requires-Dist: pandas; extra == "all"
178
- Requires-Dist: diskcache; extra == "all"
179
- Requires-Dist: bokeh; extra == "all"
180
- Requires-Dist: google-api-python-client; extra == "all"
181
- Requires-Dist: deepmerge; extra == "all"
182
- Requires-Dist: torchaudio; extra == "all"
183
- Requires-Dist: contexttimer; extra == "all"
164
+ Requires-Dist: deepdiff; extra == "all"
184
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"
171
+ Requires-Dist: google-auth-httplib2; extra == "all"
185
172
  Requires-Dist: pymupdf; extra == "all"
186
- Requires-Dist: logfire; extra == "all"
173
+ Requires-Dist: pymupdf4llm; extra == "all"
187
174
  Requires-Dist: httpx_retries; extra == "all"
188
- Requires-Dist: beanie[odm]; extra == "all"
189
- Requires-Dist: httpx; extra == "all"
190
- Requires-Dist: deepdiff; extra == "all"
191
- Requires-Dist: ollama; extra == "all"
192
- Requires-Dist: filetype; extra == "all"
175
+ Requires-Dist: google-auth; extra == "all"
176
+ Requires-Dist: logfire[fastapi]; extra == "all"
193
177
  Requires-Dist: torchvision; extra == "all"
194
- Requires-Dist: sre_yield; extra == "all"
195
- Requires-Dist: appdirs; extra == "all"
196
- Requires-Dist: setuptools; extra == "all"
197
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
198
- Requires-Dist: yamlscript; extra == "all"
178
+ Requires-Dist: diskcache; extra == "all"
179
+ Requires-Dist: cachetools; extra == "all"
180
+ Requires-Dist: semver; extra == "all"
199
181
  Requires-Dist: tinynetrc; extra == "all"
200
- Requires-Dist: faker; extra == "all"
201
- Requires-Dist: flet-webview; extra == "all"
202
- Requires-Dist: pytest-cov; extra == "all"
203
- Requires-Dist: logfire[httpx]; extra == "all"
204
- Requires-Dist: dask[bag]; extra == "all"
182
+ Requires-Dist: sentence_transformers; extra == "all"
183
+ Requires-Dist: Unidecode; extra == "all"
205
184
  Requires-Dist: openpyxl; extra == "all"
206
- Requires-Dist: playwright; extra == "all"
207
- Requires-Dist: google-auth-httplib2; extra == "all"
208
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
209
- Requires-Dist: peft; extra == "all"
185
+ Requires-Dist: html2text; extra == "all"
186
+ Requires-Dist: appdirs; extra == "all"
187
+ Requires-Dist: ollama; extra == "all"
210
188
  Requires-Dist: docker; extra == "all"
211
- Requires-Dist: pydantic; extra == "all"
212
- Requires-Dist: odfpy; extra == "all"
213
- Requires-Dist: pymupdf4llm; extra == "all"
214
- Requires-Dist: cachetools; extra == "all"
215
- Requires-Dist: uvicorn[standard]; 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"
193
+ Requires-Dist: setuptools; extra == "all"
194
+ Requires-Dist: beanie[odm]; extra == "all"
216
195
  Requires-Dist: google-auth-oauthlib; extra == "all"
217
- Requires-Dist: html2text; extra == "all"
196
+ Requires-Dist: json_repair; extra == "all"
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"
201
+ Requires-Dist: uvicorn[standard]; extra == "all"
202
+ Requires-Dist: flet-webview; extra == "all"
203
+ Requires-Dist: huggingface_hub; extra == "all"
218
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"
210
+ Requires-Dist: dnspython[doh]; extra == "all"
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.50
File without changes
File without changes
@@ -18,68 +18,68 @@ pydantic-ai[logfire,openai]
18
18
  ollama
19
19
 
20
20
  [all]
21
- flet[all]
22
- regex
21
+ bokeh
23
22
  distributed
24
- tokenizers
25
- pydantic-extra-types
26
- transformers[sentencepiece]
27
- sentence_transformers
28
- json_repair
29
- Unidecode
30
- google-auth
31
- pydantic-settings
32
- flet-video
33
- fastapi
34
- pyyaml
35
- huggingface_hub
36
- dnspython[doh]
37
23
  motor
38
- semver
24
+ faker
25
+ peft
39
26
  openai
40
- logfire[fastapi]
41
27
  pandas
42
- diskcache
43
- bokeh
44
- google-api-python-client
45
- deepmerge
46
- torchaudio
47
- contexttimer
28
+ deepdiff
48
29
  pycountry
30
+ regex
31
+ dask[bag]
32
+ filetype
33
+ logfire[httpx]
34
+ yamlscript
35
+ google-auth-httplib2
49
36
  pymupdf
50
- logfire
37
+ pymupdf4llm
51
38
  httpx_retries
52
- beanie[odm]
53
- httpx
54
- deepdiff
55
- ollama
56
- filetype
39
+ google-auth
40
+ logfire[fastapi]
57
41
  torchvision
58
- sre_yield
59
- appdirs
60
- setuptools
61
- pydevd-pycharm~=251.25410.159
62
- yamlscript
42
+ diskcache
43
+ cachetools
44
+ semver
63
45
  tinynetrc
64
- faker
65
- flet-webview
66
- pytest-cov
67
- logfire[httpx]
68
- dask[bag]
46
+ sentence_transformers
47
+ Unidecode
69
48
  openpyxl
70
- playwright
71
- google-auth-httplib2
72
- pydantic-ai[logfire,openai]
73
- peft
49
+ html2text
50
+ appdirs
51
+ ollama
74
52
  docker
75
- pydantic
76
- odfpy
77
- pymupdf4llm
78
- cachetools
79
- uvicorn[standard]
53
+ playwright
54
+ pytest-cov
55
+ pyyaml
56
+ fastapi
57
+ setuptools
58
+ beanie[odm]
80
59
  google-auth-oauthlib
81
- html2text
60
+ json_repair
61
+ google-api-python-client
62
+ logfire
63
+ deepmerge
64
+ sre_yield
65
+ uvicorn[standard]
66
+ flet-webview
67
+ huggingface_hub
82
68
  tabulate
69
+ tokenizers
70
+ httpx
71
+ contexttimer
72
+ flet-video
73
+ pydantic-settings
74
+ dnspython[doh]
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