fmtr.tools 1.3.65__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.65 → fmtr_tools-1.3.67}/PKG-INFO +51 -51
  2. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/data_modelling_tools.py +41 -21
  3. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/database_tools/document.py +11 -1
  4. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/datatype_tools.py +3 -0
  5. fmtr_tools-1.3.67/fmtr/tools/version +1 -0
  6. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/PKG-INFO +51 -51
  7. fmtr_tools-1.3.65/fmtr/tools/version +0 -1
  8. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/LICENSE +0 -0
  9. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/README.md +0 -0
  10. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/__init__.py +0 -0
  11. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/ai_tools/__init__.py +0 -0
  12. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  13. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  14. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/api_tools.py +0 -0
  15. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/async_tools.py +0 -0
  16. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/augmentation_tools.py +0 -0
  17. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/caching_tools.py +0 -0
  18. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/constants.py +0 -0
  19. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/context_tools.py +0 -0
  20. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/database_tools/__init__.py +0 -0
  21. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/dataclass_tools.py +0 -0
  22. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/datetime_tools.py +0 -0
  23. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/debugging_tools.py +0 -0
  24. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/dns_tools/__init__.py +0 -0
  25. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/dns_tools/client.py +0 -0
  26. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/dns_tools/dm.py +0 -0
  27. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/dns_tools/proxy.py +0 -0
  28. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/dns_tools/server.py +0 -0
  29. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/docker_tools/__init__.py +0 -0
  30. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/__init__.py +0 -0
  31. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  32. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/ep_test.py +0 -0
  33. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  34. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  35. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  36. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/environment_tools.py +0 -0
  37. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/function_tools.py +0 -0
  38. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/google_api_tools.py +0 -0
  39. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/hash_tools.py +0 -0
  40. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/hfh_tools.py +0 -0
  41. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/html_tools.py +0 -0
  42. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/http_tools.py +0 -0
  43. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/import_tools.py +0 -0
  44. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/inherit_tools.py +0 -0
  45. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/inspection_tools.py +0 -0
  46. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/interface_tools/__init__.py +0 -0
  47. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/interface_tools/context.py +0 -0
  48. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/interface_tools/controls.py +0 -0
  49. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/interface_tools/interface_tools.py +0 -0
  50. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/iterator_tools.py +0 -0
  51. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/json_fix_tools.py +0 -0
  52. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/json_tools.py +0 -0
  53. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/logging_tools.py +0 -0
  54. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/merging_tools.py +0 -0
  55. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/metric_tools.py +0 -0
  56. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/name_tools.py +0 -0
  57. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/netrc_tools.py +0 -0
  58. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/openai_tools.py +0 -0
  59. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/packaging_tools.py +0 -0
  60. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/parallel_tools.py +0 -0
  61. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/path_tools/__init__.py +0 -0
  62. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  63. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/path_tools/path_tools.py +0 -0
  64. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  65. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/pattern_tools.py +0 -0
  66. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/pdf_tools.py +0 -0
  67. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/platform_tools.py +0 -0
  68. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/process_tools.py +0 -0
  69. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/profiling_tools.py +0 -0
  70. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/random_tools.py +0 -0
  71. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/semantic_tools.py +0 -0
  72. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/settings_tools.py +0 -0
  73. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/setup_tools/__init__.py +0 -0
  74. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/setup_tools/setup_tools.py +0 -0
  75. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/spaces_tools.py +0 -0
  76. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/string_tools.py +0 -0
  77. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tabular_tools.py +0 -0
  78. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tests/__init__.py +0 -0
  79. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tests/conftest.py +0 -0
  80. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tests/helpers.py +0 -0
  81. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tests/test_datatype.py +0 -0
  82. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tests/test_environment.py +0 -0
  83. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tests/test_json.py +0 -0
  84. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tests/test_path.py +0 -0
  85. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tests/test_yaml.py +0 -0
  86. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tokenization_tools.py +0 -0
  87. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/tools.py +0 -0
  88. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/unicode_tools.py +0 -0
  89. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/version_tools/__init__.py +0 -0
  90. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/version_tools/version_tools.py +0 -0
  91. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/webhook_tools.py +0 -0
  92. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr/tools/yaml_tools.py +0 -0
  93. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  94. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  95. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/entry_points.txt +0 -0
  96. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/requires.txt +50 -50
  97. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/fmtr.tools.egg-info/top_level.txt +0 -0
  98. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/pyproject.toml +0 -0
  99. {fmtr_tools-1.3.65 → fmtr_tools-1.3.67}/setup.cfg +0 -0
  100. {fmtr_tools-1.3.65 → 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.65
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: diskcache; extra == "all"
172
+ Requires-Dist: dask[bag]; extra == "all"
173
+ Requires-Dist: python-on-whales; extra == "all"
174
+ Requires-Dist: flet[all]; extra == "all"
175
+ Requires-Dist: dnspython[doh]; extra == "all"
176
+ Requires-Dist: pydantic; extra == "all"
177
+ Requires-Dist: pytest-cov; 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"
183
+ Requires-Dist: pycountry; 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"
171
189
  Requires-Dist: beanie[odm]; extra == "all"
172
- Requires-Dist: transformers[sentencepiece]; extra == "all"
173
- Requires-Dist: httpx_retries; extra == "all"
174
- Requires-Dist: motor; extra == "all"
175
- Requires-Dist: deepdiff; extra == "all"
176
- Requires-Dist: yamlscript; extra == "all"
177
- Requires-Dist: google-auth; extra == "all"
178
190
  Requires-Dist: playwright; extra == "all"
179
- Requires-Dist: fastapi; extra == "all"
180
- Requires-Dist: flet-video; 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"
195
+ Requires-Dist: pymupdf; extra == "all"
196
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
197
+ Requires-Dist: sentence_transformers; extra == "all"
198
+ Requires-Dist: deepmerge; extra == "all"
199
+ Requires-Dist: ollama; extra == "all"
200
+ Requires-Dist: odfpy; extra == "all"
201
+ Requires-Dist: pyyaml; extra == "all"
181
202
  Requires-Dist: tinynetrc; extra == "all"
182
203
  Requires-Dist: logfire[fastapi]; extra == "all"
183
- Requires-Dist: cachetools; 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"
184
208
  Requires-Dist: httpx; extra == "all"
209
+ Requires-Dist: appdirs; extra == "all"
210
+ Requires-Dist: yamlscript; extra == "all"
211
+ Requires-Dist: distributed; extra == "all"
212
+ Requires-Dist: cachetools; extra == "all"
213
+ Requires-Dist: google-auth; extra == "all"
214
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
215
+ Requires-Dist: pandas; extra == "all"
185
216
  Requires-Dist: tabulate; extra == "all"
186
- Requires-Dist: peft; extra == "all"
187
- Requires-Dist: openai; extra == "all"
188
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
217
+ Requires-Dist: setuptools; extra == "all"
189
218
  Requires-Dist: google-auth-httplib2; extra == "all"
190
- Requires-Dist: torchaudio; extra == "all"
191
- Requires-Dist: faker; extra == "all"
192
- Requires-Dist: odfpy; extra == "all"
193
- Requires-Dist: flet[all]; extra == "all"
219
+ Requires-Dist: pymupdf4llm; extra == "all"
194
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"
195
225
  Requires-Dist: uvicorn[standard]; extra == "all"
196
- Requires-Dist: tokenizers; extra == "all"
197
- Requires-Dist: pymupdf; extra == "all"
226
+ Requires-Dist: openai; extra == "all"
227
+ Requires-Dist: fastapi; extra == "all"
198
228
  Requires-Dist: openpyxl; extra == "all"
199
- Requires-Dist: regex; extra == "all"
200
- Requires-Dist: Unidecode; extra == "all"
201
- Requires-Dist: appdirs; extra == "all"
229
+ Requires-Dist: logfire[httpx]; extra == "all"
230
+ Requires-Dist: torchvision; extra == "all"
202
231
  Requires-Dist: pydantic-settings; extra == "all"
203
- Requires-Dist: filetype; extra == "all"
204
- Requires-Dist: setuptools; extra == "all"
205
- Requires-Dist: distributed; extra == "all"
206
- Requires-Dist: python-on-whales; extra == "all"
207
- Requires-Dist: pandas; extra == "all"
208
- Requires-Dist: google-api-python-client; extra == "all"
209
- Requires-Dist: deepmerge; extra == "all"
210
- Requires-Dist: pyyaml; extra == "all"
211
- Requires-Dist: pydantic; extra == "all"
212
- Requires-Dist: pydantic-extra-types; extra == "all"
213
- Requires-Dist: sentence_transformers; extra == "all"
214
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
215
- Requires-Dist: dask[bag]; extra == "all"
216
232
  Requires-Dist: sre_yield; extra == "all"
217
- Requires-Dist: pymupdf4llm; extra == "all"
218
- Requires-Dist: dnspython[doh]; extra == "all"
219
- Requires-Dist: pytest-cov; extra == "all"
220
- Requires-Dist: pycountry; extra == "all"
221
- Requires-Dist: torchvision; extra == "all"
222
- Requires-Dist: diskcache; extra == "all"
223
- Requires-Dist: html2text; extra == "all"
224
- Requires-Dist: contexttimer; extra == "all"
225
- Requires-Dist: semver; extra == "all"
226
- Requires-Dist: flet-webview; extra == "all"
227
- Requires-Dist: logfire; extra == "all"
228
- Requires-Dist: ollama; extra == "all"
229
- Requires-Dist: json_repair; extra == "all"
230
- Requires-Dist: bokeh; extra == "all"
231
- Requires-Dist: logfire[httpx]; extra == "all"
232
- Requires-Dist: huggingface_hub; 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'):
@@ -2,13 +2,23 @@ from functools import cached_property
2
2
  from typing import List
3
3
 
4
4
  import beanie
5
+ from beanie.odm import actions
5
6
  from motor.motor_asyncio import AsyncIOMotorClient
6
7
 
8
+ from fmtr.tools import data_modelling_tools
7
9
  from fmtr.tools.constants import Constants
8
10
  from fmtr.tools.logging_tools import logger
9
11
 
12
+ ModifyEvents = [
13
+ actions.Insert,
14
+ actions.Replace,
15
+ actions.Save,
16
+ actions.SaveChanges,
17
+ actions.Update
18
+ ]
10
19
 
11
- class Document(beanie.Document):
20
+
21
+ class Document(beanie.Document, data_modelling_tools.Base):
12
22
  """
13
23
 
14
24
  Document stub.
@@ -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.65
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: diskcache; extra == "all"
172
+ Requires-Dist: dask[bag]; extra == "all"
173
+ Requires-Dist: python-on-whales; extra == "all"
174
+ Requires-Dist: flet[all]; extra == "all"
175
+ Requires-Dist: dnspython[doh]; extra == "all"
176
+ Requires-Dist: pydantic; extra == "all"
177
+ Requires-Dist: pytest-cov; 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"
183
+ Requires-Dist: pycountry; 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"
171
189
  Requires-Dist: beanie[odm]; extra == "all"
172
- Requires-Dist: transformers[sentencepiece]; extra == "all"
173
- Requires-Dist: httpx_retries; extra == "all"
174
- Requires-Dist: motor; extra == "all"
175
- Requires-Dist: deepdiff; extra == "all"
176
- Requires-Dist: yamlscript; extra == "all"
177
- Requires-Dist: google-auth; extra == "all"
178
190
  Requires-Dist: playwright; extra == "all"
179
- Requires-Dist: fastapi; extra == "all"
180
- Requires-Dist: flet-video; 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"
195
+ Requires-Dist: pymupdf; extra == "all"
196
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
197
+ Requires-Dist: sentence_transformers; extra == "all"
198
+ Requires-Dist: deepmerge; extra == "all"
199
+ Requires-Dist: ollama; extra == "all"
200
+ Requires-Dist: odfpy; extra == "all"
201
+ Requires-Dist: pyyaml; extra == "all"
181
202
  Requires-Dist: tinynetrc; extra == "all"
182
203
  Requires-Dist: logfire[fastapi]; extra == "all"
183
- Requires-Dist: cachetools; 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"
184
208
  Requires-Dist: httpx; extra == "all"
209
+ Requires-Dist: appdirs; extra == "all"
210
+ Requires-Dist: yamlscript; extra == "all"
211
+ Requires-Dist: distributed; extra == "all"
212
+ Requires-Dist: cachetools; extra == "all"
213
+ Requires-Dist: google-auth; extra == "all"
214
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
215
+ Requires-Dist: pandas; extra == "all"
185
216
  Requires-Dist: tabulate; extra == "all"
186
- Requires-Dist: peft; extra == "all"
187
- Requires-Dist: openai; extra == "all"
188
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
217
+ Requires-Dist: setuptools; extra == "all"
189
218
  Requires-Dist: google-auth-httplib2; extra == "all"
190
- Requires-Dist: torchaudio; extra == "all"
191
- Requires-Dist: faker; extra == "all"
192
- Requires-Dist: odfpy; extra == "all"
193
- Requires-Dist: flet[all]; extra == "all"
219
+ Requires-Dist: pymupdf4llm; extra == "all"
194
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"
195
225
  Requires-Dist: uvicorn[standard]; extra == "all"
196
- Requires-Dist: tokenizers; extra == "all"
197
- Requires-Dist: pymupdf; extra == "all"
226
+ Requires-Dist: openai; extra == "all"
227
+ Requires-Dist: fastapi; extra == "all"
198
228
  Requires-Dist: openpyxl; extra == "all"
199
- Requires-Dist: regex; extra == "all"
200
- Requires-Dist: Unidecode; extra == "all"
201
- Requires-Dist: appdirs; extra == "all"
229
+ Requires-Dist: logfire[httpx]; extra == "all"
230
+ Requires-Dist: torchvision; extra == "all"
202
231
  Requires-Dist: pydantic-settings; extra == "all"
203
- Requires-Dist: filetype; extra == "all"
204
- Requires-Dist: setuptools; extra == "all"
205
- Requires-Dist: distributed; extra == "all"
206
- Requires-Dist: python-on-whales; extra == "all"
207
- Requires-Dist: pandas; extra == "all"
208
- Requires-Dist: google-api-python-client; extra == "all"
209
- Requires-Dist: deepmerge; extra == "all"
210
- Requires-Dist: pyyaml; extra == "all"
211
- Requires-Dist: pydantic; extra == "all"
212
- Requires-Dist: pydantic-extra-types; extra == "all"
213
- Requires-Dist: sentence_transformers; extra == "all"
214
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
215
- Requires-Dist: dask[bag]; extra == "all"
216
232
  Requires-Dist: sre_yield; extra == "all"
217
- Requires-Dist: pymupdf4llm; extra == "all"
218
- Requires-Dist: dnspython[doh]; extra == "all"
219
- Requires-Dist: pytest-cov; extra == "all"
220
- Requires-Dist: pycountry; extra == "all"
221
- Requires-Dist: torchvision; extra == "all"
222
- Requires-Dist: diskcache; extra == "all"
223
- Requires-Dist: html2text; extra == "all"
224
- Requires-Dist: contexttimer; extra == "all"
225
- Requires-Dist: semver; extra == "all"
226
- Requires-Dist: flet-webview; extra == "all"
227
- Requires-Dist: logfire; extra == "all"
228
- Requires-Dist: ollama; extra == "all"
229
- Requires-Dist: json_repair; extra == "all"
230
- Requires-Dist: bokeh; extra == "all"
231
- Requires-Dist: logfire[httpx]; extra == "all"
232
- Requires-Dist: huggingface_hub; extra == "all"
233
233
  Dynamic: author
234
234
  Dynamic: author-email
235
235
  Dynamic: description
@@ -1 +0,0 @@
1
- 1.3.65
File without changes
File without changes
@@ -18,68 +18,68 @@ pydantic-ai[logfire,openai]
18
18
  ollama
19
19
 
20
20
  [all]
21
+ diskcache
22
+ dask[bag]
23
+ python-on-whales
24
+ flet[all]
25
+ dnspython[doh]
26
+ pydantic
27
+ pytest-cov
28
+ bokeh
29
+ faker
30
+ pydevd-pycharm~=251.25410.159
31
+ peft
32
+ Unidecode
33
+ pycountry
34
+ huggingface_hub
35
+ flet-webview
36
+ semver
37
+ torchaudio
38
+ google-api-python-client
21
39
  beanie[odm]
22
- transformers[sentencepiece]
23
- httpx_retries
24
- motor
25
- deepdiff
26
- yamlscript
27
- google-auth
28
40
  playwright
29
- fastapi
30
- flet-video
41
+ filetype
42
+ html2text
43
+ logfire
44
+ pydantic-extra-types
45
+ pymupdf
46
+ pydantic-ai[logfire,openai]
47
+ sentence_transformers
48
+ deepmerge
49
+ ollama
50
+ odfpy
51
+ pyyaml
31
52
  tinynetrc
32
53
  logfire[fastapi]
33
- cachetools
54
+ motor
55
+ json_repair
56
+ tokenizers
57
+ contexttimer
34
58
  httpx
59
+ appdirs
60
+ yamlscript
61
+ distributed
62
+ cachetools
63
+ google-auth
64
+ transformers[sentencepiece]
65
+ pandas
35
66
  tabulate
36
- peft
37
- openai
38
- pydantic-ai[logfire,openai]
67
+ setuptools
39
68
  google-auth-httplib2
40
- torchaudio
41
- faker
42
- odfpy
43
- flet[all]
69
+ pymupdf4llm
44
70
  google-auth-oauthlib
71
+ regex
72
+ flet-video
73
+ deepdiff
74
+ httpx_retries
45
75
  uvicorn[standard]
46
- tokenizers
47
- pymupdf
76
+ openai
77
+ fastapi
48
78
  openpyxl
49
- regex
50
- Unidecode
51
- appdirs
79
+ logfire[httpx]
80
+ torchvision
52
81
  pydantic-settings
53
- filetype
54
- setuptools
55
- distributed
56
- python-on-whales
57
- pandas
58
- google-api-python-client
59
- deepmerge
60
- pyyaml
61
- pydantic
62
- pydantic-extra-types
63
- sentence_transformers
64
- pydevd-pycharm~=251.25410.159
65
- dask[bag]
66
82
  sre_yield
67
- pymupdf4llm
68
- dnspython[doh]
69
- pytest-cov
70
- pycountry
71
- torchvision
72
- diskcache
73
- html2text
74
- contexttimer
75
- semver
76
- flet-webview
77
- logfire
78
- ollama
79
- json_repair
80
- bokeh
81
- logfire[httpx]
82
- huggingface_hub
83
83
 
84
84
  [api]
85
85
  fastapi
File without changes
File without changes
File without changes