fmtr.tools 1.1.26__tar.gz → 1.1.28__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 (80) hide show
  1. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/PKG-INFO +44 -44
  2. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/constants.py +4 -0
  3. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/setup_tools/setup_tools.py +44 -31
  4. fmtr_tools-1.1.28/fmtr/tools/version +1 -0
  5. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr.tools.egg-info/PKG-INFO +44 -44
  6. fmtr_tools-1.1.26/fmtr/tools/version +0 -1
  7. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/LICENSE +0 -0
  8. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/README.md +0 -0
  9. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/__init__.py +0 -0
  10. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/ai_tools/__init__.py +0 -0
  11. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  12. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  13. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/api_tools.py +0 -0
  14. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/async_tools.py +0 -0
  15. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/augmentation_tools.py +0 -0
  16. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/caching_tools.py +0 -0
  17. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/console_script_tools.py +0 -0
  18. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/data_modelling_tools.py +0 -0
  19. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/dataclass_tools.py +0 -0
  20. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/datatype_tools.py +0 -0
  21. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/debugging_tools.py +0 -0
  22. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/dns_tools.py +0 -0
  23. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/docker_tools.py +0 -0
  24. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/environment_tools.py +0 -0
  25. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/function_tools.py +0 -0
  26. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/google_api_tools.py +0 -0
  27. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/hash_tools.py +0 -0
  28. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/hfh_tools.py +0 -0
  29. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/html_tools.py +0 -0
  30. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/http_tools.py +0 -0
  31. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/import_tools.py +0 -0
  32. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/inspection_tools.py +0 -0
  33. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/interface_tools.py +0 -0
  34. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/iterator_tools.py +0 -0
  35. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/json_fix_tools.py +0 -0
  36. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/json_tools.py +0 -0
  37. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/logging_tools.py +0 -0
  38. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/merging_tools.py +0 -0
  39. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/metric_tools.py +0 -0
  40. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/name_tools.py +0 -0
  41. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/netrc_tools.py +0 -0
  42. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/openai_tools.py +0 -0
  43. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/packaging_tools.py +0 -0
  44. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/parallel_tools.py +0 -0
  45. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/path_tools/__init__.py +0 -0
  46. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  47. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/path_tools/path_tools.py +0 -0
  48. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  49. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/pattern_tools.py +0 -0
  50. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/pdf_tools.py +0 -0
  51. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/platform_tools.py +0 -0
  52. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/process_tools.py +0 -0
  53. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/profiling_tools.py +0 -0
  54. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/random_tools.py +0 -0
  55. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/semantic_tools.py +0 -0
  56. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/settings_tools.py +0 -0
  57. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/setup_tools/__init__.py +0 -0
  58. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/spaces_tools.py +0 -0
  59. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/string_tools.py +0 -0
  60. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tabular_tools.py +0 -0
  61. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tests/__init__.py +0 -0
  62. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tests/conftest.py +0 -0
  63. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tests/helpers.py +0 -0
  64. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tests/test_datatype.py +0 -0
  65. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tests/test_environment.py +0 -0
  66. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tests/test_json.py +0 -0
  67. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tests/test_path.py +0 -0
  68. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tests/test_yaml.py +0 -0
  69. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tokenization_tools.py +0 -0
  70. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/tools.py +0 -0
  71. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/unicode_tools.py +0 -0
  72. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/version_tools.py +0 -0
  73. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr/tools/yaml_tools.py +0 -0
  74. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  75. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  76. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr.tools.egg-info/entry_points.txt +0 -0
  77. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr.tools.egg-info/requires.txt +43 -43
  78. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/fmtr.tools.egg-info/top_level.txt +0 -0
  79. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/setup.cfg +0 -0
  80. {fmtr_tools-1.1.26 → fmtr_tools-1.1.28}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.1.26
3
+ Version: 1.1.28
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
@@ -9,60 +9,60 @@ License: Copyright © 2025 Frontmatter. All rights reserved.
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
11
  Provides-Extra: test
12
+ Requires-Dist: setuptools; extra == "test"
13
+ Requires-Dist: httpx_retries; extra == "test"
14
+ Requires-Dist: flet-webview; extra == "test"
15
+ Requires-Dist: filetype; extra == "test"
16
+ Requires-Dist: httpx; extra == "test"
17
+ Requires-Dist: bokeh; extra == "test"
18
+ Requires-Dist: fastapi; extra == "test"
19
+ Requires-Dist: tabulate; extra == "test"
20
+ Requires-Dist: flet-video; extra == "test"
21
+ Requires-Dist: uvicorn[standard]; extra == "test"
22
+ Requires-Dist: logfire[httpx]; extra == "test"
23
+ Requires-Dist: logfire; extra == "test"
12
24
  Requires-Dist: torchaudio; extra == "test"
25
+ Requires-Dist: google-api-python-client; extra == "test"
26
+ Requires-Dist: yamlscript; extra == "test"
27
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "test"
13
28
  Requires-Dist: semver; extra == "test"
14
- Requires-Dist: docker; extra == "test"
15
- Requires-Dist: logfire; extra == "test"
29
+ Requires-Dist: html2text; extra == "test"
30
+ Requires-Dist: dnspython[doh]; extra == "test"
31
+ Requires-Dist: pydantic; extra == "test"
32
+ Requires-Dist: tokenizers; extra == "test"
33
+ Requires-Dist: deepmerge; extra == "test"
16
34
  Requires-Dist: ollama; extra == "test"
17
- Requires-Dist: openpyxl; extra == "test"
18
- Requires-Dist: flet[all]; extra == "test"
19
35
  Requires-Dist: diskcache; extra == "test"
36
+ Requires-Dist: google-auth-httplib2; extra == "test"
20
37
  Requires-Dist: pymupdf; extra == "test"
21
- Requires-Dist: pydevd-pycharm; extra == "test"
22
- Requires-Dist: filetype; extra == "test"
23
- Requires-Dist: sentence_transformers; extra == "test"
24
- Requires-Dist: peft; extra == "test"
25
- Requires-Dist: flet-video; extra == "test"
26
- Requires-Dist: appdirs; extra == "test"
27
- Requires-Dist: huggingface_hub; extra == "test"
28
- Requires-Dist: flet-webview; extra == "test"
29
- Requires-Dist: httpx; extra == "test"
30
- Requires-Dist: deepmerge; extra == "test"
38
+ Requires-Dist: tinynetrc; extra == "test"
31
39
  Requires-Dist: pytest-cov; extra == "test"
32
- Requires-Dist: dnspython[doh]; extra == "test"
33
40
  Requires-Dist: regex; extra == "test"
34
- Requires-Dist: openai; extra == "test"
35
- Requires-Dist: html2text; extra == "test"
36
- Requires-Dist: yamlscript; extra == "test"
37
- Requires-Dist: pydantic-settings; extra == "test"
38
- Requires-Dist: dask[bag]; extra == "test"
39
- Requires-Dist: tinynetrc; extra == "test"
40
- Requires-Dist: pandas; extra == "test"
41
- Requires-Dist: bokeh; extra == "test"
42
- Requires-Dist: uvicorn[standard]; extra == "test"
43
- Requires-Dist: torchvision; extra == "test"
44
- Requires-Dist: logfire[fastapi]; extra == "test"
45
- Requires-Dist: Unidecode; extra == "test"
46
- Requires-Dist: tabulate; extra == "test"
47
- Requires-Dist: distributed; extra == "test"
48
- Requires-Dist: tokenizers; extra == "test"
49
41
  Requires-Dist: faker; extra == "test"
50
- Requires-Dist: contexttimer; extra == "test"
51
- Requires-Dist: google-auth-oauthlib; extra == "test"
52
- Requires-Dist: fastapi; extra == "test"
53
- Requires-Dist: google-api-python-client; extra == "test"
54
- Requires-Dist: logfire[httpx]; extra == "test"
55
- Requires-Dist: json_repair; extra == "test"
56
- Requires-Dist: pymupdf4llm; extra == "test"
42
+ Requires-Dist: pydevd-pycharm; extra == "test"
57
43
  Requires-Dist: sre_yield; extra == "test"
58
- Requires-Dist: setuptools; extra == "test"
44
+ Requires-Dist: Unidecode; extra == "test"
45
+ Requires-Dist: pyyaml; extra == "test"
46
+ Requires-Dist: peft; extra == "test"
47
+ Requires-Dist: pymupdf4llm; extra == "test"
48
+ Requires-Dist: distributed; extra == "test"
59
49
  Requires-Dist: transformers[sentencepiece]; extra == "test"
60
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "test"
61
- Requires-Dist: pydantic; extra == "test"
50
+ Requires-Dist: json_repair; extra == "test"
51
+ Requires-Dist: torchvision; extra == "test"
52
+ Requires-Dist: sentence_transformers; extra == "test"
62
53
  Requires-Dist: google-auth; extra == "test"
63
- Requires-Dist: pyyaml; extra == "test"
64
- Requires-Dist: google-auth-httplib2; extra == "test"
65
- Requires-Dist: httpx_retries; extra == "test"
54
+ Requires-Dist: google-auth-oauthlib; extra == "test"
55
+ Requires-Dist: pydantic-settings; extra == "test"
56
+ Requires-Dist: docker; extra == "test"
57
+ Requires-Dist: flet[all]; extra == "test"
58
+ Requires-Dist: contexttimer; extra == "test"
59
+ Requires-Dist: huggingface_hub; extra == "test"
60
+ Requires-Dist: pandas; extra == "test"
61
+ Requires-Dist: openai; extra == "test"
62
+ Requires-Dist: appdirs; extra == "test"
63
+ Requires-Dist: dask[bag]; extra == "test"
64
+ Requires-Dist: openpyxl; extra == "test"
65
+ Requires-Dist: logfire[fastapi]; extra == "test"
66
66
  Provides-Extra: yaml
67
67
  Requires-Dist: yamlscript; extra == "yaml"
68
68
  Requires-Dist: pyyaml; extra == "yaml"
@@ -35,3 +35,7 @@ class Constants:
35
35
  DIR_NAME_SOURCE = 'source'
36
36
  FILENAME_VERSION = 'version'
37
37
  DIR_NAME_HF = 'hf'
38
+
39
+ ENTRYPOINTS_DIR = 'entrypoints'
40
+ PACKAGE_EXCLUDE_DIRS = {'data', 'build', 'dist', '.*', '*egg-info*'}
41
+ INIT_FILENAME = '__init__.py'
@@ -1,5 +1,6 @@
1
1
  import sys
2
2
  from datetime import datetime
3
+ from fnmatch import fnmatch
3
4
  from functools import cached_property
4
5
  from itertools import chain
5
6
  from typing import List, Dict
@@ -40,20 +41,22 @@ class SetupPaths(FromCallerMixin):
40
41
  @cached_property
41
42
  def path(self):
42
43
 
43
- from fmtr.tools import setup
44
-
45
- if self.org:
44
+ if self.is_namespace:
46
45
  base = self.org
47
46
  else:
48
47
  base = self.repo
49
48
 
50
- directories = [base / dir for dir in setup.find_packages(base)]
49
+ packages = [
50
+ dir for dir in base.iterdir()
51
+ if (dir / Constants.INIT_FILENAME).is_file()
52
+ and not any(fnmatch(dir.name, pattern) for pattern in Constants.PACKAGE_EXCLUDE_DIRS)
53
+ ]
51
54
 
52
- if len(directories) != 1:
53
- dirs_str = ', '.join([str(dir) for dir in directories])
54
- raise ValueError(f'Expected exactly one directory in {self.repo}, found {dirs_str}')
55
+ if len(packages) != 1:
56
+ dirs_str = ', '.join([str(dir) for dir in packages])
57
+ raise ValueError(f'Expected exactly one package in {self.repo}, found {dirs_str}')
55
58
 
56
- package = next(iter(directories))
59
+ package = next(iter(packages))
57
60
  return package
58
61
 
59
62
  @property
@@ -65,6 +68,10 @@ class SetupPaths(FromCallerMixin):
65
68
  return False
66
69
  return org
67
70
 
71
+ @property
72
+ def entrypoints(self):
73
+ return self.path / Constants.ENTRYPOINTS_DIR
74
+
68
75
  @property
69
76
  def is_namespace(self) -> bool:
70
77
  return bool(self.org)
@@ -79,9 +86,13 @@ class Setup(FromCallerMixin):
79
86
  AUTHOR_EMAIL = 'innovative.fowler@mask.pro.fmtr.dev'
80
87
 
81
88
  REQUIREMENTS_ARG = 'requirements'
82
- SKIP_DIRS = {'data', 'build', 'dist', '.*', '*egg-info*'}
83
89
 
84
- def __init__(self, dependencies, paths=None, org=Constants.ORG_NAME, console_scripts=None, client=None, do_setup=True, **kwargs):
90
+ ENTRYPOINT_COMMAND_SEP = '-'
91
+ ENTRYPOINT_FUNCTION_SEP = '_'
92
+ ENTRYPOINT_FUNC_NAME = 'main'
93
+
94
+ def __init__(self, dependencies, paths=None, org=Constants.ORG_NAME, client=None, do_setup=True, **kwargs):
95
+
85
96
 
86
97
  self.kwargs = kwargs
87
98
 
@@ -102,7 +113,7 @@ class Setup(FromCallerMixin):
102
113
  self.paths = paths
103
114
 
104
115
  self.client = client
105
- self.console_scripts = console_scripts
116
+
106
117
 
107
118
  if do_setup:
108
119
  self.setup()
@@ -124,27 +135,26 @@ class Setup(FromCallerMixin):
124
135
  reqs = '\n'.join(reqs)
125
136
  print(reqs)
126
137
 
138
+ @property
139
+ def console_scripts(self):
127
140
 
141
+ if not self.paths.entrypoints.exists():
142
+ return {}
128
143
 
129
- def get_entrypoint_path(self, key, value):
130
- if value:
131
- return f'{self.name}.{value}:{key}'
132
- else:
133
- return f'{self.name}:{key}'
144
+ names_mods = [path.stem for path in self.paths.entrypoints.iterdir() if path.is_file() and not path.stem.startswith('_')]
145
+ command_prefix = self.name.replace('.', self.ENTRYPOINT_COMMAND_SEP)
146
+ command_suffixes = [name_mod.replace(self.ENTRYPOINT_FUNCTION_SEP, self.ENTRYPOINT_COMMAND_SEP) for name_mod in names_mods]
147
+ commands = [f'{command_prefix}-{command_suffix}' for command_suffix in command_suffixes]
148
+ paths = [f'{self.name}.{Constants.ENTRYPOINTS_DIR}.{name_mod}:{self.ENTRYPOINT_FUNC_NAME}' for name_mod in names_mods]
134
149
 
135
- @property
136
- def entrypoints(self):
137
- if self.console_scripts:
138
- return dict(
139
- console_scripts=[f'{key} = {self.get_entrypoint_path(key, value)}' for key, value in self.console_scripts.items()],
140
- )
141
- else:
142
- return dict()
150
+ console_scripts = [f'{command} = {path}' for command, path in zip(commands, paths)]
151
+
152
+ return console_scripts
143
153
 
144
154
  @property
145
155
  def name(self):
146
156
  if self.paths.is_namespace:
147
- return f'{self.paths.org}.{self.paths.name}'
157
+ return f'{self.paths.org_name}.{self.paths.name}'
148
158
  return self.paths.name
149
159
 
150
160
  @property
@@ -180,9 +190,7 @@ class Setup(FromCallerMixin):
180
190
 
181
191
  @property
182
192
  def packages(self):
183
-
184
- excludes = list(self.SKIP_DIRS) + [f'{name}.*' for name in self.SKIP_DIRS if '*' not in name]
185
-
193
+ excludes = list(Constants.PACKAGE_EXCLUDE_DIRS) + [f'{name}.*' for name in Constants.PACKAGE_EXCLUDE_DIRS if '*' not in name]
186
194
  packages = self.find(where=str(self.paths.repo), exclude=excludes)
187
195
  return packages
188
196
 
@@ -199,7 +207,7 @@ class Setup(FromCallerMixin):
199
207
 
200
208
  @property
201
209
  def url(self):
202
- return f'https://github.com/{self.paths.org}/{self.paths.name}'
210
+ return f'https://github.com/{self.org}/{self.paths.name}'
203
211
 
204
212
  @property
205
213
  def data(self):
@@ -215,7 +223,9 @@ class Setup(FromCallerMixin):
215
223
  packages=self.packages,
216
224
  package_dir=self.package_dir,
217
225
  package_data=self.package_data,
218
- entry_points=self.entrypoints,
226
+ entry_points=dict(
227
+ console_scripts=self.console_scripts,
228
+ ),
219
229
  install_requires=self.dependencies.install,
220
230
  extras_require=self.dependencies.extras,
221
231
  ) | self.kwargs
@@ -280,7 +290,10 @@ class Dependencies:
280
290
 
281
291
  @cached_property
282
292
  def install(self):
283
- return self.resolve_values(self.INSTALL)
293
+ if self.INSTALL in self.dependencies:
294
+ return self.resolve_values(self.INSTALL)
295
+ else:
296
+ return []
284
297
 
285
298
 
286
299
  if __name__ == '__main__':
@@ -0,0 +1 @@
1
+ 1.1.28
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.1.26
3
+ Version: 1.1.28
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
@@ -9,60 +9,60 @@ License: Copyright © 2025 Frontmatter. All rights reserved.
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
11
  Provides-Extra: test
12
+ Requires-Dist: setuptools; extra == "test"
13
+ Requires-Dist: httpx_retries; extra == "test"
14
+ Requires-Dist: flet-webview; extra == "test"
15
+ Requires-Dist: filetype; extra == "test"
16
+ Requires-Dist: httpx; extra == "test"
17
+ Requires-Dist: bokeh; extra == "test"
18
+ Requires-Dist: fastapi; extra == "test"
19
+ Requires-Dist: tabulate; extra == "test"
20
+ Requires-Dist: flet-video; extra == "test"
21
+ Requires-Dist: uvicorn[standard]; extra == "test"
22
+ Requires-Dist: logfire[httpx]; extra == "test"
23
+ Requires-Dist: logfire; extra == "test"
12
24
  Requires-Dist: torchaudio; extra == "test"
25
+ Requires-Dist: google-api-python-client; extra == "test"
26
+ Requires-Dist: yamlscript; extra == "test"
27
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "test"
13
28
  Requires-Dist: semver; extra == "test"
14
- Requires-Dist: docker; extra == "test"
15
- Requires-Dist: logfire; extra == "test"
29
+ Requires-Dist: html2text; extra == "test"
30
+ Requires-Dist: dnspython[doh]; extra == "test"
31
+ Requires-Dist: pydantic; extra == "test"
32
+ Requires-Dist: tokenizers; extra == "test"
33
+ Requires-Dist: deepmerge; extra == "test"
16
34
  Requires-Dist: ollama; extra == "test"
17
- Requires-Dist: openpyxl; extra == "test"
18
- Requires-Dist: flet[all]; extra == "test"
19
35
  Requires-Dist: diskcache; extra == "test"
36
+ Requires-Dist: google-auth-httplib2; extra == "test"
20
37
  Requires-Dist: pymupdf; extra == "test"
21
- Requires-Dist: pydevd-pycharm; extra == "test"
22
- Requires-Dist: filetype; extra == "test"
23
- Requires-Dist: sentence_transformers; extra == "test"
24
- Requires-Dist: peft; extra == "test"
25
- Requires-Dist: flet-video; extra == "test"
26
- Requires-Dist: appdirs; extra == "test"
27
- Requires-Dist: huggingface_hub; extra == "test"
28
- Requires-Dist: flet-webview; extra == "test"
29
- Requires-Dist: httpx; extra == "test"
30
- Requires-Dist: deepmerge; extra == "test"
38
+ Requires-Dist: tinynetrc; extra == "test"
31
39
  Requires-Dist: pytest-cov; extra == "test"
32
- Requires-Dist: dnspython[doh]; extra == "test"
33
40
  Requires-Dist: regex; extra == "test"
34
- Requires-Dist: openai; extra == "test"
35
- Requires-Dist: html2text; extra == "test"
36
- Requires-Dist: yamlscript; extra == "test"
37
- Requires-Dist: pydantic-settings; extra == "test"
38
- Requires-Dist: dask[bag]; extra == "test"
39
- Requires-Dist: tinynetrc; extra == "test"
40
- Requires-Dist: pandas; extra == "test"
41
- Requires-Dist: bokeh; extra == "test"
42
- Requires-Dist: uvicorn[standard]; extra == "test"
43
- Requires-Dist: torchvision; extra == "test"
44
- Requires-Dist: logfire[fastapi]; extra == "test"
45
- Requires-Dist: Unidecode; extra == "test"
46
- Requires-Dist: tabulate; extra == "test"
47
- Requires-Dist: distributed; extra == "test"
48
- Requires-Dist: tokenizers; extra == "test"
49
41
  Requires-Dist: faker; extra == "test"
50
- Requires-Dist: contexttimer; extra == "test"
51
- Requires-Dist: google-auth-oauthlib; extra == "test"
52
- Requires-Dist: fastapi; extra == "test"
53
- Requires-Dist: google-api-python-client; extra == "test"
54
- Requires-Dist: logfire[httpx]; extra == "test"
55
- Requires-Dist: json_repair; extra == "test"
56
- Requires-Dist: pymupdf4llm; extra == "test"
42
+ Requires-Dist: pydevd-pycharm; extra == "test"
57
43
  Requires-Dist: sre_yield; extra == "test"
58
- Requires-Dist: setuptools; extra == "test"
44
+ Requires-Dist: Unidecode; extra == "test"
45
+ Requires-Dist: pyyaml; extra == "test"
46
+ Requires-Dist: peft; extra == "test"
47
+ Requires-Dist: pymupdf4llm; extra == "test"
48
+ Requires-Dist: distributed; extra == "test"
59
49
  Requires-Dist: transformers[sentencepiece]; extra == "test"
60
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "test"
61
- Requires-Dist: pydantic; extra == "test"
50
+ Requires-Dist: json_repair; extra == "test"
51
+ Requires-Dist: torchvision; extra == "test"
52
+ Requires-Dist: sentence_transformers; extra == "test"
62
53
  Requires-Dist: google-auth; extra == "test"
63
- Requires-Dist: pyyaml; extra == "test"
64
- Requires-Dist: google-auth-httplib2; extra == "test"
65
- Requires-Dist: httpx_retries; extra == "test"
54
+ Requires-Dist: google-auth-oauthlib; extra == "test"
55
+ Requires-Dist: pydantic-settings; extra == "test"
56
+ Requires-Dist: docker; extra == "test"
57
+ Requires-Dist: flet[all]; extra == "test"
58
+ Requires-Dist: contexttimer; extra == "test"
59
+ Requires-Dist: huggingface_hub; extra == "test"
60
+ Requires-Dist: pandas; extra == "test"
61
+ Requires-Dist: openai; extra == "test"
62
+ Requires-Dist: appdirs; extra == "test"
63
+ Requires-Dist: dask[bag]; extra == "test"
64
+ Requires-Dist: openpyxl; extra == "test"
65
+ Requires-Dist: logfire[fastapi]; extra == "test"
66
66
  Provides-Extra: yaml
67
67
  Requires-Dist: yamlscript; extra == "yaml"
68
68
  Requires-Dist: pyyaml; extra == "yaml"
@@ -1 +0,0 @@
1
- 1.1.26
File without changes
File without changes
@@ -135,60 +135,60 @@ tabulate
135
135
  openpyxl
136
136
 
137
137
  [test]
138
+ setuptools
139
+ httpx_retries
140
+ flet-webview
141
+ filetype
142
+ httpx
143
+ bokeh
144
+ fastapi
145
+ tabulate
146
+ flet-video
147
+ uvicorn[standard]
148
+ logfire[httpx]
149
+ logfire
138
150
  torchaudio
151
+ google-api-python-client
152
+ yamlscript
153
+ pydantic-ai[logfire,openai]
139
154
  semver
140
- docker
141
- logfire
155
+ html2text
156
+ dnspython[doh]
157
+ pydantic
158
+ tokenizers
159
+ deepmerge
142
160
  ollama
143
- openpyxl
144
- flet[all]
145
161
  diskcache
162
+ google-auth-httplib2
146
163
  pymupdf
147
- pydevd-pycharm
148
- filetype
149
- sentence_transformers
150
- peft
151
- flet-video
152
- appdirs
153
- huggingface_hub
154
- flet-webview
155
- httpx
156
- deepmerge
164
+ tinynetrc
157
165
  pytest-cov
158
- dnspython[doh]
159
166
  regex
160
- openai
161
- html2text
162
- yamlscript
163
- pydantic-settings
164
- dask[bag]
165
- tinynetrc
166
- pandas
167
- bokeh
168
- uvicorn[standard]
169
- torchvision
170
- logfire[fastapi]
171
- Unidecode
172
- tabulate
173
- distributed
174
- tokenizers
175
167
  faker
176
- contexttimer
177
- google-auth-oauthlib
178
- fastapi
179
- google-api-python-client
180
- logfire[httpx]
181
- json_repair
182
- pymupdf4llm
168
+ pydevd-pycharm
183
169
  sre_yield
184
- setuptools
170
+ Unidecode
171
+ pyyaml
172
+ peft
173
+ pymupdf4llm
174
+ distributed
185
175
  transformers[sentencepiece]
186
- pydantic-ai[logfire,openai]
187
- pydantic
176
+ json_repair
177
+ torchvision
178
+ sentence_transformers
188
179
  google-auth
189
- pyyaml
190
- google-auth-httplib2
191
- httpx_retries
180
+ google-auth-oauthlib
181
+ pydantic-settings
182
+ docker
183
+ flet[all]
184
+ contexttimer
185
+ huggingface_hub
186
+ pandas
187
+ openai
188
+ appdirs
189
+ dask[bag]
190
+ openpyxl
191
+ logfire[fastapi]
192
192
 
193
193
  [tokenization]
194
194
  tokenizers
File without changes
File without changes