omlish 0.0.0.dev150__py3-none-any.whl → 0.0.0.dev152__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.dev150'
2
- __revision__ = 'ab779edf0b58378203e055980af0fedacedb20aa'
1
+ __version__ = '0.0.0.dev152'
2
+ __revision__ = '53e32242b8e9bfcfe60359cf06ca1530082fc343'
3
3
 
4
4
 
5
5
  #
omlish/argparse/cli.py CHANGED
@@ -4,6 +4,8 @@
4
4
  TODO:
5
5
  - default command
6
6
  - auto match all underscores to hyphens
7
+ - pre-run, post-run hooks
8
+ - exitstack?
7
9
  """
8
10
  import argparse
9
11
  import dataclasses as dc
@@ -136,11 +138,12 @@ class ArgparseCli:
136
138
 
137
139
  self._args, self._unknown_args = self.get_parser().parse_known_args(self._argv)
138
140
 
141
+ #
142
+
139
143
  def __init_subclass__(cls, **kwargs: ta.Any) -> None:
140
144
  super().__init_subclass__(**kwargs)
141
145
 
142
146
  ns = cls.__dict__
143
-
144
147
  objs = {}
145
148
  mro = cls.__mro__[::-1]
146
149
  for bns in [bcls.__dict__ for bcls in reversed(mro)] + [ns]:
@@ -153,24 +156,33 @@ class ArgparseCli:
153
156
  elif k in objs:
154
157
  del [k]
155
158
 
159
+ #
160
+
156
161
  anns = ta.get_type_hints(_ArgparseCliAnnotationBox({
157
162
  **{k: v for bcls in reversed(mro) for k, v in getattr(bcls, '__annotations__', {}).items()},
158
163
  **ns.get('__annotations__', {}),
159
164
  }), globalns=ns.get('__globals__', {}))
160
165
 
166
+ #
167
+
161
168
  if '_parser' in ns:
162
169
  parser = check.isinstance(ns['_parser'], argparse.ArgumentParser)
163
170
  else:
164
171
  parser = argparse.ArgumentParser()
165
172
  setattr(cls, '_parser', parser)
166
173
 
174
+ #
175
+
167
176
  subparsers = parser.add_subparsers()
177
+
168
178
  for att, obj in objs.items():
169
179
  if isinstance(obj, ArgparseCommand):
170
180
  if obj.parent is not None:
171
181
  raise NotImplementedError
182
+
172
183
  for cn in [obj.name, *(obj.aliases or [])]:
173
- cparser = subparsers.add_parser(cn)
184
+ subparser = subparsers.add_parser(cn)
185
+
174
186
  for arg in (obj.args or []):
175
187
  if (
176
188
  len(arg.args) == 1 and
@@ -178,29 +190,34 @@ class ArgparseCli:
178
190
  not (n := check.isinstance(arg.args[0], str)).startswith('-') and
179
191
  'metavar' not in arg.kwargs
180
192
  ):
181
- cparser.add_argument(
193
+ subparser.add_argument(
182
194
  n.replace('-', '_'),
183
195
  **arg.kwargs,
184
196
  metavar=n,
185
197
  )
186
198
  else:
187
- cparser.add_argument(*arg.args, **arg.kwargs)
188
- cparser.set_defaults(_cmd=obj)
199
+ subparser.add_argument(*arg.args, **arg.kwargs)
200
+
201
+ subparser.set_defaults(_cmd=obj)
189
202
 
190
203
  elif isinstance(obj, ArgparseArg):
191
204
  if att in anns:
192
- akwargs = _get_argparse_arg_ann_kwargs(anns[att])
193
- obj.kwargs = {**akwargs, **obj.kwargs}
205
+ ann_kwargs = _get_argparse_arg_ann_kwargs(anns[att])
206
+ obj.kwargs = {**ann_kwargs, **obj.kwargs}
207
+
194
208
  if not obj.dest:
195
209
  if 'dest' in obj.kwargs:
196
210
  obj.dest = obj.kwargs['dest']
197
211
  else:
198
212
  obj.dest = obj.kwargs['dest'] = att # type: ignore
213
+
199
214
  parser.add_argument(*obj.args, **obj.kwargs)
200
215
 
201
216
  else:
202
217
  raise TypeError(obj)
203
218
 
219
+ #
220
+
204
221
  _parser: ta.ClassVar[argparse.ArgumentParser]
205
222
 
206
223
  @classmethod
@@ -219,10 +236,12 @@ class ArgparseCli:
219
236
  def unknown_args(self) -> ta.Sequence[str]:
220
237
  return self._unknown_args
221
238
 
222
- def _run_cmd(self, cmd: ArgparseCommand) -> ta.Optional[int]:
223
- return cmd.__get__(self, type(self))()
239
+ #
240
+
241
+ def _bind_cli_cmd(self, cmd: ArgparseCommand) -> ta.Callable:
242
+ return cmd.__get__(self, type(self))
224
243
 
225
- def __call__(self) -> ta.Optional[int]:
244
+ def prepare_cli_run(self) -> ta.Optional[ta.Callable]:
226
245
  cmd = getattr(self.args, '_cmd', None)
227
246
 
228
247
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
@@ -234,9 +253,31 @@ class ArgparseCli:
234
253
 
235
254
  if cmd is None:
236
255
  self.get_parser().print_help()
256
+ return None
257
+
258
+ return self._bind_cli_cmd(cmd)
259
+
260
+ #
261
+
262
+ def cli_run(self) -> ta.Optional[int]:
263
+ if (fn := self.prepare_cli_run()) is None:
237
264
  return 0
238
265
 
239
- return self._run_cmd(cmd)
266
+ return fn()
267
+
268
+ def cli_run_and_exit(self) -> ta.NoReturn:
269
+ sys.exit(rc if isinstance(rc := self.cli_run(), int) else 0)
270
+
271
+ def __call__(self, *, exit: bool = False) -> ta.Optional[int]: # noqa
272
+ if exit:
273
+ return self.cli_run_and_exit()
274
+ else:
275
+ return self.cli_run()
276
+
277
+ #
278
+
279
+ async def async_cli_run(self) -> ta.Optional[int]:
280
+ if (fn := self.prepare_cli_run()) is None:
281
+ return 0
240
282
 
241
- def call_and_exit(self) -> ta.NoReturn:
242
- sys.exit(rc if isinstance(rc := self(), int) else 0)
283
+ return await fn()
omlish/asyncs/__init__.py CHANGED
@@ -1,35 +0,0 @@
1
- from .asyncs import ( # noqa
2
- SyncableIterable,
3
- async_list,
4
- sync_await,
5
- sync_list,
6
- syncable_iterable,
7
- )
8
-
9
- from .bridge import ( # noqa
10
- a_to_s,
11
- is_in_bridge,
12
- s_to_a,
13
- s_to_a_await,
14
- trivial_a_to_s,
15
- trivial_s_to_a,
16
- )
17
-
18
- from .flavors import ( # noqa
19
- ContextManagerAdapter,
20
- Flavor,
21
- adapt,
22
- adapt_context,
23
- from_anyio,
24
- from_anyio_context,
25
- from_asyncio,
26
- from_asyncio_context,
27
- from_trio,
28
- from_trio_context,
29
- get_flavor,
30
- mark_anyio,
31
- mark_asyncio,
32
- mark_flavor,
33
- mark_trio,
34
- with_adapter_loop,
35
- )
omlish/asyncs/all.py ADDED
@@ -0,0 +1,35 @@
1
+ from .asyncs import ( # noqa
2
+ SyncableIterable,
3
+ async_list,
4
+ sync_await,
5
+ sync_list,
6
+ syncable_iterable,
7
+ )
8
+
9
+ from .bridge import ( # noqa
10
+ a_to_s,
11
+ is_in_bridge,
12
+ s_to_a,
13
+ s_to_a_await,
14
+ trivial_a_to_s,
15
+ trivial_s_to_a,
16
+ )
17
+
18
+ from .flavors import ( # noqa
19
+ ContextManagerAdapter,
20
+ Flavor,
21
+ adapt,
22
+ adapt_context,
23
+ from_anyio,
24
+ from_anyio_context,
25
+ from_asyncio,
26
+ from_asyncio_context,
27
+ from_trio,
28
+ from_trio_context,
29
+ get_flavor,
30
+ mark_anyio,
31
+ mark_asyncio,
32
+ mark_flavor,
33
+ mark_trio,
34
+ with_adapter_loop,
35
+ )
omlish/bootstrap/sys.py CHANGED
@@ -23,13 +23,13 @@ if ta.TYPE_CHECKING:
23
23
  from .. import libc
24
24
  from .. import logs
25
25
  from ..formats import dotenv
26
- from ..lite import pidfile
26
+ from ..os import pidfile
27
27
 
28
28
  else:
29
29
  libc = lang.proxy_import('..libc', __package__)
30
30
  logs = lang.proxy_import('..logs', __package__)
31
31
  dotenv = lang.proxy_import('..formats.dotenv', __package__)
32
- pidfile = lang.proxy_import('..lite.pidfile', __package__)
32
+ pidfile = lang.proxy_import('..os.pidfile', __package__)
33
33
 
34
34
 
35
35
  ##
omlish/diag/procfs.py CHANGED
@@ -13,8 +13,8 @@ import typing as ta
13
13
 
14
14
  from .. import iterators as it
15
15
  from .. import lang
16
- from .. import os as oos
17
16
  from ..formats import json
17
+ from ..os.sizes import PAGE_SIZE
18
18
  from .procstats import ProcStats
19
19
 
20
20
 
@@ -239,8 +239,8 @@ def get_process_range_pagemaps(start: int, end: int, pid: PidLike = 'self') -> t
239
239
  """https://www.kernel.org/doc/Documentation/vm/pagemap.txt"""
240
240
 
241
241
  _check_linux()
242
- offset = (start // oos.PAGE_SIZE) * 8
243
- npages = ((end - start) // oos.PAGE_SIZE)
242
+ offset = (start // PAGE_SIZE) * 8
243
+ npages = ((end - start) // PAGE_SIZE)
244
244
  size = npages * 8
245
245
  with open(f'/proc/{pid}/pagemap', 'rb') as pagemap_file:
246
246
  pagemap_file.seek(offset)
@@ -251,7 +251,7 @@ def get_process_range_pagemaps(start: int, end: int, pid: PidLike = 'self') -> t
251
251
  for pagenum in range(npages):
252
252
  [packed] = _struct_unpack('Q', pagemap_buf[pagenum * 8:(pagenum + 1) * 8])
253
253
  yield {
254
- 'address': start + (pagenum * oos.PAGE_SIZE),
254
+ 'address': start + (pagenum * PAGE_SIZE),
255
255
  'pfn': (packed & ((1 << (54 + 1)) - 1)),
256
256
  'swap_type': (packed & ((1 << (4 + 1)) - 1)),
257
257
  'swap_offset': (packed & ((1 << (54 + 1)) - 1)) >> 5,
@@ -280,7 +280,7 @@ def _dump_cmd(args: ta.Any) -> None:
280
280
  sys.stdout.write('\n')
281
281
  for pm in get_process_range_pagemaps(m['address'], m['end_address'], args.pid):
282
282
  if pm['pte_soft_dirty']:
283
- dirty_total += oos.PAGE_SIZE
283
+ dirty_total += PAGE_SIZE
284
284
  sys.stdout.write(json.dumps({'page': tuple(pm[k] for k in PAGEMAP_KEYS)}))
285
285
  sys.stdout.write('\n')
286
286
  dct = {
@@ -326,11 +326,11 @@ def _cmp_cmd(args: ta.Any) -> None:
326
326
  r_pages += c_pages
327
327
  dct = {
328
328
  'l_pages': l_pages,
329
- 'l_bytes': l_pages * oos.PAGE_SIZE,
329
+ 'l_bytes': l_pages * PAGE_SIZE,
330
330
  'r_pages': r_pages,
331
- 'r_bytes': r_pages * oos.PAGE_SIZE,
331
+ 'r_bytes': r_pages * PAGE_SIZE,
332
332
  'c_pages': c_pages,
333
- 'c_bytes': c_pages * oos.PAGE_SIZE,
333
+ 'c_bytes': c_pages * PAGE_SIZE,
334
334
  }
335
335
  sys.stdout.write(json.dumps(dct))
336
336
  sys.stdout.write('\n')
omlish/docker/__init__.py CHANGED
@@ -1,37 +0,0 @@
1
- from .cli import ( # noqa
2
- Inspect,
3
- Port,
4
- PsItem,
5
- cli_inspect,
6
- cli_ps,
7
- has_cli,
8
- parse_port,
9
- )
10
-
11
- from .compose import ( # noqa
12
- ComposeConfig,
13
- get_compose_port,
14
- )
15
-
16
- from .helpers import ( # noqa
17
- DOCKER_HOST_PLATFORM_KEY,
18
- get_docker_host_platform,
19
- timebomb_payload,
20
- )
21
-
22
- from .hub import ( # noqa
23
- HubRepoInfo,
24
- get_hub_repo_info,
25
- select_latest_tag,
26
- split_tag_suffix,
27
- )
28
-
29
-
30
- ##
31
-
32
-
33
- from ..lite.docker import ( # noqa
34
- DOCKER_FOR_MAC_HOSTNAME,
35
-
36
- is_likely_in_docker,
37
- )
omlish/docker/all.py ADDED
@@ -0,0 +1,31 @@
1
+ from .cli import ( # noqa
2
+ Inspect,
3
+ Port,
4
+ PsItem,
5
+ cli_inspect,
6
+ cli_ps,
7
+ has_cli,
8
+ parse_port,
9
+ )
10
+
11
+ from .compose import ( # noqa
12
+ ComposeConfig,
13
+ get_compose_port,
14
+ )
15
+
16
+ from .detect import ( # noqa
17
+ DOCKER_HOST_PLATFORM_KEY,
18
+ get_docker_host_platform,
19
+ is_likely_in_docker,
20
+ )
21
+
22
+ from .hub import ( # noqa
23
+ HubRepoInfo,
24
+ get_hub_repo_info,
25
+ select_latest_tag,
26
+ split_tag_suffix,
27
+ )
28
+
29
+ from .timebomb import ( # noqa
30
+ timebomb_payload,
31
+ )
@@ -0,0 +1,4 @@
1
+ # @omlish-lite
2
+
3
+
4
+ DOCKER_FOR_MAC_HOSTNAME = 'docker.for.mac.localhost'
@@ -1,8 +1,23 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
3
+ import os
1
4
  import re
2
5
  import sys
6
+ import typing as ta
3
7
 
4
8
 
5
- DOCKER_FOR_MAC_HOSTNAME = 'docker.for.mac.localhost'
9
+ ##
10
+
11
+
12
+ # Set by pyproject, docker-dev script
13
+ DOCKER_HOST_PLATFORM_KEY = 'DOCKER_HOST_PLATFORM'
14
+
15
+
16
+ def get_docker_host_platform() -> ta.Optional[str]:
17
+ return os.environ.get(DOCKER_HOST_PLATFORM_KEY)
18
+
19
+
20
+ ##
6
21
 
7
22
 
8
23
  _LIKELY_IN_DOCKER_PATTERN = re.compile(r'^overlay / .*/(docker|desktop-containerd)/')
@@ -1,10 +1,6 @@
1
- import os
2
1
  import shlex
3
2
 
4
3
 
5
- ##
6
-
7
-
8
4
  _DEFAULT_TIMEBOMB_NAME = '-'.join([*__name__.split('.'), 'timebomb'])
9
5
 
10
6
 
@@ -16,14 +12,3 @@ def timebomb_payload(delay_s: float, name: str = _DEFAULT_TIMEBOMB_NAME) -> str:
16
12
  'sh -c \'killall5 -9 -o $PPID -o $$ ; kill 1\''
17
13
  ') &'
18
14
  )
19
-
20
-
21
- ##
22
-
23
-
24
- # Set by pyproject, docker-dev script
25
- DOCKER_HOST_PLATFORM_KEY = 'DOCKER_HOST_PLATFORM'
26
-
27
-
28
- def get_docker_host_platform() -> str | None:
29
- return os.environ.get(DOCKER_HOST_PLATFORM_KEY)
omlish/inject/managed.py CHANGED
@@ -14,9 +14,9 @@ from .injector import create_injector
14
14
 
15
15
 
16
16
  if ta.TYPE_CHECKING:
17
- from .. import asyncs as _asyncs
17
+ from ..asyncs import all as _asyncs
18
18
  else:
19
- _asyncs = lang.proxy_import('..asyncs', __package__)
19
+ _asyncs = lang.proxy_import('..asyncs.all', __package__)
20
20
 
21
21
 
22
22
  T = ta.TypeVar('T')
omlish/lite/check.py CHANGED
@@ -14,7 +14,7 @@ T = ta.TypeVar('T')
14
14
  SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
15
15
 
16
16
  CheckMessage = ta.Union[str, ta.Callable[..., ta.Optional[str]], None] # ta.TypeAlias
17
- CheckLateConfigureFn = ta.Callable[['Checks'], None]
17
+ CheckLateConfigureFn = ta.Callable[['Checks'], None] # ta.TypeAlias
18
18
  CheckOnRaiseFn = ta.Callable[[Exception], None] # ta.TypeAlias
19
19
  CheckExceptionFactory = ta.Callable[..., Exception] # ta.TypeAlias
20
20
  CheckArgsRenderer = ta.Callable[..., ta.Optional[str]] # ta.TypeAlias
@@ -13,7 +13,7 @@ from .runtime import is_debugger_attached
13
13
 
14
14
 
15
15
  T = ta.TypeVar('T')
16
- SubprocessChannelOption = ta.Literal['pipe', 'stdout', 'devnull']
16
+ SubprocessChannelOption = ta.Literal['pipe', 'stdout', 'devnull'] # ta.TypeAlias
17
17
 
18
18
 
19
19
  ##
omlish/os/__init__.py ADDED
File without changes
@@ -1,3 +1,4 @@
1
+ # @omlish-lite
1
2
  import ctypes as ct
2
3
  import sys
3
4
 
@@ -1,19 +1,10 @@
1
1
  import contextlib
2
2
  import os
3
- import resource
4
3
  import shutil
5
4
  import tempfile
6
5
  import typing as ta
7
6
 
8
7
 
9
- PAGE_SIZE = resource.getpagesize()
10
-
11
-
12
- def round_to_page_size(sz: int) -> int:
13
- sz += PAGE_SIZE - 1
14
- return sz - (sz % PAGE_SIZE)
15
-
16
-
17
8
  @contextlib.contextmanager
18
9
  def tmp_dir(
19
10
  root_dir: str | None = None,
@@ -1,4 +1,5 @@
1
1
  # ruff: noqa: UP007 UP012
2
+ # @omlish-lite
2
3
  import ctypes as ct
3
4
  import logging
4
5
  import sys
@@ -6,7 +7,7 @@ import syslog
6
7
  import threading
7
8
  import typing as ta
8
9
 
9
- from .cached import cached_nullary
10
+ from ..lite.cached import cached_nullary
10
11
 
11
12
 
12
13
  ##
@@ -1,4 +1,5 @@
1
1
  # ruff: noqa: UP007
2
+ # @omlish-lite
2
3
  import fcntl
3
4
  import os
4
5
  import signal
omlish/os/sizes.py ADDED
@@ -0,0 +1,9 @@
1
+ import resource
2
+
3
+
4
+ PAGE_SIZE = resource.getpagesize()
5
+
6
+
7
+ def round_to_page_size(sz: int) -> int:
8
+ sz += PAGE_SIZE - 1
9
+ return sz - (sz % PAGE_SIZE)
@@ -9,7 +9,7 @@ import typing as ta
9
9
  import sqlalchemy as sa
10
10
  import sqlalchemy.ext.asyncio as saa
11
11
 
12
- from ... import asyncs as au
12
+ from ...asyncs import all as au
13
13
 
14
14
 
15
15
  T = ta.TypeVar('T')
@@ -10,8 +10,8 @@ import pytest
10
10
 
11
11
  from .... import check
12
12
  from .... import collections as col
13
- from .... import docker
14
13
  from .... import lang
14
+ from ....docker import all as docker
15
15
  from ._registry import register
16
16
 
17
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev150
3
+ Version: 0.0.0.dev152
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=RX24SRc6DCEg77PUVnaXOKCWa5TF_c9RQJdGIf7gl9c,1135
2
- omlish/__about__.py,sha256=4aEYKTBS4r1TTWZrwKdO_g9CF9j1lXrJLKEFEBaSHxo,3409
2
+ omlish/__about__.py,sha256=Ns9xWW8wbI1DTKwID9EOPabBkKEIOnxYGWygqeQ6Z94,3409
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
5
5
  omlish/cached.py,sha256=UI-XTFBwA6YXWJJJeBn-WkwBkfzDjLBBaZf4nIJA9y0,510
@@ -10,7 +10,6 @@ omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
10
10
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
11
11
  omlish/libc.py,sha256=8r7Ejyhttk9ruCfBkxNTrlzir5WPbDE2vmY7VPlceMA,15362
12
12
  omlish/multiprocessing.py,sha256=QZT4C7I-uThCAjaEY3xgUYb-5GagUlnE4etN01LDyU4,5186
13
- omlish/os.py,sha256=5nJ-a9JKSMoaZVZ1eOa5BAbfL7o7CF7ue_PyJwufnwY,1460
14
13
  omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
15
14
  omlish/sync.py,sha256=QJ79kxmIqDP9SeHDoZAf--DpFIhDQe1jACy8H4N0yZI,2928
16
15
  omlish/term.py,sha256=BXJSE9gfM461bh4z_gysx0oavZSafqcQs5ayZK-kTUo,9284
@@ -76,8 +75,9 @@ omlish/antlr/_runtime/xpath/XPathLexer.py,sha256=xFtdr4ZXMZxb2dnB_ggWyhvlQiC7RXQ
76
75
  omlish/antlr/_runtime/xpath/__init__.py,sha256=lMd_BbXYdlDhZQN_q0TKN978XW5G0pq618F0NaLkpFE,71
77
76
  omlish/argparse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
77
  omlish/argparse/all.py,sha256=EfUSf27vFWqa4Q93AycU5YRsrHt-Nx3pU3uNVapb-EE,1054
79
- omlish/argparse/cli.py,sha256=cnF_WfAqt_0BIEyF4Xxh4yVkaCc5Mi83GfwIKwwytuM,7436
80
- omlish/asyncs/__init__.py,sha256=uUz9ziKh4_QrgmdhKFMgq6j7mFbiZd3LiogguDCQsGI,587
78
+ omlish/argparse/cli.py,sha256=RrFql1bS1Lw3GA1ooLCJDQX4bK_Ci-dDqD5nEkVgHGI,8072
79
+ omlish/asyncs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ omlish/asyncs/all.py,sha256=uUz9ziKh4_QrgmdhKFMgq6j7mFbiZd3LiogguDCQsGI,587
81
81
  omlish/asyncs/anyio.py,sha256=gfpx-D8QGmUfhnQxHEaHXcAP8zSMQjcGw4COFTGNnHI,8021
82
82
  omlish/asyncs/asyncio.py,sha256=JfM59QgB3asgEbrps0zoVbNjWD4kL2XdsEkRMEIoFos,971
83
83
  omlish/asyncs/asyncs.py,sha256=Tf7ZodTGepkM7HAuFcDNh9lLzzrMw6rELWvopGmFkh4,2035
@@ -92,7 +92,7 @@ omlish/bootstrap/diag.py,sha256=iemH0nQEHEDzyZztvd_ygGGVpRpgn5UG6naxeQTvXp0,5347
92
92
  omlish/bootstrap/harness.py,sha256=VW8YP-yENGyXIuJ8GL_xintArF13nafwpz-iAghPt34,1967
93
93
  omlish/bootstrap/main.py,sha256=yZhOHDDlj4xB5a89dRdT8z58FsqqnpoBg1-tvY2CJe4,5903
94
94
  omlish/bootstrap/marshal.py,sha256=ZxdAeMNd2qXRZ1HUK89HmEhz8tqlS9OduW34QBscKw0,516
95
- omlish/bootstrap/sys.py,sha256=iLHUNIuIPv-k-Mc6aHj5sSET78olCVt7t0HquFDO4iQ,8762
95
+ omlish/bootstrap/sys.py,sha256=S6HgjfCKYNuC_iW6gIJNVp8-eJ_wm0JTBMyQRZLE6eQ,8758
96
96
  omlish/collections/__init__.py,sha256=zeUvcAz073ekko37QKya6sElTMfKTuF1bKrdbMtaRpI,2142
97
97
  omlish/collections/abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
98
98
  omlish/collections/coerce.py,sha256=g68ROb_-5HgH-vI8612mU2S0FZ8-wp2ZHK5_Zy_kVC0,7037
@@ -151,7 +151,7 @@ omlish/dataclasses/impl/utils.py,sha256=aER2iL3UAtgS1BdLuEvTr9Tr2wC28wk1kiOeO-jI
151
151
  omlish/diag/__init__.py,sha256=4S8v0myJM4Zld6_FV6cPe_nSv0aJb6kXftEit0HkiGE,1141
152
152
  omlish/diag/asts.py,sha256=BveUUNUcaAm4Hg55f4ZxGSI313E4L8cCZ5XjHpEkKVI,3325
153
153
  omlish/diag/debug.py,sha256=ClED7kKXeVMyKrjGIxcq14kXk9kvUJfytBQwK9y7c4Q,1637
154
- omlish/diag/procfs.py,sha256=vBovaMvAUKdl7FbtFq3TNsSmdhs8DaYfhoEsKeWYta8,9704
154
+ omlish/diag/procfs.py,sha256=KaGTAA2Gj8eEEp7MjClRe4aimwzd-HDABThFzvq2cBQ,9684
155
155
  omlish/diag/procstats.py,sha256=UkqxREqfd-38xPYZ9T1SIJISz5ARQCEhTtOZrxtm2dE,777
156
156
  omlish/diag/ps.py,sha256=1JWxZen3fVG-20R6ZZ8BtO_gpzw_5bhHZiKdoHkgxoU,1004
157
157
  omlish/diag/pycharm.py,sha256=7-r_F-whXt8v-0dehxAX-MeMFPM3iZXX9IfeL0GfUtk,4643
@@ -169,12 +169,15 @@ omlish/dispatch/_dispatch3.py,sha256=Vnu5DfoPWFJLodudBqoZBXGTi2wYk-Az56MXJgdQvwc
169
169
  omlish/dispatch/dispatch.py,sha256=8XQiLVoAq4u2oO0DnDSXQB9Q5qDk569l4CIFBqwDSyc,3847
170
170
  omlish/dispatch/functions.py,sha256=S8ElsLi6DKxTdtFGigWaF0vAquwy2sK-3f4iRLaYq70,1522
171
171
  omlish/dispatch/methods.py,sha256=XHjwwC9Gn4iDWxbyLAcbdSwRgVaq-8Bnn5cAwf5oZdA,5403
172
- omlish/docker/__init__.py,sha256=TK2UOuawDMDbsdANLtGfOPpKQbDQf-rU2fXneb9elxw,528
172
+ omlish/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
+ omlish/docker/all.py,sha256=2BqXMehpqj4j6-rVq_iOMcjoWgw4oyC3jWeHd_jPOZo,487
173
174
  omlish/docker/cli.py,sha256=gtb9kitVfGnd4cr587NsVVk8D5Ok5y5SAsqD_SwGrSA,2565
174
175
  omlish/docker/compose.py,sha256=4drmnGQzbkOFJ9B6XSg9rnXkJeZz1ETmdcMe1PE790U,1237
175
- omlish/docker/helpers.py,sha256=dGmCSDd-Rpdu3YCdyVEaTx_8GdbXGR4lw12ctyGPxzg,552
176
+ omlish/docker/consts.py,sha256=wvwfUtEFrEWZKfREWqSMrx8xjjl8P5MNUSF6qzzgJHY,70
177
+ omlish/docker/detect.py,sha256=Qrdbosm2wJkxKDuy8gaGmbQoxk4Wnp1HJjAEz58NA8Y,614
176
178
  omlish/docker/hub.py,sha256=7LIuJGdA-N1Y1dmo50ynKM1KUTcnQM_5XbtPbdT_QLU,3940
177
179
  omlish/docker/manifests.py,sha256=LR4FpOGNUT3bZQ-gTjB6r_-1C3YiG30QvevZjrsVUQM,7068
180
+ omlish/docker/timebomb.py,sha256=A_pgIDaXKsQwPiikrCTgIJl91gwYqkPGFY6j-Naq07Q,342
178
181
  omlish/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
182
  omlish/formats/dotenv.py,sha256=qoDG4Ayu7B-8LjBBhcmNiLZW0_9LgCi3Ri2aPo9DEQ8,19314
180
183
  omlish/formats/props.py,sha256=cek3JLFLIrpE76gvs8rs_B8yF4SpY8ooDH8apWsquwE,18953
@@ -243,7 +246,7 @@ omlish/inject/injector.py,sha256=CoCUeMm1Oot4sG4Ti1sKCWrhlvtJ5QAeAI22AFWu2RQ,106
243
246
  omlish/inject/inspect.py,sha256=tw49r1RJVHrEHmT8WWA3_Bl9Z0L3lEGRqlLhbM5OmAM,592
244
247
  omlish/inject/keys.py,sha256=BczsGcNvoziQYggGKX3_XpRZQ3b0F_pYWSDLBg5lRvE,654
245
248
  omlish/inject/listeners.py,sha256=AIWUs4OTUPeURU1tS2CXeEbJwC1bZiuya9K6I2ElMns,581
246
- omlish/inject/managed.py,sha256=Ls54Ah5KDrLHYWmso64xipvCLWPcgl1sUOn2n1tuWag,2107
249
+ omlish/inject/managed.py,sha256=ASHaY57v9POUOpwgCiinTbE14U28ysl3D6RcFkLfcOQ,2114
247
250
  omlish/inject/multis.py,sha256=a3DparPZjLdkAYFuEFTI6kM3BhNpJbtjeAMRdbeJx0c,3363
248
251
  omlish/inject/origins.py,sha256=OVQkiuRxx6ZtE8ZliufdndtFexcfpj-wZSDkUeGUCYM,534
249
252
  omlish/inject/overrides.py,sha256=hrm243slCw_DDRbn3dK5QK1jfHezVokG-WYO2JaQOV8,535
@@ -326,17 +329,13 @@ omlish/lifecycles/states.py,sha256=zqMOU2ZU-MDNnWuwauM3_anIAiXM8LoBDElDEraptFg,1
326
329
  omlish/lifecycles/transitions.py,sha256=qQtFby-h4VzbvgaUqT2NnbNumlcOx9FVVADP9t83xj4,1939
327
330
  omlish/lite/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
328
331
  omlish/lite/cached.py,sha256=hBW77-F7ZLtFqbLwVrlqaJ4-iFHMQleMWZXaZN1IubA,1308
329
- omlish/lite/check.py,sha256=tPTF6TGWOHb683apClolpJFuZ4_XuomlbsExfF_KJuw,12861
332
+ omlish/lite/check.py,sha256=tAKB99X_oHG3JADUgZXMdPzgN8aNF9UBuJv4WeSgM_A,12877
330
333
  omlish/lite/contextmanagers.py,sha256=4tKuBYyxn-aI31QowIuClHgpML8JsdzCW3j5ms_-uuY,1418
331
- omlish/lite/deathsig.py,sha256=Etz04WX6R2PXQ-BgqJyVJ0C5Pqym6Ds6PAG7p1cqr5o,626
332
- omlish/lite/docker.py,sha256=Dj_7lQjs2sFPc_SmUn5CpJF3LnQQnckEBYGBKz8u5tE,392
333
334
  omlish/lite/inject.py,sha256=729Qi0TLbQgBtkvx97q1EUMe73VFYA1hu4woXkOTcwM,23572
334
- omlish/lite/journald.py,sha256=f5Y2Q6-6O3iK_7MoGiwZwoQEOcP7LfkxxQNUR9tMjJM,3882
335
335
  omlish/lite/json.py,sha256=7-02Ny4fq-6YAu5ynvqoijhuYXWpLmfCI19GUeZnb1c,740
336
336
  omlish/lite/logs.py,sha256=1pcGu0ekhVCcLUckLSP16VccnAoprjtl5Vkdfm7y1Wg,6184
337
337
  omlish/lite/marshal.py,sha256=6dCv_H4MF0BgzQ1XfIn30eE5jr4S96IfDi7anbBFl2c,13485
338
338
  omlish/lite/maybes.py,sha256=7OlHJ8Q2r4wQ-aRbZSlJY7x0e8gDvufFdlohGEIJ3P4,833
339
- omlish/lite/pidfile.py,sha256=PRSDOAXmNkNwxh-Vwif0Nrs8RAmWroiNhLKIbdjwzBc,1723
340
339
  omlish/lite/pycharm.py,sha256=pUOJevrPClSqTCEOkQBO11LKX2003tfDcp18a03QFrc,1163
341
340
  omlish/lite/reflect.py,sha256=ad_ya_zZJOQB8HoNjs9yc66R54zgflwJVPJqiBXMzqA,1681
342
341
  omlish/lite/resources.py,sha256=YNSmX1Ohck1aoWRs55a-o5ChVbFJIQhtbqE-XwF55Oc,326
@@ -345,7 +344,7 @@ omlish/lite/secrets.py,sha256=3Mz3V2jf__XU9qNHcH56sBSw95L3U2UPL24bjvobG0c,816
345
344
  omlish/lite/socket.py,sha256=7OYgkXTcQv0wq7TQuLnl9y6dJA1ZT6Vbc1JH59QlxgY,1792
346
345
  omlish/lite/socketserver.py,sha256=doTXIctu_6c8XneFtzPFVG_Wq6xVmA3p9ymut8IvBoU,1586
347
346
  omlish/lite/strings.py,sha256=QURcE4-1pKVW8eT_5VCJpXaHDWR2dW2pYOChTJnZDiQ,1504
348
- omlish/lite/subprocesses.py,sha256=RTs8HJ1Lz8YOZTHw12Ja8KW7Eq4oyDFJZDiG0PSUBKY,4918
347
+ omlish/lite/subprocesses.py,sha256=iN-HX44g9uxkZ7HII2Upvkfjp7YK6qQuhPrBqM4Hnp0,4934
349
348
  omlish/lite/typing.py,sha256=U3-JaEnkDSYxK4tsu_MzUn3RP6qALBe5FXQXpD-licE,1090
350
349
  omlish/lite/asyncio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
351
350
  omlish/lite/asyncio/asyncio.py,sha256=tsqQSLl5rG4GZHPYOBqI7V2yuw45ZVuGZEHe-J4QEhE,1320
@@ -394,6 +393,12 @@ omlish/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
394
393
  omlish/math/bits.py,sha256=yip1l8agOYzT7bFyMGc0RR3XlnGCfHMpjw_SECLLh1I,3477
395
394
  omlish/math/floats.py,sha256=UimhOT7KRl8LXTzOI5cQWoX_9h6WNWe_3vcOuO7-h_8,327
396
395
  omlish/math/stats.py,sha256=MegzKVsmv2kra4jDWLOUgV0X7Ee2Tbl5u6ql1v4-dEY,10053
396
+ omlish/os/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
397
+ omlish/os/deathsig.py,sha256=hk9Yq2kyDdI-cI7OQH7mOfpRbOKzY_TfPKEqgrjVYbA,641
398
+ omlish/os/files.py,sha256=1tNy1z5I_CgYKA5c6lOfsXc-hknP4tQDbSShdz8HArw,1308
399
+ omlish/os/journald.py,sha256=2nI8Res1poXkbLc31--MPUlzYMESnCcPUkIxDOCjZW0,3903
400
+ omlish/os/pidfile.py,sha256=S4Nbe00oSxckY0qCC9AeTEZe7NSw4eJudnQX7wCXzks,1738
401
+ omlish/os/sizes.py,sha256=ohkALLvqSqBX4iR-7DMKJ4pfOCRdZXV8htH4QywUNM0,152
397
402
  omlish/reflect/__init__.py,sha256=4-EuCSX1qpEWfScCFzAJv_XghHFu4cXxpxKeBKrosQ4,720
398
403
  omlish/reflect/inspect.py,sha256=veJ424-9oZrqyvhVpvxOi7hcKW-PDBkdYL2yjrFlk4o,495
399
404
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
@@ -455,7 +460,7 @@ omlish/sql/dbs.py,sha256=lpdFmm2vTwLoBiVYGj9yPsVcTEYYNCxlYZZpjfChzkY,1870
455
460
  omlish/sql/params.py,sha256=Z4VPet6GhNqD1T_MXSWSHkdy3cpUEhST-OplC4B_fYI,4433
456
461
  omlish/sql/qualifiedname.py,sha256=rlW3gVmyucJbqwcxj_7BfK4X2HoXrMroZT2H45zPgJQ,2264
457
462
  omlish/sql/alchemy/__init__.py,sha256=1ruDMiviH5fjevn2xVki-QspcE9O3VPy4hxOqpHjI2s,224
458
- omlish/sql/alchemy/asyncs.py,sha256=C1bIzz9m2Qbgl4qYGQt_FRQg4BKRcxUqMsVg9RtnTPg,3689
463
+ omlish/sql/alchemy/asyncs.py,sha256=MwZwWIaZsUCQLcTA8mdHUPZmR-pXEVSAsvd15FCm3W4,3692
459
464
  omlish/sql/alchemy/duckdb.py,sha256=kr7pIhiBLNAuZrcigHDtFg9zHkVcrRW3LfryO9VJ4mk,3749
460
465
  omlish/sql/alchemy/exprs.py,sha256=gO4Fj4xEY-PuDgV-N8hBMy55glZz7O-4H7v1LWabfZY,323
461
466
  omlish/sql/alchemy/secrets.py,sha256=EMfy4EfTbEvrlv_41oOhn8qsoF-eTkY7HciPenIE6rI,178
@@ -501,7 +506,7 @@ omlish/testing/pytest/plugins/pydevd.py,sha256=AXtN83M39ZKJ4VH3MJEhvPnAmYzD5u1r8
501
506
  omlish/testing/pytest/plugins/repeat.py,sha256=flSQzE9GFOWksVKz-mUGnpxJpv3yRqn1G4K8pW7JHs0,498
502
507
  omlish/testing/pytest/plugins/skips.py,sha256=EoZDg1uWccgbAegmzqI85c7RliycD1e2J4Y7vfDRhwM,1041
503
508
  omlish/testing/pytest/plugins/spacing.py,sha256=JQQhi9q3c523Ro1a_K_9RGAb7HotiO74N8bYX2VESFE,707
504
- omlish/testing/pytest/plugins/switches.py,sha256=hqFYM6tCcr-6fAPg8DBI-TJn762Kq4EUFt6gjXgiAQQ,3802
509
+ omlish/testing/pytest/plugins/switches.py,sha256=CflHe6gLhkLt_9OcAmzskuZsrhZhwOuL_bIdogibARc,3815
505
510
  omlish/testing/pytest/plugins/utils.py,sha256=L5C622UXcA_AUKDcvyh5IMiRfqSGGz0McdhwZWvfMlU,261
506
511
  omlish/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
507
512
  omlish/text/asdl.py,sha256=AS3irh-sag5pqyH3beJif78PjCbOaFso1NeKq-HXuTs,16867
@@ -510,9 +515,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
510
515
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
511
516
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
512
517
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
513
- omlish-0.0.0.dev150.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
514
- omlish-0.0.0.dev150.dist-info/METADATA,sha256=Y1BEzqnhyp1_EQkLHicJ6k0_ey5GHni1wObkf9FCM2o,4264
515
- omlish-0.0.0.dev150.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
516
- omlish-0.0.0.dev150.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
517
- omlish-0.0.0.dev150.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
518
- omlish-0.0.0.dev150.dist-info/RECORD,,
518
+ omlish-0.0.0.dev152.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
519
+ omlish-0.0.0.dev152.dist-info/METADATA,sha256=uBMDbkXKL4n5VAP4o0TmBKEkOBfv549S6LO7Xo_AXCQ,4264
520
+ omlish-0.0.0.dev152.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
521
+ omlish-0.0.0.dev152.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
522
+ omlish-0.0.0.dev152.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
523
+ omlish-0.0.0.dev152.dist-info/RECORD,,