fmtr.tools 1.3.62__py3-none-any.whl → 1.3.63__py3-none-any.whl

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.

@@ -1,11 +1,11 @@
1
- from collections import namedtuple
2
- from string import Formatter
3
-
4
1
  import re
5
2
  from dataclasses import dataclass
6
3
  from textwrap import dedent
7
4
  from typing import List
8
5
 
6
+ from collections import namedtuple
7
+ from string import Formatter
8
+
9
9
  from fmtr.tools.datatype_tools import is_none
10
10
 
11
11
  ELLIPSIS = '…'
@@ -151,14 +151,14 @@ def truncate_mid(text, length=None, sep=ELLIPSIS, return_type=str):
151
151
  )
152
152
 
153
153
 
154
- def flatten(raw):
154
+ def flatten(raw, sep=' '):
155
155
  """
156
156
 
157
157
  Flatten a multiline string to a single line
158
158
 
159
159
  """
160
160
  lines = raw.splitlines()
161
- text = ' '.join(lines)
161
+ text = sep.join(lines)
162
162
  text = text.strip()
163
163
  return text
164
164
 
@@ -175,6 +175,22 @@ def join(strings, sep=' '):
175
175
  return text
176
176
 
177
177
 
178
+ def join_natural(items, sep=', ', conj='and'):
179
+ """
180
+
181
+ Natural language list
182
+
183
+ """
184
+
185
+ if not items:
186
+ return ""
187
+ if len(items) == 1:
188
+ return items[0]
189
+ firsts, last = items[:-1], items[-1]
190
+ firsts_str = join(firsts, sep=sep)
191
+ text = f"{firsts_str} {conj} {last}"
192
+ return text
193
+
178
194
  class Mask:
179
195
  """
180
196
 
fmtr/tools/version CHANGED
@@ -1 +1 @@
1
- 1.3.62
1
+ 1.3.63
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.62
3
+ Version: 1.3.63
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
@@ -154,68 +154,68 @@ Provides-Extra: db-document
154
154
  Requires-Dist: beanie[odm]; extra == "db-document"
155
155
  Requires-Dist: motor; extra == "db-document"
156
156
  Provides-Extra: all
157
- Requires-Dist: json_repair; extra == "all"
158
- Requires-Dist: flet[all]; extra == "all"
159
- Requires-Dist: logfire[httpx]; extra == "all"
160
- Requires-Dist: pydantic; extra == "all"
161
- Requires-Dist: dnspython[doh]; extra == "all"
162
- Requires-Dist: sentence_transformers; extra == "all"
157
+ Requires-Dist: uvicorn[standard]; extra == "all"
158
+ Requires-Dist: contexttimer; extra == "all"
163
159
  Requires-Dist: pymupdf; extra == "all"
164
- Requires-Dist: bokeh; extra == "all"
165
- Requires-Dist: tokenizers; extra == "all"
166
- Requires-Dist: deepmerge; extra == "all"
167
- Requires-Dist: html2text; extra == "all"
168
- Requires-Dist: transformers[sentencepiece]; extra == "all"
160
+ Requires-Dist: motor; extra == "all"
161
+ Requires-Dist: huggingface_hub; extra == "all"
169
162
  Requires-Dist: google-auth-httplib2; extra == "all"
170
- Requires-Dist: dask[bag]; extra == "all"
171
- Requires-Dist: pydantic-extra-types; extra == "all"
163
+ Requires-Dist: sre_yield; extra == "all"
164
+ Requires-Dist: json_repair; extra == "all"
172
165
  Requires-Dist: fastapi; extra == "all"
166
+ Requires-Dist: tabulate; extra == "all"
167
+ Requires-Dist: flet-webview; extra == "all"
168
+ Requires-Dist: beanie[odm]; extra == "all"
169
+ Requires-Dist: openai; extra == "all"
170
+ Requires-Dist: pydantic-extra-types; extra == "all"
173
171
  Requires-Dist: torchaudio; extra == "all"
174
- Requires-Dist: deepdiff; extra == "all"
175
- Requires-Dist: setuptools; extra == "all"
176
172
  Requires-Dist: flet-video; extra == "all"
177
- Requires-Dist: uvicorn[standard]; extra == "all"
178
- Requires-Dist: huggingface_hub; extra == "all"
179
- Requires-Dist: contexttimer; extra == "all"
173
+ Requires-Dist: tinynetrc; extra == "all"
174
+ Requires-Dist: flet[all]; extra == "all"
175
+ Requires-Dist: pycountry; extra == "all"
176
+ Requires-Dist: torchvision; extra == "all"
177
+ Requires-Dist: deepdiff; extra == "all"
178
+ Requires-Dist: pydantic; extra == "all"
179
+ Requires-Dist: httpx_retries; extra == "all"
180
+ Requires-Dist: logfire[fastapi]; extra == "all"
181
+ Requires-Dist: diskcache; extra == "all"
182
+ Requires-Dist: dask[bag]; extra == "all"
183
+ Requires-Dist: yamlscript; extra == "all"
184
+ Requires-Dist: Unidecode; extra == "all"
180
185
  Requires-Dist: openpyxl; extra == "all"
186
+ Requires-Dist: httpx; extra == "all"
187
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
188
+ Requires-Dist: html2text; extra == "all"
181
189
  Requires-Dist: pytest-cov; extra == "all"
182
- Requires-Dist: flet-webview; extra == "all"
183
- Requires-Dist: tinynetrc; extra == "all"
190
+ Requires-Dist: logfire; extra == "all"
191
+ Requires-Dist: appdirs; extra == "all"
192
+ Requires-Dist: python-on-whales; extra == "all"
193
+ Requires-Dist: semver; extra == "all"
194
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
184
195
  Requires-Dist: pandas; extra == "all"
185
- Requires-Dist: httpx_retries; extra == "all"
186
- Requires-Dist: peft; extra == "all"
187
- Requires-Dist: google-api-python-client; extra == "all"
196
+ Requires-Dist: distributed; extra == "all"
197
+ Requires-Dist: filetype; extra == "all"
188
198
  Requires-Dist: faker; extra == "all"
189
- Requires-Dist: odfpy; extra == "all"
190
- Requires-Dist: Unidecode; extra == "all"
191
- Requires-Dist: openai; extra == "all"
199
+ Requires-Dist: sentence_transformers; extra == "all"
200
+ Requires-Dist: regex; extra == "all"
201
+ Requires-Dist: deepmerge; extra == "all"
202
+ Requires-Dist: google-api-python-client; extra == "all"
203
+ Requires-Dist: setuptools; extra == "all"
192
204
  Requires-Dist: google-auth; extra == "all"
193
- Requires-Dist: sre_yield; extra == "all"
194
- Requires-Dist: diskcache; extra == "all"
195
- Requires-Dist: torchvision; extra == "all"
196
- Requires-Dist: filetype; extra == "all"
197
- Requires-Dist: pymupdf4llm; extra == "all"
198
205
  Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
199
- Requires-Dist: regex; extra == "all"
200
- Requires-Dist: playwright; extra == "all"
201
- Requires-Dist: semver; extra == "all"
202
- Requires-Dist: logfire; extra == "all"
203
- Requires-Dist: beanie[odm]; extra == "all"
204
206
  Requires-Dist: pydantic-settings; extra == "all"
205
- Requires-Dist: appdirs; extra == "all"
206
- Requires-Dist: httpx; extra == "all"
207
- Requires-Dist: motor; extra == "all"
208
- Requires-Dist: yamlscript; extra == "all"
207
+ Requires-Dist: dnspython[doh]; extra == "all"
208
+ Requires-Dist: ollama; extra == "all"
209
209
  Requires-Dist: cachetools; extra == "all"
210
- Requires-Dist: google-auth-oauthlib; extra == "all"
211
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
212
- Requires-Dist: logfire[fastapi]; extra == "all"
210
+ Requires-Dist: pymupdf4llm; extra == "all"
213
211
  Requires-Dist: pyyaml; extra == "all"
214
- Requires-Dist: ollama; extra == "all"
215
- Requires-Dist: python-on-whales; extra == "all"
216
- Requires-Dist: tabulate; extra == "all"
217
- Requires-Dist: distributed; extra == "all"
218
- Requires-Dist: pycountry; extra == "all"
212
+ Requires-Dist: logfire[httpx]; extra == "all"
213
+ Requires-Dist: playwright; extra == "all"
214
+ Requires-Dist: odfpy; extra == "all"
215
+ Requires-Dist: tokenizers; extra == "all"
216
+ Requires-Dist: bokeh; extra == "all"
217
+ Requires-Dist: google-auth-oauthlib; extra == "all"
218
+ Requires-Dist: peft; extra == "all"
219
219
  Dynamic: author
220
220
  Dynamic: author-email
221
221
  Dynamic: description
@@ -40,12 +40,12 @@ fmtr/tools/random_tools.py,sha256=4VlQdk5THbR8ka4pZaLbk_ZO_4yy6PF_lHZes_rgenY,22
40
40
  fmtr/tools/semantic_tools.py,sha256=cxY9NSAHWj4nEc6Oj4qA1omR3dWbl2OuH7_PkINc6_E,1386
41
41
  fmtr/tools/settings_tools.py,sha256=o11W3T60UZSvCTkh_eEQq1Mx74GycQ6JxUr0plBDbsk,2356
42
42
  fmtr/tools/spaces_tools.py,sha256=D_he3mve6DruB3OPS6QyzqD05ChHnRTb4buViKPe7To,1099
43
- fmtr/tools/string_tools.py,sha256=On6YRLTAK1i6mmMpOUWVM618CykJiuaoyKIsU1cB_mA,4952
43
+ fmtr/tools/string_tools.py,sha256=Lz_H9l25OOoxE48QBJ_Upkk5nno7dPA6G2Gc0Wo8rOk,5275
44
44
  fmtr/tools/tabular_tools.py,sha256=mw6vOij1Ch-pVAyHMPtm5zj__ULZN_TKeBYOfj33wFM,1634
45
45
  fmtr/tools/tokenization_tools.py,sha256=me-IBzSLyNYejLybwjO9CNB6Mj2NYfKPaOVThXyaGNg,4268
46
46
  fmtr/tools/tools.py,sha256=CAsApa1YwVdNE6H66Vjivs_mXYvOas3rh7fPELAnTpk,795
47
47
  fmtr/tools/unicode_tools.py,sha256=yS_9wpu8ogNoiIL7s1G_8bETFFO_YQlo4LNPv1NLDeY,52
48
- fmtr/tools/version,sha256=FKKPeGwGcnITJYQNL1W7YAPGPvigwhisVg9K99HxWho,6
48
+ fmtr/tools/version,sha256=1-w7DNphgnwgQa3EckgnbD0Qx9ULcbjMgAOknBRyoWI,6
49
49
  fmtr/tools/webhook_tools.py,sha256=q3pVJ1NCem2SrMuFcLxiWd7DibFs7Q-uGtojfXd3Qcg,380
50
50
  fmtr/tools/yaml_tools.py,sha256=Bhhyd6GQVKO72Lp8ky7bAUjIB_65Hdh0Q45SKIEe6S8,1901
51
51
  fmtr/tools/ai_tools/__init__.py,sha256=O8VRlPnnQCncg2ZZ2l_VdWLJf4jkKH6dkZFVbv6o7IM,388
@@ -85,9 +85,9 @@ fmtr/tools/tests/test_path.py,sha256=AkZQa6_8BQ-VaCyL_J-iKmdf2ZaM-xFYR37Kun3k4_g
85
85
  fmtr/tools/tests/test_yaml.py,sha256=jc0TwwKu9eC0LvFGNMERdgBue591xwLxYXFbtsRwXVM,287
86
86
  fmtr/tools/version_tools/__init__.py,sha256=cjE6nO6AoVOUp3RwgTbqL9wiw8J1l2pHJOz6Gn6bxjA,326
87
87
  fmtr/tools/version_tools/version_tools.py,sha256=Hcc6yferZS1hHbugRTdiHhSNmXEEG0hjCiTTXKna-YY,1127
88
- fmtr_tools-1.3.62.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
89
- fmtr_tools-1.3.62.dist-info/METADATA,sha256=ylVUFuwLtaNvhNbmm4P8w1MCEZ5Ddkmu6Bc_exClAW4,17455
90
- fmtr_tools-1.3.62.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
91
- fmtr_tools-1.3.62.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
92
- fmtr_tools-1.3.62.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
93
- fmtr_tools-1.3.62.dist-info/RECORD,,
88
+ fmtr_tools-1.3.63.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
89
+ fmtr_tools-1.3.63.dist-info/METADATA,sha256=nSjkJECziz3f5ss_9fCnnyyVJCoAKvOl0LzYDPShNzo,17455
90
+ fmtr_tools-1.3.63.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
91
+ fmtr_tools-1.3.63.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
92
+ fmtr_tools-1.3.63.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
93
+ fmtr_tools-1.3.63.dist-info/RECORD,,