fmtr.tools 1.3.7__tar.gz → 1.3.8__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 (90) hide show
  1. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/PKG-INFO +45 -43
  2. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/caching_tools.py +99 -3
  3. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/constants.py +4 -0
  4. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/logging_tools.py +1 -1
  5. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/path_tools/path_tools.py +10 -0
  6. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/pattern_tools.py +3 -3
  7. fmtr_tools-1.3.8/fmtr/tools/version +1 -0
  8. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr.tools.egg-info/PKG-INFO +45 -43
  9. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr.tools.egg-info/requires.txt +44 -42
  10. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/setup.py +1 -1
  11. fmtr_tools-1.3.7/fmtr/tools/version +0 -1
  12. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/LICENSE +0 -0
  13. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/README.md +0 -0
  14. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/__init__.py +0 -0
  15. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/ai_tools/__init__.py +0 -0
  16. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  17. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  18. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/api_tools.py +0 -0
  19. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/async_tools.py +0 -0
  20. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/augmentation_tools.py +0 -0
  21. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/data_modelling_tools.py +0 -0
  22. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/dataclass_tools.py +0 -0
  23. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/datatype_tools.py +0 -0
  24. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/debugging_tools.py +0 -0
  25. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/dns_tools/__init__.py +0 -0
  26. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/dns_tools/client.py +0 -0
  27. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/dns_tools/dm.py +0 -0
  28. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/dns_tools/proxy.py +0 -0
  29. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/dns_tools/server.py +0 -0
  30. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/docker_tools.py +0 -0
  31. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/entrypoints/__init__.py +0 -0
  32. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  33. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/entrypoints/ep_test.py +0 -0
  34. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  35. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  36. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  37. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/environment_tools.py +0 -0
  38. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/function_tools.py +0 -0
  39. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/google_api_tools.py +0 -0
  40. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/hash_tools.py +0 -0
  41. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/hfh_tools.py +0 -0
  42. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/html_tools.py +0 -0
  43. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/http_tools.py +0 -0
  44. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/import_tools.py +0 -0
  45. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/inspection_tools.py +0 -0
  46. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/interface_tools.py +0 -0
  47. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/iterator_tools.py +0 -0
  48. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/json_fix_tools.py +0 -0
  49. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/json_tools.py +0 -0
  50. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/merging_tools.py +0 -0
  51. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/metric_tools.py +0 -0
  52. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/name_tools.py +0 -0
  53. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/netrc_tools.py +0 -0
  54. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/openai_tools.py +0 -0
  55. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/packaging_tools.py +0 -0
  56. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/parallel_tools.py +0 -0
  57. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/path_tools/__init__.py +0 -0
  58. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  59. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  60. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/pdf_tools.py +0 -0
  61. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/platform_tools.py +0 -0
  62. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/process_tools.py +0 -0
  63. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/profiling_tools.py +0 -0
  64. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/random_tools.py +0 -0
  65. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/semantic_tools.py +0 -0
  66. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/settings_tools.py +0 -0
  67. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/setup_tools/__init__.py +0 -0
  68. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/setup_tools/setup_tools.py +0 -0
  69. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/spaces_tools.py +0 -0
  70. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/string_tools.py +0 -0
  71. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tabular_tools.py +0 -0
  72. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tests/__init__.py +0 -0
  73. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tests/conftest.py +0 -0
  74. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tests/helpers.py +0 -0
  75. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tests/test_datatype.py +0 -0
  76. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tests/test_environment.py +0 -0
  77. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tests/test_json.py +0 -0
  78. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tests/test_path.py +0 -0
  79. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tests/test_yaml.py +0 -0
  80. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tokenization_tools.py +0 -0
  81. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/tools.py +0 -0
  82. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/unicode_tools.py +0 -0
  83. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/version_tools.py +0 -0
  84. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr/tools/yaml_tools.py +0 -0
  85. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  86. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  87. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr.tools.egg-info/entry_points.txt +0 -0
  88. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/fmtr.tools.egg-info/top_level.txt +0 -0
  89. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/pyproject.toml +0 -0
  90. {fmtr_tools-1.3.7 → fmtr_tools-1.3.8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.7
3
+ Version: 1.3.8
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
@@ -97,6 +97,7 @@ Requires-Dist: google-auth-httplib2; extra == "google-api"
97
97
  Requires-Dist: google-api-python-client; extra == "google-api"
98
98
  Provides-Extra: caching
99
99
  Requires-Dist: diskcache; extra == "caching"
100
+ Requires-Dist: cachetools; extra == "caching"
100
101
  Provides-Extra: pdf
101
102
  Requires-Dist: pymupdf; extra == "pdf"
102
103
  Requires-Dist: pydantic; extra == "pdf"
@@ -130,60 +131,61 @@ Requires-Dist: logfire[httpx]; extra == "http"
130
131
  Provides-Extra: setup
131
132
  Requires-Dist: setuptools; extra == "setup"
132
133
  Provides-Extra: all
133
- Requires-Dist: dnspython[doh]; extra == "all"
134
- Requires-Dist: pymupdf4llm; extra == "all"
135
- Requires-Dist: regex; extra == "all"
136
- Requires-Dist: uvicorn[standard]; extra == "all"
137
- Requires-Dist: tokenizers; extra == "all"
138
- Requires-Dist: filetype; extra == "all"
139
- Requires-Dist: flet[all]; extra == "all"
140
- Requires-Dist: Unidecode; extra == "all"
141
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
134
+ Requires-Dist: tinynetrc; extra == "all"
135
+ Requires-Dist: flet-webview; extra == "all"
136
+ Requires-Dist: distributed; extra == "all"
142
137
  Requires-Dist: logfire[httpx]; extra == "all"
143
- Requires-Dist: bokeh; extra == "all"
144
- Requires-Dist: fastapi; extra == "all"
145
138
  Requires-Dist: pytest-cov; extra == "all"
146
- Requires-Dist: json_repair; extra == "all"
139
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
140
+ Requires-Dist: torchaudio; extra == "all"
141
+ Requires-Dist: docker; extra == "all"
142
+ Requires-Dist: httpx; extra == "all"
143
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
144
+ Requires-Dist: logfire[fastapi]; extra == "all"
145
+ Requires-Dist: filetype; extra == "all"
146
+ Requires-Dist: openai; extra == "all"
147
147
  Requires-Dist: semver; extra == "all"
148
- Requires-Dist: google-auth-oauthlib; extra == "all"
149
- Requires-Dist: google-auth-httplib2; extra == "all"
150
- Requires-Dist: html2text; extra == "all"
148
+ Requires-Dist: fastapi; extra == "all"
149
+ Requires-Dist: logfire; extra == "all"
150
+ Requires-Dist: faker; extra == "all"
151
+ Requires-Dist: appdirs; extra == "all"
151
152
  Requires-Dist: sre_yield; extra == "all"
152
- Requires-Dist: pymupdf; extra == "all"
153
- Requires-Dist: flet-video; extra == "all"
154
- Requires-Dist: transformers[sentencepiece]; extra == "all"
155
- Requires-Dist: pydantic-settings; extra == "all"
156
- Requires-Dist: ollama; extra == "all"
157
- Requires-Dist: distributed; extra == "all"
158
- Requires-Dist: httpx; extra == "all"
153
+ Requires-Dist: huggingface_hub; extra == "all"
154
+ Requires-Dist: regex; extra == "all"
159
155
  Requires-Dist: google-auth; extra == "all"
160
- Requires-Dist: openpyxl; extra == "all"
161
- Requires-Dist: logfire[fastapi]; extra == "all"
156
+ Requires-Dist: bokeh; extra == "all"
157
+ Requires-Dist: ollama; extra == "all"
158
+ Requires-Dist: Unidecode; extra == "all"
159
+ Requires-Dist: deepmerge; extra == "all"
160
+ Requires-Dist: pymupdf; extra == "all"
161
+ Requires-Dist: uvicorn[standard]; extra == "all"
162
+ Requires-Dist: httpx_retries; extra == "all"
163
+ Requires-Dist: tokenizers; extra == "all"
164
+ Requires-Dist: dask[bag]; extra == "all"
162
165
  Requires-Dist: tabulate; extra == "all"
163
- Requires-Dist: tinynetrc; extra == "all"
164
- Requires-Dist: torchvision; extra == "all"
166
+ Requires-Dist: flet[all]; extra == "all"
167
+ Requires-Dist: cachetools; extra == "all"
168
+ Requires-Dist: pymupdf4llm; extra == "all"
165
169
  Requires-Dist: sentence_transformers; extra == "all"
166
- Requires-Dist: pyyaml; extra == "all"
167
170
  Requires-Dist: diskcache; extra == "all"
168
- Requires-Dist: faker; extra == "all"
169
- Requires-Dist: docker; extra == "all"
171
+ Requires-Dist: pydantic-settings; extra == "all"
172
+ Requires-Dist: google-auth-httplib2; extra == "all"
173
+ Requires-Dist: flet-video; extra == "all"
170
174
  Requires-Dist: yamlscript; extra == "all"
171
- Requires-Dist: pydantic; extra == "all"
172
175
  Requires-Dist: contexttimer; extra == "all"
173
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
174
- Requires-Dist: appdirs; extra == "all"
175
- Requires-Dist: flet-webview; extra == "all"
176
- Requires-Dist: dask[bag]; extra == "all"
177
- Requires-Dist: openai; extra == "all"
178
- Requires-Dist: huggingface_hub; extra == "all"
179
- Requires-Dist: torchaudio; extra == "all"
180
- Requires-Dist: httpx_retries; extra == "all"
181
- Requires-Dist: setuptools; extra == "all"
182
- Requires-Dist: logfire; extra == "all"
183
- Requires-Dist: deepmerge; extra == "all"
176
+ Requires-Dist: pydantic; extra == "all"
177
+ Requires-Dist: peft; extra == "all"
178
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
179
+ Requires-Dist: torchvision; extra == "all"
184
180
  Requires-Dist: pandas; extra == "all"
181
+ Requires-Dist: html2text; extra == "all"
182
+ Requires-Dist: google-auth-oauthlib; extra == "all"
183
+ Requires-Dist: pyyaml; extra == "all"
185
184
  Requires-Dist: google-api-python-client; extra == "all"
186
- Requires-Dist: peft; extra == "all"
185
+ Requires-Dist: openpyxl; extra == "all"
186
+ Requires-Dist: setuptools; extra == "all"
187
+ Requires-Dist: json_repair; extra == "all"
188
+ Requires-Dist: dnspython[doh]; extra == "all"
187
189
  Dynamic: author
188
190
  Dynamic: author-email
189
191
  Dynamic: description
@@ -1,6 +1,8 @@
1
+ import cachetools
2
+ from datetime import timedelta, datetime
1
3
  from diskcache import Cache
2
4
 
3
- from fmtr.tools import logger, Path
5
+ from fmtr.tools import logger, Path, Constants
4
6
 
5
7
 
6
8
  class Dump(dict):
@@ -31,9 +33,9 @@ class Disk(Cache):
31
33
  if not path.parent.exists():
32
34
  raise FileNotFoundError(f"Directory {path.parent=} does not exist")
33
35
  if path and not path.exists():
34
- logger.warning(f'Cache does not exist. Will be created. "{path=}"...')
36
+ logger.warning(f'Cache does not exist. Will be created. {str(path)=}...')
35
37
 
36
- logger.info(f'Initializing Disk Cache at path "{path=}"...')
38
+ logger.info(f'Initializing Disk Cache {str(path)=}...')
37
39
 
38
40
  super().__init__(directory=str(path / self.ROOT_KEY), **settings)
39
41
 
@@ -95,7 +97,101 @@ class Disk(Cache):
95
97
  return self.dump()
96
98
 
97
99
 
100
+ class TLRU(cachetools.TLRUCache):
101
+ """
102
+
103
+ Subclass to include logging and simplify global TTU
104
+
105
+ """
106
+ MASK_MAPPING = '{key} ' + Constants.ARROW + ' {value}'
107
+
108
+ def __init__(self, maxsize=1_024, timer=datetime.now, getsizeof=None, ttu_static=None, desc=None):
109
+ """
110
+
111
+ Add overridable TTU method
112
+
113
+ """
114
+ super().__init__(maxsize=maxsize, ttu=self.get_ttu, timer=timer, getsizeof=getsizeof)
115
+ self.ttu_static = ttu_static
116
+ self.desc = desc
117
+
118
+ @property
119
+ def cache_desc(self):
120
+ """
121
+
122
+ Friendly description of cache
123
+
124
+ """
125
+ desc = self.desc or self.__class__.__name__
126
+ return desc
127
+
128
+ def get_ttu(self, _key, value, now) -> float | timedelta:
129
+ """
130
+
131
+ Default implementation just adds on the static TTU
132
+
133
+ """
134
+ return now + self.ttu_static
135
+
136
+ def expire(self, time=None):
137
+ """
138
+
139
+ Log expiry
140
+
141
+ """
142
+ items = super().expire(time)
143
+ if not items:
144
+ return items
145
+
146
+ with logger.span(f'{self.desc} cache expiry {len(items)=}...'):
147
+ for key, value in items:
148
+ logger.debug(self.MASK_MAPPING.format(key=key, value=value))
149
+
150
+ return items
151
+
152
+ def popitem(self):
153
+ """
154
+
155
+ Log eviction
156
+
157
+ """
158
+ key, value = super().popitem()
159
+ logger.debug(f'{self.desc} cache eviction: {self.MASK_MAPPING.format(key=key, value=value)}')
160
+ return key, value
161
+
162
+ def dump(self):
163
+ """
164
+
165
+ Dump contents
166
+
167
+ """
168
+ data = Dump(self.items())
169
+ return data
170
+
171
+ @property
172
+ def data(self):
173
+ """
174
+
175
+ Dump as property
176
+
177
+ """
178
+ return self.dump()
179
+
180
+
181
+
98
182
  if __name__ == '__main__':
183
+ sec10 = timedelta(seconds=10)
184
+ c = TLRU(ttu_static=sec10, maxsize=2, desc='Test Data')
185
+ c['test'] = 'val'
186
+ c['test2'] = 'val2'
187
+ c['test3'] = 'val3'
188
+ c
189
+
190
+
191
+
192
+
193
+
194
+
99
195
  path_tmp_cache = Path.cwd().parent.parent / 'data' / 'cache'
100
196
  tc = Disk(path_tmp_cache)
101
197
 
@@ -14,6 +14,9 @@ class Constants:
14
14
  DATETIME_NOW_STR = DATETIME_NOW.strftime(DATETIME_FILENAME_FORMAT)
15
15
  SERIALIZATION_INDENT = 4
16
16
 
17
+ ARROW = '→'
18
+ ARROW_SEP = f' {ARROW} '
19
+
17
20
  FMTR_LOG_LEVEL_KEY = 'FMTR_LOG_LEVEL'
18
21
  FMTR_OBS_API_KEY_KEY = 'FMTR_OBS_API_KEY'
19
22
  FMTR_OBS_HOST = 'obs.sv.fmtr.dev'
@@ -31,6 +34,7 @@ class Constants:
31
34
  FILENAME_CONFIG = 'settings.yaml'
32
35
  DIR_NAME_REPO = 'repo'
33
36
  DIR_NAME_DATA = 'data'
37
+ DIR_NAME_CACHE = 'cache'
34
38
  DIR_NAME_ARTIFACT = 'artifact'
35
39
  DIR_NAME_SOURCE = 'source'
36
40
  FILENAME_VERSION = 'version'
@@ -52,7 +52,7 @@ def get_logger(name, version=None, host=Constants.FMTR_OBS_HOST, key=None, org=C
52
52
  lev_name_otel = logfire._internal.constants.NUMBER_TO_LEVEL[lev_num_otel]
53
53
 
54
54
  console_opts = logfire.ConsoleOptions(
55
- colors='always' if environment_tools.IS_DEBUG else 'auto',
55
+ colors='always',
56
56
  min_log_level=lev_name_otel,
57
57
  )
58
58
 
@@ -305,6 +305,16 @@ class PackagePaths(FromCallerMixin):
305
305
 
306
306
  return self.dev / Constants.DIR_NAME_REPO / self.name_ns / self.dir_name_data
307
307
 
308
+ @property
309
+ def cache(self) -> Path:
310
+ """
311
+
312
+ Path of cache directory.
313
+
314
+ """
315
+
316
+ return self.data / Constants.DIR_NAME_CACHE
317
+
308
318
  @property
309
319
  def artifact(self) -> Path:
310
320
  """
@@ -1,9 +1,9 @@
1
+ import regex as re
1
2
  from dataclasses import dataclass, asdict
2
3
  from functools import cached_property
3
4
  from typing import List, Any
4
5
 
5
- import regex as re
6
-
6
+ from fmtr.tools import Constants
7
7
  from fmtr.tools.logging_tools import logger
8
8
  from fmtr.tools.string_tools import join
9
9
 
@@ -210,7 +210,7 @@ class Transformer:
210
210
  previous = key
211
211
 
212
212
  def get_history_str():
213
- return join(history, sep=' → ')
213
+ return join(history, sep=Constants.ARROW_SEP)
214
214
 
215
215
  while True:
216
216
  if previous in history:
@@ -0,0 +1 @@
1
+ 1.3.8
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.7
3
+ Version: 1.3.8
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
@@ -97,6 +97,7 @@ Requires-Dist: google-auth-httplib2; extra == "google-api"
97
97
  Requires-Dist: google-api-python-client; extra == "google-api"
98
98
  Provides-Extra: caching
99
99
  Requires-Dist: diskcache; extra == "caching"
100
+ Requires-Dist: cachetools; extra == "caching"
100
101
  Provides-Extra: pdf
101
102
  Requires-Dist: pymupdf; extra == "pdf"
102
103
  Requires-Dist: pydantic; extra == "pdf"
@@ -130,60 +131,61 @@ Requires-Dist: logfire[httpx]; extra == "http"
130
131
  Provides-Extra: setup
131
132
  Requires-Dist: setuptools; extra == "setup"
132
133
  Provides-Extra: all
133
- Requires-Dist: dnspython[doh]; extra == "all"
134
- Requires-Dist: pymupdf4llm; extra == "all"
135
- Requires-Dist: regex; extra == "all"
136
- Requires-Dist: uvicorn[standard]; extra == "all"
137
- Requires-Dist: tokenizers; extra == "all"
138
- Requires-Dist: filetype; extra == "all"
139
- Requires-Dist: flet[all]; extra == "all"
140
- Requires-Dist: Unidecode; extra == "all"
141
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
134
+ Requires-Dist: tinynetrc; extra == "all"
135
+ Requires-Dist: flet-webview; extra == "all"
136
+ Requires-Dist: distributed; extra == "all"
142
137
  Requires-Dist: logfire[httpx]; extra == "all"
143
- Requires-Dist: bokeh; extra == "all"
144
- Requires-Dist: fastapi; extra == "all"
145
138
  Requires-Dist: pytest-cov; extra == "all"
146
- Requires-Dist: json_repair; extra == "all"
139
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
140
+ Requires-Dist: torchaudio; extra == "all"
141
+ Requires-Dist: docker; extra == "all"
142
+ Requires-Dist: httpx; extra == "all"
143
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
144
+ Requires-Dist: logfire[fastapi]; extra == "all"
145
+ Requires-Dist: filetype; extra == "all"
146
+ Requires-Dist: openai; extra == "all"
147
147
  Requires-Dist: semver; extra == "all"
148
- Requires-Dist: google-auth-oauthlib; extra == "all"
149
- Requires-Dist: google-auth-httplib2; extra == "all"
150
- Requires-Dist: html2text; extra == "all"
148
+ Requires-Dist: fastapi; extra == "all"
149
+ Requires-Dist: logfire; extra == "all"
150
+ Requires-Dist: faker; extra == "all"
151
+ Requires-Dist: appdirs; extra == "all"
151
152
  Requires-Dist: sre_yield; extra == "all"
152
- Requires-Dist: pymupdf; extra == "all"
153
- Requires-Dist: flet-video; extra == "all"
154
- Requires-Dist: transformers[sentencepiece]; extra == "all"
155
- Requires-Dist: pydantic-settings; extra == "all"
156
- Requires-Dist: ollama; extra == "all"
157
- Requires-Dist: distributed; extra == "all"
158
- Requires-Dist: httpx; extra == "all"
153
+ Requires-Dist: huggingface_hub; extra == "all"
154
+ Requires-Dist: regex; extra == "all"
159
155
  Requires-Dist: google-auth; extra == "all"
160
- Requires-Dist: openpyxl; extra == "all"
161
- Requires-Dist: logfire[fastapi]; extra == "all"
156
+ Requires-Dist: bokeh; extra == "all"
157
+ Requires-Dist: ollama; extra == "all"
158
+ Requires-Dist: Unidecode; extra == "all"
159
+ Requires-Dist: deepmerge; extra == "all"
160
+ Requires-Dist: pymupdf; extra == "all"
161
+ Requires-Dist: uvicorn[standard]; extra == "all"
162
+ Requires-Dist: httpx_retries; extra == "all"
163
+ Requires-Dist: tokenizers; extra == "all"
164
+ Requires-Dist: dask[bag]; extra == "all"
162
165
  Requires-Dist: tabulate; extra == "all"
163
- Requires-Dist: tinynetrc; extra == "all"
164
- Requires-Dist: torchvision; extra == "all"
166
+ Requires-Dist: flet[all]; extra == "all"
167
+ Requires-Dist: cachetools; extra == "all"
168
+ Requires-Dist: pymupdf4llm; extra == "all"
165
169
  Requires-Dist: sentence_transformers; extra == "all"
166
- Requires-Dist: pyyaml; extra == "all"
167
170
  Requires-Dist: diskcache; extra == "all"
168
- Requires-Dist: faker; extra == "all"
169
- Requires-Dist: docker; extra == "all"
171
+ Requires-Dist: pydantic-settings; extra == "all"
172
+ Requires-Dist: google-auth-httplib2; extra == "all"
173
+ Requires-Dist: flet-video; extra == "all"
170
174
  Requires-Dist: yamlscript; extra == "all"
171
- Requires-Dist: pydantic; extra == "all"
172
175
  Requires-Dist: contexttimer; extra == "all"
173
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
174
- Requires-Dist: appdirs; extra == "all"
175
- Requires-Dist: flet-webview; extra == "all"
176
- Requires-Dist: dask[bag]; extra == "all"
177
- Requires-Dist: openai; extra == "all"
178
- Requires-Dist: huggingface_hub; extra == "all"
179
- Requires-Dist: torchaudio; extra == "all"
180
- Requires-Dist: httpx_retries; extra == "all"
181
- Requires-Dist: setuptools; extra == "all"
182
- Requires-Dist: logfire; extra == "all"
183
- Requires-Dist: deepmerge; extra == "all"
176
+ Requires-Dist: pydantic; extra == "all"
177
+ Requires-Dist: peft; extra == "all"
178
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
179
+ Requires-Dist: torchvision; extra == "all"
184
180
  Requires-Dist: pandas; extra == "all"
181
+ Requires-Dist: html2text; extra == "all"
182
+ Requires-Dist: google-auth-oauthlib; extra == "all"
183
+ Requires-Dist: pyyaml; extra == "all"
185
184
  Requires-Dist: google-api-python-client; extra == "all"
186
- Requires-Dist: peft; extra == "all"
185
+ Requires-Dist: openpyxl; extra == "all"
186
+ Requires-Dist: setuptools; extra == "all"
187
+ Requires-Dist: json_repair; extra == "all"
188
+ Requires-Dist: dnspython[doh]; extra == "all"
187
189
  Dynamic: author
188
190
  Dynamic: author-email
189
191
  Dynamic: description
@@ -15,60 +15,61 @@ pydantic-ai[logfire,openai]
15
15
  ollama
16
16
 
17
17
  [all]
18
- dnspython[doh]
19
- pymupdf4llm
20
- regex
21
- uvicorn[standard]
22
- tokenizers
23
- filetype
24
- flet[all]
25
- Unidecode
26
- pydantic-ai[logfire,openai]
18
+ tinynetrc
19
+ flet-webview
20
+ distributed
27
21
  logfire[httpx]
28
- bokeh
29
- fastapi
30
22
  pytest-cov
31
- json_repair
23
+ pydevd-pycharm~=251.25410.159
24
+ torchaudio
25
+ docker
26
+ httpx
27
+ pydantic-ai[logfire,openai]
28
+ logfire[fastapi]
29
+ filetype
30
+ openai
32
31
  semver
33
- google-auth-oauthlib
34
- google-auth-httplib2
35
- html2text
32
+ fastapi
33
+ logfire
34
+ faker
35
+ appdirs
36
36
  sre_yield
37
- pymupdf
38
- flet-video
39
- transformers[sentencepiece]
40
- pydantic-settings
41
- ollama
42
- distributed
43
- httpx
37
+ huggingface_hub
38
+ regex
44
39
  google-auth
45
- openpyxl
46
- logfire[fastapi]
40
+ bokeh
41
+ ollama
42
+ Unidecode
43
+ deepmerge
44
+ pymupdf
45
+ uvicorn[standard]
46
+ httpx_retries
47
+ tokenizers
48
+ dask[bag]
47
49
  tabulate
48
- tinynetrc
49
- torchvision
50
+ flet[all]
51
+ cachetools
52
+ pymupdf4llm
50
53
  sentence_transformers
51
- pyyaml
52
54
  diskcache
53
- faker
54
- docker
55
+ pydantic-settings
56
+ google-auth-httplib2
57
+ flet-video
55
58
  yamlscript
56
- pydantic
57
59
  contexttimer
58
- pydevd-pycharm~=251.25410.159
59
- appdirs
60
- flet-webview
61
- dask[bag]
62
- openai
63
- huggingface_hub
64
- torchaudio
65
- httpx_retries
66
- setuptools
67
- logfire
68
- deepmerge
60
+ pydantic
61
+ peft
62
+ transformers[sentencepiece]
63
+ torchvision
69
64
  pandas
65
+ html2text
66
+ google-auth-oauthlib
67
+ pyyaml
70
68
  google-api-python-client
71
- peft
69
+ openpyxl
70
+ setuptools
71
+ json_repair
72
+ dnspython[doh]
72
73
 
73
74
  [api]
74
75
  fastapi
@@ -84,6 +85,7 @@ sre_yield
84
85
 
85
86
  [caching]
86
87
  diskcache
88
+ cachetools
87
89
 
88
90
  [debug]
89
91
  pydevd-pycharm~=251.25410.159
@@ -29,7 +29,7 @@ DEPENDENCIES = {
29
29
  'html': ['html2text'],
30
30
  'interface': ['flet[all]', 'flet-video', 'flet-webview', 'dm'],
31
31
  'google.api': ['google-auth', 'google-auth-oauthlib', 'google-auth-httplib2', 'google-api-python-client'],
32
- 'caching': ['diskcache'],
32
+ 'caching': ['diskcache', 'cachetools'],
33
33
  'pdf': ['pymupdf', 'dm', 'pymupdf4llm'],
34
34
  'debug': ['pydevd-pycharm~=251.25410.159'],
35
35
  'sets': ['pydantic-settings', 'dm', 'yaml'],
@@ -1 +0,0 @@
1
- 1.3.7
File without changes
File without changes
File without changes
File without changes