fmtr.tools 1.2.7__tar.gz → 1.3.1__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 (89) hide show
  1. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/PKG-INFO +45 -45
  2. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/dns_tools/server.py +1 -1
  3. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/setup_tools/setup_tools.py +147 -47
  4. fmtr_tools-1.3.1/fmtr/tools/version +1 -0
  5. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr.tools.egg-info/PKG-INFO +45 -45
  6. fmtr_tools-1.3.1/pyproject.toml +3 -0
  7. fmtr_tools-1.2.7/fmtr/tools/version +0 -1
  8. fmtr_tools-1.2.7/pyproject.toml +0 -3
  9. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/LICENSE +0 -0
  10. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/README.md +0 -0
  11. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/__init__.py +0 -0
  12. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/ai_tools/__init__.py +0 -0
  13. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  14. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  15. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/api_tools.py +0 -0
  16. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/async_tools.py +0 -0
  17. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/augmentation_tools.py +0 -0
  18. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/caching_tools.py +0 -0
  19. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/constants.py +0 -0
  20. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/data_modelling_tools.py +0 -0
  21. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/dataclass_tools.py +0 -0
  22. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/datatype_tools.py +0 -0
  23. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/debugging_tools.py +0 -0
  24. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/dns_tools/__init__.py +0 -0
  25. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/dns_tools/client.py +0 -0
  26. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/dns_tools/dm.py +0 -0
  27. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/docker_tools.py +0 -0
  28. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/entrypoints/__init__.py +0 -0
  29. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  30. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/entrypoints/ep_test.py +0 -0
  31. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  32. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  33. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/environment_tools.py +0 -0
  34. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/function_tools.py +0 -0
  35. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/google_api_tools.py +0 -0
  36. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/hash_tools.py +0 -0
  37. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/hfh_tools.py +0 -0
  38. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/html_tools.py +0 -0
  39. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/http_tools.py +0 -0
  40. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/import_tools.py +0 -0
  41. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/inspection_tools.py +0 -0
  42. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/interface_tools.py +0 -0
  43. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/iterator_tools.py +0 -0
  44. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/json_fix_tools.py +0 -0
  45. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/json_tools.py +0 -0
  46. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/logging_tools.py +0 -0
  47. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/merging_tools.py +0 -0
  48. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/metric_tools.py +0 -0
  49. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/name_tools.py +0 -0
  50. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/netrc_tools.py +0 -0
  51. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/openai_tools.py +0 -0
  52. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/packaging_tools.py +0 -0
  53. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/parallel_tools.py +0 -0
  54. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/path_tools/__init__.py +0 -0
  55. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  56. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/path_tools/path_tools.py +0 -0
  57. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  58. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/pattern_tools.py +0 -0
  59. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/pdf_tools.py +0 -0
  60. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/platform_tools.py +0 -0
  61. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/process_tools.py +0 -0
  62. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/profiling_tools.py +0 -0
  63. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/random_tools.py +0 -0
  64. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/semantic_tools.py +0 -0
  65. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/settings_tools.py +0 -0
  66. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/setup_tools/__init__.py +0 -0
  67. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/spaces_tools.py +0 -0
  68. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/string_tools.py +0 -0
  69. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tabular_tools.py +0 -0
  70. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tests/__init__.py +0 -0
  71. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tests/conftest.py +0 -0
  72. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tests/helpers.py +0 -0
  73. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tests/test_datatype.py +0 -0
  74. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tests/test_environment.py +0 -0
  75. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tests/test_json.py +0 -0
  76. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tests/test_path.py +0 -0
  77. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tests/test_yaml.py +0 -0
  78. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tokenization_tools.py +0 -0
  79. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/tools.py +0 -0
  80. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/unicode_tools.py +0 -0
  81. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/version_tools.py +0 -0
  82. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr/tools/yaml_tools.py +0 -0
  83. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  84. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  85. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr.tools.egg-info/entry_points.txt +0 -0
  86. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr.tools.egg-info/requires.txt +43 -43
  87. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/fmtr.tools.egg-info/top_level.txt +0 -0
  88. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/setup.cfg +0 -0
  89. {fmtr_tools-1.2.7 → fmtr_tools-1.3.1}/setup.py +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.2.7
3
+ Version: 1.3.1
4
4
  Summary: Collection of high-level tools to simplify everyday development tasks, with a focus on AI/ML
5
- Home-page: https://github.com/fmtr/tools
5
+ Home-page: https://github.com/fmtr/fmtr.tools
6
6
  Author: Frontmatter
7
7
  Author-email: innovative.fowler@mask.pro.fmtr.dev
8
8
  License: Copyright © 2025 Frontmatter. All rights reserved.
@@ -130,60 +130,60 @@ Requires-Dist: logfire[httpx]; extra == "http"
130
130
  Provides-Extra: setup
131
131
  Requires-Dist: setuptools; extra == "setup"
132
132
  Provides-Extra: all
133
+ Requires-Dist: deepmerge; extra == "all"
134
+ Requires-Dist: bokeh; extra == "all"
133
135
  Requires-Dist: distributed; extra == "all"
134
- Requires-Dist: diskcache; extra == "all"
136
+ Requires-Dist: pydantic; extra == "all"
137
+ Requires-Dist: appdirs; extra == "all"
135
138
  Requires-Dist: sre_yield; extra == "all"
136
- Requires-Dist: httpx_retries; extra == "all"
137
- Requires-Dist: filetype; extra == "all"
138
- Requires-Dist: logfire[httpx]; extra == "all"
139
- Requires-Dist: pymupdf4llm; extra == "all"
139
+ Requires-Dist: logfire; extra == "all"
140
+ Requires-Dist: ollama; extra == "all"
140
141
  Requires-Dist: Unidecode; extra == "all"
141
- Requires-Dist: uvicorn[standard]; extra == "all"
142
- Requires-Dist: faker; extra == "all"
143
- Requires-Dist: semver; extra == "all"
142
+ Requires-Dist: flet[all]; extra == "all"
143
+ Requires-Dist: google-auth-httplib2; extra == "all"
144
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
145
+ Requires-Dist: pydevd-pycharm; extra == "all"
146
+ Requires-Dist: torchvision; extra == "all"
144
147
  Requires-Dist: pyyaml; extra == "all"
145
- Requires-Dist: regex; extra == "all"
146
- Requires-Dist: contexttimer; extra == "all"
147
- Requires-Dist: peft; extra == "all"
148
- Requires-Dist: flet-webview; extra == "all"
149
- Requires-Dist: pydantic-settings; extra == "all"
150
- Requires-Dist: deepmerge; extra == "all"
151
- Requires-Dist: httpx; extra == "all"
152
- Requires-Dist: pydantic; extra == "all"
148
+ Requires-Dist: tabulate; extra == "all"
153
149
  Requires-Dist: pymupdf; extra == "all"
154
- Requires-Dist: google-auth; extra == "all"
155
- Requires-Dist: google-api-python-client; extra == "all"
156
- Requires-Dist: logfire; extra == "all"
157
- Requires-Dist: openpyxl; extra == "all"
158
- Requires-Dist: html2text; extra == "all"
159
- Requires-Dist: pytest-cov; extra == "all"
160
150
  Requires-Dist: docker; extra == "all"
161
- Requires-Dist: google-auth-oauthlib; extra == "all"
162
- Requires-Dist: json_repair; extra == "all"
163
- Requires-Dist: ollama; extra == "all"
151
+ Requires-Dist: openai; extra == "all"
164
152
  Requires-Dist: sentence_transformers; extra == "all"
165
- Requires-Dist: pandas; extra == "all"
166
- Requires-Dist: setuptools; extra == "all"
167
- Requires-Dist: logfire[fastapi]; extra == "all"
168
- Requires-Dist: tabulate; extra == "all"
169
- Requires-Dist: pydevd-pycharm; extra == "all"
170
- Requires-Dist: huggingface_hub; extra == "all"
171
- Requires-Dist: flet-video; extra == "all"
172
- Requires-Dist: dask[bag]; extra == "all"
173
- Requires-Dist: google-auth-httplib2; extra == "all"
174
- Requires-Dist: bokeh; extra == "all"
175
- Requires-Dist: fastapi; extra == "all"
176
153
  Requires-Dist: dnspython[doh]; extra == "all"
177
- Requires-Dist: transformers[sentencepiece]; extra == "all"
178
- Requires-Dist: yamlscript; extra == "all"
154
+ Requires-Dist: regex; extra == "all"
155
+ Requires-Dist: semver; extra == "all"
156
+ Requires-Dist: setuptools; extra == "all"
157
+ Requires-Dist: google-auth; extra == "all"
158
+ Requires-Dist: openpyxl; extra == "all"
159
+ Requires-Dist: google-api-python-client; extra == "all"
179
160
  Requires-Dist: torchaudio; extra == "all"
180
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
181
- Requires-Dist: torchvision; extra == "all"
182
- Requires-Dist: flet[all]; extra == "all"
183
- Requires-Dist: openai; extra == "all"
184
161
  Requires-Dist: tinynetrc; extra == "all"
185
- Requires-Dist: appdirs; extra == "all"
162
+ Requires-Dist: httpx_retries; extra == "all"
163
+ Requires-Dist: pymupdf4llm; extra == "all"
164
+ Requires-Dist: yamlscript; extra == "all"
165
+ Requires-Dist: filetype; extra == "all"
166
+ Requires-Dist: pydantic-settings; extra == "all"
167
+ Requires-Dist: flet-webview; extra == "all"
168
+ Requires-Dist: google-auth-oauthlib; extra == "all"
169
+ Requires-Dist: pytest-cov; extra == "all"
170
+ Requires-Dist: fastapi; extra == "all"
171
+ Requires-Dist: logfire[fastapi]; extra == "all"
172
+ Requires-Dist: pandas; extra == "all"
173
+ Requires-Dist: html2text; extra == "all"
174
+ Requires-Dist: dask[bag]; extra == "all"
175
+ Requires-Dist: uvicorn[standard]; extra == "all"
176
+ Requires-Dist: json_repair; extra == "all"
177
+ Requires-Dist: flet-video; extra == "all"
178
+ Requires-Dist: httpx; extra == "all"
179
+ Requires-Dist: faker; extra == "all"
180
+ Requires-Dist: peft; extra == "all"
186
181
  Requires-Dist: tokenizers; extra == "all"
182
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
183
+ Requires-Dist: logfire[httpx]; extra == "all"
184
+ Requires-Dist: contexttimer; extra == "all"
185
+ Requires-Dist: huggingface_hub; extra == "all"
186
+ Requires-Dist: diskcache; extra == "all"
187
187
  Dynamic: author
188
188
  Dynamic: author-email
189
189
  Dynamic: description
@@ -66,7 +66,7 @@ class ServerBaseDoHProxy(ServerBasePlain):
66
66
 
67
67
  request = exchange.request
68
68
 
69
- with logger.span(f'Handling request for {request.name_text} from {exchange.client}...'):
69
+ with logger.span(f'Handling request ID {request.message.id} for {request.name_text} from {exchange.client}...'):
70
70
 
71
71
  if not request.is_valid:
72
72
  raise ValueError(f'Only one question per request is supported. Got {len(request.question)} questions.')
@@ -3,7 +3,7 @@ from datetime import datetime
3
3
  from fnmatch import fnmatch
4
4
  from functools import cached_property
5
5
  from itertools import chain
6
- from typing import List, Dict
6
+ from typing import List, Dict, Any, Callable, Optional
7
7
 
8
8
  from fmtr.tools.constants import Constants
9
9
  from fmtr.tools.path_tools import Path
@@ -18,7 +18,6 @@ class SetupPaths(FromCallerMixin):
18
18
  """
19
19
 
20
20
  def __init__(self, path=None, org=Constants.ORG_NAME):
21
-
22
21
  """
23
22
 
24
23
  Use calling module path as default path, if not otherwise specified.
@@ -31,15 +30,30 @@ class SetupPaths(FromCallerMixin):
31
30
  self.repo = Path(path)
32
31
 
33
32
  @property
34
- def readme(self):
33
+ def readme(self) -> Path:
34
+ """
35
+
36
+ Path of the README file.
37
+
38
+ """
35
39
  return self.repo / 'README.md'
36
40
 
37
41
  @property
38
- def version(self):
42
+ def version(self) -> Path:
43
+ """
44
+
45
+ Path of the version file
46
+
47
+ """
39
48
  return self.path / Constants.FILENAME_VERSION
40
49
 
41
50
  @cached_property
42
- def path(self):
51
+ def path(self) -> Path:
52
+ """
53
+
54
+ Infer the package path. It should be the only non-excluded package in the repo/org Path.
55
+
56
+ """
43
57
 
44
58
  if self.is_namespace:
45
59
  base = self.org
@@ -61,7 +75,12 @@ class SetupPaths(FromCallerMixin):
61
75
  return package
62
76
 
63
77
  @property
64
- def org(self):
78
+ def org(self) -> bool | Path:
79
+ """
80
+
81
+ Get the org path, i.e. the namespace parent directory.
82
+
83
+ """
65
84
  if not self.org_name:
66
85
  return False
67
86
  org = self.repo / self.org_name
@@ -70,7 +89,12 @@ class SetupPaths(FromCallerMixin):
70
89
  return org
71
90
 
72
91
  @property
73
- def entrypoints(self):
92
+ def entrypoints(self) -> Path:
93
+ """
94
+
95
+ Path of entrypoints sub-package.
96
+
97
+ """
74
98
  return self.path / Constants.ENTRYPOINTS_DIR
75
99
 
76
100
  @property
@@ -83,6 +107,11 @@ class SetupPaths(FromCallerMixin):
83
107
 
84
108
 
85
109
  class Setup(FromCallerMixin):
110
+ """
111
+
112
+ Abstract canonical pacakge setup for setuptools.
113
+
114
+ """
86
115
  AUTHOR = 'Frontmatter'
87
116
  AUTHOR_EMAIL = 'innovative.fowler@mask.pro.fmtr.dev'
88
117
 
@@ -93,8 +122,12 @@ class Setup(FromCallerMixin):
93
122
  ENTRYPOINT_FUNC_NAME = 'main'
94
123
 
95
124
  def __init__(self, dependencies, paths=None, org=Constants.ORG_NAME, client=None, do_setup=True, **kwargs):
125
+ """
96
126
 
127
+ First check if commandline arguments for requirements output exist. If so, print them and return early.
128
+ Otherwise, continue generating data to pass to setuptools.
97
129
 
130
+ """
98
131
  self.kwargs = kwargs
99
132
 
100
133
  if type(dependencies) is not Dependencies:
@@ -115,11 +148,15 @@ class Setup(FromCallerMixin):
115
148
 
116
149
  self.client = client
117
150
 
118
-
119
151
  if do_setup:
120
152
  self.setup()
121
153
 
122
- def get_requirements_extras(self):
154
+ def get_requirements_extras(self) -> Optional[List[str]]:
155
+ """
156
+
157
+ Get list of extras from command line arguments.
158
+
159
+ """
123
160
  if self.REQUIREMENTS_ARG not in sys.argv:
124
161
  return None
125
162
 
@@ -128,6 +165,11 @@ class Setup(FromCallerMixin):
128
165
  return extras
129
166
 
130
167
  def print_requirements(self):
168
+ """
169
+
170
+ Output flat list of requirements for specified extras
171
+
172
+ """
131
173
  reqs = []
132
174
  reqs += self.dependencies.install
133
175
 
@@ -137,12 +179,17 @@ class Setup(FromCallerMixin):
137
179
  print(reqs)
138
180
 
139
181
  @property
140
- def console_scripts(self):
182
+ def console_scripts(self) -> List[str]:
183
+ """
184
+
185
+ Generate console scripts for any modules in the `entrypoints` sub-package.
186
+
187
+ """
141
188
 
142
189
  if not self.paths.entrypoints.exists():
143
- return {}
190
+ return []
144
191
 
145
- names_mods = [path.stem for path in self.paths.entrypoints.iterdir() if path.is_file() and not path.stem.startswith('_')]
192
+ names_mods = [path.stem for path in self.paths.entrypoints.iterdir() if path.is_file() and path.name != Constants.INIT_FILENAME]
146
193
  command_prefix = self.name.replace('.', self.ENTRYPOINT_COMMAND_SEP)
147
194
  command_suffixes = [name_mod.replace(self.ENTRYPOINT_FUNCTION_SEP, self.ENTRYPOINT_COMMAND_SEP) for name_mod in names_mods]
148
195
  commands = [f'{command_prefix}-{command_suffix}' for command_suffix in command_suffixes]
@@ -153,35 +200,63 @@ class Setup(FromCallerMixin):
153
200
  return console_scripts
154
201
 
155
202
  @property
156
- def name(self):
203
+ def name(self) -> str:
204
+ """
205
+
206
+ Full library name
207
+
208
+ """
157
209
  if self.paths.is_namespace:
158
210
  return f'{self.paths.org_name}.{self.paths.name}'
159
211
  return self.paths.name
160
212
 
161
213
  @property
162
- def author(self):
214
+ def author(self) -> str:
215
+ """
216
+
217
+ Create appropriate author string
218
+
219
+ """
163
220
  if self.client:
164
221
  return f'{self.AUTHOR} on behalf of {self.client}'
165
222
  return self.AUTHOR
166
223
 
167
224
  @property
168
- def copyright(self):
225
+ def copyright(self) -> str:
226
+ """
227
+
228
+ Create appropriate copyright string
229
+
230
+ """
169
231
  if self.client:
170
232
  return self.client
171
233
  return self.AUTHOR
172
234
 
173
235
  @property
174
- def long_description(self):
236
+ def long_description(self) -> str:
237
+ """
238
+
239
+ Read in README.md
175
240
 
241
+ """
176
242
  return self.paths.readme.read_text()
177
243
 
178
244
  @property
179
- def version(self):
245
+ def version(self) -> str:
246
+ """
247
+
248
+ Read in the version string from file
249
+
250
+ """
180
251
  return self.paths.version.read_text().strip()
181
252
 
182
253
  @property
183
- def find(self):
254
+ def find(self) -> Callable:
255
+ """
256
+
257
+ Use the appropriate package finding function from setuptools
184
258
 
259
+ """
185
260
  from fmtr.tools import setup
186
261
 
187
262
  if self.paths.is_namespace:
@@ -190,13 +265,23 @@ class Setup(FromCallerMixin):
190
265
  return setup.find_packages
191
266
 
192
267
  @property
193
- def packages(self):
268
+ def packages(self) -> List[str]:
269
+ """
270
+
271
+ Fetch list of packages excluding canonical paths
272
+
273
+ """
194
274
  excludes = list(Constants.PACKAGE_EXCLUDE_DIRS) + [f'{name}.*' for name in Constants.PACKAGE_EXCLUDE_DIRS if '*' not in name]
195
275
  packages = self.find(where=str(self.paths.repo), exclude=excludes)
196
276
  return packages
197
277
 
198
278
  @property
199
279
  def package_dir(self):
280
+ """
281
+
282
+ Needs to be relative apparently as absolute paths break during packaging
283
+
284
+ """
200
285
  if self.paths.is_namespace:
201
286
  return {'': '.'}
202
287
  else:
@@ -204,14 +289,29 @@ class Setup(FromCallerMixin):
204
289
 
205
290
  @property
206
291
  def package_data(self):
292
+ """
293
+
294
+ Default package data is just the version file
295
+
296
+ """
207
297
  return {self.name: [Constants.FILENAME_VERSION]}
208
298
 
209
299
  @property
210
- def url(self):
211
- return f'https://github.com/{self.org}/{self.paths.name}'
300
+ def url(self) -> str:
301
+ """
302
+
303
+ Default to GitHub URL
304
+
305
+ """
306
+ return f'https://github.com/{self.org}/{self.name}'
212
307
 
213
308
  @property
214
- def data(self):
309
+ def data(self) -> Dict[str, Any]:
310
+ """
311
+
312
+ Generate data for use by setuptools
313
+
314
+ """
215
315
  data = dict(
216
316
  name=self.name,
217
317
  version=self.version,
@@ -233,13 +333,30 @@ class Setup(FromCallerMixin):
233
333
  return data
234
334
 
235
335
  def setup(self):
336
+ """
337
+
338
+ Call setuptools.setup using generated data
339
+
340
+ """
236
341
 
237
342
  from fmtr.tools import setup
238
343
 
239
344
  return setup.setup_setuptools(**self.data)
240
345
 
346
+ def __repr__(self) -> str:
347
+ """
348
+
349
+ Show library name
350
+
351
+ """
352
+ return f'{self.__class__.__name__}("{self.name}")'
241
353
 
242
354
  class Tools:
355
+ """
356
+
357
+ Helper for downstream libraries to specify lists of `fmtr.tools` extras
358
+
359
+ """
243
360
  MASK = f'{Constants.LIBRARY_NAME}[{{extras}}]'
244
361
 
245
362
  def __init__(self, *extras):
@@ -261,7 +378,7 @@ class Dependencies:
261
378
  def resolve_values(self, key) -> List[str]:
262
379
  """
263
380
 
264
- Flatten a list of values.
381
+ Flatten a list of dependencies.
265
382
 
266
383
  """
267
384
  values_resolved = []
@@ -290,7 +407,12 @@ class Dependencies:
290
407
  return resolved
291
408
 
292
409
  @cached_property
293
- def install(self):
410
+ def install(self) -> List[str]:
411
+ """
412
+
413
+ Get install_requires
414
+
415
+ """
294
416
  if self.INSTALL in self.dependencies:
295
417
  return self.resolve_values(self.INSTALL)
296
418
  else:
@@ -298,26 +420,4 @@ class Dependencies:
298
420
 
299
421
 
300
422
  if __name__ == '__main__':
301
- ds = Dependencies(
302
- install=['version', 'yaml'],
303
-
304
- yaml=['yamlscript', 'pyyaml'],
305
- logging=['logfire', 'version'],
306
- version=['semver', 'av'],
307
- av=['av']
308
- # Add the rest of your dependencies...
309
- )
310
-
311
- ds
312
-
313
- setup = Setup(
314
- # client='Acme',
315
- dependencies=ds,
316
- description='some tools test',
317
- console_scripts=dict(
318
- cache_hfh='console_script_tools',
319
- test=None,
320
- )
321
- )
322
- data = setup.get_data_setup()
323
- data
423
+ ...
@@ -0,0 +1 @@
1
+ 1.3.1
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.2.7
3
+ Version: 1.3.1
4
4
  Summary: Collection of high-level tools to simplify everyday development tasks, with a focus on AI/ML
5
- Home-page: https://github.com/fmtr/tools
5
+ Home-page: https://github.com/fmtr/fmtr.tools
6
6
  Author: Frontmatter
7
7
  Author-email: innovative.fowler@mask.pro.fmtr.dev
8
8
  License: Copyright © 2025 Frontmatter. All rights reserved.
@@ -130,60 +130,60 @@ Requires-Dist: logfire[httpx]; extra == "http"
130
130
  Provides-Extra: setup
131
131
  Requires-Dist: setuptools; extra == "setup"
132
132
  Provides-Extra: all
133
+ Requires-Dist: deepmerge; extra == "all"
134
+ Requires-Dist: bokeh; extra == "all"
133
135
  Requires-Dist: distributed; extra == "all"
134
- Requires-Dist: diskcache; extra == "all"
136
+ Requires-Dist: pydantic; extra == "all"
137
+ Requires-Dist: appdirs; extra == "all"
135
138
  Requires-Dist: sre_yield; extra == "all"
136
- Requires-Dist: httpx_retries; extra == "all"
137
- Requires-Dist: filetype; extra == "all"
138
- Requires-Dist: logfire[httpx]; extra == "all"
139
- Requires-Dist: pymupdf4llm; extra == "all"
139
+ Requires-Dist: logfire; extra == "all"
140
+ Requires-Dist: ollama; extra == "all"
140
141
  Requires-Dist: Unidecode; extra == "all"
141
- Requires-Dist: uvicorn[standard]; extra == "all"
142
- Requires-Dist: faker; extra == "all"
143
- Requires-Dist: semver; extra == "all"
142
+ Requires-Dist: flet[all]; extra == "all"
143
+ Requires-Dist: google-auth-httplib2; extra == "all"
144
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
145
+ Requires-Dist: pydevd-pycharm; extra == "all"
146
+ Requires-Dist: torchvision; extra == "all"
144
147
  Requires-Dist: pyyaml; extra == "all"
145
- Requires-Dist: regex; extra == "all"
146
- Requires-Dist: contexttimer; extra == "all"
147
- Requires-Dist: peft; extra == "all"
148
- Requires-Dist: flet-webview; extra == "all"
149
- Requires-Dist: pydantic-settings; extra == "all"
150
- Requires-Dist: deepmerge; extra == "all"
151
- Requires-Dist: httpx; extra == "all"
152
- Requires-Dist: pydantic; extra == "all"
148
+ Requires-Dist: tabulate; extra == "all"
153
149
  Requires-Dist: pymupdf; extra == "all"
154
- Requires-Dist: google-auth; extra == "all"
155
- Requires-Dist: google-api-python-client; extra == "all"
156
- Requires-Dist: logfire; extra == "all"
157
- Requires-Dist: openpyxl; extra == "all"
158
- Requires-Dist: html2text; extra == "all"
159
- Requires-Dist: pytest-cov; extra == "all"
160
150
  Requires-Dist: docker; extra == "all"
161
- Requires-Dist: google-auth-oauthlib; extra == "all"
162
- Requires-Dist: json_repair; extra == "all"
163
- Requires-Dist: ollama; extra == "all"
151
+ Requires-Dist: openai; extra == "all"
164
152
  Requires-Dist: sentence_transformers; extra == "all"
165
- Requires-Dist: pandas; extra == "all"
166
- Requires-Dist: setuptools; extra == "all"
167
- Requires-Dist: logfire[fastapi]; extra == "all"
168
- Requires-Dist: tabulate; extra == "all"
169
- Requires-Dist: pydevd-pycharm; extra == "all"
170
- Requires-Dist: huggingface_hub; extra == "all"
171
- Requires-Dist: flet-video; extra == "all"
172
- Requires-Dist: dask[bag]; extra == "all"
173
- Requires-Dist: google-auth-httplib2; extra == "all"
174
- Requires-Dist: bokeh; extra == "all"
175
- Requires-Dist: fastapi; extra == "all"
176
153
  Requires-Dist: dnspython[doh]; extra == "all"
177
- Requires-Dist: transformers[sentencepiece]; extra == "all"
178
- Requires-Dist: yamlscript; extra == "all"
154
+ Requires-Dist: regex; extra == "all"
155
+ Requires-Dist: semver; extra == "all"
156
+ Requires-Dist: setuptools; extra == "all"
157
+ Requires-Dist: google-auth; extra == "all"
158
+ Requires-Dist: openpyxl; extra == "all"
159
+ Requires-Dist: google-api-python-client; extra == "all"
179
160
  Requires-Dist: torchaudio; extra == "all"
180
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
181
- Requires-Dist: torchvision; extra == "all"
182
- Requires-Dist: flet[all]; extra == "all"
183
- Requires-Dist: openai; extra == "all"
184
161
  Requires-Dist: tinynetrc; extra == "all"
185
- Requires-Dist: appdirs; extra == "all"
162
+ Requires-Dist: httpx_retries; extra == "all"
163
+ Requires-Dist: pymupdf4llm; extra == "all"
164
+ Requires-Dist: yamlscript; extra == "all"
165
+ Requires-Dist: filetype; extra == "all"
166
+ Requires-Dist: pydantic-settings; extra == "all"
167
+ Requires-Dist: flet-webview; extra == "all"
168
+ Requires-Dist: google-auth-oauthlib; extra == "all"
169
+ Requires-Dist: pytest-cov; extra == "all"
170
+ Requires-Dist: fastapi; extra == "all"
171
+ Requires-Dist: logfire[fastapi]; extra == "all"
172
+ Requires-Dist: pandas; extra == "all"
173
+ Requires-Dist: html2text; extra == "all"
174
+ Requires-Dist: dask[bag]; extra == "all"
175
+ Requires-Dist: uvicorn[standard]; extra == "all"
176
+ Requires-Dist: json_repair; extra == "all"
177
+ Requires-Dist: flet-video; extra == "all"
178
+ Requires-Dist: httpx; extra == "all"
179
+ Requires-Dist: faker; extra == "all"
180
+ Requires-Dist: peft; extra == "all"
186
181
  Requires-Dist: tokenizers; extra == "all"
182
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
183
+ Requires-Dist: logfire[httpx]; extra == "all"
184
+ Requires-Dist: contexttimer; extra == "all"
185
+ Requires-Dist: huggingface_hub; extra == "all"
186
+ Requires-Dist: diskcache; extra == "all"
187
187
  Dynamic: author
188
188
  Dynamic: author-email
189
189
  Dynamic: description
@@ -0,0 +1,3 @@
1
+ [build-system]
2
+ requires = ["fmtr.tools[setup]==1.3.0"]
3
+ build-backend = "setuptools.build_meta"
@@ -1 +0,0 @@
1
- 1.2.7
@@ -1,3 +0,0 @@
1
- [build-system]
2
- requires = ["fmtr.tools[setup]==1.2.0"]
3
- build-backend = "setuptools.build_meta"
File without changes
File without changes
@@ -15,60 +15,60 @@ pydantic-ai[logfire,openai]
15
15
  ollama
16
16
 
17
17
  [all]
18
+ deepmerge
19
+ bokeh
18
20
  distributed
19
- diskcache
21
+ pydantic
22
+ appdirs
20
23
  sre_yield
21
- httpx_retries
22
- filetype
23
- logfire[httpx]
24
- pymupdf4llm
24
+ logfire
25
+ ollama
25
26
  Unidecode
26
- uvicorn[standard]
27
- faker
28
- semver
27
+ flet[all]
28
+ google-auth-httplib2
29
+ pydantic-ai[logfire,openai]
30
+ pydevd-pycharm
31
+ torchvision
29
32
  pyyaml
30
- regex
31
- contexttimer
32
- peft
33
- flet-webview
34
- pydantic-settings
35
- deepmerge
36
- httpx
37
- pydantic
33
+ tabulate
38
34
  pymupdf
39
- google-auth
40
- google-api-python-client
41
- logfire
42
- openpyxl
43
- html2text
44
- pytest-cov
45
35
  docker
46
- google-auth-oauthlib
47
- json_repair
48
- ollama
36
+ openai
49
37
  sentence_transformers
50
- pandas
51
- setuptools
52
- logfire[fastapi]
53
- tabulate
54
- pydevd-pycharm
55
- huggingface_hub
56
- flet-video
57
- dask[bag]
58
- google-auth-httplib2
59
- bokeh
60
- fastapi
61
38
  dnspython[doh]
62
- transformers[sentencepiece]
63
- yamlscript
39
+ regex
40
+ semver
41
+ setuptools
42
+ google-auth
43
+ openpyxl
44
+ google-api-python-client
64
45
  torchaudio
65
- pydantic-ai[logfire,openai]
66
- torchvision
67
- flet[all]
68
- openai
69
46
  tinynetrc
70
- appdirs
47
+ httpx_retries
48
+ pymupdf4llm
49
+ yamlscript
50
+ filetype
51
+ pydantic-settings
52
+ flet-webview
53
+ google-auth-oauthlib
54
+ pytest-cov
55
+ fastapi
56
+ logfire[fastapi]
57
+ pandas
58
+ html2text
59
+ dask[bag]
60
+ uvicorn[standard]
61
+ json_repair
62
+ flet-video
63
+ httpx
64
+ faker
65
+ peft
71
66
  tokenizers
67
+ transformers[sentencepiece]
68
+ logfire[httpx]
69
+ contexttimer
70
+ huggingface_hub
71
+ diskcache
72
72
 
73
73
  [api]
74
74
  fastapi
File without changes
File without changes