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