omlish 0.0.0.dev30__py3-none-any.whl → 0.0.0.dev31__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/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev30'
2
- __revision__ = '1378b0a61f7d3ec16204c06bc87e5215b062d378'
1
+ __version__ = '0.0.0.dev31'
2
+ __revision__ = 'bd655a8d18c1cc31ce2c9d79fedaec771c5e1593'
3
3
 
4
4
 
5
5
  #
@@ -30,7 +30,7 @@ class Project(ProjectBase):
30
30
 
31
31
  optional_dependencies = {
32
32
  'async': [
33
- 'anyio ~= 4.5',
33
+ 'anyio ~= 4.6',
34
34
  'sniffio ~= 1.3',
35
35
 
36
36
  'greenlet ~= 3.1',
omlish/asyncs/anyio.py CHANGED
@@ -4,7 +4,7 @@ TODO:
4
4
  - owned lock
5
5
  - async once
6
6
 
7
- lookit:
7
+ See:
8
8
  - https://github.com/davidbrochart/sqlite-anyio/blob/a3ba4c6ef0535b14a5a60071fcd6ed565a514963/sqlite_anyio/sqlite.py
9
9
  - https://github.com/rafalkrupinski/ratelimit-anyio/blob/2910a8a3d6fa54ed17ee6ba457686c9f7a4c4beb/src/ratelimit_anyio/__init__.py
10
10
  - https://github.com/nekitdev/async-extensions/tree/main/async_extensions
omlish/asyncs/bridge.py CHANGED
@@ -12,8 +12,9 @@ TODO:
12
12
  See:
13
13
  - https://greenback.readthedocs.io/en/latest/
14
14
  """
15
+ import functools # noqa
15
16
  import itertools
16
- import sys
17
+ import sys # noqa
17
18
  import types
18
19
  import typing as ta
19
20
  import weakref
@@ -90,7 +91,7 @@ class UnexpectedBridgeNestingError(Exception):
90
91
 
91
92
 
92
93
  _DEBUG_PRINT: ta.Callable[..., None] | None = None
93
- # _DEBUG_PRINT = print # noqa
94
+ # _DEBUG_PRINT = functools.partial(print, file=sys.stderr) # noqa
94
95
 
95
96
  _TRACK_TRANSITION_OBJS = False
96
97
 
@@ -253,8 +254,8 @@ def s_to_a(fn, *, require_await=False):
253
254
  switch_occurred = True
254
255
  try:
255
256
  value = yield result
256
- except BaseException: # noqa
257
- result = g.throw(*sys.exc_info())
257
+ except BaseException as e: # noqa
258
+ result = g.throw(e)
258
259
  else:
259
260
  result = g.switch(value)
260
261
 
@@ -302,15 +303,22 @@ def a_to_s(fn):
302
303
 
303
304
  cr = gate()
304
305
  sv = None
306
+ he = False
305
307
  try:
306
308
  while True:
307
- try:
308
- sv = cr.send(sv)
309
- except StopIteration:
310
- break
309
+ if not he:
310
+ try:
311
+ sv = cr.send(sv)
312
+ except StopIteration:
313
+ break
314
+ he = False
311
315
 
312
316
  if ret is missing or cr.cr_await is not None or cr.cr_running:
313
- sv = s_to_a_await(sv)
317
+ try:
318
+ sv = s_to_a_await(sv) # type: ignore
319
+ except BaseException as e: # noqa
320
+ sv = cr.throw(e)
321
+ he = True
314
322
 
315
323
  finally:
316
324
  cr.close()
omlish/asyncs/trio.py CHANGED
@@ -1,5 +1,5 @@
1
1
  """
2
- lookit:
2
+ See:
3
3
  - https://github.com/oremanj/trio-monitor
4
4
  - https://github.com/python-trio/trio-monitor/tree/master
5
5
  - https://github.com/python-trio/triopg
omlish/bootstrap/main.py CHANGED
@@ -1,3 +1,8 @@
1
+ """
2
+ TODO:
3
+ - -x / --exec - os.exec entrypoint
4
+ - refuse to install non-exec-relevant Bootstraps when chosen
5
+ """
1
6
  # ruff: noqa: UP006 UP007
2
7
  import argparse
3
8
  import dataclasses as dc
@@ -48,7 +48,7 @@ class Threadlet(abc.ABC):
48
48
  raise NotImplementedError
49
49
 
50
50
  @abc.abstractmethod
51
- def throw(self, ex: Exception) -> ta.Any:
51
+ def throw(self, ex: BaseException) -> ta.Any:
52
52
  raise NotImplementedError
53
53
 
54
54
 
@@ -84,7 +84,7 @@ class GreenletThreadlet(Threadlet):
84
84
  def switch(self, *args: ta.Any, **kwargs: ta.Any) -> ta.Any:
85
85
  return self.g.switch(*args, **kwargs)
86
86
 
87
- def throw(self, ex: Exception) -> ta.Any:
87
+ def throw(self, ex: BaseException) -> ta.Any:
88
88
  return self.g.throw(ex)
89
89
 
90
90
 
omlish/docker.py CHANGED
@@ -107,6 +107,15 @@ def cli_inspect(ids: list[str]) -> list[Inspect]:
107
107
  return msh.unmarshal(json.loads(o.decode()), list[Inspect])
108
108
 
109
109
 
110
+ def has_cli() -> bool:
111
+ try:
112
+ proc = subprocess.run(['docker', '--version']) # noqa
113
+ except (FileNotFoundError, subprocess.CalledProcessError):
114
+ return False
115
+ else:
116
+ return not proc.returncode
117
+
118
+
110
119
  ##
111
120
 
112
121
 
omlish/logs/noisy.py CHANGED
@@ -5,6 +5,7 @@ NOISY_LOGGERS: set[str] = {
5
5
  'boto3.resources.action',
6
6
  'datadog.dogstatsd',
7
7
  'elasticsearch',
8
+ 'httpx',
8
9
  'kazoo.client',
9
10
  'requests.packages.urllib3.connectionpool',
10
11
  }
omlish/matchfns.py CHANGED
@@ -130,7 +130,7 @@ def multi(*children: MatchFn[P, T], strict: bool = False) -> MultiMatchFn: # Mu
130
130
  ##
131
131
 
132
132
 
133
- class CachedMultiFn(MatchFn[P, T]):
133
+ class CachedMatchFn(MatchFn[P, T]):
134
134
  @staticmethod
135
135
  def _default_key(*args, **kwargs):
136
136
  return (args, tuple(sorted(kwargs.items(), key=lambda t: t[0])))
@@ -187,7 +187,7 @@ class CachedMultiFn(MatchFn[P, T]):
187
187
  return self.__class__(self._f.__get__(instance, owner), key=self._key) # noqa
188
188
 
189
189
 
190
- cached = CachedMultiFn
190
+ cached = CachedMatchFn
191
191
 
192
192
 
193
193
  ##
@@ -10,19 +10,24 @@ import pytest
10
10
 
11
11
  from .... import check
12
12
  from .... import collections as col
13
+ from .... import docker
14
+ from .... import lang
13
15
  from ._registry import register
14
16
 
15
17
 
16
18
  Configable = pytest.FixtureRequest | pytest.Config
17
19
 
18
20
 
19
- SWITCHES = {
20
- 'docker': True,
21
+ SWITCHES: ta.Mapping[str, bool | ta.Callable[[], bool]] = {
22
+ 'docker': docker.has_cli,
23
+ 'docker-guest': docker.is_likely_in_docker,
21
24
  'online': True,
22
25
  'integration': True,
23
26
  'slow': False,
24
27
  }
25
28
 
29
+ SWITCH_ATTRS = {k.replace('-', '_'): k for k in SWITCHES}
30
+
26
31
 
27
32
  SwitchState: ta.TypeAlias = bool | ta.Literal['only']
28
33
 
@@ -53,9 +58,9 @@ def skip_if_disabled(obj: Configable | None, name: str) -> None:
53
58
  pytest.skip(f'{name} disabled')
54
59
 
55
60
 
56
- def get_switches(obj: Configable) -> ta.Mapping[str, SwitchState]:
61
+ def get_specified_switches(obj: Configable) -> ta.Mapping[str, SwitchState]:
57
62
  ret: dict[str, SwitchState] = {}
58
- for sw, d in SWITCHES.items():
63
+ for sw in SWITCHES:
59
64
  sts = {
60
65
  st
61
66
  for st, pfx in SWITCH_STATE_OPT_PREFIXES.items()
@@ -65,8 +70,6 @@ def get_switches(obj: Configable) -> ta.Mapping[str, SwitchState]:
65
70
  if len(sts) > 1:
66
71
  raise Exception(f'Multiple switches specified for {sw}')
67
72
  ret[sw] = check.single(sts)
68
- else:
69
- ret[sw] = d
70
73
  return ret
71
74
 
72
75
 
@@ -74,8 +77,9 @@ def get_switches(obj: Configable) -> ta.Mapping[str, SwitchState]:
74
77
  class SwitchesPlugin:
75
78
 
76
79
  def pytest_configure(self, config):
77
- for sw in SWITCHES:
80
+ for sw in SWITCH_ATTRS:
78
81
  config.addinivalue_line('markers', f'{sw}: mark test as {sw}')
82
+ config.addinivalue_line('markers', f'not_{sw}: mark test as not {sw}')
79
83
 
80
84
  def pytest_addoption(self, parser):
81
85
  for sw in SWITCHES:
@@ -83,13 +87,25 @@ class SwitchesPlugin:
83
87
  parser.addoption(f'--{sw}', action='store_true', default=False, help=f'enables {sw} tests')
84
88
  parser.addoption(f'--only-{sw}', action='store_true', default=False, help=f'enables only {sw} tests')
85
89
 
90
+ @lang.cached_function
91
+ def get_switches(self) -> ta.Mapping[str, SwitchState]:
92
+ return {
93
+ k: v() if callable(v) else v
94
+ for k, v in SWITCHES.items()
95
+ }
96
+
86
97
  def pytest_collection_modifyitems(self, config, items):
87
- sts = get_switches(config)
98
+ sts = {
99
+ **self.get_switches(),
100
+ **get_specified_switches(config),
101
+ }
102
+
88
103
  stx = col.multi_map(map(reversed, sts.items())) # type: ignore
89
104
  ts, fs, onlys = (stx.get(k, ()) for k in (True, False, 'only'))
90
105
 
91
106
  def process(item):
92
- sws = {sw for sw in SWITCHES if sw in item.keywords}
107
+ sws = {sw for swa, sw in SWITCH_ATTRS.items() if swa in item.keywords}
108
+ nsws = {sw for swa, sw in SWITCH_ATTRS.items() if ('not_' + swa) in item.keywords}
93
109
 
94
110
  if onlys:
95
111
  if not any(sw in onlys for sw in sws):
@@ -101,5 +117,9 @@ class SwitchesPlugin:
101
117
  if sw in fs:
102
118
  item.add_marker(pytest.mark.skip(reason=f'skipping switches {sw}'))
103
119
 
120
+ for nsw in nsws:
121
+ if nsw in ts:
122
+ item.add_marker(pytest.mark.skip(reason=f'skipping switches {nsw}'))
123
+
104
124
  for item in items:
105
125
  process(item)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev30
3
+ Version: 0.0.0.dev31
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -13,7 +13,7 @@ Classifier: Operating System :: POSIX
13
13
  Requires-Python: ~=3.12
14
14
  License-File: LICENSE
15
15
  Provides-Extra: all
16
- Requires-Dist: anyio ~=4.5 ; extra == 'all'
16
+ Requires-Dist: anyio ~=4.6 ; extra == 'all'
17
17
  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'
@@ -42,7 +42,7 @@ Requires-Dist: python-snappy ~=0.7 ; (python_version < "3.13") and extra == 'all
42
42
  Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'all'
43
43
  Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'all'
44
44
  Provides-Extra: async
45
- Requires-Dist: anyio ~=4.5 ; extra == 'async'
45
+ Requires-Dist: anyio ~=4.6 ; extra == 'async'
46
46
  Requires-Dist: sniffio ~=1.3 ; extra == 'async'
47
47
  Requires-Dist: greenlet ~=3.1 ; extra == 'async'
48
48
  Requires-Dist: trio ~=0.26 ; extra == 'async'
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=N1F-Xz3GaBn2H1p7uKzhkhKCQV8QVR0t76XD6wmFtXA,3
2
- omlish/__about__.py,sha256=fDFLSSMSxswk3iOzGDNumjsP4JcRrkaXRbp8w77f4ok,2709
2
+ omlish/__about__.py,sha256=G5PhHDsjnmH0v-N3l7GO0RtaA0iLAw7M9ihGEGPM0x4,2709
3
3
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omlish/argparse.py,sha256=QRQmX9G0-L_nATkFtGHvpd4qrpYzKATdjuFLbBqzJPM,6224
5
5
  omlish/c3.py,sha256=W5EwYx9Por3rWYLkKUitJ6OoRMLLgVTfLTyroOz41Y0,8047
@@ -7,33 +7,33 @@ omlish/cached.py,sha256=UAizxlH4eMWHPzQtmItmyE6FEpFEUFzIkxaO2BHWZ5s,196
7
7
  omlish/check.py,sha256=3qp1_W8uRp23I26nWvG_c7YFxdTwJAZEFxmY8Bfw50Y,10078
8
8
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
9
9
  omlish/defs.py,sha256=T3bq_7h_tO3nDB5RAFBn7DkdeQgqheXzkFColbOHZko,4890
10
- omlish/docker.py,sha256=wipM7Xsx7rUv7-PoBTTT2v0uk3JVan0USljgm2QesXg,6227
10
+ omlish/docker.py,sha256=uRVJUJwGtTFYhm4XeztrVEYk93f0NI5VpjEKQaN_5uY,6453
11
11
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
12
12
  omlish/fnpairs.py,sha256=hVuLqQFdRNNze3FYH2cAQO3GC7nK5yQP_GWPUSbL7nE,10601
13
13
  omlish/fnpipes.py,sha256=AJkgz9nvRRm7oqw7ZgYyz21klu276LWi54oYCLg-vOg,2196
14
14
  omlish/genmachine.py,sha256=LCMiqvK32dAWtrlB6lKw9tXdQFiXC8rRdk4TMQYIroU,1603
15
15
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
16
16
  omlish/libc.py,sha256=u0481imCiTFqP_e-v9g0pD-0WD249j5vYzhtn-fnNkY,15308
17
- omlish/matchfns.py,sha256=ygqbqthRxgF9I1PJaw9Xl7FoZnAVMmnKBrYgimKQ0ag,6152
17
+ omlish/matchfns.py,sha256=I1IlQGfEyk_AcFSy6ulVS3utC-uwyZM2YfUXYHc9Bw0,6152
18
18
  omlish/multiprocessing.py,sha256=QZT4C7I-uThCAjaEY3xgUYb-5GagUlnE4etN01LDyU4,5186
19
19
  omlish/os.py,sha256=vO1sZCzAhVxo46tDFLrD52q2KuMFWQwu5MPJgSsnliI,3107
20
20
  omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
21
21
  omlish/sync.py,sha256=AqwIfIuCMVHLwlJUa7dmaSjfA4sM5AYPCD5-nsz3XVQ,1516
22
22
  omlish/term.py,sha256=NEmxqAhicyInGtmFamZAizI2xdu819MzFYPEp0Fx97M,6111
23
23
  omlish/asyncs/__init__.py,sha256=uUz9ziKh4_QrgmdhKFMgq6j7mFbiZd3LiogguDCQsGI,587
24
- omlish/asyncs/anyio.py,sha256=Hqdi1iCopKoaAWGx-AYTRLEwnavLWx1esfJISK1IVF0,8024
24
+ omlish/asyncs/anyio.py,sha256=gfpx-D8QGmUfhnQxHEaHXcAP8zSMQjcGw4COFTGNnHI,8021
25
25
  omlish/asyncs/asyncio.py,sha256=JfM59QgB3asgEbrps0zoVbNjWD4kL2XdsEkRMEIoFos,971
26
26
  omlish/asyncs/asyncs.py,sha256=Tf7ZodTGepkM7HAuFcDNh9lLzzrMw6rELWvopGmFkh4,2035
27
- omlish/asyncs/bridge.py,sha256=fkMQWG2TNmPB9BfIxtXrE50W5FJw0ma44GleOXbcSKw,8628
27
+ omlish/asyncs/bridge.py,sha256=bcTEhsBJOWAMixu_fCxkDedLP3NEitAfwaHYTu26sQE,8980
28
28
  omlish/asyncs/flavors.py,sha256=1mNxGNRVmjUHzA13K5ht8vdJv4CLEmzYTQ6BZXr1520,4866
29
- omlish/asyncs/trio.py,sha256=GKG3wgelFr7gIKKHZhcflvMyCvxXHNZe862KB0Xw2uA,370
29
+ omlish/asyncs/trio.py,sha256=fmZ5b_lKdVV8NQ3euCUutWgnkqTFzSnOjvJSA_jvmrE,367
30
30
  omlish/asyncs/trio_asyncio.py,sha256=oqdOHy0slj9PjVxaDf3gJkq9AAgg7wYZbB469jOftVw,1327
31
31
  omlish/bootstrap/__init__.py,sha256=-Rtsg7uPQNhh1dIT9nqrz96XlqizwoLnWf-FwOEstJI,730
32
32
  omlish/bootstrap/__main__.py,sha256=d23loR_cKfTYZwYiqpt_CmKI7dd5WcYFgIYzqMep75E,68
33
33
  omlish/bootstrap/base.py,sha256=koELbK6UmsZaRj-6Bng5_zPVmEBqDpFCduEdR5BddOs,1077
34
34
  omlish/bootstrap/diag.py,sha256=x_BKS_uhfW8QFk1NeH_VIocHif-A6FVTZ37262qCgZ0,5052
35
35
  omlish/bootstrap/harness.py,sha256=pIeSXKfMsF7-3ZkU0gGpde-PtLAKKcVrWaxcin7Xzy0,2041
36
- omlish/bootstrap/main.py,sha256=9ZbgXaRNZwt_hXdg8W4YjpP0v0Si_qqlfu86jfgRz04,5215
36
+ omlish/bootstrap/main.py,sha256=u-TfxO4GkAK3LbRweQERogtO4kT0z3gqXRjnXvtJzC8,5328
37
37
  omlish/bootstrap/marshal.py,sha256=qKewGVs-3i2p5W9nywkXSo1pcbVxmOAlTvfLjyo0xpo,554
38
38
  omlish/bootstrap/sys.py,sha256=U0MFxO9tLFV3cdN5Y-Zrink6_45sFvzPUYQXyBk7-ns,8741
39
39
  omlish/collections/__init__.py,sha256=tGUzvS_ZjiqALsLRy7JX3h4KZRQX2CmtdAfTRD7UwMk,1677
@@ -60,7 +60,7 @@ omlish/collections/cache/types.py,sha256=yNjwd6CGyTJQdxN2CQxFqqBAlcs1Z7vvNV-aU1K
60
60
  omlish/concurrent/__init__.py,sha256=9p-s8MvBEYDqHIoYU3OYoe-Nni22QdkW7nhZGEukJTM,197
61
61
  omlish/concurrent/executors.py,sha256=FYKCDYYuj-OgMa8quLsA47SfFNX3KDJvRENVk8NDsrA,1292
62
62
  omlish/concurrent/futures.py,sha256=J2s9wYURUskqRJiBbAR0PNEAp1pXbIMYldOVBTQduQY,4239
63
- omlish/concurrent/threadlets.py,sha256=eQLJBJwT6iOt4jOm67BberSKLPhaEYJTStHK0LCo2v4,2374
63
+ omlish/concurrent/threadlets.py,sha256=0fl0_Q_joTLtFYhR2kpKu45BW-win-le0rCuXPBtjko,2382
64
64
  omlish/configs/__init__.py,sha256=3uh09ezodTwkMI0nRmAMP0eEuJ_0VdF-LYyNmPjHiCE,77
65
65
  omlish/configs/classes.py,sha256=GLbB8xKjHjjoUQRCUQm3nEjM8z1qNTx9gPV7ODSt5dg,1317
66
66
  omlish/configs/flattening.py,sha256=AOlRpBHm449MxwMp3CiIRGunStOC1DUNs1f3CLou0wc,4731
@@ -212,7 +212,7 @@ omlish/logs/_abc.py,sha256=UgrCUQVUi_PvT3p1CEkb3P74CFrFcZq2AFby3GEUv9M,5974
212
212
  omlish/logs/configs.py,sha256=EE0jlNaXJbGnM7V-y4xS5VwyTBSTzFzc0BYaVjg0JmA,1283
213
213
  omlish/logs/formatters.py,sha256=q79nMnR2mRIStPyGrydQHpYTXgC5HHptt8lH3W2Wwbs,671
214
214
  omlish/logs/handlers.py,sha256=nyuFgmO05By_Xwq7es58ClzS51-F53lJL7gD0x5IqAg,228
215
- omlish/logs/noisy.py,sha256=8JORjI1dH38yU2MddM54OB6qt32Xozfocdb88vY4wro,335
215
+ omlish/logs/noisy.py,sha256=Ubc-eTH6ZbGYsLfUUi69JAotwuUwzb-SJBeGo_0dIZI,348
216
216
  omlish/logs/utils.py,sha256=MgGovbP0zUrZ3FGD3qYNQWn-l0jy0Y0bStcQvv5BOmQ,391
217
217
  omlish/marshal/__init__.py,sha256=RkZGfdp7x9KU8nEpb8hYBGANK-P_9AXMyjBXCrdYMmc,1757
218
218
  omlish/marshal/any.py,sha256=e82OyYK3Emm1P1ClnsnxP7fIWC2iNVyW0H5nK4mLmWM,779
@@ -307,7 +307,7 @@ omlish/testing/pytest/plugins/pydevd.py,sha256=u1fxfCgFw4wGKBkMV_H_l9WI8JoUwlRff
307
307
  omlish/testing/pytest/plugins/repeat.py,sha256=flSQzE9GFOWksVKz-mUGnpxJpv3yRqn1G4K8pW7JHs0,498
308
308
  omlish/testing/pytest/plugins/skips.py,sha256=EoZDg1uWccgbAegmzqI85c7RliycD1e2J4Y7vfDRhwM,1041
309
309
  omlish/testing/pytest/plugins/spacing.py,sha256=JQQhi9q3c523Ro1a_K_9RGAb7HotiO74N8bYX2VESFE,707
310
- omlish/testing/pytest/plugins/switches.py,sha256=9FtN5qtPBoS-teEp54OHPF6jlZJakRJdq4pnLJpPj_A,3001
310
+ omlish/testing/pytest/plugins/switches.py,sha256=hqFYM6tCcr-6fAPg8DBI-TJn762Kq4EUFt6gjXgiAQQ,3802
311
311
  omlish/testing/pytest/plugins/utils.py,sha256=L5C622UXcA_AUKDcvyh5IMiRfqSGGz0McdhwZWvfMlU,261
312
312
  omlish/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
313
313
  omlish/text/asdl.py,sha256=3v5UocAfxan_d9drkGNdH3AMfx_FFBpQu3ULGL4M6VM,16865
@@ -315,8 +315,8 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
315
315
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
316
316
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
317
317
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
318
- omlish-0.0.0.dev30.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
319
- omlish-0.0.0.dev30.dist-info/METADATA,sha256=IwpExBB3pJdmS4yOOGHNJjwusV5Xj5KOyW5aY9cHxV8,3694
320
- omlish-0.0.0.dev30.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
321
- omlish-0.0.0.dev30.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
322
- omlish-0.0.0.dev30.dist-info/RECORD,,
318
+ omlish-0.0.0.dev31.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
319
+ omlish-0.0.0.dev31.dist-info/METADATA,sha256=ONRqZOyFknW_WO5Hntonm5hY10yIlv645eKTmoXhhyY,3694
320
+ omlish-0.0.0.dev31.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
321
+ omlish-0.0.0.dev31.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
322
+ omlish-0.0.0.dev31.dist-info/RECORD,,