omlish 0.0.0.dev38__py3-none-any.whl → 0.0.0.dev40__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.dev38'
2
- __revision__ = 'ff24c9ed55c341bfc1359f26dcd421346f5822ba-dirty'
1
+ __version__ = '0.0.0.dev40'
2
+ __revision__ = '12eed3861e67278bb050cec10f1ebd2296c0bbe9-dirty'
3
3
 
4
4
 
5
5
  #
@@ -40,7 +40,8 @@ class Project(ProjectBase):
40
40
  ],
41
41
 
42
42
  'compress': [
43
- 'lz4 ~= 4.0',
43
+ 'lz4 ~= 4.3',
44
+ # 'lz4 @ git+https://github.com/wrmsr/python-lz4@wrmsr_20240830_GIL_NOT_USED'
44
45
 
45
46
  'python-snappy ~= 0.7; python_version < "3.13"',
46
47
 
@@ -83,7 +84,7 @@ class Project(ProjectBase):
83
84
  'sqlalchemy[asyncio] ~= 2.0',
84
85
  ],
85
86
 
86
- 'sqlalchemy-drivers': [
87
+ 'sqldrivers': [
87
88
  'pg8000 ~= 1.31',
88
89
  # 'psycopg2 ~= 2.9',
89
90
  # 'psycopg ~= 3.2',
@@ -96,6 +97,8 @@ class Project(ProjectBase):
96
97
  'aiosqlite ~= 0.20',
97
98
  'asyncpg ~= 0.29; python_version < "3.13"',
98
99
 
100
+ 'apsw ~= 3.46',
101
+
99
102
  'sqlean.py ~= 3.45; python_version < "3.13"',
100
103
 
101
104
  'duckdb ~= 1.1',
omlish/argparse.py CHANGED
@@ -73,7 +73,7 @@ class Command:
73
73
 
74
74
  def __post_init__(self) -> None:
75
75
  check.isinstance(self.name, str)
76
- check.not_in('-', self.name)
76
+ check.not_in('_', self.name)
77
77
  check.not_empty(self.name)
78
78
 
79
79
  check.callable(self.fn)
@@ -103,7 +103,7 @@ def command(
103
103
 
104
104
  def inner(fn):
105
105
  return Command(
106
- (name if name is not None else fn.__name__).replace('-', '_'),
106
+ (name if name is not None else fn.__name__).replace('_', '-'),
107
107
  fn,
108
108
  args,
109
109
  parent=parent,
omlish/bootstrap/base.py CHANGED
@@ -2,7 +2,7 @@ import abc
2
2
  import dataclasses as dc
3
3
  import typing as ta
4
4
 
5
- from omlish import lang
5
+ from .. import lang
6
6
 
7
7
 
8
8
  BootstrapConfigT = ta.TypeVar('BootstrapConfigT', bound='Bootstrap.Config')
omlish/c3.py CHANGED
@@ -43,7 +43,8 @@ T = ta.TypeVar('T')
43
43
 
44
44
 
45
45
  def merge(seqs: ta.MutableSequence[list[T]]) -> list[T]:
46
- """Merges MROs in *sequences* to a single MRO using the C3 algorithm.
46
+ """
47
+ Merges MROs in *sequences* to a single MRO using the C3 algorithm.
47
48
 
48
49
  Adapted from https://www.python.org/download/releases/2.3/mro/.
49
50
  """
@@ -78,7 +79,8 @@ def mro(
78
79
  get_bases: ta.Callable[[T], ta.Sequence[T]] = operator.attrgetter('__bases__'),
79
80
  is_subclass: ta.Callable[[T, T], bool] = issubclass, # type: ignore
80
81
  ) -> list[T]:
81
- """Computes the method resolution order using extended C3 linearization.
82
+ """
83
+ Computes the method resolution order using extended C3 linearization.
82
84
 
83
85
  If no *abcs* are given, the algorithm works exactly like the built-in C3 linearization used for method resolution.
84
86
 
@@ -128,7 +130,8 @@ def compose_mro(
128
130
  is_subclass: ta.Callable[[T, T], bool] = issubclass, # type: ignore
129
131
  get_subclasses: ta.Callable[[T], ta.Iterable[T]] = operator.methodcaller('__subclasses__'),
130
132
  ) -> list[T]:
131
- """Calculates the method resolution order for a given class *cls*.
133
+ """
134
+ Calculates the method resolution order for a given class *cls*.
132
135
 
133
136
  Includes relevant abstract base classes (with their respective bases) from the *types* list. Uses a modified C3
134
137
  linearization algorithm.
omlish/check.py CHANGED
@@ -44,41 +44,49 @@ def unregister_on_raise(fn: OnRaiseFn) -> None:
44
44
  #
45
45
 
46
46
 
47
- _render_args: ta.Callable[..., str | None] | None = None
47
+ _ARGS_RENDERER: ta.Callable[..., str | None] | None = None
48
48
 
49
49
 
50
- def enable_args_rendering() -> bool:
51
- global _render_args
52
- if _render_args is not None:
50
+ def _try_enable_args_rendering() -> bool:
51
+ global _ARGS_RENDERER
52
+ if _ARGS_RENDERER is not None:
53
53
  return True
54
54
 
55
- with _CONFIG_LOCK:
56
- if _render_args is not None:
57
- return True # type: ignore
55
+ try:
56
+ from .diag.asts import ArgsRenderer
58
57
 
59
- try:
60
- from .diag.asts import ArgsRenderer
58
+ ArgsRenderer.smoketest()
61
59
 
62
- ArgsRenderer.smoketest()
60
+ except Exception: # noqa
61
+ return False
63
62
 
64
- except Exception: # noqa
65
- return False
63
+ def _real_render_args(fmt: str, *args: ta.Any) -> str | None:
64
+ ra = ArgsRenderer(back=3).render_args(*args)
65
+ if ra is None:
66
+ return None
66
67
 
67
- def _real_render_args(fmt: str, *args: ta.Any) -> str | None:
68
- ra = ArgsRenderer(back=3).render_args(*args)
69
- if ra is None:
70
- return None
68
+ return fmt % tuple(str(a) for a in ra)
71
69
 
72
- return fmt % tuple(str(a) for a in ra)
70
+ _ARGS_RENDERER = _real_render_args
71
+ return True
73
72
 
74
- _render_args = _real_render_args
75
- return True
76
73
 
74
+ _TRIED_ENABLED_ARGS_RENDERING: bool | None = None
77
75
 
78
- enable_args_rendering()
79
76
 
77
+ def try_enable_args_rendering() -> bool:
78
+ global _TRIED_ENABLED_ARGS_RENDERING
79
+ if _TRIED_ENABLED_ARGS_RENDERING is not None:
80
+ return _TRIED_ENABLED_ARGS_RENDERING
80
81
 
81
- #
82
+ with _CONFIG_LOCK:
83
+ if _TRIED_ENABLED_ARGS_RENDERING is None:
84
+ _TRIED_ENABLED_ARGS_RENDERING = _try_enable_args_rendering()
85
+
86
+ return _TRIED_ENABLED_ARGS_RENDERING
87
+
88
+
89
+ ##
82
90
 
83
91
 
84
92
  def _default_exception_factory(exc_cls: type[Exception], *args, **kwargs) -> Exception:
@@ -111,8 +119,8 @@ def _raise(
111
119
  if message is None:
112
120
  message = default_message
113
121
 
114
- if render_fmt is not None and _render_args is not None:
115
- rendered_args = _render_args(render_fmt, *ak.args)
122
+ if render_fmt is not None and _ARGS_RENDERER is not None:
123
+ rendered_args = _ARGS_RENDERER(render_fmt, *ak.args)
116
124
  if rendered_args is not None:
117
125
  message = f'{message} : {rendered_args}'
118
126
 
@@ -124,6 +132,8 @@ def _raise(
124
132
  **ak.kwargs,
125
133
  )
126
134
 
135
+ try_enable_args_rendering()
136
+
127
137
  for fn in _ON_RAISE:
128
138
  fn(exc)
129
139
 
@@ -7,7 +7,7 @@ import abc
7
7
  import dataclasses as dc
8
8
  import typing as ta
9
9
 
10
- from omlish import lang
10
+ from .. import lang
11
11
 
12
12
 
13
13
  if ta.TYPE_CHECKING:
omlish/diag/pycharm.py CHANGED
@@ -9,9 +9,9 @@ from .. import lang
9
9
 
10
10
 
11
11
  if ta.TYPE_CHECKING:
12
- docker = lang.proxy_import('omlish.docker')
12
+ docker = lang.proxy_import('..docker')
13
13
  else:
14
- from omlish import docker
14
+ from .. import docker
15
15
 
16
16
 
17
17
  ##
omlish/docker.py CHANGED
@@ -159,7 +159,10 @@ def get_compose_port(cfg: ta.Mapping[str, ta.Any], default: int) -> int:
159
159
  ##
160
160
 
161
161
 
162
- def timebomb_payload(delay_s: float, name: str = 'omlish-docker-timebomb') -> str:
162
+ _DEFAULT_TIMEBOMB_NAME = '-'.join([*__name__.split('.'), 'timebomb'])
163
+
164
+
165
+ def timebomb_payload(delay_s: float, name: str = _DEFAULT_TIMEBOMB_NAME) -> str:
163
166
  return (
164
167
  '('
165
168
  f'echo {shlex.quote(name)} && '
@@ -1,11 +1,11 @@
1
1
  import operator
2
2
  import typing as ta
3
3
 
4
- from omlish import cached
5
- from omlish import check
6
- from omlish import collections as col
7
- from omlish import dataclasses as dc
8
- from omlish import lang
4
+ from .... import cached
5
+ from .... import check
6
+ from .... import collections as col
7
+ from .... import dataclasses as dc
8
+ from .... import lang
9
9
 
10
10
 
11
11
  KeywordT = ta.TypeVar('KeywordT', bound='Keyword')
@@ -1,5 +1,4 @@
1
- from omlish import lang
2
-
1
+ from .... import lang
3
2
  from .base import Keyword
4
3
  from .base import StrKeyword
5
4
 
@@ -1,5 +1,4 @@
1
- from omlish import lang
2
-
1
+ from .... import lang
3
2
  from .base import Keyword
4
3
  from .base import StrKeyword
5
4
 
@@ -1,10 +1,9 @@
1
1
  import operator
2
2
  import typing as ta
3
3
 
4
- from omlish import check
5
- from omlish import collections as col
6
- from omlish import lang
7
-
4
+ from .... import check
5
+ from .... import collections as col
6
+ from .... import lang
8
7
  from . import core # noqa
9
8
  from . import metadata # noqa
10
9
  from . import validation # noqa
@@ -1,5 +1,4 @@
1
- from omlish import lang
2
-
1
+ from .... import lang
3
2
  from .base import BooleanKeyword
4
3
  from .base import Keyword
5
4
  from .base import KeywordsKeyword
@@ -4,11 +4,9 @@ from .helpers import ( # noqa
4
4
 
5
5
  from .marks import ( # noqa
6
6
  drain_asyncio,
7
- skip_if_cant_import,
8
- skip_if_nogil,
9
- skip_if_not_on_path,
10
- skip_if_python_version_less_than,
11
7
  )
12
8
 
9
+ from . import skip # noqa
10
+
13
11
  # Imported for convenience in things that import this but not lang.
14
12
  from ...lang import breakpoint_on_exception # noqa
@@ -1,44 +1,17 @@
1
- import shutil
2
- import sys
3
- import sysconfig
4
1
  import typing as ta
5
2
 
6
3
  import pytest
7
4
 
8
5
  from ... import lang # noqa
9
- from ..testing import can_import
10
6
  from .plugins.managermarks import ManagerMark # noqa
11
7
 
12
8
 
13
9
  if ta.TYPE_CHECKING:
14
10
  from ...asyncs import asyncio as aiu
15
-
16
11
  else:
17
12
  aiu = lang.proxy_import('...asyncs.asyncio', __package__)
18
13
 
19
14
 
20
- def skip_if_cant_import(module: str, *args, **kwargs):
21
- return pytest.mark.skipif(not can_import(module, *args, **kwargs), reason=f'requires import {module}')
22
-
23
-
24
- def skip_if_not_on_path(exe: str):
25
- return pytest.mark.skipif(shutil.which(exe) is None, reason=f'requires exe on path {exe}')
26
-
27
-
28
- def skip_if_python_version_less_than(num: ta.Sequence[int]):
29
- return pytest.mark.skipif(sys.version_info < tuple(num), reason=f'python version {tuple(sys.version_info)} < {tuple(num)}') # noqa
30
-
31
-
32
- def skip_if_not_single():
33
- # FIXME
34
- # [resolve_collection_argument(a) for a in session.config.args]
35
- raise NotImplementedError
36
-
37
-
38
- def skip_if_nogil():
39
- return pytest.mark.skipif(sysconfig.get_config_var('Py_GIL_DISABLED'), reason='requires gil build')
40
-
41
-
42
15
  class drain_asyncio(ManagerMark): # noqa
43
16
  def __call__(self, item: pytest.Function) -> ta.Iterator[None]:
44
17
  with aiu.draining_asyncio_tasks():
@@ -0,0 +1,30 @@
1
+ import shutil
2
+ import sys
3
+ import sysconfig
4
+ import typing as ta
5
+
6
+ import pytest
7
+
8
+ from ..testing import can_import
9
+
10
+
11
+ def if_cant_import(module: str, *args, **kwargs):
12
+ return pytest.mark.skipif(not can_import(module, *args, **kwargs), reason=f'requires import {module}')
13
+
14
+
15
+ def if_not_on_path(exe: str):
16
+ return pytest.mark.skipif(shutil.which(exe) is None, reason=f'requires exe on path {exe}')
17
+
18
+
19
+ def if_python_version_less_than(num: ta.Sequence[int]):
20
+ return pytest.mark.skipif(sys.version_info < tuple(num), reason=f'python version {tuple(sys.version_info)} < {tuple(num)}') # noqa
21
+
22
+
23
+ def if_not_single():
24
+ # FIXME
25
+ # [resolve_collection_argument(a) for a in session.config.args]
26
+ raise NotImplementedError
27
+
28
+
29
+ def if_nogil():
30
+ return pytest.mark.skipif(sysconfig.get_config_var('Py_GIL_DISABLED'), reason='requires gil build')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev38
3
+ Version: 0.0.0.dev40
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -18,7 +18,7 @@ Requires-Dist: sniffio ~=1.3 ; extra == 'all'
18
18
  Requires-Dist: greenlet ~=3.1 ; extra == 'all'
19
19
  Requires-Dist: trio ~=0.26 ; extra == 'all'
20
20
  Requires-Dist: trio-asyncio ~=0.15 ; extra == 'all'
21
- Requires-Dist: lz4 ~=4.0 ; extra == 'all'
21
+ Requires-Dist: lz4 ~=4.3 ; extra == 'all'
22
22
  Requires-Dist: zstd ~=1.5 ; extra == 'all'
23
23
  Requires-Dist: asttokens ~=2.4 ; extra == 'all'
24
24
  Requires-Dist: executing ~=2.1 ; extra == 'all'
@@ -37,6 +37,7 @@ Requires-Dist: pg8000 ~=1.31 ; extra == 'all'
37
37
  Requires-Dist: pymysql ~=1.1 ; extra == 'all'
38
38
  Requires-Dist: aiomysql ~=0.2 ; extra == 'all'
39
39
  Requires-Dist: aiosqlite ~=0.20 ; extra == 'all'
40
+ Requires-Dist: apsw ~=3.46 ; extra == 'all'
40
41
  Requires-Dist: duckdb ~=1.1 ; extra == 'all'
41
42
  Requires-Dist: pytest ~=8.0 ; extra == 'all'
42
43
  Requires-Dist: python-snappy ~=0.7 ; (python_version < "3.13") and extra == 'all'
@@ -49,7 +50,7 @@ Requires-Dist: greenlet ~=3.1 ; extra == 'async'
49
50
  Requires-Dist: trio ~=0.26 ; extra == 'async'
50
51
  Requires-Dist: trio-asyncio ~=0.15 ; extra == 'async'
51
52
  Provides-Extra: compress
52
- Requires-Dist: lz4 ~=4.0 ; extra == 'compress'
53
+ Requires-Dist: lz4 ~=4.3 ; extra == 'compress'
53
54
  Requires-Dist: zstd ~=1.5 ; extra == 'compress'
54
55
  Requires-Dist: python-snappy ~=0.7 ; (python_version < "3.13") and extra == 'compress'
55
56
  Provides-Extra: diag
@@ -71,14 +72,15 @@ Provides-Extra: secrets
71
72
  Requires-Dist: cryptography ~=43.0 ; extra == 'secrets'
72
73
  Provides-Extra: sqlalchemy
73
74
  Requires-Dist: sqlalchemy[asyncio] ~=2.0 ; extra == 'sqlalchemy'
74
- Provides-Extra: sqlalchemy-drivers
75
- Requires-Dist: pg8000 ~=1.31 ; extra == 'sqlalchemy-drivers'
76
- Requires-Dist: pymysql ~=1.1 ; extra == 'sqlalchemy-drivers'
77
- Requires-Dist: aiomysql ~=0.2 ; extra == 'sqlalchemy-drivers'
78
- Requires-Dist: aiosqlite ~=0.20 ; extra == 'sqlalchemy-drivers'
79
- Requires-Dist: duckdb ~=1.1 ; extra == 'sqlalchemy-drivers'
80
- Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'sqlalchemy-drivers'
81
- Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'sqlalchemy-drivers'
75
+ Provides-Extra: sqldrivers
76
+ Requires-Dist: pg8000 ~=1.31 ; extra == 'sqldrivers'
77
+ Requires-Dist: pymysql ~=1.1 ; extra == 'sqldrivers'
78
+ Requires-Dist: aiomysql ~=0.2 ; extra == 'sqldrivers'
79
+ Requires-Dist: aiosqlite ~=0.20 ; extra == 'sqldrivers'
80
+ Requires-Dist: apsw ~=3.46 ; extra == 'sqldrivers'
81
+ Requires-Dist: duckdb ~=1.1 ; extra == 'sqldrivers'
82
+ Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'sqldrivers'
83
+ Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'sqldrivers'
82
84
  Provides-Extra: testing
83
85
  Requires-Dist: pytest ~=8.0 ; extra == 'testing'
84
86
 
@@ -1,13 +1,13 @@
1
1
  omlish/.manifests.json,sha256=FPSgLg_3QDVzKlNOuqV3dMqhja2KG_TUfKdGmHE8Eg4,803
2
- omlish/__about__.py,sha256=O4CK8WlzT1o7eVkM-7gathEbzIr4DVA2EkpLUKLYiPQ,2814
2
+ omlish/__about__.py,sha256=RFPy3zw7QYcods5DomAlNdYeo4ySug48-5ISyCkIHJg,2925
3
3
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- omlish/argparse.py,sha256=ljKH6AqxtScRfcqXNO4PKH0kUUwDhCZ0XGPHzBKVIJk,6265
5
- omlish/c3.py,sha256=W5EwYx9Por3rWYLkKUitJ6OoRMLLgVTfLTyroOz41Y0,8047
4
+ omlish/argparse.py,sha256=QUUS6sv2ftfcmhDj4qU429mEE_lfWa0UN5yYpPG65B0,6265
5
+ omlish/c3.py,sha256=4vogWgwPb8TbNS2KkZxpoWbwjj7MuHG2lQG-hdtkvjI,8062
6
6
  omlish/cached.py,sha256=UAizxlH4eMWHPzQtmItmyE6FEpFEUFzIkxaO2BHWZ5s,196
7
- omlish/check.py,sha256=3qp1_W8uRp23I26nWvG_c7YFxdTwJAZEFxmY8Bfw50Y,10078
7
+ omlish/check.py,sha256=fgWiBoHvqZlE8tjaxK7OMW4J8z3_rEGRENTka3EohbI,10378
8
8
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
9
9
  omlish/defs.py,sha256=T3bq_7h_tO3nDB5RAFBn7DkdeQgqheXzkFColbOHZko,4890
10
- omlish/docker.py,sha256=uRVJUJwGtTFYhm4XeztrVEYk93f0NI5VpjEKQaN_5uY,6453
10
+ omlish/docker.py,sha256=vmyQA9HCmBQPnOMGcQVomiyAY3TsMKI-9e7Nt8ptrH8,6523
11
11
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
12
12
  omlish/fnpairs.py,sha256=Sl8CMFNyDS-1JYAjSWqnT5FmUm9Lj6o7FxSRo7g4jww,10875
13
13
  omlish/fnpipes.py,sha256=AJkgz9nvRRm7oqw7ZgYyz21klu276LWi54oYCLg-vOg,2196
@@ -30,7 +30,7 @@ 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=4jCwsaogp0FrJjJZ85hzF4-WqluPeheHbfeoKynKvNs,194
33
- omlish/bootstrap/base.py,sha256=koELbK6UmsZaRj-6Bng5_zPVmEBqDpFCduEdR5BddOs,1077
33
+ omlish/bootstrap/base.py,sha256=d8hqn4hp1XMMi5PgcJBQXPKmW47epu8CxBlqDZiRZb4,1073
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
36
  omlish/bootstrap/main.py,sha256=u-TfxO4GkAK3LbRweQERogtO4kT0z3gqXRjnXvtJzC8,5328
@@ -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=0fl0_Q_joTLtFYhR2kpKu45BW-win-le0rCuXPBtjko,2382
63
+ omlish/concurrent/threadlets.py,sha256=rTuGp4odJv23eiGTR0E73_gXKgjh4AOeRhutUcEFh70,2378
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
@@ -96,7 +96,7 @@ omlish/diag/asts.py,sha256=BveUUNUcaAm4Hg55f4ZxGSI313E4L8cCZ5XjHpEkKVI,3325
96
96
  omlish/diag/procfs.py,sha256=vBovaMvAUKdl7FbtFq3TNsSmdhs8DaYfhoEsKeWYta8,9704
97
97
  omlish/diag/procstats.py,sha256=UkqxREqfd-38xPYZ9T1SIJISz5ARQCEhTtOZrxtm2dE,777
98
98
  omlish/diag/ps.py,sha256=1JWxZen3fVG-20R6ZZ8BtO_gpzw_5bhHZiKdoHkgxoU,1004
99
- omlish/diag/pycharm.py,sha256=0Gmn7GR2CuJLlgFQ5jZH3Nehc0PQwKI9CRD8ir4K92o,3190
99
+ omlish/diag/pycharm.py,sha256=HoEYtBuz04RyQhCMRslSEqMwnMlDU49bjOTBwGeivMk,3181
100
100
  omlish/diag/pydevd.py,sha256=Fsx9rfCOnwLD6RLBqH0uAdtq75rbNeBAQfiDvIBd3e0,7295
101
101
  omlish/diag/threads.py,sha256=1-x02VCDZ407gfbtXm1pWK-ubqhqfePm9PMqkHCVoqk,3642
102
102
  omlish/diag/replserver/__init__.py,sha256=uLo6V2aQ29v9z3IMELlPDSlG3_2iOT4-_X8VniF-EgE,235
@@ -265,12 +265,12 @@ omlish/specs/jsonrpc/types.py,sha256=g19j2_FCVJDXFqAkQ5U4LICkL4Z7vEBMU0t_aOEqio4
265
265
  omlish/specs/jsonschema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
266
266
  omlish/specs/jsonschema/types.py,sha256=qoxExgKfrI-UZXdk3qcVZIEyp1WckFbb85_eGInEoAY,467
267
267
  omlish/specs/jsonschema/keywords/__init__.py,sha256=Zt2g1BXd654uU2AQ5P7_-x2Wrtf6cNbP9mxI1wGN4wo,596
268
- omlish/specs/jsonschema/keywords/base.py,sha256=mwXxvuh6-GBODdgyDhjzZbBZ3M_c6V-iQpfeJ1nboVU,1953
269
- omlish/specs/jsonschema/keywords/core.py,sha256=irJ5Rreg9hTeXu3FovSdzhFb3vUly-hYQVYflEgST3g,368
270
- omlish/specs/jsonschema/keywords/metadata.py,sha256=55jlunXosdcM1IQ256KfUIEwFzDPah448ZOeQhJE1c8,316
271
- omlish/specs/jsonschema/keywords/parse.py,sha256=eTOvEhiibC4TpFZy9jGvrAfzNRd_bb6LFT1tPRmAc9g,1934
268
+ omlish/specs/jsonschema/keywords/base.py,sha256=6w2PdquW-6TvagTplIsDFBp1W8dW1uFm6GR-nxzmBkI,1943
269
+ omlish/specs/jsonschema/keywords/core.py,sha256=wbftFHs-P8befiS115eemo51T1Fx9eOwqcJ3kXAnA-o,365
270
+ omlish/specs/jsonschema/keywords/metadata.py,sha256=CsodNy9H07--QWPe9OYvLS9J9_EoMd-BT9FQY80lugM,313
271
+ omlish/specs/jsonschema/keywords/parse.py,sha256=S7rLXoxvYLq-Rr8ZdzUiXBltp6gmrjPpRZTOMVSLXVg,1927
272
272
  omlish/specs/jsonschema/keywords/render.py,sha256=enGkw1S8Zxfn1IBkKqZTK81yG21MVKk54B8rqiTY30c,1236
273
- omlish/specs/jsonschema/keywords/validation.py,sha256=ghewVUSG5qPYnmexy1Ylc-XouiQXobsXLYvkaGgZLqg,1322
273
+ omlish/specs/jsonschema/keywords/validation.py,sha256=7MTXj4DVoEYftHZBO7kz1jiJt0qGHJLcB7qqwQgX_gY,1319
274
274
  omlish/specs/jsonschema/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
275
275
  omlish/specs/jsonschema/schemas/draft202012/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
276
276
  omlish/specs/jsonschema/schemas/draft202012/metaschema.json,sha256=Qdp29a-3zgYtJI92JGOpL3ykfk4PkFsiS6av7vkd7Q8,2452
@@ -296,9 +296,10 @@ omlish/sql/alchemy/secrets.py,sha256=EMfy4EfTbEvrlv_41oOhn8qsoF-eTkY7HciPenIE6rI
296
296
  omlish/sql/alchemy/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,403
297
297
  omlish/testing/__init__.py,sha256=kfiF10ykrjWXniedIl3g8j3pNAFyuSbp1D3ZXug3-Eo,168
298
298
  omlish/testing/testing.py,sha256=pJUbZ0ymdrQoNG9r9UlGXypeU1x9ntEp9xcYBnyOHUs,3088
299
- omlish/testing/pytest/__init__.py,sha256=b6ObMEHTZnvGEI_de6nN1x5FyitV6B2mNYkurA4Q7fo,336
299
+ omlish/testing/pytest/__init__.py,sha256=B2nyJrjIoNcEopbg0IZ5UUDs4OHmQ8qqElFJfGcDdas,257
300
300
  omlish/testing/pytest/helpers.py,sha256=TJpD60mBtLi9FtxX4TThfuXvg5FIRPSiZk1aeRwe-D4,197
301
- omlish/testing/pytest/marks.py,sha256=LbI5lO29cbh_FA5-vktwtcZwWjxn9URI0pprzmPRyJo,1260
301
+ omlish/testing/pytest/marks.py,sha256=ExuwitbMr1txMbaAcWZ652pYa30M-i3wVacnjqschTs,424
302
+ omlish/testing/pytest/skip.py,sha256=uACMFtQQNJfFDbWrppjWevdrQgKVH1MUmH5rXIpv0IE,846
302
303
  omlish/testing/pytest/inject/__init__.py,sha256=pdRKv1HcDmJ_yArKJbYITPXXZthRSGgBJWqITr0Er38,117
303
304
  omlish/testing/pytest/inject/harness.py,sha256=sMKjP2EWHq-eeTB1YVXcANli2Czxt56_9ERg4HtkVPg,5810
304
305
  omlish/testing/pytest/plugins/__init__.py,sha256=ys1zXrYrNm7Uo6YOIVJ6Bd3dQo6kv387k7MbTYlqZSI,467
@@ -319,9 +320,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
319
320
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
320
321
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
321
322
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
322
- omlish-0.0.0.dev38.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
323
- omlish-0.0.0.dev38.dist-info/METADATA,sha256=okoAtD411S4BFoQ17-WSYbBs-89jdktWXTp4fWzAA1o,3786
324
- omlish-0.0.0.dev38.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
325
- omlish-0.0.0.dev38.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
326
- omlish-0.0.0.dev38.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
327
- omlish-0.0.0.dev38.dist-info/RECORD,,
323
+ omlish-0.0.0.dev40.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
324
+ omlish-0.0.0.dev40.dist-info/METADATA,sha256=cgGflLfobBAX38YnOg4rq76Ep04gAV4o75NXd0QGrd8,3817
325
+ omlish-0.0.0.dev40.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
326
+ omlish-0.0.0.dev40.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
327
+ omlish-0.0.0.dev40.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
328
+ omlish-0.0.0.dev40.dist-info/RECORD,,