fmtr.tools 1.3.74__tar.gz → 1.3.76__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (100) hide show
  1. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/PKG-INFO +47 -50
  2. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/constants.py +4 -1
  3. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/data_modelling_tools.py +31 -1
  4. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/database_tools/document.py +2 -2
  5. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/interface_tools/interface_tools.py +0 -8
  6. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/settings_tools.py +4 -2
  7. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/setup_tools/setup_tools.py +29 -5
  8. fmtr_tools-1.3.76/fmtr/tools/version +1 -0
  9. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr.tools.egg-info/PKG-INFO +47 -50
  10. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr.tools.egg-info/requires.txt +46 -49
  11. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/setup.py +1 -1
  12. fmtr_tools-1.3.74/fmtr/tools/version +0 -1
  13. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/LICENSE +0 -0
  14. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/README.md +0 -0
  15. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/__init__.py +0 -0
  16. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/ai_tools/__init__.py +0 -0
  17. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  18. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  19. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/api_tools.py +0 -0
  20. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/async_tools.py +0 -0
  21. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/augmentation_tools.py +0 -0
  22. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/caching_tools.py +0 -0
  23. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/context_tools.py +0 -0
  24. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/database_tools/__init__.py +0 -0
  25. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/dataclass_tools.py +0 -0
  26. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/datatype_tools.py +0 -0
  27. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/datetime_tools.py +0 -0
  28. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/debugging_tools.py +0 -0
  29. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/dns_tools/__init__.py +0 -0
  30. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/dns_tools/client.py +0 -0
  31. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/dns_tools/dm.py +0 -0
  32. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/dns_tools/proxy.py +0 -0
  33. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/dns_tools/server.py +0 -0
  34. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/docker_tools/__init__.py +0 -0
  35. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/entrypoints/__init__.py +0 -0
  36. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  37. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/entrypoints/ep_test.py +0 -0
  38. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  39. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  40. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  41. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/environment_tools.py +0 -0
  42. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/function_tools.py +0 -0
  43. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/google_api_tools.py +0 -0
  44. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/hash_tools.py +0 -0
  45. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/hfh_tools.py +0 -0
  46. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/html_tools.py +0 -0
  47. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/http_tools.py +0 -0
  48. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/import_tools.py +0 -0
  49. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/inherit_tools.py +0 -0
  50. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/inspection_tools.py +0 -0
  51. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/interface_tools/__init__.py +0 -0
  52. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/interface_tools/context.py +0 -0
  53. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/interface_tools/controls.py +0 -0
  54. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/iterator_tools.py +0 -0
  55. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/json_fix_tools.py +0 -0
  56. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/json_tools.py +0 -0
  57. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/logging_tools.py +0 -0
  58. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/merging_tools.py +0 -0
  59. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/metric_tools.py +0 -0
  60. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/name_tools.py +0 -0
  61. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/netrc_tools.py +0 -0
  62. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/openai_tools.py +0 -0
  63. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/packaging_tools.py +0 -0
  64. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/parallel_tools.py +0 -0
  65. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/path_tools/__init__.py +0 -0
  66. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  67. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/path_tools/path_tools.py +0 -0
  68. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  69. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/pattern_tools.py +0 -0
  70. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/pdf_tools.py +0 -0
  71. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/platform_tools.py +0 -0
  72. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/process_tools.py +0 -0
  73. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/profiling_tools.py +0 -0
  74. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/random_tools.py +0 -0
  75. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/semantic_tools.py +0 -0
  76. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/setup_tools/__init__.py +0 -0
  77. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/spaces_tools.py +0 -0
  78. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/string_tools.py +0 -0
  79. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tabular_tools.py +0 -0
  80. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tests/__init__.py +0 -0
  81. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tests/conftest.py +0 -0
  82. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tests/helpers.py +0 -0
  83. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tests/test_datatype.py +0 -0
  84. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tests/test_environment.py +0 -0
  85. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tests/test_json.py +0 -0
  86. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tests/test_path.py +0 -0
  87. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tests/test_yaml.py +0 -0
  88. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tokenization_tools.py +0 -0
  89. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/tools.py +0 -0
  90. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/unicode_tools.py +0 -0
  91. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/version_tools/__init__.py +0 -0
  92. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/version_tools/version_tools.py +0 -0
  93. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/webhook_tools.py +0 -0
  94. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr/tools/yaml_tools.py +0 -0
  95. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  96. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  97. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr.tools.egg-info/entry_points.txt +0 -0
  98. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/fmtr.tools.egg-info/top_level.txt +0 -0
  99. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/pyproject.toml +0 -0
  100. {fmtr_tools-1.3.74 → fmtr_tools-1.3.76}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.74
3
+ Version: 1.3.76
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
@@ -21,7 +21,6 @@ Requires-Dist: pyyaml; extra == "dev"
21
21
  Requires-Dist: yamlscript; extra == "dev"
22
22
  Requires-Dist: pyyaml; extra == "dev"
23
23
  Requires-Dist: beanie[odm]; extra == "dev"
24
- Requires-Dist: motor; extra == "dev"
25
24
  Provides-Extra: test
26
25
  Requires-Dist: pytest-cov; extra == "test"
27
26
  Provides-Extra: yaml
@@ -166,70 +165,68 @@ Requires-Dist: playwright; extra == "browsers"
166
165
  Provides-Extra: db
167
166
  Provides-Extra: db-document
168
167
  Requires-Dist: beanie[odm]; extra == "db-document"
169
- Requires-Dist: motor; extra == "db-document"
170
168
  Provides-Extra: all
171
- Requires-Dist: tinynetrc; extra == "all"
172
- Requires-Dist: cachetools; extra == "all"
173
- Requires-Dist: appdirs; extra == "all"
174
169
  Requires-Dist: json_repair; extra == "all"
170
+ Requires-Dist: distributed; extra == "all"
171
+ Requires-Dist: pyyaml; extra == "all"
172
+ Requires-Dist: Unidecode; extra == "all"
173
+ Requires-Dist: ollama; extra == "all"
175
174
  Requires-Dist: openai; extra == "all"
175
+ Requires-Dist: pymupdf; extra == "all"
176
176
  Requires-Dist: logfire[httpx]; extra == "all"
177
+ Requires-Dist: sentence_transformers; extra == "all"
177
178
  Requires-Dist: setuptools; extra == "all"
178
- Requires-Dist: pydantic-settings; extra == "all"
179
- Requires-Dist: pydantic; extra == "all"
180
- Requires-Dist: pyyaml; extra == "all"
181
- Requires-Dist: logfire[fastapi]; extra == "all"
182
- Requires-Dist: odfpy; extra == "all"
183
- Requires-Dist: httpx_retries; extra == "all"
184
- Requires-Dist: pydantic-extra-types; extra == "all"
185
- Requires-Dist: python-on-whales; extra == "all"
186
- Requires-Dist: peft; extra == "all"
187
- Requires-Dist: logfire; extra == "all"
188
- Requires-Dist: uvicorn[standard]; extra == "all"
189
- Requires-Dist: flet-video; extra == "all"
190
- Requires-Dist: diskcache; extra == "all"
191
- Requires-Dist: pymupdf4llm; extra == "all"
192
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
193
- Requires-Dist: html2text; extra == "all"
194
- Requires-Dist: pandas; extra == "all"
195
- Requires-Dist: filetype; extra == "all"
196
179
  Requires-Dist: contexttimer; extra == "all"
197
- Requires-Dist: flet-webview; extra == "all"
198
- Requires-Dist: distributed; extra == "all"
199
- Requires-Dist: fastapi; extra == "all"
200
- Requires-Dist: ollama; extra == "all"
201
- Requires-Dist: motor; extra == "all"
202
- Requires-Dist: pymupdf; extra == "all"
203
- Requires-Dist: google-api-python-client; extra == "all"
204
- Requires-Dist: regex; extra == "all"
180
+ Requires-Dist: sre_yield; extra == "all"
181
+ Requires-Dist: huggingface_hub; extra == "all"
182
+ Requires-Dist: logfire; extra == "all"
205
183
  Requires-Dist: torchaudio; extra == "all"
184
+ Requires-Dist: playwright; extra == "all"
206
185
  Requires-Dist: torchvision; extra == "all"
207
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
208
- Requires-Dist: beanie[odm]; extra == "all"
209
- Requires-Dist: faker; extra == "all"
210
- Requires-Dist: huggingface_hub; extra == "all"
186
+ Requires-Dist: deepdiff; extra == "all"
211
187
  Requires-Dist: tabulate; extra == "all"
212
- Requires-Dist: semver; extra == "all"
213
- Requires-Dist: openpyxl; extra == "all"
214
- Requires-Dist: google-auth; extra == "all"
215
- Requires-Dist: playwright; extra == "all"
216
- Requires-Dist: transformers[sentencepiece]; extra == "all"
217
- Requires-Dist: Unidecode; extra == "all"
188
+ Requires-Dist: pydantic-extra-types; extra == "all"
218
189
  Requires-Dist: pycountry; extra == "all"
219
- Requires-Dist: deepmerge; extra == "all"
220
190
  Requires-Dist: dask[bag]; extra == "all"
221
- Requires-Dist: sre_yield; extra == "all"
191
+ Requires-Dist: html2text; extra == "all"
192
+ Requires-Dist: appdirs; extra == "all"
193
+ Requires-Dist: logfire[fastapi]; extra == "all"
194
+ Requires-Dist: openpyxl; extra == "all"
195
+ Requires-Dist: httpx_retries; extra == "all"
196
+ Requires-Dist: dnspython[doh]; extra == "all"
197
+ Requires-Dist: pymupdf4llm; extra == "all"
198
+ Requires-Dist: uvicorn[standard]; extra == "all"
199
+ Requires-Dist: google-api-python-client; extra == "all"
200
+ Requires-Dist: google-auth-httplib2; extra == "all"
201
+ Requires-Dist: bokeh; extra == "all"
202
+ Requires-Dist: beanie[odm]; extra == "all"
222
203
  Requires-Dist: flet[all]; extra == "all"
223
204
  Requires-Dist: google-auth-oauthlib; extra == "all"
205
+ Requires-Dist: filetype; extra == "all"
206
+ Requires-Dist: deepmerge; extra == "all"
207
+ Requires-Dist: tinynetrc; extra == "all"
208
+ Requires-Dist: fastapi; extra == "all"
209
+ Requires-Dist: tokenizers; extra == "all"
210
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
211
+ Requires-Dist: odfpy; extra == "all"
224
212
  Requires-Dist: pytest-cov; extra == "all"
225
- Requires-Dist: dnspython[doh]; extra == "all"
213
+ Requires-Dist: python-on-whales; extra == "all"
214
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
215
+ Requires-Dist: google-auth; extra == "all"
226
216
  Requires-Dist: httpx; extra == "all"
227
- Requires-Dist: sentence_transformers; extra == "all"
217
+ Requires-Dist: semver; extra == "all"
218
+ Requires-Dist: flet-video; extra == "all"
219
+ Requires-Dist: flet-webview; extra == "all"
228
220
  Requires-Dist: yamlscript; extra == "all"
229
- Requires-Dist: tokenizers; extra == "all"
230
- Requires-Dist: google-auth-httplib2; extra == "all"
231
- Requires-Dist: deepdiff; extra == "all"
232
- Requires-Dist: bokeh; extra == "all"
221
+ Requires-Dist: cachetools; extra == "all"
222
+ Requires-Dist: diskcache; extra == "all"
223
+ Requires-Dist: pandas; extra == "all"
224
+ Requires-Dist: regex; extra == "all"
225
+ Requires-Dist: faker; extra == "all"
226
+ Requires-Dist: pydantic; extra == "all"
227
+ Requires-Dist: peft; extra == "all"
228
+ Requires-Dist: pydantic-settings; extra == "all"
229
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
233
230
  Dynamic: author
234
231
  Dynamic: author-email
235
232
  Dynamic: description
@@ -46,7 +46,10 @@ class Constants:
46
46
  FILENAME_VERSION = 'version'
47
47
  DIR_NAME_HF = 'hf'
48
48
 
49
- ENTRYPOINTS_DIR = 'entrypoints'
49
+ ENTRYPOINT = 'entrypoint'
50
+ ENTRYPOINTS_DIR = f'{ENTRYPOINT}s'
51
+ ENTRYPOINT_FILE = f'{ENTRYPOINT}.py'
52
+
50
53
  PACKAGE_EXCLUDE_DIRS = {'data', 'build', 'dist', '.*', '*egg-info*'}
51
54
  INIT_FILENAME = '__init__.py'
52
55
 
@@ -182,8 +182,38 @@ class MixinFromJson:
182
182
  return self
183
183
 
184
184
 
185
+ class CliRunMixin:
186
+ """
187
+
188
+ Mixin only so that it can also be used with Pydantic Settings.
189
+
190
+ TODO Ideally, the run method would be defined on dm.Base and the settings base would just inherit like set.Base(BaseSettings, dm.Base), but this isn't yet tested/could break Fields.
191
+
192
+ """
193
+
194
+ def run(self):
195
+ """
196
+
197
+ Behaviour when run as a CLI command, i.e. via Pydantic Settings. Run any subcommands then exit.
198
+
199
+ """
200
+
201
+ from pydantic_settings import get_subcommand
202
+
203
+ command = get_subcommand(self, is_required=False, cli_exit_on_error=False)
204
+
205
+ if not command:
206
+ return
207
+
208
+ result = command.run()
209
+ if inspect.isawaitable(result):
210
+ import asyncio
211
+ result = asyncio.run(result)
212
+
213
+ raise SystemExit(result)
214
+
185
215
 
186
- class Base(BaseModel, MixinFromJson):
216
+ class Base(BaseModel, MixinFromJson, CliRunMixin):
187
217
  """
188
218
 
189
219
  Base model allowing model definition via a list of custom Field objects.
@@ -3,7 +3,7 @@ from typing import List
3
3
 
4
4
  import beanie
5
5
  from beanie.odm import actions
6
- from motor.motor_asyncio import AsyncIOMotorClient
6
+ from pymongo import AsyncMongoClient
7
7
 
8
8
  from fmtr.tools import data_modelling_tools
9
9
  from fmtr.tools.constants import Constants
@@ -34,7 +34,7 @@ class Client:
34
34
  self.port = port
35
35
  self.documents = documents
36
36
 
37
- self.client = AsyncIOMotorClient(self.uri, tz_aware=True)
37
+ self.client = AsyncMongoClient(self.uri, tz_aware=True)
38
38
  self.db = self.client[self.name]
39
39
 
40
40
  @cached_property
@@ -31,14 +31,6 @@ class progress(update):
31
31
 
32
32
  """
33
33
 
34
- def get_context(self, instance):
35
- """
36
-
37
- Use instance-defined context.
38
-
39
- """
40
- return instance.context
41
-
42
34
  def start(self, instance, *args, **kwargs):
43
35
  """
44
36
 
@@ -1,6 +1,8 @@
1
- from pydantic_settings import BaseSettings, PydanticBaseSettingsSource, YamlConfigSettingsSource, EnvSettingsSource, CliSettingsSource
2
1
  from typing import ClassVar, Any
3
2
 
3
+ from pydantic_settings import BaseSettings, PydanticBaseSettingsSource, YamlConfigSettingsSource, EnvSettingsSource, CliSettingsSource
4
+
5
+ from fmtr.tools.data_modelling_tools import CliRunMixin
4
6
  from fmtr.tools.path_tools import PackagePaths, Path
5
7
 
6
8
 
@@ -21,7 +23,7 @@ class YamlScriptConfigSettingsSource(YamlConfigSettingsSource):
21
23
  return data
22
24
 
23
25
 
24
- class Base(BaseSettings):
26
+ class Base(BaseSettings, CliRunMixin):
25
27
  """
26
28
 
27
29
  Base class for settings configuration using Pydantic BaseSettings.
@@ -88,6 +88,15 @@ class SetupPaths(FromCallerMixin):
88
88
  return False
89
89
  return org
90
90
 
91
+ @property
92
+ def entrypoint(self) -> Path:
93
+ """
94
+
95
+ Path of base entrypoint module.
96
+
97
+ """
98
+ return self.path / Constants.ENTRYPOINT_FILE
99
+
91
100
  @property
92
101
  def entrypoints(self) -> Path:
93
102
  """
@@ -182,23 +191,38 @@ class Setup(FromCallerMixin):
182
191
  def console_scripts(self) -> List[str]:
183
192
  """
184
193
 
185
- Generate console scripts for any modules in the `entrypoints` sub-package.
194
+ Generate console scripts for the `entrypoint` module - and/or any modules in `entrypoints` sub-package.
186
195
 
187
196
  """
188
197
 
189
198
  if not self.paths.entrypoints.exists():
190
- return []
199
+ paths_mods = []
200
+ else:
201
+ paths_mods = list(self.paths.entrypoints.iterdir())
191
202
 
192
- names_mods = [path.stem for path in self.paths.entrypoints.iterdir() if path.is_file() and path.name != Constants.INIT_FILENAME]
193
- command_prefix = self.name.replace('.', self.ENTRYPOINT_COMMAND_SEP)
203
+ names_mods = [path.stem for path in paths_mods if path.is_file() and path.name != Constants.INIT_FILENAME]
194
204
  command_suffixes = [name_mod.replace(self.ENTRYPOINT_FUNCTION_SEP, self.ENTRYPOINT_COMMAND_SEP) for name_mod in names_mods]
195
- commands = [f'{command_prefix}-{command_suffix}' for command_suffix in command_suffixes]
205
+ commands = [f'{self.name_command}-{command_suffix}' for command_suffix in command_suffixes]
196
206
  paths = [f'{self.name}.{Constants.ENTRYPOINTS_DIR}.{name_mod}:{self.ENTRYPOINT_FUNC_NAME}' for name_mod in names_mods]
197
207
 
208
+ if self.paths.entrypoint.exists():
209
+ commands.append(self.name_command)
210
+ path = f'{self.name}.{self.paths.entrypoint.stem}:{self.ENTRYPOINT_FUNC_NAME}'
211
+ paths.append(path)
212
+
198
213
  console_scripts = [f'{command} = {path}' for command, path in zip(commands, paths)]
199
214
 
200
215
  return console_scripts
201
216
 
217
+ @cached_property
218
+ def name_command(self) -> str:
219
+ """
220
+
221
+ Name as a command, e.g. `fmtr-tools`
222
+
223
+ """
224
+ return self.name.replace('.', self.ENTRYPOINT_COMMAND_SEP)
225
+
202
226
  @property
203
227
  def name(self) -> str:
204
228
  """
@@ -0,0 +1 @@
1
+ 1.3.76
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.74
3
+ Version: 1.3.76
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
@@ -21,7 +21,6 @@ Requires-Dist: pyyaml; extra == "dev"
21
21
  Requires-Dist: yamlscript; extra == "dev"
22
22
  Requires-Dist: pyyaml; extra == "dev"
23
23
  Requires-Dist: beanie[odm]; extra == "dev"
24
- Requires-Dist: motor; extra == "dev"
25
24
  Provides-Extra: test
26
25
  Requires-Dist: pytest-cov; extra == "test"
27
26
  Provides-Extra: yaml
@@ -166,70 +165,68 @@ Requires-Dist: playwright; extra == "browsers"
166
165
  Provides-Extra: db
167
166
  Provides-Extra: db-document
168
167
  Requires-Dist: beanie[odm]; extra == "db-document"
169
- Requires-Dist: motor; extra == "db-document"
170
168
  Provides-Extra: all
171
- Requires-Dist: tinynetrc; extra == "all"
172
- Requires-Dist: cachetools; extra == "all"
173
- Requires-Dist: appdirs; extra == "all"
174
169
  Requires-Dist: json_repair; extra == "all"
170
+ Requires-Dist: distributed; extra == "all"
171
+ Requires-Dist: pyyaml; extra == "all"
172
+ Requires-Dist: Unidecode; extra == "all"
173
+ Requires-Dist: ollama; extra == "all"
175
174
  Requires-Dist: openai; extra == "all"
175
+ Requires-Dist: pymupdf; extra == "all"
176
176
  Requires-Dist: logfire[httpx]; extra == "all"
177
+ Requires-Dist: sentence_transformers; extra == "all"
177
178
  Requires-Dist: setuptools; extra == "all"
178
- Requires-Dist: pydantic-settings; extra == "all"
179
- Requires-Dist: pydantic; extra == "all"
180
- Requires-Dist: pyyaml; extra == "all"
181
- Requires-Dist: logfire[fastapi]; extra == "all"
182
- Requires-Dist: odfpy; extra == "all"
183
- Requires-Dist: httpx_retries; extra == "all"
184
- Requires-Dist: pydantic-extra-types; extra == "all"
185
- Requires-Dist: python-on-whales; extra == "all"
186
- Requires-Dist: peft; extra == "all"
187
- Requires-Dist: logfire; extra == "all"
188
- Requires-Dist: uvicorn[standard]; extra == "all"
189
- Requires-Dist: flet-video; extra == "all"
190
- Requires-Dist: diskcache; extra == "all"
191
- Requires-Dist: pymupdf4llm; extra == "all"
192
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
193
- Requires-Dist: html2text; extra == "all"
194
- Requires-Dist: pandas; extra == "all"
195
- Requires-Dist: filetype; extra == "all"
196
179
  Requires-Dist: contexttimer; extra == "all"
197
- Requires-Dist: flet-webview; extra == "all"
198
- Requires-Dist: distributed; extra == "all"
199
- Requires-Dist: fastapi; extra == "all"
200
- Requires-Dist: ollama; extra == "all"
201
- Requires-Dist: motor; extra == "all"
202
- Requires-Dist: pymupdf; extra == "all"
203
- Requires-Dist: google-api-python-client; extra == "all"
204
- Requires-Dist: regex; extra == "all"
180
+ Requires-Dist: sre_yield; extra == "all"
181
+ Requires-Dist: huggingface_hub; extra == "all"
182
+ Requires-Dist: logfire; extra == "all"
205
183
  Requires-Dist: torchaudio; extra == "all"
184
+ Requires-Dist: playwright; extra == "all"
206
185
  Requires-Dist: torchvision; extra == "all"
207
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
208
- Requires-Dist: beanie[odm]; extra == "all"
209
- Requires-Dist: faker; extra == "all"
210
- Requires-Dist: huggingface_hub; extra == "all"
186
+ Requires-Dist: deepdiff; extra == "all"
211
187
  Requires-Dist: tabulate; extra == "all"
212
- Requires-Dist: semver; extra == "all"
213
- Requires-Dist: openpyxl; extra == "all"
214
- Requires-Dist: google-auth; extra == "all"
215
- Requires-Dist: playwright; extra == "all"
216
- Requires-Dist: transformers[sentencepiece]; extra == "all"
217
- Requires-Dist: Unidecode; extra == "all"
188
+ Requires-Dist: pydantic-extra-types; extra == "all"
218
189
  Requires-Dist: pycountry; extra == "all"
219
- Requires-Dist: deepmerge; extra == "all"
220
190
  Requires-Dist: dask[bag]; extra == "all"
221
- Requires-Dist: sre_yield; extra == "all"
191
+ Requires-Dist: html2text; extra == "all"
192
+ Requires-Dist: appdirs; extra == "all"
193
+ Requires-Dist: logfire[fastapi]; extra == "all"
194
+ Requires-Dist: openpyxl; extra == "all"
195
+ Requires-Dist: httpx_retries; extra == "all"
196
+ Requires-Dist: dnspython[doh]; extra == "all"
197
+ Requires-Dist: pymupdf4llm; extra == "all"
198
+ Requires-Dist: uvicorn[standard]; extra == "all"
199
+ Requires-Dist: google-api-python-client; extra == "all"
200
+ Requires-Dist: google-auth-httplib2; extra == "all"
201
+ Requires-Dist: bokeh; extra == "all"
202
+ Requires-Dist: beanie[odm]; extra == "all"
222
203
  Requires-Dist: flet[all]; extra == "all"
223
204
  Requires-Dist: google-auth-oauthlib; extra == "all"
205
+ Requires-Dist: filetype; extra == "all"
206
+ Requires-Dist: deepmerge; extra == "all"
207
+ Requires-Dist: tinynetrc; extra == "all"
208
+ Requires-Dist: fastapi; extra == "all"
209
+ Requires-Dist: tokenizers; extra == "all"
210
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
211
+ Requires-Dist: odfpy; extra == "all"
224
212
  Requires-Dist: pytest-cov; extra == "all"
225
- Requires-Dist: dnspython[doh]; extra == "all"
213
+ Requires-Dist: python-on-whales; extra == "all"
214
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
215
+ Requires-Dist: google-auth; extra == "all"
226
216
  Requires-Dist: httpx; extra == "all"
227
- Requires-Dist: sentence_transformers; extra == "all"
217
+ Requires-Dist: semver; extra == "all"
218
+ Requires-Dist: flet-video; extra == "all"
219
+ Requires-Dist: flet-webview; extra == "all"
228
220
  Requires-Dist: yamlscript; extra == "all"
229
- Requires-Dist: tokenizers; extra == "all"
230
- Requires-Dist: google-auth-httplib2; extra == "all"
231
- Requires-Dist: deepdiff; extra == "all"
232
- Requires-Dist: bokeh; extra == "all"
221
+ Requires-Dist: cachetools; extra == "all"
222
+ Requires-Dist: diskcache; extra == "all"
223
+ Requires-Dist: pandas; extra == "all"
224
+ Requires-Dist: regex; extra == "all"
225
+ Requires-Dist: faker; extra == "all"
226
+ Requires-Dist: pydantic; extra == "all"
227
+ Requires-Dist: peft; extra == "all"
228
+ Requires-Dist: pydantic-settings; extra == "all"
229
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
233
230
  Dynamic: author
234
231
  Dynamic: author-email
235
232
  Dynamic: description
@@ -18,68 +18,67 @@ pydantic-ai[logfire,openai]
18
18
  ollama
19
19
 
20
20
  [all]
21
- tinynetrc
22
- cachetools
23
- appdirs
24
21
  json_repair
22
+ distributed
23
+ pyyaml
24
+ Unidecode
25
+ ollama
25
26
  openai
27
+ pymupdf
26
28
  logfire[httpx]
29
+ sentence_transformers
27
30
  setuptools
28
- pydantic-settings
29
- pydantic
30
- pyyaml
31
- logfire[fastapi]
32
- odfpy
33
- httpx_retries
34
- pydantic-extra-types
35
- python-on-whales
36
- peft
37
- logfire
38
- uvicorn[standard]
39
- flet-video
40
- diskcache
41
- pymupdf4llm
42
- pydantic-ai[logfire,openai]
43
- html2text
44
- pandas
45
- filetype
46
31
  contexttimer
47
- flet-webview
48
- distributed
49
- fastapi
50
- ollama
51
- motor
52
- pymupdf
53
- google-api-python-client
54
- regex
32
+ sre_yield
33
+ huggingface_hub
34
+ logfire
55
35
  torchaudio
36
+ playwright
56
37
  torchvision
57
- pydevd-pycharm~=251.25410.159
58
- beanie[odm]
59
- faker
60
- huggingface_hub
38
+ deepdiff
61
39
  tabulate
62
- semver
63
- openpyxl
64
- google-auth
65
- playwright
66
- transformers[sentencepiece]
67
- Unidecode
40
+ pydantic-extra-types
68
41
  pycountry
69
- deepmerge
70
42
  dask[bag]
71
- sre_yield
43
+ html2text
44
+ appdirs
45
+ logfire[fastapi]
46
+ openpyxl
47
+ httpx_retries
48
+ dnspython[doh]
49
+ pymupdf4llm
50
+ uvicorn[standard]
51
+ google-api-python-client
52
+ google-auth-httplib2
53
+ bokeh
54
+ beanie[odm]
72
55
  flet[all]
73
56
  google-auth-oauthlib
57
+ filetype
58
+ deepmerge
59
+ tinynetrc
60
+ fastapi
61
+ tokenizers
62
+ pydantic-ai[logfire,openai]
63
+ odfpy
74
64
  pytest-cov
75
- dnspython[doh]
65
+ python-on-whales
66
+ pydevd-pycharm~=251.25410.159
67
+ google-auth
76
68
  httpx
77
- sentence_transformers
69
+ semver
70
+ flet-video
71
+ flet-webview
78
72
  yamlscript
79
- tokenizers
80
- google-auth-httplib2
81
- deepdiff
82
- bokeh
73
+ cachetools
74
+ diskcache
75
+ pandas
76
+ regex
77
+ faker
78
+ pydantic
79
+ peft
80
+ pydantic-settings
81
+ transformers[sentencepiece]
83
82
 
84
83
  [api]
85
84
  fastapi
@@ -105,7 +104,6 @@ cachetools
105
104
 
106
105
  [db.document]
107
106
  beanie[odm]
108
- motor
109
107
 
110
108
  [debug]
111
109
  pydevd-pycharm~=251.25410.159
@@ -121,7 +119,6 @@ pycountry
121
119
  yamlscript
122
120
  pyyaml
123
121
  beanie[odm]
124
- motor
125
122
 
126
123
  [dm]
127
124
  pydantic
@@ -45,7 +45,7 @@ DEPENDENCIES = {
45
45
  'webhook': ['http'],
46
46
  'browsers': ['playwright'],
47
47
  'db': [],
48
- 'db.document': ['beanie[odm]', 'motor'],
48
+ 'db.document': ['beanie[odm]'],
49
49
 
50
50
  }
51
51
 
@@ -1 +0,0 @@
1
- 1.3.74
File without changes
File without changes
File without changes
File without changes