fmtr.tools 1.3.31__py3-none-any.whl → 1.3.33__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.

Potentially problematic release.


This version of fmtr.tools might be problematic. Click here for more details.

@@ -125,6 +125,14 @@ class Task:
125
125
 
126
126
  return []
127
127
 
128
+ def reset(self):
129
+ """
130
+
131
+ Reset the task by deleting its history.
132
+
133
+ """
134
+ self.history = []
135
+
128
136
  def __repr__(self):
129
137
  """
130
138
 
@@ -1,6 +1,6 @@
1
1
  import functools
2
2
  import inspect
3
- from typing import Tuple
3
+ from typing import Tuple, Callable, Self
4
4
 
5
5
  from fmtr.tools import context_tools
6
6
 
@@ -35,25 +35,43 @@ def split_args_kwargs(args_kwargs: dict) -> Tuple[list, dict]:
35
35
  return args, kwargs
36
36
 
37
37
 
38
- class BoundDecorator:
38
+ class MethodDecorator:
39
39
  """
40
40
 
41
41
  Bound method decorator with overridable start/stop and context manager
42
42
 
43
43
  """
44
44
 
45
- def __init__(self, func):
45
+ CONTEXT_KEY = 'context'
46
+
47
+ def __init__(self):
48
+ """
49
+
50
+ Initialise with decorator arguments
51
+
52
+ """
53
+ self.func = None
54
+
55
+ def __call__(self, func: Callable) -> Self:
56
+ """
57
+
58
+ If called, arguments were provided, so return the object with those applied.
59
+
60
+ """
46
61
  self.func = func
47
- self.context_null = context_tools.null()
48
62
  functools.update_wrapper(self, func)
63
+ return self
49
64
 
50
65
  def get_context(self, instance):
51
66
  """
52
67
 
53
- By default use a null context.
68
+ If the instance has a context attribute, use that - otherwise use a null context.
54
69
 
55
70
  """
56
- return self.context_null
71
+ context = getattr(instance, self.CONTEXT_KEY, None)
72
+ if context:
73
+ return context
74
+ return context_tools.null()
57
75
 
58
76
  def __get__(self, instance, owner):
59
77
  """
@@ -61,7 +79,7 @@ class BoundDecorator:
61
79
  Wrap at runtime, call start/stop within context.
62
80
 
63
81
  """
64
- if instance is None:
82
+ if instance is None: # Class method called.
65
83
  return self.func
66
84
 
67
85
  if inspect.iscoroutinefunction(self.func):
@@ -72,7 +90,7 @@ class BoundDecorator:
72
90
  self.stop(instance)
73
91
  return result
74
92
 
75
- return functools.update_wrapper(async_wrapper, self.func)
93
+ return async_wrapper
76
94
 
77
95
  else:
78
96
  def sync_wrapper(*args, **kwargs):
@@ -82,7 +100,7 @@ class BoundDecorator:
82
100
  self.stop(instance)
83
101
  return result
84
102
 
85
- return functools.update_wrapper(sync_wrapper, self.func)
103
+ return sync_wrapper
86
104
 
87
105
  def start(self, instance):
88
106
  pass
@@ -4,11 +4,11 @@ from flet.core.view import View
4
4
 
5
5
  from fmtr.tools import environment_tools
6
6
  from fmtr.tools.constants import Constants
7
- from fmtr.tools.function_tools import BoundDecorator
7
+ from fmtr.tools.function_tools import MethodDecorator
8
8
  from fmtr.tools.logging_tools import logger
9
9
 
10
10
 
11
- class update(BoundDecorator):
11
+ class update(MethodDecorator):
12
12
  """
13
13
 
14
14
  Update the page after the decorated function is called.
@@ -48,7 +48,7 @@ class progress(update):
48
48
 
49
49
  Make progress not visible and update.
50
50
 
51
- """
51
+ """
52
52
  instance.progress.visible = False
53
53
  super().stop(instance)
54
54
 
@@ -68,6 +68,15 @@ class Interface(ft.Column):
68
68
  APPVIEW = AppView.WEB_BROWSER
69
69
  PATH_ASSETS = None
70
70
  ROUTE_ROOT = '/'
71
+ SCROLL = ft.ScrollMode.AUTO
72
+
73
+ def __init__(self, *args, **kwargs):
74
+ """
75
+
76
+ Instantiate and apply interface config
77
+
78
+ """
79
+ super().__init__(*args, **kwargs, scroll=self.SCROLL)
71
80
 
72
81
  @classmethod
73
82
  def render(cls, page: ft.Page):
@@ -80,7 +89,6 @@ class Interface(ft.Column):
80
89
  page.theme = cls.get_theme()
81
90
  page.views.clear()
82
91
  page.views.append(cls())
83
-
84
92
  page.on_route_change = cls.route
85
93
  page.on_view_pop = cls.pop
86
94
 
fmtr/tools/version CHANGED
@@ -1 +1 @@
1
- 1.3.31
1
+ 1.3.33
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.31
3
+ Version: 1.3.33
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,60 +126,60 @@ 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: sre_yield; extra == "all"
129
+ Requires-Dist: cachetools; extra == "all"
130
+ Requires-Dist: peft; extra == "all"
131
+ Requires-Dist: bokeh; extra == "all"
132
+ Requires-Dist: pytest-cov; extra == "all"
133
+ Requires-Dist: tokenizers; extra == "all"
130
134
  Requires-Dist: tinynetrc; extra == "all"
131
- Requires-Dist: logfire[httpx]; extra == "all"
132
- Requires-Dist: google-auth-httplib2; extra == "all"
133
- Requires-Dist: pymupdf4llm; extra == "all"
135
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
134
136
  Requires-Dist: ollama; extra == "all"
135
- Requires-Dist: fastapi; extra == "all"
136
- Requires-Dist: tabulate; extra == "all"
137
+ Requires-Dist: google-auth-httplib2; extra == "all"
137
138
  Requires-Dist: diskcache; extra == "all"
138
- Requires-Dist: google-auth; extra == "all"
139
- Requires-Dist: cachetools; extra == "all"
139
+ Requires-Dist: torchaudio; extra == "all"
140
+ Requires-Dist: torchvision; extra == "all"
140
141
  Requires-Dist: appdirs; extra == "all"
141
- Requires-Dist: html2text; extra == "all"
142
+ Requires-Dist: huggingface_hub; extra == "all"
143
+ Requires-Dist: openpyxl; extra == "all"
144
+ Requires-Dist: httpx_retries; extra == "all"
145
+ Requires-Dist: pydantic-settings; extra == "all"
142
146
  Requires-Dist: docker; extra == "all"
143
- Requires-Dist: Unidecode; extra == "all"
147
+ Requires-Dist: yamlscript; extra == "all"
148
+ Requires-Dist: pydantic; extra == "all"
149
+ Requires-Dist: contexttimer; extra == "all"
150
+ Requires-Dist: pandas; extra == "all"
144
151
  Requires-Dist: uvicorn[standard]; extra == "all"
152
+ Requires-Dist: tabulate; extra == "all"
153
+ Requires-Dist: logfire[fastapi]; extra == "all"
154
+ Requires-Dist: flet-video; extra == "all"
145
155
  Requires-Dist: pymupdf; extra == "all"
146
- Requires-Dist: distributed; extra == "all"
147
- Requires-Dist: faker; extra == "all"
148
- Requires-Dist: dnspython[doh]; extra == "all"
156
+ Requires-Dist: setuptools; extra == "all"
157
+ Requires-Dist: fastapi; extra == "all"
158
+ Requires-Dist: google-api-python-client; extra == "all"
149
159
  Requires-Dist: filetype; extra == "all"
150
- Requires-Dist: pyyaml; extra == "all"
151
- Requires-Dist: sentence_transformers; extra == "all"
152
- Requires-Dist: logfire; extra == "all"
153
- Requires-Dist: flet-video; extra == "all"
154
- Requires-Dist: tokenizers; extra == "all"
155
- Requires-Dist: pytest-cov; extra == "all"
156
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
160
+ Requires-Dist: logfire[httpx]; extra == "all"
161
+ Requires-Dist: google-auth; extra == "all"
162
+ Requires-Dist: regex; extra == "all"
157
163
  Requires-Dist: semver; extra == "all"
164
+ Requires-Dist: pyyaml; extra == "all"
158
165
  Requires-Dist: flet-webview; extra == "all"
159
- Requires-Dist: google-auth-oauthlib; extra == "all"
160
- Requires-Dist: yamlscript; extra == "all"
161
- Requires-Dist: setuptools; extra == "all"
162
- Requires-Dist: huggingface_hub; extra == "all"
163
- Requires-Dist: bokeh; extra == "all"
164
- Requires-Dist: peft; extra == "all"
165
- Requires-Dist: openai; extra == "all"
166
- Requires-Dist: openpyxl; extra == "all"
167
- Requires-Dist: regex; extra == "all"
168
- Requires-Dist: pydantic; extra == "all"
166
+ Requires-Dist: httpx; extra == "all"
169
167
  Requires-Dist: dask[bag]; extra == "all"
168
+ Requires-Dist: pymupdf4llm; extra == "all"
170
169
  Requires-Dist: json_repair; extra == "all"
171
- Requires-Dist: torchaudio; extra == "all"
172
- Requires-Dist: pandas; extra == "all"
170
+ Requires-Dist: faker; extra == "all"
171
+ Requires-Dist: Unidecode; extra == "all"
172
+ Requires-Dist: logfire; extra == "all"
173
+ Requires-Dist: sentence_transformers; extra == "all"
174
+ Requires-Dist: dnspython[doh]; extra == "all"
173
175
  Requires-Dist: deepmerge; extra == "all"
174
- Requires-Dist: pydantic-settings; extra == "all"
176
+ Requires-Dist: html2text; extra == "all"
177
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
175
178
  Requires-Dist: flet[all]; extra == "all"
176
- Requires-Dist: httpx_retries; extra == "all"
177
- Requires-Dist: logfire[fastapi]; extra == "all"
178
- Requires-Dist: torchvision; extra == "all"
179
- Requires-Dist: httpx; extra == "all"
180
- Requires-Dist: transformers[sentencepiece]; extra == "all"
181
- Requires-Dist: contexttimer; extra == "all"
182
- Requires-Dist: google-api-python-client; extra == "all"
179
+ Requires-Dist: openai; extra == "all"
180
+ Requires-Dist: google-auth-oauthlib; extra == "all"
181
+ Requires-Dist: distributed; extra == "all"
182
+ Requires-Dist: sre_yield; extra == "all"
183
183
  Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
184
184
  Dynamic: author
185
185
  Dynamic: author-email
@@ -11,7 +11,7 @@ fmtr/tools/datatype_tools.py,sha256=3P4AWIFGkJ-UqvXlj0Jc9IvkIIgTOE9jRrOk3NVbpH8,
11
11
  fmtr/tools/debugging_tools.py,sha256=_xzqS0V5BpL8d06j-jVQjGgI7T020QsqVXKAKMz7Du8,2082
12
12
  fmtr/tools/docker_tools.py,sha256=rdaZje2xhlmnfQqZnR7IHgRdWncTLjrJcViUTt5oEwk,617
13
13
  fmtr/tools/environment_tools.py,sha256=jlx6LYFVv9tyNBT_pVD-tDhyR3ccNC7w6ENVlnoxCLM,1823
14
- fmtr/tools/function_tools.py,sha256=fbOCk2_o9RB1Eps7lrduf7nm93a1H62w9Z49x2FvAWA,2375
14
+ fmtr/tools/function_tools.py,sha256=c3exfRVTd3fN8N1lT1sdbj7M50XL-GoevkSOb7Eo7EU,2752
15
15
  fmtr/tools/google_api_tools.py,sha256=owWE0GlnJjmVbXus8ENxT2PH7Fnd3m_r-14xyR7lAnA,1107
16
16
  fmtr/tools/hash_tools.py,sha256=tr4HXpeT6rRrDk6TvMlRPUSrLRRaov96y128OI2tzsc,729
17
17
  fmtr/tools/hfh_tools.py,sha256=DCDIWuWlhtmIGCtp9cLcOTTEw_4yN_NocLX8w5NZsbk,2384
@@ -45,10 +45,10 @@ fmtr/tools/tabular_tools.py,sha256=tpIpZzYku1HcJrHZJL6BC39LmN3WUWVhFbK2N7nDVmE,1
45
45
  fmtr/tools/tokenization_tools.py,sha256=me-IBzSLyNYejLybwjO9CNB6Mj2NYfKPaOVThXyaGNg,4268
46
46
  fmtr/tools/tools.py,sha256=CAsApa1YwVdNE6H66Vjivs_mXYvOas3rh7fPELAnTpk,795
47
47
  fmtr/tools/unicode_tools.py,sha256=yS_9wpu8ogNoiIL7s1G_8bETFFO_YQlo4LNPv1NLDeY,52
48
- fmtr/tools/version,sha256=VVb3LiUlBjS5_S8NQl06zfsmOwyZ6VtToM0Y2ve-UNQ,6
48
+ fmtr/tools/version,sha256=vmxTAvLKZhzFgfuMMISjooj9JcEzyYMgvefLRN_twHY,6
49
49
  fmtr/tools/yaml_tools.py,sha256=Bhhyd6GQVKO72Lp8ky7bAUjIB_65Hdh0Q45SKIEe6S8,1901
50
50
  fmtr/tools/ai_tools/__init__.py,sha256=JZrLuOFNV1A3wvJgonxOgz_4WS-7MfCuowGWA5uYCjs,372
51
- fmtr/tools/ai_tools/agentic_tools.py,sha256=XwiI3K2w_bIawqrlmUpSdd5kGN6Dpr5ut6WPUHK_HC4,4660
51
+ fmtr/tools/ai_tools/agentic_tools.py,sha256=8su8wmSEoQaDoDnmcKy_DvtWzssBEpNJtH4PzNAKZUE,4782
52
52
  fmtr/tools/ai_tools/inference_tools.py,sha256=2UP2gXEyOJUjyyV6zmFIYmIxUsh1rXkRH0IbFvr2bRs,11908
53
53
  fmtr/tools/dns_tools/__init__.py,sha256=Mzaepy8lEdT0SJtUOCnF3IkpOt0vrZn-IOgOf4xfd8Q,258
54
54
  fmtr/tools/dns_tools/client.py,sha256=IBbd7Xgx9ExTn_EPoL7ts9JfXokHHuOiD9m4K6tl1Q0,2817
@@ -63,7 +63,7 @@ fmtr/tools/entrypoints/remote_debug_test.py,sha256=wmKg9o2pQq7eqeHmaO8oviujNgtns
63
63
  fmtr/tools/entrypoints/shell_debug.py,sha256=0No3tAg9Ri4_vvSlQCUtAY-11HR0nE45i0VVtiAViwY,106
64
64
  fmtr/tools/interface_tools/__init__.py,sha256=nODVT7v657onpmak7qbW4P8NoW2HQqyeEDUSx5pZAFg,331
65
65
  fmtr/tools/interface_tools/controls.py,sha256=oOl0_sZB8fkvYB-9A5yjArfQmFQLMCsVGgRNrJAFJm4,332
66
- fmtr/tools/interface_tools/interface_tools.py,sha256=wo5lVJrk3SxsByFTT0L1dkZpxsSdvx7U-Oh0-c_GowE,3098
66
+ fmtr/tools/interface_tools/interface_tools.py,sha256=kQusNsZZU2VWQ_IZu78muS8RpOZRNNmORRBIA7HKXYY,3307
67
67
  fmtr/tools/path_tools/__init__.py,sha256=v5CpmzXq5Ii90FtcmxAJKiLxmguZMrPnQ_HdT872Np0,443
68
68
  fmtr/tools/path_tools/app_path_tools.py,sha256=JrJvtTDd_gkCKcZtBCDTMktsM77PZwGV_hzQX0g5GU8,1722
69
69
  fmtr/tools/path_tools/path_tools.py,sha256=eh30PpmH0wopy0wNWuPT84cmXY1EvqsTSDT7AV_GPOY,8034
@@ -80,9 +80,9 @@ fmtr/tools/tests/test_path.py,sha256=AkZQa6_8BQ-VaCyL_J-iKmdf2ZaM-xFYR37Kun3k4_g
80
80
  fmtr/tools/tests/test_yaml.py,sha256=jc0TwwKu9eC0LvFGNMERdgBue591xwLxYXFbtsRwXVM,287
81
81
  fmtr/tools/version_tools/__init__.py,sha256=pg4iLtmIr5HtyEW_j0fMFoIdzqi_w9xH8-grQaXLB28,318
82
82
  fmtr/tools/version_tools/version_tools.py,sha256=Hcc6yferZS1hHbugRTdiHhSNmXEEG0hjCiTTXKna-YY,1127
83
- fmtr_tools-1.3.31.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
84
- fmtr_tools-1.3.31.dist-info/METADATA,sha256=1_mrusaMKPO1ULMB8M9snIRRZHI7ipH5f3Tlh7qKwCM,15938
85
- fmtr_tools-1.3.31.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
86
- fmtr_tools-1.3.31.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
87
- fmtr_tools-1.3.31.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
88
- fmtr_tools-1.3.31.dist-info/RECORD,,
83
+ fmtr_tools-1.3.33.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
84
+ fmtr_tools-1.3.33.dist-info/METADATA,sha256=7H3tjWWEroxKZAxXzbl7jG85b8dtrmnT4nbjy_ROQrA,15938
85
+ fmtr_tools-1.3.33.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
86
+ fmtr_tools-1.3.33.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
87
+ fmtr_tools-1.3.33.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
88
+ fmtr_tools-1.3.33.dist-info/RECORD,,