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 +7 -4
- omlish/argparse.py +2 -2
- omlish/bootstrap/base.py +1 -1
- omlish/c3.py +6 -3
- omlish/check.py +33 -23
- omlish/concurrent/threadlets.py +1 -1
- omlish/diag/pycharm.py +2 -2
- omlish/docker.py +4 -1
- omlish/specs/jsonschema/keywords/base.py +5 -5
- omlish/specs/jsonschema/keywords/core.py +1 -2
- omlish/specs/jsonschema/keywords/metadata.py +1 -2
- omlish/specs/jsonschema/keywords/parse.py +3 -4
- omlish/specs/jsonschema/keywords/validation.py +1 -2
- omlish/testing/pytest/__init__.py +2 -4
- omlish/testing/pytest/marks.py +0 -27
- omlish/testing/pytest/skip.py +30 -0
- {omlish-0.0.0.dev38.dist-info → omlish-0.0.0.dev40.dist-info}/METADATA +13 -11
- {omlish-0.0.0.dev38.dist-info → omlish-0.0.0.dev40.dist-info}/RECORD +22 -21
- {omlish-0.0.0.dev38.dist-info → omlish-0.0.0.dev40.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev38.dist-info → omlish-0.0.0.dev40.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev38.dist-info → omlish-0.0.0.dev40.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev38.dist-info → omlish-0.0.0.dev40.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
__version__ = '0.0.0.
|
2
|
-
__revision__ = '
|
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.
|
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
|
-
'
|
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('
|
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
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
|
-
"""
|
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
|
-
"""
|
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
|
-
"""
|
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
|
-
|
47
|
+
_ARGS_RENDERER: ta.Callable[..., str | None] | None = None
|
48
48
|
|
49
49
|
|
50
|
-
def
|
51
|
-
global
|
52
|
-
if
|
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
|
-
|
56
|
-
|
57
|
-
return True # type: ignore
|
55
|
+
try:
|
56
|
+
from .diag.asts import ArgsRenderer
|
58
57
|
|
59
|
-
|
60
|
-
from .diag.asts import ArgsRenderer
|
58
|
+
ArgsRenderer.smoketest()
|
61
59
|
|
62
|
-
|
60
|
+
except Exception: # noqa
|
61
|
+
return False
|
63
62
|
|
64
|
-
|
65
|
-
|
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
|
-
|
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
|
-
|
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
|
115
|
-
rendered_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
|
|
omlish/concurrent/threadlets.py
CHANGED
omlish/diag/pycharm.py
CHANGED
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
|
-
|
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
|
5
|
-
from
|
6
|
-
from
|
7
|
-
from
|
8
|
-
from
|
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,10 +1,9 @@
|
|
1
1
|
import operator
|
2
2
|
import typing as ta
|
3
3
|
|
4
|
-
from
|
5
|
-
from
|
6
|
-
from
|
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
|
@@ -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
|
omlish/testing/pytest/marks.py
CHANGED
@@ -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.
|
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.
|
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.
|
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:
|
75
|
-
Requires-Dist: pg8000 ~=1.31 ; extra == '
|
76
|
-
Requires-Dist: pymysql ~=1.1 ; extra == '
|
77
|
-
Requires-Dist: aiomysql ~=0.2 ; extra == '
|
78
|
-
Requires-Dist: aiosqlite ~=0.20 ; extra == '
|
79
|
-
Requires-Dist:
|
80
|
-
Requires-Dist:
|
81
|
-
Requires-Dist:
|
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=
|
2
|
+
omlish/__about__.py,sha256=RFPy3zw7QYcods5DomAlNdYeo4ySug48-5ISyCkIHJg,2925
|
3
3
|
omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
-
omlish/argparse.py,sha256=
|
5
|
-
omlish/c3.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
269
|
-
omlish/specs/jsonschema/keywords/core.py,sha256=
|
270
|
-
omlish/specs/jsonschema/keywords/metadata.py,sha256=
|
271
|
-
omlish/specs/jsonschema/keywords/parse.py,sha256=
|
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=
|
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=
|
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=
|
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.
|
323
|
-
omlish-0.0.0.
|
324
|
-
omlish-0.0.0.
|
325
|
-
omlish-0.0.0.
|
326
|
-
omlish-0.0.0.
|
327
|
-
omlish-0.0.0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|