fmtr.tools 1.3.64__tar.gz → 1.3.66__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.64 → fmtr_tools-1.3.66}/PKG-INFO +52 -52
  2. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/data_modelling_tools.py +19 -3
  3. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/database_tools/document.py +11 -1
  4. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/iterator_tools.py +2 -3
  5. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/string_tools.py +15 -0
  6. fmtr_tools-1.3.66/fmtr/tools/version +1 -0
  7. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr.tools.egg-info/PKG-INFO +52 -52
  8. fmtr_tools-1.3.64/fmtr/tools/version +0 -1
  9. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/LICENSE +0 -0
  10. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/README.md +0 -0
  11. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/__init__.py +0 -0
  12. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/ai_tools/__init__.py +0 -0
  13. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/ai_tools/agentic_tools.py +0 -0
  14. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  15. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/api_tools.py +0 -0
  16. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/async_tools.py +0 -0
  17. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/augmentation_tools.py +0 -0
  18. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/caching_tools.py +0 -0
  19. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/constants.py +0 -0
  20. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/context_tools.py +0 -0
  21. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/database_tools/__init__.py +0 -0
  22. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/dataclass_tools.py +0 -0
  23. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/datatype_tools.py +0 -0
  24. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/datetime_tools.py +0 -0
  25. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/debugging_tools.py +0 -0
  26. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/dns_tools/__init__.py +0 -0
  27. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/dns_tools/client.py +0 -0
  28. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/dns_tools/dm.py +0 -0
  29. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/dns_tools/proxy.py +0 -0
  30. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/dns_tools/server.py +0 -0
  31. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/docker_tools/__init__.py +0 -0
  32. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/entrypoints/__init__.py +0 -0
  33. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  34. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/entrypoints/ep_test.py +0 -0
  35. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  36. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  37. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  38. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/environment_tools.py +0 -0
  39. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/function_tools.py +0 -0
  40. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/google_api_tools.py +0 -0
  41. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/hash_tools.py +0 -0
  42. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/hfh_tools.py +0 -0
  43. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/html_tools.py +0 -0
  44. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/http_tools.py +0 -0
  45. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/import_tools.py +0 -0
  46. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/inherit_tools.py +0 -0
  47. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/inspection_tools.py +0 -0
  48. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/interface_tools/__init__.py +0 -0
  49. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/interface_tools/context.py +0 -0
  50. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/interface_tools/controls.py +0 -0
  51. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/interface_tools/interface_tools.py +0 -0
  52. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/json_fix_tools.py +0 -0
  53. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/json_tools.py +0 -0
  54. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/logging_tools.py +0 -0
  55. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/merging_tools.py +0 -0
  56. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/metric_tools.py +0 -0
  57. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/name_tools.py +0 -0
  58. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/netrc_tools.py +0 -0
  59. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/openai_tools.py +0 -0
  60. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/packaging_tools.py +0 -0
  61. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/parallel_tools.py +0 -0
  62. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/path_tools/__init__.py +0 -0
  63. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  64. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/path_tools/path_tools.py +0 -0
  65. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  66. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/pattern_tools.py +0 -0
  67. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/pdf_tools.py +0 -0
  68. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/platform_tools.py +0 -0
  69. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/process_tools.py +0 -0
  70. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/profiling_tools.py +0 -0
  71. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/random_tools.py +0 -0
  72. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/semantic_tools.py +0 -0
  73. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/settings_tools.py +0 -0
  74. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/setup_tools/__init__.py +0 -0
  75. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/setup_tools/setup_tools.py +0 -0
  76. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/spaces_tools.py +0 -0
  77. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tabular_tools.py +0 -0
  78. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tests/__init__.py +0 -0
  79. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tests/conftest.py +0 -0
  80. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tests/helpers.py +0 -0
  81. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tests/test_datatype.py +0 -0
  82. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tests/test_environment.py +0 -0
  83. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tests/test_json.py +0 -0
  84. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tests/test_path.py +0 -0
  85. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tests/test_yaml.py +0 -0
  86. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tokenization_tools.py +0 -0
  87. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/tools.py +0 -0
  88. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/unicode_tools.py +0 -0
  89. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/version_tools/__init__.py +0 -0
  90. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/version_tools/version_tools.py +0 -0
  91. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/webhook_tools.py +0 -0
  92. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr/tools/yaml_tools.py +0 -0
  93. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  94. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  95. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr.tools.egg-info/entry_points.txt +0 -0
  96. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr.tools.egg-info/requires.txt +51 -51
  97. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/fmtr.tools.egg-info/top_level.txt +0 -0
  98. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/pyproject.toml +0 -0
  99. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/setup.cfg +0 -0
  100. {fmtr_tools-1.3.64 → fmtr_tools-1.3.66}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.64
3
+ Version: 1.3.66
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: deepmerge; extra == "all"
172
- Requires-Dist: faker; extra == "all"
173
- Requires-Dist: pandas; extra == "all"
174
- Requires-Dist: google-api-python-client; extra == "all"
175
- Requires-Dist: html2text; extra == "all"
176
- Requires-Dist: pyyaml; extra == "all"
177
- Requires-Dist: dask[bag]; extra == "all"
178
- Requires-Dist: google-auth-httplib2; extra == "all"
179
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
180
- Requires-Dist: pymupdf; extra == "all"
181
- Requires-Dist: beanie[odm]; extra == "all"
182
- Requires-Dist: fastapi; extra == "all"
183
- Requires-Dist: uvicorn[standard]; extra == "all"
184
- Requires-Dist: appdirs; extra == "all"
185
- Requires-Dist: pydantic-extra-types; extra == "all"
186
- Requires-Dist: distributed; extra == "all"
187
- Requires-Dist: torchaudio; extra == "all"
188
- Requires-Dist: setuptools; extra == "all"
189
- Requires-Dist: deepdiff; extra == "all"
190
- Requires-Dist: odfpy; extra == "all"
191
- Requires-Dist: python-on-whales; extra == "all"
192
- Requires-Dist: Unidecode; extra == "all"
193
- Requires-Dist: contexttimer; extra == "all"
194
- Requires-Dist: tokenizers; extra == "all"
195
- Requires-Dist: pycountry; extra == "all"
196
- Requires-Dist: openai; extra == "all"
197
- Requires-Dist: flet-webview; extra == "all"
198
171
  Requires-Dist: logfire[httpx]; extra == "all"
199
- Requires-Dist: regex; extra == "all"
200
- Requires-Dist: peft; extra == "all"
201
172
  Requires-Dist: logfire; extra == "all"
202
- Requires-Dist: pytest-cov; extra == "all"
203
- Requires-Dist: playwright; extra == "all"
204
- Requires-Dist: httpx; extra == "all"
205
- Requires-Dist: logfire[fastapi]; extra == "all"
206
- Requires-Dist: pydantic-settings; extra == "all"
207
- Requires-Dist: sentence_transformers; extra == "all"
208
- Requires-Dist: filetype; extra == "all"
209
173
  Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
210
- Requires-Dist: openpyxl; extra == "all"
211
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"
178
+ 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"
212
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
+ Requires-Dist: dnspython[doh]; extra == "all"
188
+ Requires-Dist: google-api-python-client; extra == "all"
189
+ Requires-Dist: contexttimer; extra == "all"
213
190
  Requires-Dist: tinynetrc; extra == "all"
214
- Requires-Dist: flet-video; extra == "all"
215
- Requires-Dist: pymupdf4llm; extra == "all"
216
- Requires-Dist: bokeh; extra == "all"
217
- Requires-Dist: diskcache; extra == "all"
191
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
192
+ Requires-Dist: deepmerge; extra == "all"
193
+ Requires-Dist: python-on-whales; extra == "all"
218
194
  Requires-Dist: semver; extra == "all"
219
- Requires-Dist: huggingface_hub; extra == "all"
220
- Requires-Dist: flet[all]; extra == "all"
221
- Requires-Dist: google-auth; extra == "all"
222
- Requires-Dist: tabulate; 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"
223
201
  Requires-Dist: torchvision; extra == "all"
224
- Requires-Dist: yamlscript; extra == "all"
202
+ Requires-Dist: faker; extra == "all"
203
+ Requires-Dist: pytest-cov; extra == "all"
204
+ Requires-Dist: pydantic-settings; extra == "all"
225
205
  Requires-Dist: sre_yield; extra == "all"
226
- Requires-Dist: json_repair; extra == "all"
227
- Requires-Dist: transformers[sentencepiece]; extra == "all"
228
- Requires-Dist: pydantic; extra == "all"
206
+ Requires-Dist: pycountry; extra == "all"
207
+ Requires-Dist: tabulate; extra == "all"
208
+ Requires-Dist: pymupdf; extra == "all"
209
+ Requires-Dist: fastapi; extra == "all"
210
+ Requires-Dist: sentence_transformers; extra == "all"
211
+ Requires-Dist: motor; extra == "all"
212
+ Requires-Dist: bokeh; extra == "all"
213
+ Requires-Dist: odfpy; extra == "all"
229
214
  Requires-Dist: cachetools; extra == "all"
215
+ Requires-Dist: appdirs; extra == "all"
216
+ Requires-Dist: logfire[fastapi]; extra == "all"
217
+ Requires-Dist: pydantic; extra == "all"
230
218
  Requires-Dist: google-auth-oauthlib; extra == "all"
231
- Requires-Dist: dnspython[doh]; extra == "all"
232
- Requires-Dist: motor; extra == "all"
219
+ Requires-Dist: pydantic-extra-types; extra == "all"
220
+ 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"
224
+ Requires-Dist: distributed; extra == "all"
225
+ Requires-Dist: peft; extra == "all"
226
+ Requires-Dist: setuptools; extra == "all"
227
+ Requires-Dist: huggingface_hub; extra == "all"
228
+ Requires-Dist: google-auth; extra == "all"
229
+ 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"
233
233
  Dynamic: author
234
234
  Dynamic: author-email
235
235
  Dynamic: description
@@ -8,6 +8,7 @@ from pydantic_core import PydanticUndefined, PydanticUndefinedType
8
8
 
9
9
  from fmtr.tools.datatype_tools import is_optional
10
10
  from fmtr.tools.iterator_tools import get_class_lookup
11
+ from fmtr.tools.string_tools import camel_to_snake
11
12
  from fmtr.tools.tools import Auto, Required
12
13
 
13
14
 
@@ -17,12 +18,13 @@ class Field(FieldInfo):
17
18
  Allow DRYer field definitions, set annotation and defaults at the same time, easier field inheritance, etc.
18
19
 
19
20
  """
21
+ NAME = Auto
20
22
  ANNOTATION = None
21
23
  DEFAULT = Auto
22
24
  FILLS = None
23
25
  DESCRIPTION = None
24
26
  TITLE = Auto
25
- KWARGS = None
27
+ CONFIG = None
26
28
 
27
29
  def __init__(self):
28
30
  """
@@ -33,13 +35,27 @@ class Field(FieldInfo):
33
35
  title = self.get_title_auto()
34
36
  description = self.get_desc()
35
37
  default = self.get_default_auto()
36
- kwargs = self.KWARGS or {}
38
+ kwargs = self.CONFIG or {}
37
39
 
38
40
  if default is Required:
39
41
  default = PydanticUndefined
40
42
 
41
43
  super().__init__(default=default, title=title, description=description, **kwargs)
42
44
 
45
+ @classmethod
46
+ def get_name_auto(cls) -> str:
47
+ """
48
+
49
+ Infer field name, if set to auto.
50
+
51
+ """
52
+ if cls.NAME is Auto:
53
+ return camel_to_snake(cls.__name__)
54
+ elif cls.NAME is None:
55
+ return cls.__name__
56
+
57
+ return cls.NAME
58
+
43
59
  @cached_property
44
60
  def fills(self) -> Dict[str, str]:
45
61
  """
@@ -169,7 +185,7 @@ class Base(BaseModel, MixinFromJson):
169
185
  if isinstance(raw, dict):
170
186
  fields |= raw
171
187
  else:
172
- fields |= get_class_lookup(*raw, name_function=str.lower)
188
+ fields |= get_class_lookup(*raw, name_function=lambda cls_field: cls_field.get_name_auto())
173
189
 
174
190
  cls.FIELDS = fields
175
191
 
@@ -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.
@@ -2,7 +2,6 @@ from itertools import chain, batched
2
2
  from typing import List, Dict, Any
3
3
 
4
4
  from fmtr.tools.datatype_tools import is_none
5
- from fmtr.tools.tools import identity
6
5
 
7
6
 
8
7
  def enlist(value) -> List[Any]:
@@ -75,10 +74,10 @@ def dedupe(items):
75
74
  return list(dict.fromkeys(items))
76
75
 
77
76
 
78
- def get_class_lookup(*classes, name_function=identity):
77
+ def get_class_lookup(*classes, name_function=lambda cls: cls.__name__):
79
78
  """
80
79
 
81
80
  Dictionary of class names to classes
82
81
 
83
82
  """
84
- return {name_function(cls.__name__): cls for cls in classes}
83
+ return {name_function(cls): cls for cls in classes}
@@ -241,3 +241,18 @@ def trim(text: str) -> str:
241
241
 
242
242
  """
243
243
  return dedent(text).strip()
244
+
245
+
246
+ ACRONYM_BOUNDARY = re.compile(r'([A-Z]+)([A-Z][a-z])')
247
+ CAMEL_BOUNDARY = re.compile(r'([a-z0-9])([A-Z])')
248
+
249
+
250
+ def camel_to_snake(name: str) -> str:
251
+ """
252
+
253
+ Camel case to snake case
254
+
255
+ """
256
+ name = ACRONYM_BOUNDARY.sub(r'\1_\2', name)
257
+ name = CAMEL_BOUNDARY.sub(r'\1_\2', name)
258
+ return name.lower()
@@ -0,0 +1 @@
1
+ 1.3.66
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.64
3
+ Version: 1.3.66
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: deepmerge; extra == "all"
172
- Requires-Dist: faker; extra == "all"
173
- Requires-Dist: pandas; extra == "all"
174
- Requires-Dist: google-api-python-client; extra == "all"
175
- Requires-Dist: html2text; extra == "all"
176
- Requires-Dist: pyyaml; extra == "all"
177
- Requires-Dist: dask[bag]; extra == "all"
178
- Requires-Dist: google-auth-httplib2; extra == "all"
179
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
180
- Requires-Dist: pymupdf; extra == "all"
181
- Requires-Dist: beanie[odm]; extra == "all"
182
- Requires-Dist: fastapi; extra == "all"
183
- Requires-Dist: uvicorn[standard]; extra == "all"
184
- Requires-Dist: appdirs; extra == "all"
185
- Requires-Dist: pydantic-extra-types; extra == "all"
186
- Requires-Dist: distributed; extra == "all"
187
- Requires-Dist: torchaudio; extra == "all"
188
- Requires-Dist: setuptools; extra == "all"
189
- Requires-Dist: deepdiff; extra == "all"
190
- Requires-Dist: odfpy; extra == "all"
191
- Requires-Dist: python-on-whales; extra == "all"
192
- Requires-Dist: Unidecode; extra == "all"
193
- Requires-Dist: contexttimer; extra == "all"
194
- Requires-Dist: tokenizers; extra == "all"
195
- Requires-Dist: pycountry; extra == "all"
196
- Requires-Dist: openai; extra == "all"
197
- Requires-Dist: flet-webview; extra == "all"
198
171
  Requires-Dist: logfire[httpx]; extra == "all"
199
- Requires-Dist: regex; extra == "all"
200
- Requires-Dist: peft; extra == "all"
201
172
  Requires-Dist: logfire; extra == "all"
202
- Requires-Dist: pytest-cov; extra == "all"
203
- Requires-Dist: playwright; extra == "all"
204
- Requires-Dist: httpx; extra == "all"
205
- Requires-Dist: logfire[fastapi]; extra == "all"
206
- Requires-Dist: pydantic-settings; extra == "all"
207
- Requires-Dist: sentence_transformers; extra == "all"
208
- Requires-Dist: filetype; extra == "all"
209
173
  Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
210
- Requires-Dist: openpyxl; extra == "all"
211
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"
178
+ 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"
212
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
+ Requires-Dist: dnspython[doh]; extra == "all"
188
+ Requires-Dist: google-api-python-client; extra == "all"
189
+ Requires-Dist: contexttimer; extra == "all"
213
190
  Requires-Dist: tinynetrc; extra == "all"
214
- Requires-Dist: flet-video; extra == "all"
215
- Requires-Dist: pymupdf4llm; extra == "all"
216
- Requires-Dist: bokeh; extra == "all"
217
- Requires-Dist: diskcache; extra == "all"
191
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
192
+ Requires-Dist: deepmerge; extra == "all"
193
+ Requires-Dist: python-on-whales; extra == "all"
218
194
  Requires-Dist: semver; extra == "all"
219
- Requires-Dist: huggingface_hub; extra == "all"
220
- Requires-Dist: flet[all]; extra == "all"
221
- Requires-Dist: google-auth; extra == "all"
222
- Requires-Dist: tabulate; 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"
223
201
  Requires-Dist: torchvision; extra == "all"
224
- Requires-Dist: yamlscript; extra == "all"
202
+ Requires-Dist: faker; extra == "all"
203
+ Requires-Dist: pytest-cov; extra == "all"
204
+ Requires-Dist: pydantic-settings; extra == "all"
225
205
  Requires-Dist: sre_yield; extra == "all"
226
- Requires-Dist: json_repair; extra == "all"
227
- Requires-Dist: transformers[sentencepiece]; extra == "all"
228
- Requires-Dist: pydantic; extra == "all"
206
+ Requires-Dist: pycountry; extra == "all"
207
+ Requires-Dist: tabulate; extra == "all"
208
+ Requires-Dist: pymupdf; extra == "all"
209
+ Requires-Dist: fastapi; extra == "all"
210
+ Requires-Dist: sentence_transformers; extra == "all"
211
+ Requires-Dist: motor; extra == "all"
212
+ Requires-Dist: bokeh; extra == "all"
213
+ Requires-Dist: odfpy; extra == "all"
229
214
  Requires-Dist: cachetools; extra == "all"
215
+ Requires-Dist: appdirs; extra == "all"
216
+ Requires-Dist: logfire[fastapi]; extra == "all"
217
+ Requires-Dist: pydantic; extra == "all"
230
218
  Requires-Dist: google-auth-oauthlib; extra == "all"
231
- Requires-Dist: dnspython[doh]; extra == "all"
232
- Requires-Dist: motor; extra == "all"
219
+ Requires-Dist: pydantic-extra-types; extra == "all"
220
+ 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"
224
+ Requires-Dist: distributed; extra == "all"
225
+ Requires-Dist: peft; extra == "all"
226
+ Requires-Dist: setuptools; extra == "all"
227
+ Requires-Dist: huggingface_hub; extra == "all"
228
+ Requires-Dist: google-auth; extra == "all"
229
+ 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"
233
233
  Dynamic: author
234
234
  Dynamic: author-email
235
235
  Dynamic: description
@@ -1 +0,0 @@
1
- 1.3.64
File without changes
File without changes
@@ -18,68 +18,68 @@ pydantic-ai[logfire,openai]
18
18
  ollama
19
19
 
20
20
  [all]
21
- deepmerge
22
- faker
23
- pandas
24
- google-api-python-client
25
- html2text
26
- pyyaml
27
- dask[bag]
28
- google-auth-httplib2
29
- pydevd-pycharm~=251.25410.159
30
- pymupdf
31
- beanie[odm]
32
- fastapi
33
- uvicorn[standard]
34
- appdirs
35
- pydantic-extra-types
36
- distributed
37
- torchaudio
38
- setuptools
39
- deepdiff
40
- odfpy
41
- python-on-whales
42
- Unidecode
43
- contexttimer
44
- tokenizers
45
- pycountry
46
- openai
47
- flet-webview
48
21
  logfire[httpx]
49
- regex
50
- peft
51
22
  logfire
52
- pytest-cov
53
- playwright
54
- httpx
55
- logfire[fastapi]
56
- pydantic-settings
57
- sentence_transformers
58
- filetype
59
23
  pydantic-ai[logfire,openai]
60
- openpyxl
61
24
  ollama
25
+ pymupdf4llm
26
+ playwright
27
+ flet-video
28
+ flet[all]
29
+ filetype
30
+ flet-webview
31
+ pandas
62
32
  httpx_retries
33
+ regex
34
+ google-auth-httplib2
35
+ yamlscript
36
+ Unidecode
37
+ dnspython[doh]
38
+ google-api-python-client
39
+ contexttimer
63
40
  tinynetrc
64
- flet-video
65
- pymupdf4llm
66
- bokeh
67
- diskcache
41
+ transformers[sentencepiece]
42
+ deepmerge
43
+ python-on-whales
68
44
  semver
69
- huggingface_hub
70
- flet[all]
71
- google-auth
72
- tabulate
45
+ uvicorn[standard]
46
+ diskcache
47
+ openai
48
+ deepdiff
49
+ json_repair
50
+ tokenizers
73
51
  torchvision
74
- yamlscript
52
+ faker
53
+ pytest-cov
54
+ pydantic-settings
75
55
  sre_yield
76
- json_repair
77
- transformers[sentencepiece]
78
- pydantic
56
+ pycountry
57
+ tabulate
58
+ pymupdf
59
+ fastapi
60
+ sentence_transformers
61
+ motor
62
+ bokeh
63
+ odfpy
79
64
  cachetools
65
+ appdirs
66
+ logfire[fastapi]
67
+ pydantic
80
68
  google-auth-oauthlib
81
- dnspython[doh]
82
- motor
69
+ pydantic-extra-types
70
+ httpx
71
+ torchaudio
72
+ html2text
73
+ pydevd-pycharm~=251.25410.159
74
+ distributed
75
+ peft
76
+ setuptools
77
+ huggingface_hub
78
+ google-auth
79
+ openpyxl
80
+ beanie[odm]
81
+ pyyaml
82
+ dask[bag]
83
83
 
84
84
  [api]
85
85
  fastapi
File without changes
File without changes
File without changes