fmtr.tools 1.3.75__tar.gz → 1.3.77__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.75 → fmtr_tools-1.3.77}/PKG-INFO +51 -54
  2. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/constants.py +4 -1
  3. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/data_modelling_tools.py +31 -1
  4. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/interface_tools/controls.py +70 -4
  5. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/settings_tools.py +4 -2
  6. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/setup_tools/setup_tools.py +29 -5
  7. fmtr_tools-1.3.77/fmtr/tools/version +1 -0
  8. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr.tools.egg-info/PKG-INFO +51 -54
  9. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr.tools.egg-info/requires.txt +50 -53
  10. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/setup.py +1 -1
  11. fmtr_tools-1.3.75/fmtr/tools/version +0 -1
  12. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/LICENSE +0 -0
  13. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/README.md +0 -0
  14. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/__init__.py +0 -0
  15. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/ai_tools/__init__.py +0 -0
  16. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  17. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  18. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/api_tools.py +0 -0
  19. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/async_tools.py +0 -0
  20. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/augmentation_tools.py +0 -0
  21. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/caching_tools.py +0 -0
  22. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/context_tools.py +0 -0
  23. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/database_tools/__init__.py +0 -0
  24. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/database_tools/document.py +0 -0
  25. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/dataclass_tools.py +0 -0
  26. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/datatype_tools.py +0 -0
  27. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/datetime_tools.py +0 -0
  28. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/debugging_tools.py +0 -0
  29. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/dns_tools/__init__.py +0 -0
  30. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/dns_tools/client.py +0 -0
  31. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/dns_tools/dm.py +0 -0
  32. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/dns_tools/proxy.py +0 -0
  33. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/dns_tools/server.py +0 -0
  34. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/docker_tools/__init__.py +0 -0
  35. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/entrypoints/__init__.py +0 -0
  36. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  37. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/entrypoints/ep_test.py +0 -0
  38. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  39. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  40. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  41. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/environment_tools.py +0 -0
  42. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/function_tools.py +0 -0
  43. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/google_api_tools.py +0 -0
  44. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/hash_tools.py +0 -0
  45. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/hfh_tools.py +0 -0
  46. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/html_tools.py +0 -0
  47. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/http_tools.py +0 -0
  48. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/import_tools.py +0 -0
  49. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/inherit_tools.py +0 -0
  50. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/inspection_tools.py +0 -0
  51. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/interface_tools/__init__.py +0 -0
  52. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/interface_tools/context.py +0 -0
  53. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/interface_tools/interface_tools.py +0 -0
  54. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/iterator_tools.py +0 -0
  55. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/json_fix_tools.py +0 -0
  56. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/json_tools.py +0 -0
  57. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/logging_tools.py +0 -0
  58. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/merging_tools.py +0 -0
  59. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/metric_tools.py +0 -0
  60. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/name_tools.py +0 -0
  61. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/netrc_tools.py +0 -0
  62. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/openai_tools.py +0 -0
  63. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/packaging_tools.py +0 -0
  64. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/parallel_tools.py +0 -0
  65. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/path_tools/__init__.py +0 -0
  66. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  67. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/path_tools/path_tools.py +0 -0
  68. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  69. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/pattern_tools.py +0 -0
  70. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/pdf_tools.py +0 -0
  71. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/platform_tools.py +0 -0
  72. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/process_tools.py +0 -0
  73. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/profiling_tools.py +0 -0
  74. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/random_tools.py +0 -0
  75. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/semantic_tools.py +0 -0
  76. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/setup_tools/__init__.py +0 -0
  77. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/spaces_tools.py +0 -0
  78. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/string_tools.py +0 -0
  79. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tabular_tools.py +0 -0
  80. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tests/__init__.py +0 -0
  81. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tests/conftest.py +0 -0
  82. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tests/helpers.py +0 -0
  83. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tests/test_datatype.py +0 -0
  84. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tests/test_environment.py +0 -0
  85. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tests/test_json.py +0 -0
  86. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tests/test_path.py +0 -0
  87. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tests/test_yaml.py +0 -0
  88. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tokenization_tools.py +0 -0
  89. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/tools.py +0 -0
  90. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/unicode_tools.py +0 -0
  91. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/version_tools/__init__.py +0 -0
  92. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/version_tools/version_tools.py +0 -0
  93. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/webhook_tools.py +0 -0
  94. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr/tools/yaml_tools.py +0 -0
  95. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  96. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  97. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr.tools.egg-info/entry_points.txt +0 -0
  98. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/fmtr.tools.egg-info/top_level.txt +0 -0
  99. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/pyproject.toml +0 -0
  100. {fmtr_tools-1.3.75 → fmtr_tools-1.3.77}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.75
3
+ Version: 1.3.77
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: pydantic-ai[logfire,openai]; extra == "all"
172
- Requires-Dist: logfire[fastapi]; extra == "all"
173
- Requires-Dist: google-auth-httplib2; extra == "all"
174
- Requires-Dist: contexttimer; extra == "all"
175
- Requires-Dist: pydantic; extra == "all"
176
- Requires-Dist: httpx; extra == "all"
177
- Requires-Dist: google-auth-oauthlib; extra == "all"
178
- Requires-Dist: sre_yield; extra == "all"
179
- Requires-Dist: regex; extra == "all"
180
- Requires-Dist: flet-webview; extra == "all"
181
- Requires-Dist: openai; extra == "all"
182
169
  Requires-Dist: pyyaml; extra == "all"
183
- Requires-Dist: torchvision; extra == "all"
184
- Requires-Dist: peft; extra == "all"
185
- Requires-Dist: flet[all]; extra == "all"
186
- Requires-Dist: pymupdf; extra == "all"
187
- Requires-Dist: deepmerge; extra == "all"
188
- Requires-Dist: logfire[httpx]; extra == "all"
189
- Requires-Dist: html2text; extra == "all"
190
- Requires-Dist: transformers[sentencepiece]; extra == "all"
191
- Requires-Dist: pydantic-extra-types; extra == "all"
192
- Requires-Dist: beanie[odm]; extra == "all"
193
- Requires-Dist: bokeh; extra == "all"
194
- Requires-Dist: tinynetrc; extra == "all"
170
+ Requires-Dist: Unidecode; extra == "all"
195
171
  Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
196
- Requires-Dist: google-auth; extra == "all"
172
+ Requires-Dist: openai; extra == "all"
173
+ Requires-Dist: json_repair; extra == "all"
197
174
  Requires-Dist: faker; extra == "all"
198
- Requires-Dist: yamlscript; extra == "all"
199
- Requires-Dist: sentence_transformers; extra == "all"
200
- Requires-Dist: ollama; extra == "all"
201
- Requires-Dist: playwright; extra == "all"
202
- Requires-Dist: distributed; extra == "all"
203
- Requires-Dist: uvicorn[standard]; extra == "all"
175
+ Requires-Dist: semver; extra == "all"
176
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
177
+ Requires-Dist: tabulate; extra == "all"
204
178
  Requires-Dist: huggingface_hub; extra == "all"
179
+ Requires-Dist: dnspython[doh]; extra == "all"
180
+ Requires-Dist: setuptools; extra == "all"
181
+ Requires-Dist: filetype; extra == "all"
182
+ Requires-Dist: distributed; extra == "all"
183
+ Requires-Dist: bokeh; extra == "all"
184
+ Requires-Dist: cachetools; extra == "all"
205
185
  Requires-Dist: httpx_retries; extra == "all"
206
- Requires-Dist: tokenizers; extra == "all"
207
- Requires-Dist: pytest-cov; extra == "all"
208
- Requires-Dist: appdirs; extra == "all"
209
- Requires-Dist: pandas; extra == "all"
210
- Requires-Dist: python-on-whales; extra == "all"
211
- Requires-Dist: json_repair; extra == "all"
186
+ Requires-Dist: beanie[odm]; extra == "all"
187
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
188
+ Requires-Dist: playwright; extra == "all"
212
189
  Requires-Dist: odfpy; extra == "all"
213
- Requires-Dist: pycountry; extra == "all"
190
+ Requires-Dist: python-on-whales; extra == "all"
191
+ Requires-Dist: pymupdf; extra == "all"
192
+ Requires-Dist: peft; extra == "all"
193
+ Requires-Dist: regex; extra == "all"
194
+ Requires-Dist: logfire; extra == "all"
214
195
  Requires-Dist: deepdiff; extra == "all"
215
- Requires-Dist: pydantic-settings; extra == "all"
196
+ Requires-Dist: flet-webview; extra == "all"
197
+ Requires-Dist: uvicorn[standard]; extra == "all"
198
+ Requires-Dist: deepmerge; extra == "all"
199
+ Requires-Dist: pandas; extra == "all"
216
200
  Requires-Dist: google-api-python-client; extra == "all"
201
+ Requires-Dist: pymupdf4llm; extra == "all"
202
+ Requires-Dist: pycountry; extra == "all"
203
+ Requires-Dist: ollama; extra == "all"
204
+ Requires-Dist: tinynetrc; extra == "all"
205
+ Requires-Dist: sre_yield; extra == "all"
206
+ Requires-Dist: sentence_transformers; extra == "all"
207
+ Requires-Dist: pydantic; extra == "all"
208
+ Requires-Dist: html2text; extra == "all"
209
+ Requires-Dist: flet[all]; extra == "all"
210
+ Requires-Dist: google-auth; extra == "all"
211
+ Requires-Dist: yamlscript; extra == "all"
212
+ Requires-Dist: torchvision; extra == "all"
213
+ Requires-Dist: pytest-cov; extra == "all"
217
214
  Requires-Dist: dask[bag]; extra == "all"
218
- Requires-Dist: tabulate; extra == "all"
219
- Requires-Dist: Unidecode; extra == "all"
220
215
  Requires-Dist: flet-video; extra == "all"
221
- Requires-Dist: dnspython[doh]; extra == "all"
222
- Requires-Dist: setuptools; extra == "all"
223
- Requires-Dist: semver; extra == "all"
224
- Requires-Dist: motor; extra == "all"
225
- Requires-Dist: fastapi; extra == "all"
226
- Requires-Dist: openpyxl; extra == "all"
227
- Requires-Dist: torchaudio; extra == "all"
216
+ Requires-Dist: logfire[fastapi]; extra == "all"
228
217
  Requires-Dist: diskcache; extra == "all"
229
- Requires-Dist: cachetools; extra == "all"
230
- Requires-Dist: pymupdf4llm; extra == "all"
231
- Requires-Dist: filetype; extra == "all"
232
- Requires-Dist: logfire; extra == "all"
218
+ Requires-Dist: contexttimer; extra == "all"
219
+ Requires-Dist: httpx; extra == "all"
220
+ Requires-Dist: pydantic-settings; extra == "all"
221
+ Requires-Dist: tokenizers; extra == "all"
222
+ Requires-Dist: torchaudio; extra == "all"
223
+ Requires-Dist: openpyxl; extra == "all"
224
+ Requires-Dist: fastapi; extra == "all"
225
+ Requires-Dist: appdirs; extra == "all"
226
+ Requires-Dist: pydantic-extra-types; extra == "all"
227
+ Requires-Dist: google-auth-oauthlib; extra == "all"
228
+ Requires-Dist: google-auth-httplib2; extra == "all"
229
+ Requires-Dist: logfire[httpx]; 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.
@@ -1,3 +1,4 @@
1
+ from functools import cached_property
1
2
  from typing import Optional
2
3
 
3
4
  import flet as ft
@@ -127,8 +128,40 @@ class Row(ft.DataRow):
127
128
 
128
129
  def __init__(self, series):
129
130
  self.series = series
130
- cells = [self.TypeCell(series, col) for col in series.index]
131
- super().__init__(cells, color=self.row_color)
131
+ super().__init__(self.cells_controls, color=self.row_color)
132
+
133
+ @cached_property
134
+ def cells_data(self) -> dict[str, list[Cell]]:
135
+ """
136
+
137
+ Cell controls lookup
138
+
139
+ """
140
+ data = {}
141
+ for col in self.series.index:
142
+ data.setdefault(col, []).append(self.TypeCell(self.series, col))
143
+ return data
144
+
145
+ @cached_property
146
+ def cells_controls(self) -> list[Cell]:
147
+ """
148
+
149
+ Flat list of controls
150
+
151
+ """
152
+ controls = []
153
+ for cells in self.cells_data.values():
154
+ for cell in cells:
155
+ controls.append(cell)
156
+ return controls
157
+
158
+ def __getitem__(self, item) -> list[Cell]:
159
+ """
160
+
161
+ Get cells by column name
162
+
163
+ """
164
+ return self.cells_data[item]
132
165
 
133
166
  @property
134
167
  def row_color(self):
@@ -195,5 +228,38 @@ class Table(ft.DataTable):
195
228
  """
196
229
  self.df = df
197
230
  columns = [self.TypeColumn(col) for col in df.columns]
198
- rows = [self.TypeRow(row) for _, row in df.iterrows()]
199
- super().__init__(columns=columns, rows=rows)
231
+ super().__init__(columns=columns, rows=self.rows_controls)
232
+
233
+ @cached_property
234
+ def rows_data(self) -> dict[str, list[Row]]:
235
+ """
236
+
237
+ Row controls lookup
238
+
239
+ """
240
+ data = {}
241
+ for index, row in self.df.iterrows():
242
+ data.setdefault(index, []).append(self.TypeRow(row))
243
+ return data
244
+
245
+ @cached_property
246
+ def rows_controls(self) -> list[Row]:
247
+ """
248
+
249
+ Flat list of controls
250
+
251
+ """
252
+ controls = []
253
+ for rows in self.rows_data.values():
254
+ for row in rows:
255
+ controls.append(row)
256
+ return controls
257
+
258
+ def __getitem__(self, item) -> list[Row]:
259
+ """
260
+
261
+ Get row by index
262
+
263
+ """
264
+
265
+ return self.rows_data[item]
@@ -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.77
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.75
3
+ Version: 1.3.77
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: pydantic-ai[logfire,openai]; extra == "all"
172
- Requires-Dist: logfire[fastapi]; extra == "all"
173
- Requires-Dist: google-auth-httplib2; extra == "all"
174
- Requires-Dist: contexttimer; extra == "all"
175
- Requires-Dist: pydantic; extra == "all"
176
- Requires-Dist: httpx; extra == "all"
177
- Requires-Dist: google-auth-oauthlib; extra == "all"
178
- Requires-Dist: sre_yield; extra == "all"
179
- Requires-Dist: regex; extra == "all"
180
- Requires-Dist: flet-webview; extra == "all"
181
- Requires-Dist: openai; extra == "all"
182
169
  Requires-Dist: pyyaml; extra == "all"
183
- Requires-Dist: torchvision; extra == "all"
184
- Requires-Dist: peft; extra == "all"
185
- Requires-Dist: flet[all]; extra == "all"
186
- Requires-Dist: pymupdf; extra == "all"
187
- Requires-Dist: deepmerge; extra == "all"
188
- Requires-Dist: logfire[httpx]; extra == "all"
189
- Requires-Dist: html2text; extra == "all"
190
- Requires-Dist: transformers[sentencepiece]; extra == "all"
191
- Requires-Dist: pydantic-extra-types; extra == "all"
192
- Requires-Dist: beanie[odm]; extra == "all"
193
- Requires-Dist: bokeh; extra == "all"
194
- Requires-Dist: tinynetrc; extra == "all"
170
+ Requires-Dist: Unidecode; extra == "all"
195
171
  Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
196
- Requires-Dist: google-auth; extra == "all"
172
+ Requires-Dist: openai; extra == "all"
173
+ Requires-Dist: json_repair; extra == "all"
197
174
  Requires-Dist: faker; extra == "all"
198
- Requires-Dist: yamlscript; extra == "all"
199
- Requires-Dist: sentence_transformers; extra == "all"
200
- Requires-Dist: ollama; extra == "all"
201
- Requires-Dist: playwright; extra == "all"
202
- Requires-Dist: distributed; extra == "all"
203
- Requires-Dist: uvicorn[standard]; extra == "all"
175
+ Requires-Dist: semver; extra == "all"
176
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
177
+ Requires-Dist: tabulate; extra == "all"
204
178
  Requires-Dist: huggingface_hub; extra == "all"
179
+ Requires-Dist: dnspython[doh]; extra == "all"
180
+ Requires-Dist: setuptools; extra == "all"
181
+ Requires-Dist: filetype; extra == "all"
182
+ Requires-Dist: distributed; extra == "all"
183
+ Requires-Dist: bokeh; extra == "all"
184
+ Requires-Dist: cachetools; extra == "all"
205
185
  Requires-Dist: httpx_retries; extra == "all"
206
- Requires-Dist: tokenizers; extra == "all"
207
- Requires-Dist: pytest-cov; extra == "all"
208
- Requires-Dist: appdirs; extra == "all"
209
- Requires-Dist: pandas; extra == "all"
210
- Requires-Dist: python-on-whales; extra == "all"
211
- Requires-Dist: json_repair; extra == "all"
186
+ Requires-Dist: beanie[odm]; extra == "all"
187
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
188
+ Requires-Dist: playwright; extra == "all"
212
189
  Requires-Dist: odfpy; extra == "all"
213
- Requires-Dist: pycountry; extra == "all"
190
+ Requires-Dist: python-on-whales; extra == "all"
191
+ Requires-Dist: pymupdf; extra == "all"
192
+ Requires-Dist: peft; extra == "all"
193
+ Requires-Dist: regex; extra == "all"
194
+ Requires-Dist: logfire; extra == "all"
214
195
  Requires-Dist: deepdiff; extra == "all"
215
- Requires-Dist: pydantic-settings; extra == "all"
196
+ Requires-Dist: flet-webview; extra == "all"
197
+ Requires-Dist: uvicorn[standard]; extra == "all"
198
+ Requires-Dist: deepmerge; extra == "all"
199
+ Requires-Dist: pandas; extra == "all"
216
200
  Requires-Dist: google-api-python-client; extra == "all"
201
+ Requires-Dist: pymupdf4llm; extra == "all"
202
+ Requires-Dist: pycountry; extra == "all"
203
+ Requires-Dist: ollama; extra == "all"
204
+ Requires-Dist: tinynetrc; extra == "all"
205
+ Requires-Dist: sre_yield; extra == "all"
206
+ Requires-Dist: sentence_transformers; extra == "all"
207
+ Requires-Dist: pydantic; extra == "all"
208
+ Requires-Dist: html2text; extra == "all"
209
+ Requires-Dist: flet[all]; extra == "all"
210
+ Requires-Dist: google-auth; extra == "all"
211
+ Requires-Dist: yamlscript; extra == "all"
212
+ Requires-Dist: torchvision; extra == "all"
213
+ Requires-Dist: pytest-cov; extra == "all"
217
214
  Requires-Dist: dask[bag]; extra == "all"
218
- Requires-Dist: tabulate; extra == "all"
219
- Requires-Dist: Unidecode; extra == "all"
220
215
  Requires-Dist: flet-video; extra == "all"
221
- Requires-Dist: dnspython[doh]; extra == "all"
222
- Requires-Dist: setuptools; extra == "all"
223
- Requires-Dist: semver; extra == "all"
224
- Requires-Dist: motor; extra == "all"
225
- Requires-Dist: fastapi; extra == "all"
226
- Requires-Dist: openpyxl; extra == "all"
227
- Requires-Dist: torchaudio; extra == "all"
216
+ Requires-Dist: logfire[fastapi]; extra == "all"
228
217
  Requires-Dist: diskcache; extra == "all"
229
- Requires-Dist: cachetools; extra == "all"
230
- Requires-Dist: pymupdf4llm; extra == "all"
231
- Requires-Dist: filetype; extra == "all"
232
- Requires-Dist: logfire; extra == "all"
218
+ Requires-Dist: contexttimer; extra == "all"
219
+ Requires-Dist: httpx; extra == "all"
220
+ Requires-Dist: pydantic-settings; extra == "all"
221
+ Requires-Dist: tokenizers; extra == "all"
222
+ Requires-Dist: torchaudio; extra == "all"
223
+ Requires-Dist: openpyxl; extra == "all"
224
+ Requires-Dist: fastapi; extra == "all"
225
+ Requires-Dist: appdirs; extra == "all"
226
+ Requires-Dist: pydantic-extra-types; extra == "all"
227
+ Requires-Dist: google-auth-oauthlib; extra == "all"
228
+ Requires-Dist: google-auth-httplib2; extra == "all"
229
+ Requires-Dist: logfire[httpx]; 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
- pydantic-ai[logfire,openai]
22
- logfire[fastapi]
23
- google-auth-httplib2
24
- contexttimer
25
- pydantic
26
- httpx
27
- google-auth-oauthlib
28
- sre_yield
29
- regex
30
- flet-webview
31
- openai
32
21
  pyyaml
33
- torchvision
34
- peft
35
- flet[all]
36
- pymupdf
37
- deepmerge
38
- logfire[httpx]
39
- html2text
40
- transformers[sentencepiece]
41
- pydantic-extra-types
42
- beanie[odm]
43
- bokeh
44
- tinynetrc
22
+ Unidecode
45
23
  pydevd-pycharm~=251.25410.159
46
- google-auth
24
+ openai
25
+ json_repair
47
26
  faker
48
- yamlscript
49
- sentence_transformers
50
- ollama
51
- playwright
52
- distributed
53
- uvicorn[standard]
27
+ semver
28
+ pydantic-ai[logfire,openai]
29
+ tabulate
54
30
  huggingface_hub
31
+ dnspython[doh]
32
+ setuptools
33
+ filetype
34
+ distributed
35
+ bokeh
36
+ cachetools
55
37
  httpx_retries
56
- tokenizers
57
- pytest-cov
58
- appdirs
59
- pandas
60
- python-on-whales
61
- json_repair
38
+ beanie[odm]
39
+ transformers[sentencepiece]
40
+ playwright
62
41
  odfpy
63
- pycountry
42
+ python-on-whales
43
+ pymupdf
44
+ peft
45
+ regex
46
+ logfire
64
47
  deepdiff
65
- pydantic-settings
48
+ flet-webview
49
+ uvicorn[standard]
50
+ deepmerge
51
+ pandas
66
52
  google-api-python-client
53
+ pymupdf4llm
54
+ pycountry
55
+ ollama
56
+ tinynetrc
57
+ sre_yield
58
+ sentence_transformers
59
+ pydantic
60
+ html2text
61
+ flet[all]
62
+ google-auth
63
+ yamlscript
64
+ torchvision
65
+ pytest-cov
67
66
  dask[bag]
68
- tabulate
69
- Unidecode
70
67
  flet-video
71
- dnspython[doh]
72
- setuptools
73
- semver
74
- motor
75
- fastapi
76
- openpyxl
77
- torchaudio
68
+ logfire[fastapi]
78
69
  diskcache
79
- cachetools
80
- pymupdf4llm
81
- filetype
82
- logfire
70
+ contexttimer
71
+ httpx
72
+ pydantic-settings
73
+ tokenizers
74
+ torchaudio
75
+ openpyxl
76
+ fastapi
77
+ appdirs
78
+ pydantic-extra-types
79
+ google-auth-oauthlib
80
+ google-auth-httplib2
81
+ logfire[httpx]
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.75
File without changes
File without changes
File without changes
File without changes