omlish 0.0.0.dev150__py3-none-any.whl → 0.0.0.dev152__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
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,,