omlish 0.0.0.dev21__py3-none-any.whl → 0.0.0.dev23__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/matchfns.py CHANGED
@@ -93,7 +93,7 @@ class MultiMatchFn(MatchFn[P, T]):
93
93
  children: ta.Sequence[MatchFn[P, T]]
94
94
  strict: bool = False
95
95
 
96
- def _match(self, *args: P.args, **kwargs: P.kwargs) -> MatchFn[P, T] | None:
96
+ def match(self, *args: P.args, **kwargs: P.kwargs) -> MatchFn[P, T] | None:
97
97
  matches = []
98
98
  for cur in self.children:
99
99
  if cur.guard(*args, **kwargs):
@@ -109,10 +109,10 @@ class MultiMatchFn(MatchFn[P, T]):
109
109
  return matches[0]
110
110
 
111
111
  def guard(self, *args: P.args, **kwargs: P.kwargs) -> bool:
112
- return self._match(*args, **kwargs) is not None
112
+ return self.match(*args, **kwargs) is not None
113
113
 
114
114
  def fn(self, *args: P.args, **kwargs: P.kwargs) -> T:
115
- if (m := self._match(*args, **kwargs)) is None:
115
+ if (m := self.match(*args, **kwargs)) is None:
116
116
  raise MatchGuardError(*args, **kwargs)
117
117
  return m.fn(*args, **kwargs)
118
118
 
omlish/secrets/openssl.py CHANGED
@@ -42,7 +42,7 @@ def generate_key(self, sz: int = DEFAULT_KEY_SIZE) -> bytes:
42
42
  ##
43
43
 
44
44
 
45
- class OpensslAes265CbcCrypto(Crypto):
45
+ class OpensslAescbcCrypto(Crypto):
46
46
  """
47
47
  !!! https://docs.openssl.org/3.0/man7/passphrase-encoding/
48
48
  https://cryptography.io/en/latest/hazmat/primitives/symmetric-encryption/#cryptography.hazmat.primitives.ciphers.Cipher
@@ -122,7 +122,7 @@ class OpensslAes265CbcCrypto(Crypto):
122
122
  ##
123
123
 
124
124
 
125
- class OpensslSubprocessAes256CbcCrypto(Crypto):
125
+ class OpensslSubprocessAescbcCrypto(Crypto):
126
126
  def __init__(
127
127
  self,
128
128
  *,
omlish/sql/__init__.py CHANGED
@@ -7,3 +7,21 @@ from .asyncs import ( # noqa
7
7
  AsyncTransactionLike,
8
8
  async_adapt,
9
9
  )
10
+
11
+ from .dbs import ( # noqa
12
+ DbLoc,
13
+ DbSpec,
14
+ DbType,
15
+ DbTypes,
16
+ HostDbLoc,
17
+ UrlDbLoc,
18
+ )
19
+
20
+ from .exprs import ( # noqa
21
+ paren,
22
+ )
23
+
24
+ from .qualifiedname import ( # noqa
25
+ QualifiedName,
26
+ qn,
27
+ )
@@ -0,0 +1,82 @@
1
+ import collections.abc
2
+ import dataclasses as dc
3
+ import typing as ta
4
+
5
+
6
+ @dc.dataclass(frozen=True)
7
+ class QualifiedName(ta.Sequence[str]):
8
+ parts: ta.Sequence[str]
9
+
10
+ def __post_init__(self) -> None:
11
+ if not (
12
+ self.parts and
13
+ not isinstance(self.parts, str) and
14
+ all(self.parts) and
15
+ all(isinstance(p, str) for p in self.parts)
16
+ ):
17
+ raise ValueError(self)
18
+
19
+ def __repr__(self) -> str:
20
+ return f'{self.__class__.__name__}([{", ".join(map(repr, self.parts))}])'
21
+
22
+ @property
23
+ def dotted(self) -> str:
24
+ return '.'.join(self.parts)
25
+
26
+ def prefixed(self, sz: int) -> tuple[str | None, ...]:
27
+ if len(self) > sz:
28
+ raise ValueError(self)
29
+ return ((None,) * (sz - len(self))) + tuple(self.parts)
30
+
31
+ @property
32
+ def pair(self) -> tuple[str | None, str]:
33
+ return self.prefixed(2) # type: ignore
34
+
35
+ @property
36
+ def triple(self) -> tuple[str | None, str | None, str]:
37
+ return self.prefixed(3) # type: ignore
38
+
39
+ @property
40
+ def quad(self) -> tuple[str | None, str | None, str | None, str]:
41
+ return self.prefixed(4) # type: ignore
42
+
43
+ def __iter__(self) -> ta.Iterator[str]:
44
+ return iter(self.parts)
45
+
46
+ def __len__(self) -> int:
47
+ return len(self.parts)
48
+
49
+ def __getitem__(self, idx: int) -> str: # type: ignore
50
+ return self.parts[idx]
51
+
52
+ @classmethod
53
+ def of_dotted(cls, dotted: str) -> 'QualifiedName':
54
+ return cls(dotted.split('.'))
55
+
56
+ @classmethod
57
+ def of(
58
+ cls,
59
+ obj: ta.Union['QualifiedName', ta.Iterable[str]],
60
+ ) -> 'QualifiedName':
61
+ if isinstance(obj, QualifiedName):
62
+ return obj
63
+ elif isinstance(obj, str):
64
+ raise TypeError(obj)
65
+ elif isinstance(obj, collections.abc.Iterable):
66
+ return cls(list(obj))
67
+ else:
68
+ raise TypeError(obj)
69
+
70
+ @classmethod
71
+ def of_optional(
72
+ cls,
73
+ obj: ta.Union['QualifiedName', ta.Iterable[str], None],
74
+ ) -> ta.Optional['QualifiedName']:
75
+ if obj is None:
76
+ return None
77
+ else:
78
+ return cls.of(obj)
79
+
80
+
81
+ def qn(*args: str) -> QualifiedName:
82
+ return QualifiedName(args)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev21
3
+ Version: 0.0.0.dev23
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -15,11 +15,16 @@ License-File: LICENSE
15
15
  Provides-Extra: all
16
16
  Requires-Dist: anyio ~=4.4 ; extra == 'all'
17
17
  Requires-Dist: sniffio ~=1.3 ; extra == 'all'
18
+ Requires-Dist: greenlet ~=3.1 ; extra == 'all'
18
19
  Requires-Dist: trio ~=0.26 ; extra == 'all'
20
+ Requires-Dist: trio-asyncio ~=0.15 ; extra == 'all'
19
21
  Requires-Dist: lz4 ~=4.0 ; extra == 'all'
20
22
  Requires-Dist: zstd ~=1.5 ; extra == 'all'
23
+ Requires-Dist: asttokens ~=2.4 ; extra == 'all'
24
+ Requires-Dist: executing ~=2.1 ; extra == 'all'
21
25
  Requires-Dist: psutil ~=6.0 ; extra == 'all'
22
26
  Requires-Dist: orjson ~=3.10 ; extra == 'all'
27
+ Requires-Dist: ujson ~=5.10 ; extra == 'all'
23
28
  Requires-Dist: json5 ~=0.9 ; extra == 'all'
24
29
  Requires-Dist: pyyaml ~=5.0 ; extra == 'all'
25
30
  Requires-Dist: cloudpickle ~=3.0 ; extra == 'all'
@@ -27,33 +32,33 @@ Requires-Dist: httpx[http2] ~=0.27 ; extra == 'all'
27
32
  Requires-Dist: jinja2 ~=3.1 ; extra == 'all'
28
33
  Requires-Dist: wrapt ~=1.14 ; extra == 'all'
29
34
  Requires-Dist: cryptography ~=43.0 ; extra == 'all'
35
+ Requires-Dist: sqlalchemy[asyncio] ~=2.0 ; extra == 'all'
30
36
  Requires-Dist: pg8000 ~=1.31 ; extra == 'all'
31
37
  Requires-Dist: pymysql ~=1.1 ; extra == 'all'
32
38
  Requires-Dist: aiomysql ~=0.2 ; extra == 'all'
33
39
  Requires-Dist: aiosqlite ~=0.20 ; extra == 'all'
34
40
  Requires-Dist: duckdb ~=1.1 ; extra == 'all'
35
41
  Requires-Dist: pytest ~=8.0 ; extra == 'all'
36
- Requires-Dist: greenlet ~=3.0 ; (python_version < "3.13") and extra == 'all'
37
- Requires-Dist: trio-asyncio ~=0.15 ; (python_version < "3.13") and extra == 'all'
38
42
  Requires-Dist: python-snappy ~=0.7 ; (python_version < "3.13") and extra == 'all'
39
- Requires-Dist: sqlalchemy[asyncio] ~=2.0 ; (python_version < "3.13") and extra == 'all'
40
43
  Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'all'
41
44
  Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'all'
42
- Requires-Dist: sqlalchemy ~=2.0 ; (python_version ~= "3.13") and extra == 'all'
43
45
  Provides-Extra: async
44
46
  Requires-Dist: anyio ~=4.4 ; extra == 'async'
45
47
  Requires-Dist: sniffio ~=1.3 ; extra == 'async'
48
+ Requires-Dist: greenlet ~=3.1 ; extra == 'async'
46
49
  Requires-Dist: trio ~=0.26 ; extra == 'async'
47
- Requires-Dist: greenlet ~=3.0 ; (python_version < "3.13") and extra == 'async'
48
- Requires-Dist: trio-asyncio ~=0.15 ; (python_version < "3.13") and extra == 'async'
50
+ Requires-Dist: trio-asyncio ~=0.15 ; extra == 'async'
49
51
  Provides-Extra: compression
50
52
  Requires-Dist: lz4 ~=4.0 ; extra == 'compression'
51
53
  Requires-Dist: zstd ~=1.5 ; extra == 'compression'
52
54
  Requires-Dist: python-snappy ~=0.7 ; (python_version < "3.13") and extra == 'compression'
53
55
  Provides-Extra: diag
56
+ Requires-Dist: asttokens ~=2.4 ; extra == 'diag'
57
+ Requires-Dist: executing ~=2.1 ; extra == 'diag'
54
58
  Requires-Dist: psutil ~=6.0 ; extra == 'diag'
55
59
  Provides-Extra: formats
56
60
  Requires-Dist: orjson ~=3.10 ; extra == 'formats'
61
+ Requires-Dist: ujson ~=5.10 ; extra == 'formats'
57
62
  Requires-Dist: json5 ~=0.9 ; extra == 'formats'
58
63
  Requires-Dist: pyyaml ~=5.0 ; extra == 'formats'
59
64
  Requires-Dist: cloudpickle ~=3.0 ; extra == 'formats'
@@ -65,13 +70,12 @@ Requires-Dist: wrapt ~=1.14 ; extra == 'misc'
65
70
  Provides-Extra: secrets
66
71
  Requires-Dist: cryptography ~=43.0 ; extra == 'secrets'
67
72
  Provides-Extra: sql
73
+ Requires-Dist: sqlalchemy[asyncio] ~=2.0 ; extra == 'sql'
68
74
  Requires-Dist: pg8000 ~=1.31 ; extra == 'sql'
69
75
  Requires-Dist: pymysql ~=1.1 ; extra == 'sql'
70
76
  Requires-Dist: aiomysql ~=0.2 ; extra == 'sql'
71
77
  Requires-Dist: aiosqlite ~=0.20 ; extra == 'sql'
72
- Requires-Dist: sqlalchemy[asyncio] ~=2.0 ; (python_version < "3.13") and extra == 'sql'
73
78
  Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'sql'
74
- Requires-Dist: sqlalchemy ~=2.0 ; (python_version ~= "3.13") and extra == 'sql'
75
79
  Provides-Extra: sqlx
76
80
  Requires-Dist: duckdb ~=1.1 ; extra == 'sqlx'
77
81
  Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'sqlx'
@@ -1,18 +1,18 @@
1
- omlish/__about__.py,sha256=EGrVhtPidloIZMlJKawKWjhmKU4ZCiYWFt2sk2YMU54,2451
1
+ omlish/__about__.py,sha256=KiGBpOncoW1f9W1y130G59BNQdvfrd0cRxVrJ-_d5JA,2532
2
2
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  omlish/argparse.py,sha256=QRQmX9G0-L_nATkFtGHvpd4qrpYzKATdjuFLbBqzJPM,6224
4
4
  omlish/c3.py,sha256=W5EwYx9Por3rWYLkKUitJ6OoRMLLgVTfLTyroOz41Y0,8047
5
5
  omlish/cached.py,sha256=UAizxlH4eMWHPzQtmItmyE6FEpFEUFzIkxaO2BHWZ5s,196
6
- omlish/check.py,sha256=o3UJnIEmmRsv9ggIIDtz8fDSudW1CatxbwxP42M4dno,5543
7
- omlish/concurrent.py,sha256=jCGG76Ca_8761g1uY3nCJONg_Nxcf4JQQZYvvrmsKE4,5395
6
+ omlish/check.py,sha256=18vZWH9qEVMs62LTfn_XC0U5GPeaOotKLmL41qecyNQ,7560
8
7
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
9
8
  omlish/defs.py,sha256=T3bq_7h_tO3nDB5RAFBn7DkdeQgqheXzkFColbOHZko,4890
10
- omlish/docker.py,sha256=5WyXJyFwqIJJ11QWwPIjHjDHnsaOVZszZAjyTvg3xew,4693
9
+ omlish/docker.py,sha256=Nwyk4jpUmpd4NE0H1JeMQ42WC9NymJDZ8TPLQ9P24MY,4748
11
10
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
12
11
  omlish/fnpairs.py,sha256=hVuLqQFdRNNze3FYH2cAQO3GC7nK5yQP_GWPUSbL7nE,10601
12
+ omlish/genmachine.py,sha256=LDIMOc5OXnJ5IBzRyHX4ZR6FqViVKowuiGVWamexP9k,1595
13
13
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
14
14
  omlish/libc.py,sha256=u0481imCiTFqP_e-v9g0pD-0WD249j5vYzhtn-fnNkY,15308
15
- omlish/matchfns.py,sha256=o2evI7q0CAMHR8RQ_Jks6L0UoNpEDltnLjOiamJDtmU,6155
15
+ omlish/matchfns.py,sha256=ygqbqthRxgF9I1PJaw9Xl7FoZnAVMmnKBrYgimKQ0ag,6152
16
16
  omlish/math.py,sha256=AVqp5Y8yxKA-wO0BgrzaxA0Ga3PZiCXnYcwivMneC-0,3804
17
17
  omlish/multiprocessing.py,sha256=QZT4C7I-uThCAjaEY3xgUYb-5GagUlnE4etN01LDyU4,5186
18
18
  omlish/os.py,sha256=cz4nL2ujaxH_-XRq3JUD8af8mSe1JXGPIoXP9XAEd0M,2607
@@ -24,16 +24,17 @@ omlish/asyncs/__init__.py,sha256=uUz9ziKh4_QrgmdhKFMgq6j7mFbiZd3LiogguDCQsGI,587
24
24
  omlish/asyncs/anyio.py,sha256=Hqdi1iCopKoaAWGx-AYTRLEwnavLWx1esfJISK1IVF0,8024
25
25
  omlish/asyncs/asyncio.py,sha256=JfM59QgB3asgEbrps0zoVbNjWD4kL2XdsEkRMEIoFos,971
26
26
  omlish/asyncs/asyncs.py,sha256=Tf7ZodTGepkM7HAuFcDNh9lLzzrMw6rELWvopGmFkh4,2035
27
- omlish/asyncs/bridge.py,sha256=AabrRVz5k75dTB59M70DWkl6JrLusjhpvsaj5jld9io,8151
27
+ omlish/asyncs/bridge.py,sha256=fkMQWG2TNmPB9BfIxtXrE50W5FJw0ma44GleOXbcSKw,8628
28
28
  omlish/asyncs/flavors.py,sha256=1mNxGNRVmjUHzA13K5ht8vdJv4CLEmzYTQ6BZXr1520,4866
29
29
  omlish/asyncs/trio.py,sha256=GKG3wgelFr7gIKKHZhcflvMyCvxXHNZe862KB0Xw2uA,370
30
30
  omlish/asyncs/trio_asyncio.py,sha256=oqdOHy0slj9PjVxaDf3gJkq9AAgg7wYZbB469jOftVw,1327
31
- omlish/bootstrap/__init__.py,sha256=Nii56mGsr1MsrQPQTX45kS6NsU0APK5t13Wlb1n8jlo,48
31
+ omlish/bootstrap/__init__.py,sha256=-Rtsg7uPQNhh1dIT9nqrz96XlqizwoLnWf-FwOEstJI,730
32
32
  omlish/bootstrap/__main__.py,sha256=d23loR_cKfTYZwYiqpt_CmKI7dd5WcYFgIYzqMep75E,68
33
- omlish/bootstrap/base.py,sha256=nyf2PYCoYzNEX_78Rm8szqpdTdhhSbSJEt3hf7OncvA,1032
34
- omlish/bootstrap/diag.py,sha256=TV4s3KcSvrDD0AK5Ggz7_rYMWbEK9_NfP3I0zf91m0o,2998
33
+ omlish/bootstrap/base.py,sha256=koELbK6UmsZaRj-6Bng5_zPVmEBqDpFCduEdR5BddOs,1077
34
+ omlish/bootstrap/diag.py,sha256=8ajcsuY__5TlYzpbO6m4T87jw8uLcQ0wuJKdtQ7350w,4396
35
35
  omlish/bootstrap/harness.py,sha256=vQCIhCQY_N0NHWvDh8rG6Lo57U1qHkQf2egifbXzN-8,2027
36
- omlish/bootstrap/main.py,sha256=ZNzbT1t_dI4MhCB7so0glINw5XONTehIO5cv3hyXN44,5218
36
+ omlish/bootstrap/main.py,sha256=9ZbgXaRNZwt_hXdg8W4YjpP0v0Si_qqlfu86jfgRz04,5215
37
+ omlish/bootstrap/marshal.py,sha256=qKewGVs-3i2p5W9nywkXSo1pcbVxmOAlTvfLjyo0xpo,554
37
38
  omlish/bootstrap/sys.py,sha256=U0MFxO9tLFV3cdN5Y-Zrink6_45sFvzPUYQXyBk7-ns,8741
38
39
  omlish/collections/__init__.py,sha256=h7gXQNMI_46hRRlIAI3PTaewMV8H381FV_KlONReg9s,1660
39
40
  omlish/collections/_abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
@@ -56,6 +57,10 @@ omlish/collections/cache/__init__.py,sha256=Cv8RX-Ehit3um0QLDq7uRDqJUCcdqTKoAB9T
56
57
  omlish/collections/cache/descriptor.py,sha256=t-1Gh4DTABDuNmeDJlpoW4LV3gi_uSlBd9ZfBINfYCM,5023
57
58
  omlish/collections/cache/impl.py,sha256=nQox5kChhns9h2a5gnX-ayQGBQJ5-B1aZkLQ2Aej19g,15137
58
59
  omlish/collections/cache/types.py,sha256=yNjwd6CGyTJQdxN2CQxFqqBAlcs1Z7vvNV-aU1K7p8E,685
60
+ omlish/concurrent/__init__.py,sha256=9p-s8MvBEYDqHIoYU3OYoe-Nni22QdkW7nhZGEukJTM,197
61
+ omlish/concurrent/executors.py,sha256=FYKCDYYuj-OgMa8quLsA47SfFNX3KDJvRENVk8NDsrA,1292
62
+ omlish/concurrent/futures.py,sha256=J2s9wYURUskqRJiBbAR0PNEAp1pXbIMYldOVBTQduQY,4239
63
+ omlish/concurrent/threadlets.py,sha256=2fzXEp_KPqIY7uoa5Jk2DJ3bLMY73ZsnzgN5myGanwc,2034
59
64
  omlish/configs/__init__.py,sha256=3uh09ezodTwkMI0nRmAMP0eEuJ_0VdF-LYyNmPjHiCE,77
60
65
  omlish/configs/classes.py,sha256=GLbB8xKjHjjoUQRCUQm3nEjM8z1qNTx9gPV7ODSt5dg,1317
61
66
  omlish/configs/flattening.py,sha256=AOlRpBHm449MxwMp3CiIRGunStOC1DUNs1f3CLou0wc,4731
@@ -86,9 +91,11 @@ omlish/dataclasses/impl/simple.py,sha256=EovA-GpmQYtB_svItO2byTAWqbKGF4njz0MdQts
86
91
  omlish/dataclasses/impl/slots.py,sha256=_sm-x9v1tPnXEHBHNUMTHZocgVyhZaPdvamIPPBUVyk,2635
87
92
  omlish/dataclasses/impl/utils.py,sha256=aER2iL3UAtgS1BdLuEvTr9Tr2wC28wk1kiOeO-jIymw,6138
88
93
  omlish/diag/__init__.py,sha256=BYQoq12W2qU0O7m2Z-RLCX6YLIYEW9MmfN7_i9--Yk0,132
94
+ omlish/diag/asts.py,sha256=BveUUNUcaAm4Hg55f4ZxGSI313E4L8cCZ5XjHpEkKVI,3325
89
95
  omlish/diag/procfs.py,sha256=ggIeFoaNZ4j6HvKTiXD6Q3b9apgto7j55pwswCrIHXE,9581
90
96
  omlish/diag/procstats.py,sha256=9uQMvVL7Yzf_1F8dW55pcZeCFtP5yUbK1KuGn9bt2Qg,502
91
97
  omlish/diag/ps.py,sha256=1JWxZen3fVG-20R6ZZ8BtO_gpzw_5bhHZiKdoHkgxoU,1004
98
+ omlish/diag/pycharm.py,sha256=HgPvABfgzNU3rb77B5W8hZ4_5sP6l3W5hg8R6vM1Yr4,1686
92
99
  omlish/diag/pydevd.py,sha256=Fsx9rfCOnwLD6RLBqH0uAdtq75rbNeBAQfiDvIBd3e0,7295
93
100
  omlish/diag/threads.py,sha256=1-x02VCDZ407gfbtXm1pWK-ubqhqfePm9PMqkHCVoqk,3642
94
101
  omlish/diag/replserver/__init__.py,sha256=uLo6V2aQ29v9z3IMELlPDSlG3_2iOT4-_X8VniF-EgE,235
@@ -161,7 +168,7 @@ omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
161
168
  omlish/lang/contextmanagers.py,sha256=rzMSwJU7ObFXl46r6pGDbD45Zi_qZ9NHxDPnLNuux9o,9732
162
169
  omlish/lang/descriptors.py,sha256=VGbebrhWR0WLe3SASN444lBBvAreVMcwdam1FjcRxkQ,5908
163
170
  omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
164
- omlish/lang/functions.py,sha256=T4nPl46EHHGjMkz3FTRjsVhS9Y8HKcwM0jROU6_-Rv0,3619
171
+ omlish/lang/functions.py,sha256=yJxWwqlXEAT2gied4uTwiz5x1qXeuVubOSXyn9zy5aI,3624
165
172
  omlish/lang/imports.py,sha256=04ugFC8NI5sbL7NH4V0r0q_nFsP_AMkHLz697CVkMtQ,6274
166
173
  omlish/lang/iterables.py,sha256=_q6rHbdFfW3VBqez0IV3rUABoNxsA_oBv_sykm5zsbQ,2243
167
174
  omlish/lang/maybes.py,sha256=NYHZDjqDtwPMheDrj2VtUVujxRPf8Qpgk4ZlZCTvBZc,3492
@@ -196,16 +203,17 @@ omlish/lite/runtime.py,sha256=VUhmNQvwf8QzkWSKj4Q0ReieJA_PzHaJNRBivfTseow,452
196
203
  omlish/lite/secrets.py,sha256=FEc47dcU9M1CyMTnrihAAVwKf0ySZLahf83djOEDWXw,488
197
204
  omlish/lite/strings.py,sha256=9dO_A6EkhcTZ2xmOUGSOMT-mx9BnoOzYu1-ocSrDJaA,670
198
205
  omlish/lite/subprocesses.py,sha256=KuGV3ImehMjCUK0JoV3pUtG_7o5wei1lRDn9HxzByAg,3063
199
- omlish/logs/__init__.py,sha256=UPMdG3mbUm4PUJw6muXs4dk-uNE0aMDj_XebKCa-Wpk,224
206
+ omlish/logs/__init__.py,sha256=E4m-RTIaTh0rT9ADY9iB1Yc3pYBcnmn-tfkWXsjRTW4,276
200
207
  omlish/logs/_abc.py,sha256=UgrCUQVUi_PvT3p1CEkb3P74CFrFcZq2AFby3GEUv9M,5974
201
208
  omlish/logs/configs.py,sha256=VfZjhyA4CeMYNhlsv5oD2IZ6Iv4d_lbUgZzcnLAkxNA,1052
202
209
  omlish/logs/formatters.py,sha256=AFs9C6-qrFkgXZ0nL39wih_LGck1Tc79alvGyibBdQo,720
210
+ omlish/logs/handlers.py,sha256=nyuFgmO05By_Xwq7es58ClzS51-F53lJL7gD0x5IqAg,228
203
211
  omlish/logs/noisy.py,sha256=8JORjI1dH38yU2MddM54OB6qt32Xozfocdb88vY4wro,335
204
212
  omlish/logs/utils.py,sha256=MgGovbP0zUrZ3FGD3qYNQWn-l0jy0Y0bStcQvv5BOmQ,391
205
- omlish/marshal/__init__.py,sha256=Co5UUlCyd3eDToQTOvTURmCICKzuULnR5B6ylgb2nFM,1515
213
+ omlish/marshal/__init__.py,sha256=Oqp0e27zj3YsI5Ek0CPvyH8Rfm3hWU0wzXJcjeu5HdQ,1573
206
214
  omlish/marshal/any.py,sha256=e82OyYK3Emm1P1ClnsnxP7fIWC2iNVyW0H5nK4mLmWM,779
207
215
  omlish/marshal/base.py,sha256=EIgrqsQ1OQ4mVUMuDH5zRBCwJpn8ijVS98Nmoka_Mrs,6025
208
- omlish/marshal/base64.py,sha256=Q3ibujdhgFgDaeHahSe7WdcqvOyalWigwUlV-U-2ckQ,1018
216
+ omlish/marshal/base64.py,sha256=F-3ogJdcFCtWINRgJgWT0rErqgx6f4qahhcg8OrkqhE,1089
209
217
  omlish/marshal/dataclasses.py,sha256=cqHfzkQe7T-A_eAx-xZm6AIOZLnqE-alMUXMtRTYxuI,3910
210
218
  omlish/marshal/datetimes.py,sha256=0ffg8cEvx9SMKIXZGD9b7MqpLfmgw0uKKdn6YTfoqok,3714
211
219
  omlish/marshal/enums.py,sha256=-0fKutBbyz8ygEaA0_P_8IOJrI9jMGigmnPbutV9Bg4,1464
@@ -222,9 +230,10 @@ omlish/marshal/numbers.py,sha256=oY_yMNJEnJhjfLh89gpPXvKqeUyhQcaTcQB6ecyHiG8,170
222
230
  omlish/marshal/objects.py,sha256=T3prlm0HESpOLXHWcdsYekfmythJRZQOvaoL0is8J_o,3097
223
231
  omlish/marshal/optionals.py,sha256=r0XB5rqfasvgZJNrKYd6Unq2U4nHt3JURi26j0dYHlw,1499
224
232
  omlish/marshal/polymorphism.py,sha256=gyvNYUAkmQVhWrcXBLzXINxqx6RHyulf9n16Iv38PFI,5597
225
- omlish/marshal/primitives.py,sha256=-gLR_RTPTM8YP6t6PL5sNM1lAtwcZDHc9lxkimoQ9jw,1097
233
+ omlish/marshal/primitives.py,sha256=wcvcs5GH_TWVmzAszh3dvyKibJgBxnXke-AlAXiwrrI,1107
226
234
  omlish/marshal/registries.py,sha256=GI2KogcxawMkk02Ky7-TsnijChoe1I7YTOPIbUNwSAI,1665
227
- omlish/marshal/standard.py,sha256=059gc16ycgqFbBz1F3rCkbi5lgxH9sQt9We-ghiLpBs,2803
235
+ omlish/marshal/standard.py,sha256=uQZIGiCwihmhB1tmhpKnZWZly0DDkdGjCnN0d41WHho,2985
236
+ omlish/marshal/unions.py,sha256=m9uVp2HrkZKY9lDyGoWQGXFgan8mRuBaKimtWNksl64,2635
228
237
  omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
229
238
  omlish/marshal/uuids.py,sha256=H4B7UX_EPNmP2tC8bubcKrPLTS4aQu98huvbXQ3Zv2g,910
230
239
  omlish/marshal/values.py,sha256=ssHiWdg_L6M17kAn8GiGdPW7UeQOm3RDikWkvwblf5I,263
@@ -236,7 +245,7 @@ omlish/reflect/types.py,sha256=R9AH5YnOvdZs6QhzJ6VmjvcvGibQEQi6YqK25f5VUxw,6862
236
245
  omlish/secrets/__init__.py,sha256=VKB2IF9vz4h4RXcZxgXj36KXOLcGBzfqVnxPgPDWpmg,408
237
246
  omlish/secrets/crypto.py,sha256=6CsLy0UEqCrBK8Xx_3-iFF6SKtu2GlEqUQ8-MliY3tk,3709
238
247
  omlish/secrets/marshal.py,sha256=nVzsvQH5w3T2oMP7DCc1SLKxyR5e66psM57VOQoL0QA,2086
239
- omlish/secrets/openssl.py,sha256=nAA_wxk86G92B7027AoAlAiFliMjxLVs7xlaOAFGayE,6225
248
+ omlish/secrets/openssl.py,sha256=wxA_wIlxtuOUy71ABxAJgavh-UI_taOfm-A0dVlmSwM,6219
240
249
  omlish/secrets/passwords.py,sha256=3r-vEK6Gp6aq4L5Csnd06QnrjO9xfzHJP-g_7I9W_ao,4101
241
250
  omlish/secrets/secrets.py,sha256=hFN82uYiBVx8YSE86leWNxb4IRp3qdwZPOi4w04h8u0,6855
242
251
  omlish/secrets/subprocesses.py,sha256=EcnKlHHtnUMHGrBWXDfu8tv28wlgZx4P4GOiuPW9Vo8,1105
@@ -253,12 +262,13 @@ omlish/specs/jsonschema/keywords/validation.py,sha256=ghewVUSG5qPYnmexy1Ylc-Xoui
253
262
  omlish/specs/jsonschema/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
254
263
  omlish/specs/jsonschema/schemas/draft202012/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
255
264
  omlish/specs/jsonschema/schemas/draft202012/vocabularies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
256
- omlish/sql/__init__.py,sha256=pLv2EQmAwcGXN0Y3AE8K5JjyN_4GaHRMHyExaDFm5yU,181
265
+ omlish/sql/__init__.py,sha256=QHKkiM0rvSDWKUYrvTSynOni5fB46QQ2gOw_TcMBQ2o,398
257
266
  omlish/sql/_abc.py,sha256=HLhnnLZ7l0r_N99I-RCqJe6VHth-9iluU7cR-7-5jfs,1519
258
267
  omlish/sql/asyncs.py,sha256=Wye3dwh7oZEGYz2Y4DZQSHtW4xjI2AH5qjW-BSS2IfU,3688
259
268
  omlish/sql/dbs.py,sha256=lpdFmm2vTwLoBiVYGj9yPsVcTEYYNCxlYZZpjfChzkY,1870
260
269
  omlish/sql/duckdb.py,sha256=Z3wiZEn_21Lu1ElFRX0ATzoBMCw0KJxINjTRuTexYGM,3748
261
270
  omlish/sql/exprs.py,sha256=gO4Fj4xEY-PuDgV-N8hBMy55glZz7O-4H7v1LWabfZY,323
271
+ omlish/sql/qualifiedname.py,sha256=rlW3gVmyucJbqwcxj_7BfK4X2HoXrMroZT2H45zPgJQ,2264
262
272
  omlish/sql/secrets.py,sha256=mDUunIACxHBsPD_ONbHQJVndeMMzJR4vMC2WWX7tGfY,177
263
273
  omlish/sql/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,403
264
274
  omlish/testing/__init__.py,sha256=kfiF10ykrjWXniedIl3g8j3pNAFyuSbp1D3ZXug3-Eo,168
@@ -285,8 +295,8 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
285
295
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
286
296
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
287
297
  omlish/text/parts.py,sha256=KGgo0wHOIMVMZtDso-rhSWKAcAkYAH2IGpg9tULabu8,6505
288
- omlish-0.0.0.dev21.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
289
- omlish-0.0.0.dev21.dist-info/METADATA,sha256=xGxu7jRwygBxNlY-2GkuLO58zaPIx2lXCDxZg6N7GaI,3718
290
- omlish-0.0.0.dev21.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
291
- omlish-0.0.0.dev21.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
292
- omlish-0.0.0.dev21.dist-info/RECORD,,
298
+ omlish-0.0.0.dev23.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
299
+ omlish-0.0.0.dev23.dist-info/METADATA,sha256=vhWl21vTSXsQivm5hv_6iQ-60K2Iiaa2UigiH6Hbkww,3666
300
+ omlish-0.0.0.dev23.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
301
+ omlish-0.0.0.dev23.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
302
+ omlish-0.0.0.dev23.dist-info/RECORD,,