omlish 0.0.0.dev39__py3-none-any.whl → 0.0.0.dev41__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.
omlish/lang/strings.py CHANGED
@@ -2,63 +2,51 @@ import typing as ta
2
2
  import unicodedata
3
3
 
4
4
 
5
- ##
6
-
7
- @ta.overload
8
- def prefix_delimited(s: str, p: str, d: str) -> str:
9
- ...
5
+ StrOrBytes: ta.TypeAlias = str | bytes
6
+ StrOrBytesT = ta.TypeVar('StrOrBytesT', bound=StrOrBytes)
10
7
 
11
8
 
12
- @ta.overload
13
- def prefix_delimited(s: bytes, p: bytes, d: bytes) -> bytes:
14
- ...
9
+ ##
15
10
 
16
11
 
17
- def prefix_delimited(s, p, d):
18
- return d.join([p + l for l in s.split(d)])
12
+ def prefix_delimited(s: StrOrBytesT, p: StrOrBytesT, d: StrOrBytesT) -> StrOrBytesT:
13
+ return d.join([p + l for l in s.split(d)]) # type: ignore
19
14
 
20
15
 
21
- def prefix_lines(s: str, p: str) -> str:
22
- return prefix_delimited(s, p, '\n')
16
+ def prefix_lines(s: StrOrBytesT, p: StrOrBytesT) -> StrOrBytesT:
17
+ return prefix_delimited(s, p, '\n' if isinstance(s, str) else b'\n')
23
18
 
24
19
 
25
- def indent_lines(s: str, num: int) -> str:
26
- return prefix_lines(s, ' ' * num)
20
+ def indent_lines(s: StrOrBytesT, num: StrOrBytesT) -> StrOrBytesT:
21
+ return prefix_lines(s, (' ' if isinstance(s, str) else b' ') * num) # type: ignore
27
22
 
28
23
 
29
24
  ##
30
25
 
31
26
 
32
- @ta.overload
33
- def strip_prefix(s: str, pfx: str) -> str:
34
- ...
35
-
36
-
37
- @ta.overload
38
- def strip_prefix(s: bytes, pfx: bytes) -> bytes:
39
- ...
40
-
41
-
42
- def strip_prefix(s, pfx):
43
- if not s.startswith(pfx):
27
+ def strip_prefix(s: StrOrBytesT, pfx: StrOrBytesT) -> StrOrBytesT:
28
+ if not s.startswith(pfx): # type: ignore
44
29
  raise ValueError(f'{s!r} does not start with {pfx!r}')
45
- return s[len(pfx):]
30
+ return s[len(pfx):] # type: ignore
46
31
 
47
32
 
48
- @ta.overload
49
- def strip_suffix(s: str, sfx: str) -> str:
50
- ...
33
+ def strip_suffix(s: StrOrBytesT, sfx: StrOrBytesT) -> StrOrBytesT:
34
+ if not s.endswith(sfx): # type: ignore
35
+ raise ValueError(f'{s!r} does not end with {sfx!r}')
36
+ return s[:-len(sfx)] # type: ignore
51
37
 
52
38
 
53
- @ta.overload
54
- def strip_suffix(s: bytes, sfx: bytes) -> bytes:
55
- ...
39
+ ##
56
40
 
57
41
 
58
- def strip_suffix(s, sfx):
59
- if not s.endswith(sfx):
60
- raise ValueError(f'{s!r} does not end with {sfx!r}')
61
- return s[:-len(sfx)]
42
+ def replace_many(
43
+ s: StrOrBytesT,
44
+ old: ta.Iterable[StrOrBytesT],
45
+ new: StrOrBytesT, count_each: int = -1,
46
+ ) -> StrOrBytesT:
47
+ for o in old:
48
+ s = s.replace(o, new, count_each) # type: ignore
49
+ return s
62
50
 
63
51
 
64
52
  ##
@@ -1,11 +1,11 @@
1
1
  import operator
2
2
  import typing as ta
3
3
 
4
- from omlish import cached
5
- from omlish import check
6
- from omlish import collections as col
7
- from omlish import dataclasses as dc
8
- from omlish import lang
4
+ from .... import cached
5
+ from .... import check
6
+ from .... import collections as col
7
+ from .... import dataclasses as dc
8
+ from .... import lang
9
9
 
10
10
 
11
11
  KeywordT = ta.TypeVar('KeywordT', bound='Keyword')
@@ -1,5 +1,4 @@
1
- from omlish import lang
2
-
1
+ from .... import lang
3
2
  from .base import Keyword
4
3
  from .base import StrKeyword
5
4
 
@@ -1,5 +1,4 @@
1
- from omlish import lang
2
-
1
+ from .... import lang
3
2
  from .base import Keyword
4
3
  from .base import StrKeyword
5
4
 
@@ -1,10 +1,9 @@
1
1
  import operator
2
2
  import typing as ta
3
3
 
4
- from omlish import check
5
- from omlish import collections as col
6
- from omlish import lang
7
-
4
+ from .... import check
5
+ from .... import collections as col
6
+ from .... import lang
8
7
  from . import core # noqa
9
8
  from . import metadata # noqa
10
9
  from . import validation # noqa
@@ -1,5 +1,4 @@
1
- from omlish import lang
2
-
1
+ from .... import lang
3
2
  from .base import BooleanKeyword
4
3
  from .base import Keyword
5
4
  from .base import KeywordsKeyword
@@ -4,11 +4,9 @@ from .helpers import ( # noqa
4
4
 
5
5
  from .marks import ( # noqa
6
6
  drain_asyncio,
7
- skip_if_cant_import,
8
- skip_if_nogil,
9
- skip_if_not_on_path,
10
- skip_if_python_version_less_than,
11
7
  )
12
8
 
9
+ from . import skip # noqa
10
+
13
11
  # Imported for convenience in things that import this but not lang.
14
12
  from ...lang import breakpoint_on_exception # noqa
@@ -1,44 +1,17 @@
1
- import shutil
2
- import sys
3
- import sysconfig
4
1
  import typing as ta
5
2
 
6
3
  import pytest
7
4
 
8
5
  from ... import lang # noqa
9
- from ..testing import can_import
10
6
  from .plugins.managermarks import ManagerMark # noqa
11
7
 
12
8
 
13
9
  if ta.TYPE_CHECKING:
14
10
  from ...asyncs import asyncio as aiu
15
-
16
11
  else:
17
12
  aiu = lang.proxy_import('...asyncs.asyncio', __package__)
18
13
 
19
14
 
20
- def skip_if_cant_import(module: str, *args, **kwargs):
21
- return pytest.mark.skipif(not can_import(module, *args, **kwargs), reason=f'requires import {module}')
22
-
23
-
24
- def skip_if_not_on_path(exe: str):
25
- return pytest.mark.skipif(shutil.which(exe) is None, reason=f'requires exe on path {exe}')
26
-
27
-
28
- def skip_if_python_version_less_than(num: ta.Sequence[int]):
29
- return pytest.mark.skipif(sys.version_info < tuple(num), reason=f'python version {tuple(sys.version_info)} < {tuple(num)}') # noqa
30
-
31
-
32
- def skip_if_not_single():
33
- # FIXME
34
- # [resolve_collection_argument(a) for a in session.config.args]
35
- raise NotImplementedError
36
-
37
-
38
- def skip_if_nogil():
39
- return pytest.mark.skipif(sysconfig.get_config_var('Py_GIL_DISABLED'), reason='requires gil build')
40
-
41
-
42
15
  class drain_asyncio(ManagerMark): # noqa
43
16
  def __call__(self, item: pytest.Function) -> ta.Iterator[None]:
44
17
  with aiu.draining_asyncio_tasks():
@@ -0,0 +1,30 @@
1
+ import shutil
2
+ import sys
3
+ import sysconfig
4
+ import typing as ta
5
+
6
+ import pytest
7
+
8
+ from ..testing import can_import
9
+
10
+
11
+ def if_cant_import(module: str, *args, **kwargs):
12
+ return pytest.mark.skipif(not can_import(module, *args, **kwargs), reason=f'requires import {module}')
13
+
14
+
15
+ def if_not_on_path(exe: str):
16
+ return pytest.mark.skipif(shutil.which(exe) is None, reason=f'requires exe on path {exe}')
17
+
18
+
19
+ def if_python_version_less_than(num: ta.Sequence[int]):
20
+ return pytest.mark.skipif(sys.version_info < tuple(num), reason=f'python version {tuple(sys.version_info)} < {tuple(num)}') # noqa
21
+
22
+
23
+ def if_not_single():
24
+ # FIXME
25
+ # [resolve_collection_argument(a) for a in session.config.args]
26
+ raise NotImplementedError
27
+
28
+
29
+ def if_nogil():
30
+ return pytest.mark.skipif(sysconfig.get_config_var('Py_GIL_DISABLED'), reason='requires gil build')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev39
3
+ Version: 0.0.0.dev41
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -18,7 +18,7 @@ Requires-Dist: sniffio ~=1.3 ; extra == 'all'
18
18
  Requires-Dist: greenlet ~=3.1 ; extra == 'all'
19
19
  Requires-Dist: trio ~=0.26 ; extra == 'all'
20
20
  Requires-Dist: trio-asyncio ~=0.15 ; extra == 'all'
21
- Requires-Dist: lz4 ~=4.0 ; extra == 'all'
21
+ Requires-Dist: lz4 ~=4.3 ; extra == 'all'
22
22
  Requires-Dist: zstd ~=1.5 ; extra == 'all'
23
23
  Requires-Dist: asttokens ~=2.4 ; extra == 'all'
24
24
  Requires-Dist: executing ~=2.1 ; extra == 'all'
@@ -37,6 +37,7 @@ Requires-Dist: pg8000 ~=1.31 ; extra == 'all'
37
37
  Requires-Dist: pymysql ~=1.1 ; extra == 'all'
38
38
  Requires-Dist: aiomysql ~=0.2 ; extra == 'all'
39
39
  Requires-Dist: aiosqlite ~=0.20 ; extra == 'all'
40
+ Requires-Dist: apsw ~=3.46 ; extra == 'all'
40
41
  Requires-Dist: duckdb ~=1.1 ; extra == 'all'
41
42
  Requires-Dist: pytest ~=8.0 ; extra == 'all'
42
43
  Requires-Dist: python-snappy ~=0.7 ; (python_version < "3.13") and extra == 'all'
@@ -49,7 +50,7 @@ Requires-Dist: greenlet ~=3.1 ; extra == 'async'
49
50
  Requires-Dist: trio ~=0.26 ; extra == 'async'
50
51
  Requires-Dist: trio-asyncio ~=0.15 ; extra == 'async'
51
52
  Provides-Extra: compress
52
- Requires-Dist: lz4 ~=4.0 ; extra == 'compress'
53
+ Requires-Dist: lz4 ~=4.3 ; extra == 'compress'
53
54
  Requires-Dist: zstd ~=1.5 ; extra == 'compress'
54
55
  Requires-Dist: python-snappy ~=0.7 ; (python_version < "3.13") and extra == 'compress'
55
56
  Provides-Extra: diag
@@ -71,14 +72,15 @@ Provides-Extra: secrets
71
72
  Requires-Dist: cryptography ~=43.0 ; extra == 'secrets'
72
73
  Provides-Extra: sqlalchemy
73
74
  Requires-Dist: sqlalchemy[asyncio] ~=2.0 ; extra == 'sqlalchemy'
74
- Provides-Extra: sqlalchemy-drivers
75
- Requires-Dist: pg8000 ~=1.31 ; extra == 'sqlalchemy-drivers'
76
- Requires-Dist: pymysql ~=1.1 ; extra == 'sqlalchemy-drivers'
77
- Requires-Dist: aiomysql ~=0.2 ; extra == 'sqlalchemy-drivers'
78
- Requires-Dist: aiosqlite ~=0.20 ; extra == 'sqlalchemy-drivers'
79
- Requires-Dist: duckdb ~=1.1 ; extra == 'sqlalchemy-drivers'
80
- Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'sqlalchemy-drivers'
81
- Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'sqlalchemy-drivers'
75
+ Provides-Extra: sqldrivers
76
+ Requires-Dist: pg8000 ~=1.31 ; extra == 'sqldrivers'
77
+ Requires-Dist: pymysql ~=1.1 ; extra == 'sqldrivers'
78
+ Requires-Dist: aiomysql ~=0.2 ; extra == 'sqldrivers'
79
+ Requires-Dist: aiosqlite ~=0.20 ; extra == 'sqldrivers'
80
+ Requires-Dist: apsw ~=3.46 ; extra == 'sqldrivers'
81
+ Requires-Dist: duckdb ~=1.1 ; extra == 'sqldrivers'
82
+ Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'sqldrivers'
83
+ Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'sqldrivers'
82
84
  Provides-Extra: testing
83
85
  Requires-Dist: pytest ~=8.0 ; extra == 'testing'
84
86
 
@@ -1,13 +1,12 @@
1
1
  omlish/.manifests.json,sha256=FPSgLg_3QDVzKlNOuqV3dMqhja2KG_TUfKdGmHE8Eg4,803
2
- omlish/__about__.py,sha256=JATX26ZoyMsRJP4WfytsYymdN0i4gbNpGGMsk47Z4lg,2814
2
+ omlish/__about__.py,sha256=7FsOWhuWPr63aM9w6D-8mkjM3PSH0TI7v26pjaJDmCg,2919
3
3
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- omlish/argparse.py,sha256=ljKH6AqxtScRfcqXNO4PKH0kUUwDhCZ0XGPHzBKVIJk,6265
5
- omlish/c3.py,sha256=W5EwYx9Por3rWYLkKUitJ6OoRMLLgVTfLTyroOz41Y0,8047
4
+ omlish/argparse.py,sha256=QUUS6sv2ftfcmhDj4qU429mEE_lfWa0UN5yYpPG65B0,6265
5
+ omlish/c3.py,sha256=4vogWgwPb8TbNS2KkZxpoWbwjj7MuHG2lQG-hdtkvjI,8062
6
6
  omlish/cached.py,sha256=UAizxlH4eMWHPzQtmItmyE6FEpFEUFzIkxaO2BHWZ5s,196
7
- omlish/check.py,sha256=3qp1_W8uRp23I26nWvG_c7YFxdTwJAZEFxmY8Bfw50Y,10078
7
+ omlish/check.py,sha256=fgWiBoHvqZlE8tjaxK7OMW4J8z3_rEGRENTka3EohbI,10378
8
8
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
9
9
  omlish/defs.py,sha256=T3bq_7h_tO3nDB5RAFBn7DkdeQgqheXzkFColbOHZko,4890
10
- omlish/docker.py,sha256=uRVJUJwGtTFYhm4XeztrVEYk93f0NI5VpjEKQaN_5uY,6453
11
10
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
12
11
  omlish/fnpairs.py,sha256=Sl8CMFNyDS-1JYAjSWqnT5FmUm9Lj6o7FxSRo7g4jww,10875
13
12
  omlish/fnpipes.py,sha256=AJkgz9nvRRm7oqw7ZgYyz21klu276LWi54oYCLg-vOg,2196
@@ -30,7 +29,7 @@ omlish/asyncs/trio.py,sha256=fmZ5b_lKdVV8NQ3euCUutWgnkqTFzSnOjvJSA_jvmrE,367
30
29
  omlish/asyncs/trio_asyncio.py,sha256=oqdOHy0slj9PjVxaDf3gJkq9AAgg7wYZbB469jOftVw,1327
31
30
  omlish/bootstrap/__init__.py,sha256=-Rtsg7uPQNhh1dIT9nqrz96XlqizwoLnWf-FwOEstJI,730
32
31
  omlish/bootstrap/__main__.py,sha256=4jCwsaogp0FrJjJZ85hzF4-WqluPeheHbfeoKynKvNs,194
33
- omlish/bootstrap/base.py,sha256=koELbK6UmsZaRj-6Bng5_zPVmEBqDpFCduEdR5BddOs,1077
32
+ omlish/bootstrap/base.py,sha256=d8hqn4hp1XMMi5PgcJBQXPKmW47epu8CxBlqDZiRZb4,1073
34
33
  omlish/bootstrap/diag.py,sha256=x_BKS_uhfW8QFk1NeH_VIocHif-A6FVTZ37262qCgZ0,5052
35
34
  omlish/bootstrap/harness.py,sha256=pIeSXKfMsF7-3ZkU0gGpde-PtLAKKcVrWaxcin7Xzy0,2041
36
35
  omlish/bootstrap/main.py,sha256=u-TfxO4GkAK3LbRweQERogtO4kT0z3gqXRjnXvtJzC8,5328
@@ -60,7 +59,7 @@ omlish/collections/cache/types.py,sha256=yNjwd6CGyTJQdxN2CQxFqqBAlcs1Z7vvNV-aU1K
60
59
  omlish/concurrent/__init__.py,sha256=9p-s8MvBEYDqHIoYU3OYoe-Nni22QdkW7nhZGEukJTM,197
61
60
  omlish/concurrent/executors.py,sha256=FYKCDYYuj-OgMa8quLsA47SfFNX3KDJvRENVk8NDsrA,1292
62
61
  omlish/concurrent/futures.py,sha256=J2s9wYURUskqRJiBbAR0PNEAp1pXbIMYldOVBTQduQY,4239
63
- omlish/concurrent/threadlets.py,sha256=0fl0_Q_joTLtFYhR2kpKu45BW-win-le0rCuXPBtjko,2382
62
+ omlish/concurrent/threadlets.py,sha256=rTuGp4odJv23eiGTR0E73_gXKgjh4AOeRhutUcEFh70,2378
64
63
  omlish/configs/__init__.py,sha256=3uh09ezodTwkMI0nRmAMP0eEuJ_0VdF-LYyNmPjHiCE,77
65
64
  omlish/configs/classes.py,sha256=GLbB8xKjHjjoUQRCUQm3nEjM8z1qNTx9gPV7ODSt5dg,1317
66
65
  omlish/configs/flattening.py,sha256=AOlRpBHm449MxwMp3CiIRGunStOC1DUNs1f3CLou0wc,4731
@@ -96,7 +95,7 @@ omlish/diag/asts.py,sha256=BveUUNUcaAm4Hg55f4ZxGSI313E4L8cCZ5XjHpEkKVI,3325
96
95
  omlish/diag/procfs.py,sha256=vBovaMvAUKdl7FbtFq3TNsSmdhs8DaYfhoEsKeWYta8,9704
97
96
  omlish/diag/procstats.py,sha256=UkqxREqfd-38xPYZ9T1SIJISz5ARQCEhTtOZrxtm2dE,777
98
97
  omlish/diag/ps.py,sha256=1JWxZen3fVG-20R6ZZ8BtO_gpzw_5bhHZiKdoHkgxoU,1004
99
- omlish/diag/pycharm.py,sha256=0Gmn7GR2CuJLlgFQ5jZH3Nehc0PQwKI9CRD8ir4K92o,3190
98
+ omlish/diag/pycharm.py,sha256=HoEYtBuz04RyQhCMRslSEqMwnMlDU49bjOTBwGeivMk,3181
100
99
  omlish/diag/pydevd.py,sha256=Fsx9rfCOnwLD6RLBqH0uAdtq75rbNeBAQfiDvIBd3e0,7295
101
100
  omlish/diag/threads.py,sha256=1-x02VCDZ407gfbtXm1pWK-ubqhqfePm9PMqkHCVoqk,3642
102
101
  omlish/diag/replserver/__init__.py,sha256=uLo6V2aQ29v9z3IMELlPDSlG3_2iOT4-_X8VniF-EgE,235
@@ -109,6 +108,12 @@ omlish/dispatch/_dispatch3.py,sha256=Vnu5DfoPWFJLodudBqoZBXGTi2wYk-Az56MXJgdQvwc
109
108
  omlish/dispatch/dispatch.py,sha256=8B66wOat30HckcIsCq4pnutBy20iSPwPQOqJ4msHaGU,3739
110
109
  omlish/dispatch/functions.py,sha256=S8ElsLi6DKxTdtFGigWaF0vAquwy2sK-3f4iRLaYq70,1522
111
110
  omlish/dispatch/methods.py,sha256=XHjwwC9Gn4iDWxbyLAcbdSwRgVaq-8Bnn5cAwf5oZdA,5403
111
+ omlish/docker/__init__.py,sha256=LGL5ByHrd7EaQnIDO6eLQvovDamngUiTfnpThV_4-MA,437
112
+ omlish/docker/cli.py,sha256=gtb9kitVfGnd4cr587NsVVk8D5Ok5y5SAsqD_SwGrSA,2565
113
+ omlish/docker/compose.py,sha256=4drmnGQzbkOFJ9B6XSg9rnXkJeZz1ETmdcMe1PE790U,1237
114
+ omlish/docker/helpers.py,sha256=j2eZIqIUpy34ZmoGyIzsYuKx9HeewwYBfrGNC99EFYk,928
115
+ omlish/docker/hub.py,sha256=YcDYOi6t1FA2Sp0RVrmZ9cBXbzFWQ8wTps3wOskA-K0,1955
116
+ omlish/docker/manifests.py,sha256=LR4FpOGNUT3bZQ-gTjB6r_-1C3YiG30QvevZjrsVUQM,7068
112
117
  omlish/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
118
  omlish/formats/dotenv.py,sha256=UjZl3gac-0U24sDjCCGMcCqO1UCWG2Zs8PZ4JdAg2YE,17348
114
119
  omlish/formats/json.py,sha256=61XG6rveb3SSXmYrKvUmRdaVDyMD6C-7yVqXBBMu8t8,1017
@@ -163,7 +168,7 @@ omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCF
163
168
  omlish/inject/impl/providers.py,sha256=QnwhsujJFIHC0JTgd2Wlo1kP53i3CWTrj1nKU2DNxwg,2375
164
169
  omlish/inject/impl/proxy.py,sha256=1ko0VaKqzu9UG8bIldp9xtUrAVUOFTKWKTjOCqIGr4s,1636
165
170
  omlish/inject/impl/scopes.py,sha256=ASfULXgP_ETlsAqFJfrZmyEaZt64Zr8tNn5ScA-EoXk,5900
166
- omlish/lang/__init__.py,sha256=jDIv9mr3Y85S3DpUroaLty7q9iwMUjUlKwyUxs-zlXg,3618
171
+ omlish/lang/__init__.py,sha256=-DRmyoSAwSWOh7nJh4UrpR-w_hGQfe-e06S9qLjHZF8,3636
167
172
  omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
168
173
  omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
169
174
  omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
@@ -178,7 +183,7 @@ omlish/lang/maybes.py,sha256=NYHZDjqDtwPMheDrj2VtUVujxRPf8Qpgk4ZlZCTvBZc,3492
178
183
  omlish/lang/objects.py,sha256=1dY8dX5voIZf5FBYUiN0BRsWg2JCdsgRbDl9fLG7OtY,4310
179
184
  omlish/lang/resolving.py,sha256=OuN2mDTPNyBUbcrswtvFKtj4xgH4H4WglgqSKv3MTy0,1606
180
185
  omlish/lang/resources.py,sha256=-NmVTrSMKFZ6smVfOMz46ekZYVGgYh8cPooxQlFpG6s,2135
181
- omlish/lang/strings.py,sha256=LqxR49cF5owHKpbUX8nUIBPsZ-4w7xqHPhlB-HIWqUg,3628
186
+ omlish/lang/strings.py,sha256=LWgUy9WghUyV0zmZ1c3HZjEfekLlNPy7Jl6J1Z5vzp0,3882
182
187
  omlish/lang/sys.py,sha256=UoZz_PJYVKLQAKqYxxn-LHz1okK_38I__maZgnXMcxU,406
183
188
  omlish/lang/timeouts.py,sha256=vECdWYhc_IZgcal1Ng1Y42wf2FV3KAx-i8As-MgGHIQ,1186
184
189
  omlish/lang/typing.py,sha256=lJ2NGe4Pmb61I0Tx4A_rOqXNFTws1XHOzafg2knRUio,4155
@@ -265,12 +270,12 @@ omlish/specs/jsonrpc/types.py,sha256=g19j2_FCVJDXFqAkQ5U4LICkL4Z7vEBMU0t_aOEqio4
265
270
  omlish/specs/jsonschema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
266
271
  omlish/specs/jsonschema/types.py,sha256=qoxExgKfrI-UZXdk3qcVZIEyp1WckFbb85_eGInEoAY,467
267
272
  omlish/specs/jsonschema/keywords/__init__.py,sha256=Zt2g1BXd654uU2AQ5P7_-x2Wrtf6cNbP9mxI1wGN4wo,596
268
- omlish/specs/jsonschema/keywords/base.py,sha256=mwXxvuh6-GBODdgyDhjzZbBZ3M_c6V-iQpfeJ1nboVU,1953
269
- omlish/specs/jsonschema/keywords/core.py,sha256=irJ5Rreg9hTeXu3FovSdzhFb3vUly-hYQVYflEgST3g,368
270
- omlish/specs/jsonschema/keywords/metadata.py,sha256=55jlunXosdcM1IQ256KfUIEwFzDPah448ZOeQhJE1c8,316
271
- omlish/specs/jsonschema/keywords/parse.py,sha256=eTOvEhiibC4TpFZy9jGvrAfzNRd_bb6LFT1tPRmAc9g,1934
273
+ omlish/specs/jsonschema/keywords/base.py,sha256=6w2PdquW-6TvagTplIsDFBp1W8dW1uFm6GR-nxzmBkI,1943
274
+ omlish/specs/jsonschema/keywords/core.py,sha256=wbftFHs-P8befiS115eemo51T1Fx9eOwqcJ3kXAnA-o,365
275
+ omlish/specs/jsonschema/keywords/metadata.py,sha256=CsodNy9H07--QWPe9OYvLS9J9_EoMd-BT9FQY80lugM,313
276
+ omlish/specs/jsonschema/keywords/parse.py,sha256=S7rLXoxvYLq-Rr8ZdzUiXBltp6gmrjPpRZTOMVSLXVg,1927
272
277
  omlish/specs/jsonschema/keywords/render.py,sha256=enGkw1S8Zxfn1IBkKqZTK81yG21MVKk54B8rqiTY30c,1236
273
- omlish/specs/jsonschema/keywords/validation.py,sha256=ghewVUSG5qPYnmexy1Ylc-XouiQXobsXLYvkaGgZLqg,1322
278
+ omlish/specs/jsonschema/keywords/validation.py,sha256=7MTXj4DVoEYftHZBO7kz1jiJt0qGHJLcB7qqwQgX_gY,1319
274
279
  omlish/specs/jsonschema/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
275
280
  omlish/specs/jsonschema/schemas/draft202012/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
276
281
  omlish/specs/jsonschema/schemas/draft202012/metaschema.json,sha256=Qdp29a-3zgYtJI92JGOpL3ykfk4PkFsiS6av7vkd7Q8,2452
@@ -296,9 +301,10 @@ omlish/sql/alchemy/secrets.py,sha256=EMfy4EfTbEvrlv_41oOhn8qsoF-eTkY7HciPenIE6rI
296
301
  omlish/sql/alchemy/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,403
297
302
  omlish/testing/__init__.py,sha256=kfiF10ykrjWXniedIl3g8j3pNAFyuSbp1D3ZXug3-Eo,168
298
303
  omlish/testing/testing.py,sha256=pJUbZ0ymdrQoNG9r9UlGXypeU1x9ntEp9xcYBnyOHUs,3088
299
- omlish/testing/pytest/__init__.py,sha256=b6ObMEHTZnvGEI_de6nN1x5FyitV6B2mNYkurA4Q7fo,336
304
+ omlish/testing/pytest/__init__.py,sha256=B2nyJrjIoNcEopbg0IZ5UUDs4OHmQ8qqElFJfGcDdas,257
300
305
  omlish/testing/pytest/helpers.py,sha256=TJpD60mBtLi9FtxX4TThfuXvg5FIRPSiZk1aeRwe-D4,197
301
- omlish/testing/pytest/marks.py,sha256=LbI5lO29cbh_FA5-vktwtcZwWjxn9URI0pprzmPRyJo,1260
306
+ omlish/testing/pytest/marks.py,sha256=ExuwitbMr1txMbaAcWZ652pYa30M-i3wVacnjqschTs,424
307
+ omlish/testing/pytest/skip.py,sha256=uACMFtQQNJfFDbWrppjWevdrQgKVH1MUmH5rXIpv0IE,846
302
308
  omlish/testing/pytest/inject/__init__.py,sha256=pdRKv1HcDmJ_yArKJbYITPXXZthRSGgBJWqITr0Er38,117
303
309
  omlish/testing/pytest/inject/harness.py,sha256=sMKjP2EWHq-eeTB1YVXcANli2Czxt56_9ERg4HtkVPg,5810
304
310
  omlish/testing/pytest/plugins/__init__.py,sha256=ys1zXrYrNm7Uo6YOIVJ6Bd3dQo6kv387k7MbTYlqZSI,467
@@ -319,9 +325,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
319
325
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
320
326
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
321
327
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
322
- omlish-0.0.0.dev39.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
323
- omlish-0.0.0.dev39.dist-info/METADATA,sha256=RURhKHyqwg1C9diXU3j7gyI1FPN7UuCoiB9lIno6tGU,3786
324
- omlish-0.0.0.dev39.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
325
- omlish-0.0.0.dev39.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
326
- omlish-0.0.0.dev39.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
327
- omlish-0.0.0.dev39.dist-info/RECORD,,
328
+ omlish-0.0.0.dev41.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
329
+ omlish-0.0.0.dev41.dist-info/METADATA,sha256=r8Q2E7Ch6npanZY7xAo-quF5Z9R9OWkH6eY2JATdOfs,3817
330
+ omlish-0.0.0.dev41.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
331
+ omlish-0.0.0.dev41.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
332
+ omlish-0.0.0.dev41.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
333
+ omlish-0.0.0.dev41.dist-info/RECORD,,