fmtr.tools 1.3.66__tar.gz → 1.3.67__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.66 → fmtr_tools-1.3.67}/PKG-INFO +51 -51
  2. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/data_modelling_tools.py +41 -21
  3. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/datatype_tools.py +3 -0
  4. fmtr_tools-1.3.67/fmtr/tools/version +1 -0
  5. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/PKG-INFO +51 -51
  6. fmtr_tools-1.3.66/fmtr/tools/version +0 -1
  7. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/LICENSE +0 -0
  8. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/README.md +0 -0
  9. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/__init__.py +0 -0
  10. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/ai_tools/__init__.py +0 -0
  11. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  12. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  13. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/api_tools.py +0 -0
  14. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/async_tools.py +0 -0
  15. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/augmentation_tools.py +0 -0
  16. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/caching_tools.py +0 -0
  17. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/constants.py +0 -0
  18. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/context_tools.py +0 -0
  19. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/database_tools/__init__.py +0 -0
  20. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/database_tools/document.py +0 -0
  21. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/dataclass_tools.py +0 -0
  22. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/datetime_tools.py +0 -0
  23. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/debugging_tools.py +0 -0
  24. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/dns_tools/__init__.py +0 -0
  25. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/dns_tools/client.py +0 -0
  26. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/dns_tools/dm.py +0 -0
  27. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/dns_tools/proxy.py +0 -0
  28. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/dns_tools/server.py +0 -0
  29. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/docker_tools/__init__.py +0 -0
  30. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/__init__.py +0 -0
  31. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  32. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/ep_test.py +0 -0
  33. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  34. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  35. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  36. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/environment_tools.py +0 -0
  37. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/function_tools.py +0 -0
  38. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/google_api_tools.py +0 -0
  39. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/hash_tools.py +0 -0
  40. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/hfh_tools.py +0 -0
  41. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/html_tools.py +0 -0
  42. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/http_tools.py +0 -0
  43. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/import_tools.py +0 -0
  44. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/inherit_tools.py +0 -0
  45. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/inspection_tools.py +0 -0
  46. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/interface_tools/__init__.py +0 -0
  47. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/interface_tools/context.py +0 -0
  48. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/interface_tools/controls.py +0 -0
  49. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/interface_tools/interface_tools.py +0 -0
  50. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/iterator_tools.py +0 -0
  51. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/json_fix_tools.py +0 -0
  52. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/json_tools.py +0 -0
  53. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/logging_tools.py +0 -0
  54. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/merging_tools.py +0 -0
  55. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/metric_tools.py +0 -0
  56. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/name_tools.py +0 -0
  57. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/netrc_tools.py +0 -0
  58. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/openai_tools.py +0 -0
  59. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/packaging_tools.py +0 -0
  60. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/parallel_tools.py +0 -0
  61. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/path_tools/__init__.py +0 -0
  62. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  63. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/path_tools/path_tools.py +0 -0
  64. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  65. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/pattern_tools.py +0 -0
  66. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/pdf_tools.py +0 -0
  67. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/platform_tools.py +0 -0
  68. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/process_tools.py +0 -0
  69. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/profiling_tools.py +0 -0
  70. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/random_tools.py +0 -0
  71. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/semantic_tools.py +0 -0
  72. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/settings_tools.py +0 -0
  73. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/setup_tools/__init__.py +0 -0
  74. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/setup_tools/setup_tools.py +0 -0
  75. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/spaces_tools.py +0 -0
  76. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/string_tools.py +0 -0
  77. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tabular_tools.py +0 -0
  78. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tests/__init__.py +0 -0
  79. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tests/conftest.py +0 -0
  80. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tests/helpers.py +0 -0
  81. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tests/test_datatype.py +0 -0
  82. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tests/test_environment.py +0 -0
  83. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tests/test_json.py +0 -0
  84. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tests/test_path.py +0 -0
  85. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tests/test_yaml.py +0 -0
  86. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tokenization_tools.py +0 -0
  87. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/tools.py +0 -0
  88. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/unicode_tools.py +0 -0
  89. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/version_tools/__init__.py +0 -0
  90. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/version_tools/version_tools.py +0 -0
  91. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/webhook_tools.py +0 -0
  92. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr/tools/yaml_tools.py +0 -0
  93. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  94. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  95. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/entry_points.txt +0 -0
  96. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/requires.txt +50 -50
  97. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/top_level.txt +0 -0
  98. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/pyproject.toml +0 -0
  99. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/setup.cfg +0 -0
  100. {fmtr_tools-1.3.66 → fmtr_tools-1.3.67}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.66
3
+ Version: 1.3.67
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
@@ -168,68 +168,68 @@ Provides-Extra: db-document
168
168
  Requires-Dist: beanie[odm]; extra == "db-document"
169
169
  Requires-Dist: motor; extra == "db-document"
170
170
  Provides-Extra: all
171
- Requires-Dist: logfire[httpx]; extra == "all"
172
- Requires-Dist: logfire; extra == "all"
173
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
174
- Requires-Dist: ollama; extra == "all"
175
- Requires-Dist: pymupdf4llm; extra == "all"
176
- Requires-Dist: playwright; extra == "all"
177
- Requires-Dist: flet-video; extra == "all"
171
+ Requires-Dist: diskcache; extra == "all"
172
+ Requires-Dist: dask[bag]; extra == "all"
173
+ Requires-Dist: python-on-whales; extra == "all"
178
174
  Requires-Dist: flet[all]; extra == "all"
179
- Requires-Dist: filetype; extra == "all"
180
- Requires-Dist: flet-webview; extra == "all"
181
- Requires-Dist: pandas; extra == "all"
182
- Requires-Dist: httpx_retries; extra == "all"
183
- Requires-Dist: regex; extra == "all"
184
- Requires-Dist: google-auth-httplib2; extra == "all"
185
- Requires-Dist: yamlscript; extra == "all"
186
- Requires-Dist: Unidecode; extra == "all"
187
175
  Requires-Dist: dnspython[doh]; extra == "all"
188
- Requires-Dist: google-api-python-client; extra == "all"
189
- Requires-Dist: contexttimer; extra == "all"
190
- Requires-Dist: tinynetrc; extra == "all"
191
- Requires-Dist: transformers[sentencepiece]; extra == "all"
192
- Requires-Dist: deepmerge; extra == "all"
193
- Requires-Dist: python-on-whales; extra == "all"
194
- Requires-Dist: semver; extra == "all"
195
- Requires-Dist: uvicorn[standard]; extra == "all"
196
- Requires-Dist: diskcache; extra == "all"
197
- Requires-Dist: openai; extra == "all"
198
- Requires-Dist: deepdiff; extra == "all"
199
- Requires-Dist: json_repair; extra == "all"
200
- Requires-Dist: tokenizers; extra == "all"
201
- Requires-Dist: torchvision; extra == "all"
202
- Requires-Dist: faker; extra == "all"
176
+ Requires-Dist: pydantic; extra == "all"
203
177
  Requires-Dist: pytest-cov; extra == "all"
204
- Requires-Dist: pydantic-settings; extra == "all"
205
- Requires-Dist: sre_yield; extra == "all"
178
+ Requires-Dist: bokeh; extra == "all"
179
+ Requires-Dist: faker; extra == "all"
180
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
181
+ Requires-Dist: peft; extra == "all"
182
+ Requires-Dist: Unidecode; extra == "all"
206
183
  Requires-Dist: pycountry; extra == "all"
207
- Requires-Dist: tabulate; extra == "all"
184
+ Requires-Dist: huggingface_hub; extra == "all"
185
+ Requires-Dist: flet-webview; extra == "all"
186
+ Requires-Dist: semver; extra == "all"
187
+ Requires-Dist: torchaudio; extra == "all"
188
+ Requires-Dist: google-api-python-client; extra == "all"
189
+ Requires-Dist: beanie[odm]; extra == "all"
190
+ Requires-Dist: playwright; extra == "all"
191
+ Requires-Dist: filetype; extra == "all"
192
+ Requires-Dist: html2text; extra == "all"
193
+ Requires-Dist: logfire; extra == "all"
194
+ Requires-Dist: pydantic-extra-types; extra == "all"
208
195
  Requires-Dist: pymupdf; extra == "all"
209
- Requires-Dist: fastapi; extra == "all"
196
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
210
197
  Requires-Dist: sentence_transformers; extra == "all"
211
- Requires-Dist: motor; extra == "all"
212
- Requires-Dist: bokeh; extra == "all"
198
+ Requires-Dist: deepmerge; extra == "all"
199
+ Requires-Dist: ollama; extra == "all"
213
200
  Requires-Dist: odfpy; extra == "all"
214
- Requires-Dist: cachetools; extra == "all"
215
- Requires-Dist: appdirs; extra == "all"
201
+ Requires-Dist: pyyaml; extra == "all"
202
+ Requires-Dist: tinynetrc; extra == "all"
216
203
  Requires-Dist: logfire[fastapi]; extra == "all"
217
- Requires-Dist: pydantic; extra == "all"
218
- Requires-Dist: google-auth-oauthlib; extra == "all"
219
- Requires-Dist: pydantic-extra-types; extra == "all"
204
+ Requires-Dist: motor; extra == "all"
205
+ Requires-Dist: json_repair; extra == "all"
206
+ Requires-Dist: tokenizers; extra == "all"
207
+ Requires-Dist: contexttimer; extra == "all"
220
208
  Requires-Dist: httpx; extra == "all"
221
- Requires-Dist: torchaudio; extra == "all"
222
- Requires-Dist: html2text; extra == "all"
223
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
209
+ Requires-Dist: appdirs; extra == "all"
210
+ Requires-Dist: yamlscript; extra == "all"
224
211
  Requires-Dist: distributed; extra == "all"
225
- Requires-Dist: peft; extra == "all"
226
- Requires-Dist: setuptools; extra == "all"
227
- Requires-Dist: huggingface_hub; extra == "all"
212
+ Requires-Dist: cachetools; extra == "all"
228
213
  Requires-Dist: google-auth; extra == "all"
214
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
215
+ Requires-Dist: pandas; extra == "all"
216
+ Requires-Dist: tabulate; extra == "all"
217
+ Requires-Dist: setuptools; extra == "all"
218
+ Requires-Dist: google-auth-httplib2; extra == "all"
219
+ Requires-Dist: pymupdf4llm; extra == "all"
220
+ Requires-Dist: google-auth-oauthlib; extra == "all"
221
+ Requires-Dist: regex; extra == "all"
222
+ Requires-Dist: flet-video; extra == "all"
223
+ Requires-Dist: deepdiff; extra == "all"
224
+ Requires-Dist: httpx_retries; extra == "all"
225
+ Requires-Dist: uvicorn[standard]; extra == "all"
226
+ Requires-Dist: openai; extra == "all"
227
+ Requires-Dist: fastapi; extra == "all"
229
228
  Requires-Dist: openpyxl; extra == "all"
230
- Requires-Dist: beanie[odm]; extra == "all"
231
- Requires-Dist: pyyaml; extra == "all"
232
- Requires-Dist: dask[bag]; extra == "all"
229
+ Requires-Dist: logfire[httpx]; extra == "all"
230
+ Requires-Dist: torchvision; extra == "all"
231
+ Requires-Dist: pydantic-settings; extra == "all"
232
+ Requires-Dist: sre_yield; extra == "all"
233
233
  Dynamic: author
234
234
  Dynamic: author-email
235
235
  Dynamic: description
@@ -1,3 +1,4 @@
1
+ import inspect
1
2
  from functools import cached_property
2
3
  from typing import ClassVar, List, Any, Dict
3
4
 
@@ -9,7 +10,7 @@ from pydantic_core import PydanticUndefined, PydanticUndefinedType
9
10
  from fmtr.tools.datatype_tools import is_optional
10
11
  from fmtr.tools.iterator_tools import get_class_lookup
11
12
  from fmtr.tools.string_tools import camel_to_snake
12
- from fmtr.tools.tools import Auto, Required
13
+ from fmtr.tools.tools import Auto, Required, Empty
13
14
 
14
15
 
15
16
  class Field(FieldInfo):
@@ -19,27 +20,35 @@ class Field(FieldInfo):
19
20
 
20
21
  """
21
22
  NAME = Auto
22
- ANNOTATION = None
23
+ ANNOTATION = Empty
23
24
  DEFAULT = Auto
24
25
  FILLS = None
25
26
  DESCRIPTION = None
26
27
  TITLE = Auto
27
28
  CONFIG = None
28
29
 
29
- def __init__(self):
30
+ def __init__(self, annotation=Empty, default=Empty, description=None, title=None, fills=None, **kwargs):
30
31
  """
31
32
 
32
33
  Infer default from type annotation, if enabled, use class/argument fills to create titles/descriptions, etc.
33
34
 
34
35
  """
35
- title = self.get_title_auto()
36
- description = self.get_desc()
37
- default = self.get_default_auto()
38
- kwargs = self.CONFIG or {}
39
36
 
37
+ fills_super = getattr(super(), 'FILLS', None)
38
+ self.fills = (fills_super or {}) | (self.FILLS or {}) | (fills or {})
39
+
40
+ self.annotation = self.ANNOTATION if annotation is Empty else annotation
41
+ if self.annotation is Empty:
42
+ raise ValueError("Annotation must be specified.")
43
+
44
+ default = self.get_default_auto(default)
40
45
  if default is Required:
41
46
  default = PydanticUndefined
42
47
 
48
+ description = self.get_desc(description)
49
+ title = self.get_title_auto(title)
50
+ kwargs |= (self.CONFIG or {})
51
+
43
52
  super().__init__(default=default, title=title, description=description, **kwargs)
44
53
 
45
54
  @classmethod
@@ -63,46 +72,55 @@ class Field(FieldInfo):
63
72
  Get fills with filled title merged in
64
73
 
65
74
  """
66
- return (self.FILLS or {}) | dict(title=self.get_title_auto())
67
75
 
68
- def get_default_auto(self) -> type[Any] | None | PydanticUndefinedType:
76
+ fills_super = getattr(super(), 'FILLS', None)
77
+
78
+ return (fills_super or {}) | (self.FILLS or {}) | dict(title=self.get_title_auto())
79
+
80
+ def get_default_auto(self, default) -> type[Any] | None | PydanticUndefinedType:
69
81
  """
70
82
 
71
83
  Infer default, if not specified.
72
84
 
73
85
  """
86
+
87
+ if default is not Empty:
88
+ return default
89
+
74
90
  if self.DEFAULT is not Auto:
75
91
  return self.DEFAULT
76
92
 
77
- if is_optional(self.ANNOTATION):
93
+ if is_optional(self.annotation):
78
94
  return None
79
95
  else:
80
96
  return Required
81
97
 
82
- def get_title_auto(self) -> str | None:
98
+ def get_title_auto(self, mask) -> str | None:
83
99
  """
84
100
 
85
101
  Get title from classname/mask
86
102
 
87
103
  """
88
104
 
89
- mask = self.__class__.__name__ if self.TITLE is Auto else self.TITLE
90
- fills = (self.FILLS or {})
105
+ if not mask:
106
+ mask = self.__class__.__name__ if self.TITLE is Auto else self.TITLE
91
107
 
92
108
  if mask:
93
- return mask.format(**fills)
109
+ return mask.format(**self.fills)
94
110
 
95
111
  return None
96
112
 
97
- def get_desc(self) -> str | None:
113
+ def get_desc(self, mask) -> str | None:
98
114
  """
99
115
 
100
- Get description from classname/mask
116
+ Fill description mask, if specified
101
117
 
102
118
  """
103
119
 
104
- if self.DESCRIPTION:
105
- return self.DESCRIPTION.format(**self.fills)
120
+ mask = mask or self.DESCRIPTION
121
+
122
+ if mask:
123
+ return mask.format(**self.fills)
106
124
 
107
125
  return None
108
126
 
@@ -189,14 +207,16 @@ class Base(BaseModel, MixinFromJson):
189
207
 
190
208
  cls.FIELDS = fields
191
209
 
192
- for name, FieldInfoType in fields.items():
210
+ for name, field in fields.items():
193
211
  if name in cls.__annotations__:
194
212
  continue
195
213
 
196
- field = FieldInfoType()
214
+ if inspect.isclass(field):
215
+ field = field()
216
+
197
217
  setattr(cls, name, field)
198
218
 
199
- annotation = FieldInfoType.ANNOTATION
219
+ annotation = field.annotation
200
220
  cls.__annotations__[name] = annotation
201
221
 
202
222
  def to_df(self, name_value='value'):
@@ -93,6 +93,9 @@ def is_optional(annotation) -> bool:
93
93
  Is type/annotation optional? todo should be in typing_tools?
94
94
 
95
95
  """
96
+ if annotation is None:
97
+ return True
98
+
96
99
  origin = get_origin(annotation)
97
100
  args = get_args(annotation)
98
101
  is_opt = origin is UnionType and NoneType in args
@@ -0,0 +1 @@
1
+ 1.3.67
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.66
3
+ Version: 1.3.67
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
@@ -168,68 +168,68 @@ Provides-Extra: db-document
168
168
  Requires-Dist: beanie[odm]; extra == "db-document"
169
169
  Requires-Dist: motor; extra == "db-document"
170
170
  Provides-Extra: all
171
- Requires-Dist: logfire[httpx]; extra == "all"
172
- Requires-Dist: logfire; extra == "all"
173
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
174
- Requires-Dist: ollama; extra == "all"
175
- Requires-Dist: pymupdf4llm; extra == "all"
176
- Requires-Dist: playwright; extra == "all"
177
- Requires-Dist: flet-video; extra == "all"
171
+ Requires-Dist: diskcache; extra == "all"
172
+ Requires-Dist: dask[bag]; extra == "all"
173
+ Requires-Dist: python-on-whales; extra == "all"
178
174
  Requires-Dist: flet[all]; extra == "all"
179
- Requires-Dist: filetype; extra == "all"
180
- Requires-Dist: flet-webview; extra == "all"
181
- Requires-Dist: pandas; extra == "all"
182
- Requires-Dist: httpx_retries; extra == "all"
183
- Requires-Dist: regex; extra == "all"
184
- Requires-Dist: google-auth-httplib2; extra == "all"
185
- Requires-Dist: yamlscript; extra == "all"
186
- Requires-Dist: Unidecode; extra == "all"
187
175
  Requires-Dist: dnspython[doh]; extra == "all"
188
- Requires-Dist: google-api-python-client; extra == "all"
189
- Requires-Dist: contexttimer; extra == "all"
190
- Requires-Dist: tinynetrc; extra == "all"
191
- Requires-Dist: transformers[sentencepiece]; extra == "all"
192
- Requires-Dist: deepmerge; extra == "all"
193
- Requires-Dist: python-on-whales; extra == "all"
194
- Requires-Dist: semver; extra == "all"
195
- Requires-Dist: uvicorn[standard]; extra == "all"
196
- Requires-Dist: diskcache; extra == "all"
197
- Requires-Dist: openai; extra == "all"
198
- Requires-Dist: deepdiff; extra == "all"
199
- Requires-Dist: json_repair; extra == "all"
200
- Requires-Dist: tokenizers; extra == "all"
201
- Requires-Dist: torchvision; extra == "all"
202
- Requires-Dist: faker; extra == "all"
176
+ Requires-Dist: pydantic; extra == "all"
203
177
  Requires-Dist: pytest-cov; extra == "all"
204
- Requires-Dist: pydantic-settings; extra == "all"
205
- Requires-Dist: sre_yield; extra == "all"
178
+ Requires-Dist: bokeh; extra == "all"
179
+ Requires-Dist: faker; extra == "all"
180
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
181
+ Requires-Dist: peft; extra == "all"
182
+ Requires-Dist: Unidecode; extra == "all"
206
183
  Requires-Dist: pycountry; extra == "all"
207
- Requires-Dist: tabulate; extra == "all"
184
+ Requires-Dist: huggingface_hub; extra == "all"
185
+ Requires-Dist: flet-webview; extra == "all"
186
+ Requires-Dist: semver; extra == "all"
187
+ Requires-Dist: torchaudio; extra == "all"
188
+ Requires-Dist: google-api-python-client; extra == "all"
189
+ Requires-Dist: beanie[odm]; extra == "all"
190
+ Requires-Dist: playwright; extra == "all"
191
+ Requires-Dist: filetype; extra == "all"
192
+ Requires-Dist: html2text; extra == "all"
193
+ Requires-Dist: logfire; extra == "all"
194
+ Requires-Dist: pydantic-extra-types; extra == "all"
208
195
  Requires-Dist: pymupdf; extra == "all"
209
- Requires-Dist: fastapi; extra == "all"
196
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
210
197
  Requires-Dist: sentence_transformers; extra == "all"
211
- Requires-Dist: motor; extra == "all"
212
- Requires-Dist: bokeh; extra == "all"
198
+ Requires-Dist: deepmerge; extra == "all"
199
+ Requires-Dist: ollama; extra == "all"
213
200
  Requires-Dist: odfpy; extra == "all"
214
- Requires-Dist: cachetools; extra == "all"
215
- Requires-Dist: appdirs; extra == "all"
201
+ Requires-Dist: pyyaml; extra == "all"
202
+ Requires-Dist: tinynetrc; extra == "all"
216
203
  Requires-Dist: logfire[fastapi]; extra == "all"
217
- Requires-Dist: pydantic; extra == "all"
218
- Requires-Dist: google-auth-oauthlib; extra == "all"
219
- Requires-Dist: pydantic-extra-types; extra == "all"
204
+ Requires-Dist: motor; extra == "all"
205
+ Requires-Dist: json_repair; extra == "all"
206
+ Requires-Dist: tokenizers; extra == "all"
207
+ Requires-Dist: contexttimer; extra == "all"
220
208
  Requires-Dist: httpx; extra == "all"
221
- Requires-Dist: torchaudio; extra == "all"
222
- Requires-Dist: html2text; extra == "all"
223
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
209
+ Requires-Dist: appdirs; extra == "all"
210
+ Requires-Dist: yamlscript; extra == "all"
224
211
  Requires-Dist: distributed; extra == "all"
225
- Requires-Dist: peft; extra == "all"
226
- Requires-Dist: setuptools; extra == "all"
227
- Requires-Dist: huggingface_hub; extra == "all"
212
+ Requires-Dist: cachetools; extra == "all"
228
213
  Requires-Dist: google-auth; extra == "all"
214
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
215
+ Requires-Dist: pandas; extra == "all"
216
+ Requires-Dist: tabulate; extra == "all"
217
+ Requires-Dist: setuptools; extra == "all"
218
+ Requires-Dist: google-auth-httplib2; extra == "all"
219
+ Requires-Dist: pymupdf4llm; extra == "all"
220
+ Requires-Dist: google-auth-oauthlib; extra == "all"
221
+ Requires-Dist: regex; extra == "all"
222
+ Requires-Dist: flet-video; extra == "all"
223
+ Requires-Dist: deepdiff; extra == "all"
224
+ Requires-Dist: httpx_retries; extra == "all"
225
+ Requires-Dist: uvicorn[standard]; extra == "all"
226
+ Requires-Dist: openai; extra == "all"
227
+ Requires-Dist: fastapi; extra == "all"
229
228
  Requires-Dist: openpyxl; extra == "all"
230
- Requires-Dist: beanie[odm]; extra == "all"
231
- Requires-Dist: pyyaml; extra == "all"
232
- Requires-Dist: dask[bag]; extra == "all"
229
+ Requires-Dist: logfire[httpx]; extra == "all"
230
+ Requires-Dist: torchvision; extra == "all"
231
+ Requires-Dist: pydantic-settings; extra == "all"
232
+ Requires-Dist: sre_yield; extra == "all"
233
233
  Dynamic: author
234
234
  Dynamic: author-email
235
235
  Dynamic: description
@@ -1 +0,0 @@
1
- 1.3.66
File without changes
File without changes
@@ -18,68 +18,68 @@ pydantic-ai[logfire,openai]
18
18
  ollama
19
19
 
20
20
  [all]
21
- logfire[httpx]
22
- logfire
23
- pydantic-ai[logfire,openai]
24
- ollama
25
- pymupdf4llm
26
- playwright
27
- flet-video
21
+ diskcache
22
+ dask[bag]
23
+ python-on-whales
28
24
  flet[all]
29
- filetype
30
- flet-webview
31
- pandas
32
- httpx_retries
33
- regex
34
- google-auth-httplib2
35
- yamlscript
36
- Unidecode
37
25
  dnspython[doh]
38
- google-api-python-client
39
- contexttimer
40
- tinynetrc
41
- transformers[sentencepiece]
42
- deepmerge
43
- python-on-whales
44
- semver
45
- uvicorn[standard]
46
- diskcache
47
- openai
48
- deepdiff
49
- json_repair
50
- tokenizers
51
- torchvision
52
- faker
26
+ pydantic
53
27
  pytest-cov
54
- pydantic-settings
55
- sre_yield
28
+ bokeh
29
+ faker
30
+ pydevd-pycharm~=251.25410.159
31
+ peft
32
+ Unidecode
56
33
  pycountry
57
- tabulate
34
+ huggingface_hub
35
+ flet-webview
36
+ semver
37
+ torchaudio
38
+ google-api-python-client
39
+ beanie[odm]
40
+ playwright
41
+ filetype
42
+ html2text
43
+ logfire
44
+ pydantic-extra-types
58
45
  pymupdf
59
- fastapi
46
+ pydantic-ai[logfire,openai]
60
47
  sentence_transformers
61
- motor
62
- bokeh
48
+ deepmerge
49
+ ollama
63
50
  odfpy
64
- cachetools
65
- appdirs
51
+ pyyaml
52
+ tinynetrc
66
53
  logfire[fastapi]
67
- pydantic
68
- google-auth-oauthlib
69
- pydantic-extra-types
54
+ motor
55
+ json_repair
56
+ tokenizers
57
+ contexttimer
70
58
  httpx
71
- torchaudio
72
- html2text
73
- pydevd-pycharm~=251.25410.159
59
+ appdirs
60
+ yamlscript
74
61
  distributed
75
- peft
76
- setuptools
77
- huggingface_hub
62
+ cachetools
78
63
  google-auth
64
+ transformers[sentencepiece]
65
+ pandas
66
+ tabulate
67
+ setuptools
68
+ google-auth-httplib2
69
+ pymupdf4llm
70
+ google-auth-oauthlib
71
+ regex
72
+ flet-video
73
+ deepdiff
74
+ httpx_retries
75
+ uvicorn[standard]
76
+ openai
77
+ fastapi
79
78
  openpyxl
80
- beanie[odm]
81
- pyyaml
82
- dask[bag]
79
+ logfire[httpx]
80
+ torchvision
81
+ pydantic-settings
82
+ sre_yield
83
83
 
84
84
  [api]
85
85
  fastapi
File without changes
File without changes
File without changes