omlish 0.0.0.dev4__py3-none-any.whl → 0.0.0.dev6__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.
Potentially problematic release.
This version of omlish might be problematic. Click here for more details.
- omlish/__about__.py +1 -1
- omlish/__init__.py +1 -1
- omlish/asyncs/__init__.py +10 -4
- omlish/asyncs/anyio.py +142 -12
- omlish/asyncs/asyncio.py +23 -0
- omlish/asyncs/asyncs.py +9 -6
- omlish/asyncs/bridge.py +316 -0
- omlish/asyncs/flavors.py +27 -1
- omlish/asyncs/trio_asyncio.py +28 -18
- omlish/c3.py +1 -1
- omlish/cached.py +1 -2
- omlish/collections/__init__.py +5 -1
- omlish/collections/cache/impl.py +1 -1
- omlish/collections/identity.py +7 -0
- omlish/collections/indexed.py +1 -1
- omlish/collections/utils.py +38 -6
- omlish/configs/__init__.py +5 -0
- omlish/configs/classes.py +53 -0
- omlish/configs/strings.py +94 -0
- omlish/dataclasses/__init__.py +9 -0
- omlish/dataclasses/impl/api.py +1 -1
- omlish/dataclasses/impl/as_.py +1 -1
- omlish/dataclasses/impl/copy.py +30 -0
- omlish/dataclasses/impl/exceptions.py +6 -0
- omlish/dataclasses/impl/fields.py +25 -25
- omlish/dataclasses/impl/init.py +5 -3
- omlish/dataclasses/impl/main.py +3 -0
- omlish/dataclasses/impl/metaclass.py +6 -1
- omlish/dataclasses/impl/order.py +1 -1
- omlish/dataclasses/impl/reflect.py +15 -2
- omlish/dataclasses/utils.py +44 -0
- omlish/defs.py +1 -1
- omlish/diag/__init__.py +4 -0
- omlish/diag/procfs.py +31 -3
- omlish/diag/procstats.py +32 -0
- omlish/{testing → diag}/pydevd.py +35 -0
- omlish/diag/replserver/console.py +3 -3
- omlish/diag/replserver/server.py +6 -5
- omlish/diag/threads.py +86 -0
- omlish/dispatch/_dispatch2.py +65 -0
- omlish/dispatch/_dispatch3.py +104 -0
- omlish/docker.py +20 -1
- omlish/fnpairs.py +37 -18
- omlish/graphs/dags.py +113 -0
- omlish/graphs/domination.py +268 -0
- omlish/graphs/trees.py +2 -2
- omlish/http/__init__.py +25 -0
- omlish/http/asgi.py +132 -0
- omlish/http/collections.py +15 -0
- omlish/http/consts.py +47 -5
- omlish/http/cookies.py +194 -0
- omlish/http/dates.py +70 -0
- omlish/http/encodings.py +6 -0
- omlish/http/json.py +273 -0
- omlish/http/sessions.py +204 -0
- omlish/inject/__init__.py +51 -17
- omlish/inject/binder.py +185 -5
- omlish/inject/bindings.py +3 -36
- omlish/inject/eagers.py +2 -8
- omlish/inject/elements.py +30 -9
- omlish/inject/exceptions.py +3 -3
- omlish/inject/impl/elements.py +65 -31
- omlish/inject/impl/injector.py +20 -2
- omlish/inject/impl/inspect.py +33 -5
- omlish/inject/impl/multis.py +74 -0
- omlish/inject/impl/origins.py +75 -0
- omlish/inject/impl/{private.py → privates.py} +2 -2
- omlish/inject/impl/providers.py +19 -39
- omlish/inject/{proxy.py → impl/proxy.py} +2 -2
- omlish/inject/impl/scopes.py +7 -2
- omlish/inject/injector.py +9 -4
- omlish/inject/inspect.py +18 -0
- omlish/inject/keys.py +11 -23
- omlish/inject/listeners.py +26 -0
- omlish/inject/managed.py +76 -10
- omlish/inject/multis.py +120 -0
- omlish/inject/origins.py +27 -0
- omlish/inject/overrides.py +5 -4
- omlish/inject/{private.py → privates.py} +6 -10
- omlish/inject/providers.py +12 -85
- omlish/inject/scopes.py +20 -9
- omlish/inject/types.py +2 -8
- omlish/iterators.py +13 -0
- omlish/lang/__init__.py +12 -2
- omlish/lang/cached.py +2 -2
- omlish/lang/classes/restrict.py +3 -2
- omlish/lang/classes/simple.py +18 -8
- omlish/lang/classes/virtual.py +2 -2
- omlish/lang/contextmanagers.py +75 -2
- omlish/lang/datetimes.py +6 -5
- omlish/lang/descriptors.py +131 -0
- omlish/lang/functions.py +18 -28
- omlish/lang/imports.py +11 -2
- omlish/lang/iterables.py +20 -1
- omlish/lang/typing.py +6 -0
- omlish/lifecycles/__init__.py +34 -0
- omlish/lifecycles/abstract.py +43 -0
- omlish/lifecycles/base.py +51 -0
- omlish/lifecycles/contextmanagers.py +74 -0
- omlish/lifecycles/controller.py +116 -0
- omlish/lifecycles/manager.py +161 -0
- omlish/lifecycles/states.py +43 -0
- omlish/lifecycles/transitions.py +64 -0
- omlish/logs/formatters.py +1 -1
- omlish/logs/utils.py +1 -1
- omlish/marshal/__init__.py +4 -0
- omlish/marshal/datetimes.py +1 -1
- omlish/marshal/naming.py +4 -0
- omlish/marshal/objects.py +1 -0
- omlish/marshal/polymorphism.py +4 -4
- omlish/reflect.py +139 -18
- omlish/secrets/__init__.py +7 -0
- omlish/secrets/marshal.py +41 -0
- omlish/secrets/passwords.py +120 -0
- omlish/secrets/secrets.py +47 -0
- omlish/serde/__init__.py +0 -0
- omlish/serde/dotenv.py +574 -0
- omlish/{json.py → serde/json.py} +4 -2
- omlish/serde/props.py +604 -0
- omlish/serde/yaml.py +223 -0
- omlish/sql/dbs.py +1 -1
- omlish/sql/duckdb.py +136 -0
- omlish/sql/sqlean.py +17 -0
- omlish/sync.py +70 -0
- omlish/term.py +7 -2
- omlish/testing/pytest/__init__.py +8 -2
- omlish/testing/pytest/helpers.py +0 -24
- omlish/testing/pytest/inject/harness.py +4 -4
- omlish/testing/pytest/marks.py +45 -0
- omlish/testing/pytest/plugins/__init__.py +3 -0
- omlish/testing/pytest/plugins/asyncs.py +136 -0
- omlish/testing/pytest/plugins/managermarks.py +60 -0
- omlish/testing/pytest/plugins/pydevd.py +1 -1
- omlish/testing/testing.py +10 -0
- omlish/text/delimit.py +4 -0
- omlish/text/glyphsplit.py +92 -0
- {omlish-0.0.0.dev4.dist-info → omlish-0.0.0.dev6.dist-info}/METADATA +1 -1
- omlish-0.0.0.dev6.dist-info/RECORD +240 -0
- {omlish-0.0.0.dev4.dist-info → omlish-0.0.0.dev6.dist-info}/WHEEL +1 -1
- omlish/configs/props.py +0 -64
- omlish-0.0.0.dev4.dist-info/RECORD +0 -195
- {omlish-0.0.0.dev4.dist-info → omlish-0.0.0.dev6.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev4.dist-info → omlish-0.0.0.dev6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""
|
|
2
|
+
TODO:
|
|
3
|
+
- auto drain_asyncio
|
|
4
|
+
|
|
5
|
+
==
|
|
6
|
+
|
|
7
|
+
_pytest:
|
|
8
|
+
https://github.com/pytest-dev/pytest/blob/ef9b8f9d748b6f50eab5d43e32d93008f7880899/src/_pytest/python.py#L155
|
|
9
|
+
"async def function and no async plugin installed (see warnings)"
|
|
10
|
+
|
|
11
|
+
pytest_trio:
|
|
12
|
+
https://github.com/python-trio/pytest-trio/blob/f03160aa1dd355a12d39fa21f4aee4e1239efea3/pytest_trio/plugin.py
|
|
13
|
+
- pytest_addoption
|
|
14
|
+
- pytest_configure
|
|
15
|
+
- pytest_collection_modifyitems
|
|
16
|
+
- pytest_runtest_call @(hookwrapper=True)
|
|
17
|
+
- pytest_fixture_setup
|
|
18
|
+
|
|
19
|
+
pytest_asyncio:
|
|
20
|
+
https://github.com/pytest-dev/pytest-asyncio/blob/f45aa18cf3eeeb94075de16a1d797858facab863/pytest_asyncio/plugin.py
|
|
21
|
+
- pytest_addoption
|
|
22
|
+
- pytest_configure
|
|
23
|
+
- pytest_pycollect_makeitem_preprocess_async_fixtures @(specname="pytest_pycollect_makeitem", tryfirst=True)
|
|
24
|
+
- pytest_pycollect_makeitem_convert_async_functions_to_subclass @(specname="pytest_pycollect_makeitem", hookwrapper=True)
|
|
25
|
+
- pytest_generate_tests @(tryfirst=True)
|
|
26
|
+
- pytest_runtest_setup(item: pytest.Item) -> None:
|
|
27
|
+
- pytest_pyfunc_call @(tryfirst=True, hookwrapper=True)
|
|
28
|
+
- pytest_collectstart @()
|
|
29
|
+
- pytest_report_header @(tryfirst=True)
|
|
30
|
+
- pytest_fixture_setup @(hookwrapper=True)
|
|
31
|
+
|
|
32
|
+
anyio.pytest_plugin:
|
|
33
|
+
https://github.com/agronholm/anyio/blob/8907964926a24461840eee0925d3f355e729f15d/src/anyio/pytest_plugin.py
|
|
34
|
+
- pytest_configure
|
|
35
|
+
- pytest_pycollect_makeitem @(tryfirst=True)
|
|
36
|
+
- pytest_pyfunc_call @(tryfirst=True)
|
|
37
|
+
- pytest_fixture_setup
|
|
38
|
+
|
|
39
|
+
""" # noqa
|
|
40
|
+
import functools
|
|
41
|
+
import inspect
|
|
42
|
+
import typing as ta
|
|
43
|
+
|
|
44
|
+
import pytest
|
|
45
|
+
|
|
46
|
+
from .... import lang
|
|
47
|
+
from ....asyncs import trio_asyncio as trai
|
|
48
|
+
from ....diag import pydevd as pdu
|
|
49
|
+
from ._registry import register
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
if ta.TYPE_CHECKING:
|
|
53
|
+
import trio_asyncio
|
|
54
|
+
else:
|
|
55
|
+
trio_asyncio = lang.proxy_import('trio_asyncio')
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
ASYNCS_MARK = 'asyncs'
|
|
59
|
+
|
|
60
|
+
KNOWN_BACKENDS = (
|
|
61
|
+
'asyncio',
|
|
62
|
+
'trio',
|
|
63
|
+
'trio_asyncio',
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
PARAM_NAME = '__async_backend'
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def iscoroutinefunction(func: ta.Any) -> bool:
|
|
70
|
+
return inspect.iscoroutinefunction(func) or getattr(func, '_is_coroutine', False)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def is_async_function(func: ta.Any) -> bool:
|
|
74
|
+
return iscoroutinefunction(func) or inspect.isasyncgenfunction(func)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@register
|
|
78
|
+
class AsyncsPlugin:
|
|
79
|
+
ASYNC_BACKENDS: ta.ClassVar[ta.Sequence[str]] = [
|
|
80
|
+
*[s for s in KNOWN_BACKENDS if lang.can_import(s)],
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
def pytest_configure(self, config):
|
|
84
|
+
config.addinivalue_line('markers', f'{ASYNCS_MARK}: marks for all async backends')
|
|
85
|
+
config.addinivalue_line('markers', 'trio_asyncio: marks for trio_asyncio backend')
|
|
86
|
+
|
|
87
|
+
def pytest_generate_tests(self, metafunc):
|
|
88
|
+
if (m := metafunc.definition.get_closest_marker(ASYNCS_MARK)) is not None:
|
|
89
|
+
if m.args:
|
|
90
|
+
bes = m.args
|
|
91
|
+
else:
|
|
92
|
+
bes = self.ASYNC_BACKENDS
|
|
93
|
+
elif metafunc.definition.get_closest_marker('trio_asyncio') is not None:
|
|
94
|
+
bes = ['trio_asyncio']
|
|
95
|
+
else:
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
if pdu.is_present():
|
|
99
|
+
pdu.patch_for_trio_asyncio()
|
|
100
|
+
|
|
101
|
+
metafunc.fixturenames.append(PARAM_NAME)
|
|
102
|
+
metafunc.parametrize(PARAM_NAME, bes)
|
|
103
|
+
|
|
104
|
+
for c in metafunc._calls: # noqa
|
|
105
|
+
be = c.params[PARAM_NAME]
|
|
106
|
+
if be == 'trio_asyncio':
|
|
107
|
+
c.marks.extend([
|
|
108
|
+
pytest.mark.trio.mark,
|
|
109
|
+
pytest.mark.trio_asyncio.mark,
|
|
110
|
+
])
|
|
111
|
+
|
|
112
|
+
else:
|
|
113
|
+
c.marks.append(getattr(pytest.mark, be).mark)
|
|
114
|
+
|
|
115
|
+
if pdu.is_present():
|
|
116
|
+
c.marks.append(pytest.mark.drain_asyncio.mark)
|
|
117
|
+
|
|
118
|
+
@pytest.hookimpl(hookwrapper=True)
|
|
119
|
+
def pytest_runtest_call(self, item):
|
|
120
|
+
bes = [be for be in self.ASYNC_BACKENDS if item.get_closest_marker(be) is not None]
|
|
121
|
+
if len(bes) > 1 and set(bes) != {'trio', 'trio_asyncio'}:
|
|
122
|
+
raise Exception(f'{item.nodeid}: multiple async backends specified: {bes}')
|
|
123
|
+
elif is_async_function(item.obj) and not bes:
|
|
124
|
+
raise Exception(f'{item.nodeid}: async def function and no async plugin specified')
|
|
125
|
+
|
|
126
|
+
if 'trio_asyncio' in bes:
|
|
127
|
+
obj = item.obj
|
|
128
|
+
|
|
129
|
+
@functools.wraps(obj)
|
|
130
|
+
@trai.with_trio_asyncio_loop(wait=True)
|
|
131
|
+
async def run(*args, **kwargs):
|
|
132
|
+
await trio_asyncio.aio_as_trio(obj)(*args, **kwargs)
|
|
133
|
+
|
|
134
|
+
item.obj = run
|
|
135
|
+
|
|
136
|
+
yield
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import contextlib
|
|
3
|
+
import typing as ta
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from .... import lang
|
|
8
|
+
from ._registry import register
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ManagerMark(lang.Abstract):
|
|
12
|
+
def __init_subclass__(cls, **kwargs):
|
|
13
|
+
super().__init_subclass__(**kwargs)
|
|
14
|
+
|
|
15
|
+
@abc.abstractmethod
|
|
16
|
+
def __call__(self, item: pytest.Function) -> ta.Iterator[None]:
|
|
17
|
+
raise NotImplementedError
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _deep_subclasses(cls):
|
|
21
|
+
ret = set()
|
|
22
|
+
|
|
23
|
+
def rec(cur):
|
|
24
|
+
for nxt in cur.__subclasses__():
|
|
25
|
+
if nxt not in ret:
|
|
26
|
+
ret.add(nxt)
|
|
27
|
+
rec(nxt)
|
|
28
|
+
|
|
29
|
+
rec(cls)
|
|
30
|
+
return ret
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@register
|
|
34
|
+
class ManagerMarksPlugin:
|
|
35
|
+
|
|
36
|
+
@lang.cached_function
|
|
37
|
+
def mark_classes(self) -> ta.Mapping[str, type[ManagerMark]]:
|
|
38
|
+
return {
|
|
39
|
+
cls.__name__: cls
|
|
40
|
+
for cls in _deep_subclasses(ManagerMark)
|
|
41
|
+
if not lang.is_abstract_class(cls)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
def pytest_configure(self, config):
|
|
45
|
+
for n in self.mark_classes():
|
|
46
|
+
config.addinivalue_line(
|
|
47
|
+
'markers',
|
|
48
|
+
f'{n}: mark to manage {n}',
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
@pytest.hookimpl(hookwrapper=True)
|
|
52
|
+
def pytest_runtest_call(self, item):
|
|
53
|
+
with contextlib.ExitStack() as es:
|
|
54
|
+
for n, cls in self.mark_classes().items():
|
|
55
|
+
if (m := item.get_closest_marker(n)) is None:
|
|
56
|
+
continue
|
|
57
|
+
inst = cls(*m.args, **m.kwargs)
|
|
58
|
+
es.enter_context(contextlib.contextmanager(inst)(item))
|
|
59
|
+
|
|
60
|
+
yield
|
omlish/testing/testing.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import functools
|
|
2
2
|
import importlib
|
|
3
3
|
import os
|
|
4
|
+
import sys
|
|
4
5
|
import threading
|
|
5
6
|
import time
|
|
6
7
|
import traceback
|
|
@@ -100,3 +101,12 @@ def xfail(fn):
|
|
|
100
101
|
traceback.print_exc()
|
|
101
102
|
|
|
102
103
|
return inner
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def raise_in_thread(thr: threading.Thread, exc: BaseException | type[BaseException]) -> None:
|
|
107
|
+
if sys.implementation.name != 'cpython':
|
|
108
|
+
raise RuntimeError(sys.implementation.name)
|
|
109
|
+
|
|
110
|
+
# https://github.com/python/cpython/blob/37ba7531a59a0a2b240a86f7e2adfb1b1cd8ac0c/Lib/test/test_threading.py#L182
|
|
111
|
+
import ctypes as ct
|
|
112
|
+
ct.pythonapi.PyThreadState_SetAsyncExc(ct.c_ulong(thr.ident), ct.py_object(exc)) # type: ignore
|
omlish/text/delimit.py
CHANGED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import dataclasses as dc
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
from .. import check
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dc.dataclass(frozen=True)
|
|
8
|
+
class GlyphMatch:
|
|
9
|
+
l: str
|
|
10
|
+
s: str
|
|
11
|
+
r: str
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class GlyphSplitter:
|
|
15
|
+
|
|
16
|
+
def __init__(
|
|
17
|
+
self,
|
|
18
|
+
glyphs: tuple[str, str],
|
|
19
|
+
*,
|
|
20
|
+
escape_returned_doubles: bool = False,
|
|
21
|
+
compact: bool = False,
|
|
22
|
+
) -> None:
|
|
23
|
+
super().__init__()
|
|
24
|
+
|
|
25
|
+
glyphs = tuple(map(check.of_isinstance(str), glyphs)) # type: ignore
|
|
26
|
+
check.state(all(len(s) == 1 for s in glyphs))
|
|
27
|
+
check.state(len(glyphs) == 2)
|
|
28
|
+
|
|
29
|
+
self._glyphs = glyphs
|
|
30
|
+
self._l_glyph, self._r_glyph = glyphs
|
|
31
|
+
|
|
32
|
+
self._escape_returned_doubles = escape_returned_doubles
|
|
33
|
+
self._compact = compact
|
|
34
|
+
|
|
35
|
+
self._l_double_glyph = self._l_glyph * 2
|
|
36
|
+
self._r_double_glyph = self._r_glyph * 2
|
|
37
|
+
self._double_glyphs = (self._l_double_glyph, self._r_double_glyph)
|
|
38
|
+
|
|
39
|
+
self._l_escaped_glyph = re.escape(self._l_glyph)
|
|
40
|
+
self._r_escaped_glyph = re.escape(self._r_glyph)
|
|
41
|
+
|
|
42
|
+
self._l_glyph_pat = re.compile(r'(%s)' % (self._l_escaped_glyph * 2,)) # noqa
|
|
43
|
+
self._r_glyph_pat = re.compile(r'(%s)' % (self._r_escaped_glyph * 2,)) # noqa
|
|
44
|
+
|
|
45
|
+
self._single_glyph_pat = re.compile(r'(%s[^%s]*?%s)' % (self._l_escaped_glyph, self._r_escaped_glyph, self._r_escaped_glyph)) # noqa
|
|
46
|
+
|
|
47
|
+
def split(self, s: str) -> list[GlyphMatch | str]:
|
|
48
|
+
ps = self._l_glyph_pat.split(s)
|
|
49
|
+
ps = [p[::-1] for p in ps for p in reversed(self._r_glyph_pat.split(p[::-1]))]
|
|
50
|
+
|
|
51
|
+
ret = [] # type: ignore
|
|
52
|
+
|
|
53
|
+
def append_ret(o):
|
|
54
|
+
if self._compact and isinstance(o, str) and ret and isinstance(ret[-1], str):
|
|
55
|
+
ret[-1] = ret[-1] + o
|
|
56
|
+
else:
|
|
57
|
+
ret.append(o)
|
|
58
|
+
|
|
59
|
+
for p in ps:
|
|
60
|
+
if p in self._double_glyphs:
|
|
61
|
+
if self._escape_returned_doubles:
|
|
62
|
+
p = self._glyphs[p == self._r_double_glyph]
|
|
63
|
+
append_ret(p)
|
|
64
|
+
continue
|
|
65
|
+
|
|
66
|
+
ms = list(self._single_glyph_pat.finditer(p))
|
|
67
|
+
if not ms:
|
|
68
|
+
append_ret(p)
|
|
69
|
+
continue
|
|
70
|
+
|
|
71
|
+
l = 0
|
|
72
|
+
for m in ms:
|
|
73
|
+
if m.start() != l:
|
|
74
|
+
append_ret(p[l:m.start()])
|
|
75
|
+
append_ret(GlyphMatch(self._l_glyph, p[m.start() + 1:m.end() - 1], self._r_glyph))
|
|
76
|
+
l = m.end()
|
|
77
|
+
|
|
78
|
+
if l < len(p):
|
|
79
|
+
append_ret(p[l:])
|
|
80
|
+
|
|
81
|
+
return ret
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
_PAREN_GLYPH_SPLITTER = GlyphSplitter(('(', ')'), escape_returned_doubles=True, compact=True)
|
|
85
|
+
_BRACE_GLYPH_SPLITTER = GlyphSplitter(('{', '}'), escape_returned_doubles=True, compact=True)
|
|
86
|
+
_BRACKET_GLYPH_SPLITTER = GlyphSplitter(('[', ']'), escape_returned_doubles=True, compact=True)
|
|
87
|
+
_ANGLE_BRACKET_GLYPH_SPLITTER = GlyphSplitter(('<', '>'), escape_returned_doubles=True, compact=True)
|
|
88
|
+
|
|
89
|
+
split_parens = _PAREN_GLYPH_SPLITTER.split
|
|
90
|
+
split_braces = _BRACE_GLYPH_SPLITTER.split
|
|
91
|
+
split_brackets = _BRACKET_GLYPH_SPLITTER.split
|
|
92
|
+
split_angle_brackets = _ANGLE_BRACKET_GLYPH_SPLITTER.split
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
omlish/__about__.py,sha256=ok0Te9wzfwYtf7-NR58LNlxYA2Vd-jDbB4klfQ3W5JU,153
|
|
2
|
+
omlish/__init__.py,sha256=AGJOJExzKB9Ugu7eI6nTRys4D-Kd4fseT2-PCM9-1Rg,196
|
|
3
|
+
omlish/argparse.py,sha256=QRQmX9G0-L_nATkFtGHvpd4qrpYzKATdjuFLbBqzJPM,6224
|
|
4
|
+
omlish/c3.py,sha256=W5EwYx9Por3rWYLkKUitJ6OoRMLLgVTfLTyroOz41Y0,8047
|
|
5
|
+
omlish/cached.py,sha256=UAizxlH4eMWHPzQtmItmyE6FEpFEUFzIkxaO2BHWZ5s,196
|
|
6
|
+
omlish/check.py,sha256=h66jWSwaiuaaIKPI6_pIfolWYYK3WTR43X1CBO5-PQA,5538
|
|
7
|
+
omlish/defs.py,sha256=N8O1murtr4mdSE_vjAcWGfnN7GyBXbW8rJM4qPF8na0,4737
|
|
8
|
+
omlish/docker.py,sha256=Fm1VGXSGlIpEnJe4wwnC8JY25AHSmvtFlOSplHigWkk,4376
|
|
9
|
+
omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
|
|
10
|
+
omlish/fnpairs.py,sha256=tGOw4zkF9r_SATvtnWEABreINvrO0e3OsB7IRqtNtwk,9495
|
|
11
|
+
omlish/iterators.py,sha256=Z6oXZwV3aDx4A0z6mvwEahVLqopMQBZ-b2yHr4tUfmQ,5912
|
|
12
|
+
omlish/libc.py,sha256=u0481imCiTFqP_e-v9g0pD-0WD249j5vYzhtn-fnNkY,15308
|
|
13
|
+
omlish/math.py,sha256=AVqp5Y8yxKA-wO0BgrzaxA0Ga3PZiCXnYcwivMneC-0,3804
|
|
14
|
+
omlish/os.py,sha256=T77P7_U7jShPXsm_byvXwPoumcmtA0a7KPRvE2GAOhw,950
|
|
15
|
+
omlish/reflect.py,sha256=Ce70q2GLn6tyNl44bl3HkqF_yZ3ls9L3V-PE8i0R2pM,12740
|
|
16
|
+
omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
|
|
17
|
+
omlish/stats.py,sha256=uqjN-focDVssFZMagj22HqmyJ1TBO4Wt-XnHp8-EtVw,9927
|
|
18
|
+
omlish/sync.py,sha256=AqwIfIuCMVHLwlJUa7dmaSjfA4sM5AYPCD5-nsz3XVQ,1516
|
|
19
|
+
omlish/term.py,sha256=GFsBnBZHB8StpX5nQ0YWtCR5ZLjF8kwP60coq5DAYpU,6112
|
|
20
|
+
omlish/asyncs/__init__.py,sha256=axM-6TN6HDrJ8CP__IE1vfvcsqQDN2TjcTw7CAyycyY,769
|
|
21
|
+
omlish/asyncs/anyio.py,sha256=kxMY2ZDV-BuMRasITCcWTEey6DDIYDaf2jIppi5v1lY,6470
|
|
22
|
+
omlish/asyncs/asyncio.py,sha256=JfM59QgB3asgEbrps0zoVbNjWD4kL2XdsEkRMEIoFos,971
|
|
23
|
+
omlish/asyncs/asyncs.py,sha256=Tf7ZodTGepkM7HAuFcDNh9lLzzrMw6rELWvopGmFkh4,2035
|
|
24
|
+
omlish/asyncs/bridge.py,sha256=AabrRVz5k75dTB59M70DWkl6JrLusjhpvsaj5jld9io,8151
|
|
25
|
+
omlish/asyncs/flavors.py,sha256=kp1RdcsNrvDQZMB4Q_hlHyjrREJqEWjY9BI1lbE1AQ8,4820
|
|
26
|
+
omlish/asyncs/futures.py,sha256=3KkTj5TOPmvNOcuK9LtOQwmkuLzoEYQfcuaHTXSQ0Ts,5424
|
|
27
|
+
omlish/asyncs/trio.py,sha256=GKG3wgelFr7gIKKHZhcflvMyCvxXHNZe862KB0Xw2uA,370
|
|
28
|
+
omlish/asyncs/trio_asyncio.py,sha256=oqdOHy0slj9PjVxaDf3gJkq9AAgg7wYZbB469jOftVw,1327
|
|
29
|
+
omlish/collections/__init__.py,sha256=dOaaXAZKd-YQC1hItGTfJdhERIC7Io0klUmjajbT4qQ,1598
|
|
30
|
+
omlish/collections/_abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
|
|
31
|
+
omlish/collections/_io_abc.py,sha256=Cxs8KB1B_69rxpUYxI-MTsilAmNooJJn3w07DKqYKkE,1255
|
|
32
|
+
omlish/collections/coerce.py,sha256=o11AMrUiyoadd8WkdqeKPIpXf2xd0LyylzNCyJivCLU,7036
|
|
33
|
+
omlish/collections/frozen.py,sha256=DGxemj_pVID85tSBm-Wns_x4ov0wOEIT6X5bVgJtmkA,4152
|
|
34
|
+
omlish/collections/identity.py,sha256=jhEpC8tnfh3Sg-MJff1Fp9eMydt150wits_UeVdctUk,2723
|
|
35
|
+
omlish/collections/indexed.py,sha256=YHs_q0GALisXPKKMgeDQxZ6hMzYndqDL3m3ag8cnzH0,2143
|
|
36
|
+
omlish/collections/mappings.py,sha256=5D7xZabUY6n1nB-BrZlcrPy_AdzLZ6IyihuLeDL48pA,3188
|
|
37
|
+
omlish/collections/ordered.py,sha256=RzEC3fHvrDeJQSWThVDNYQKke263Vje1II5YwtDwT1Q,2335
|
|
38
|
+
omlish/collections/persistent.py,sha256=KG471s0bhhReQrjlmX0xaN9HeAIcrtT264ddZCxsExo,875
|
|
39
|
+
omlish/collections/skiplist.py,sha256=xjuKZtSScp1VnOi9lpf7I090vGp1DnjA5ELjFhMeGps,5987
|
|
40
|
+
omlish/collections/sorted.py,sha256=E5ZOdNn7Jju1EcQ7CX2Ltk9StIXsBOzqvh7EsT3ZA2U,3354
|
|
41
|
+
omlish/collections/treap.py,sha256=wq9L5hvxq4QgPvIpHmueZMF8t7UrvX5vmlNN4BOqY4g,7720
|
|
42
|
+
omlish/collections/treapmap.py,sha256=TxOM-ZRF5PK2xe5wRIhESNt7DGh9b_MeZfE7HLkCOs4,5804
|
|
43
|
+
omlish/collections/unmodifiable.py,sha256=QmUEi9IBXqiM_KGgH2rqg15VmkHJo1MZ6kwq2twEMho,4750
|
|
44
|
+
omlish/collections/utils.py,sha256=iRVkffZlLRbYPjli8EO62bgN-X1rtORwoUiZTNGLQqA,3754
|
|
45
|
+
omlish/collections/cache/__init__.py,sha256=Cv8RX-Ehit3um0QLDq7uRDqJUCcdqTKoAB9T0pM_5hg,392
|
|
46
|
+
omlish/collections/cache/descriptor.py,sha256=t-1Gh4DTABDuNmeDJlpoW4LV3gi_uSlBd9ZfBINfYCM,5023
|
|
47
|
+
omlish/collections/cache/impl.py,sha256=nQox5kChhns9h2a5gnX-ayQGBQJ5-B1aZkLQ2Aej19g,15137
|
|
48
|
+
omlish/collections/cache/types.py,sha256=yNjwd6CGyTJQdxN2CQxFqqBAlcs1Z7vvNV-aU1K7p8E,685
|
|
49
|
+
omlish/configs/__init__.py,sha256=3uh09ezodTwkMI0nRmAMP0eEuJ_0VdF-LYyNmPjHiCE,77
|
|
50
|
+
omlish/configs/classes.py,sha256=GLbB8xKjHjjoUQRCUQm3nEjM8z1qNTx9gPV7ODSt5dg,1317
|
|
51
|
+
omlish/configs/flattening.py,sha256=AOlRpBHm449MxwMp3CiIRGunStOC1DUNs1f3CLou0wc,4731
|
|
52
|
+
omlish/configs/strings.py,sha256=9Bq289VS_UIi4bsW09yHfDJYSWqQHW8XeKhdUw9CANk,2607
|
|
53
|
+
omlish/dataclasses/__init__.py,sha256=I1tbWlBa1-nXpVkb7NqjJwTiAVp_5P0WkjXDQ1NGUus,1127
|
|
54
|
+
omlish/dataclasses/utils.py,sha256=dVEzdjKwPCSoFxqXZ5zUlHtVYZ6My79e1zctYDCWmvY,1035
|
|
55
|
+
omlish/dataclasses/impl/__init__.py,sha256=rQJRcE9fVsGEvRUOZ18r4DE0xiLbSRjspyJRXgbLS3I,348
|
|
56
|
+
omlish/dataclasses/impl/api.py,sha256=NOuw5dlwztG5AA_gwdF2PJAqvouMdbUf1Si80G26qAY,6244
|
|
57
|
+
omlish/dataclasses/impl/as_.py,sha256=CD-t7hkC1EP2F_jvZKIA_cVoDuwZ-Ln_xC4fJumPYX0,2598
|
|
58
|
+
omlish/dataclasses/impl/copy.py,sha256=Tn8_n6Vohs-w4otbGdubBEvhd3TsSTaM3EfNGdS2LYo,591
|
|
59
|
+
omlish/dataclasses/impl/exceptions.py,sha256=WD0Tr1TnjUN4OR3f3rs8CgqtP2KBA1tKjPIbZO8Tzm0,178
|
|
60
|
+
omlish/dataclasses/impl/fields.py,sha256=zBa-XjJJQ7dOP_se-A8Q4Vv3ol2xjpTQXTUBCnr1UVs,4377
|
|
61
|
+
omlish/dataclasses/impl/frozen.py,sha256=5wKtt8WvPYCkHPrwR024mpvbFzqcbPQfgiFvy3orRJo,1692
|
|
62
|
+
omlish/dataclasses/impl/hashing.py,sha256=FKnHuXCg9ylrzK2TLGqO5yfRN4HX3F415CSLlVYXtYE,3190
|
|
63
|
+
omlish/dataclasses/impl/init.py,sha256=yw9iInFHaR_TFWRzsryr8vgStHMQwqubL-s7pY5k1sA,5652
|
|
64
|
+
omlish/dataclasses/impl/internals.py,sha256=LTCqGT8AhyGTWwioGrBpTJzDzPvAtizQKb0NBNKcNs0,2989
|
|
65
|
+
omlish/dataclasses/impl/main.py,sha256=vAVdqb4cgvyssA7rCFl9i2D0MAffX45YtQbGQ2te5_c,5189
|
|
66
|
+
omlish/dataclasses/impl/metaclass.py,sha256=dlQEIN9MHBirll7Nx3StpzxYxXjrqxJ-QsorMcCNt7w,2828
|
|
67
|
+
omlish/dataclasses/impl/metadata.py,sha256=HGqAtMcP422X4kPx93btcxE-n4guBFm6-N-S4nobgk4,1407
|
|
68
|
+
omlish/dataclasses/impl/order.py,sha256=zWvWDkSTym8cc7vO1cLHqcBhhjOlucHOCUVJcdh4jt0,1369
|
|
69
|
+
omlish/dataclasses/impl/params.py,sha256=M-xg9IeFftVy795oqlp7Yw8jE-7wG2K4vaFhXHKmL1k,2538
|
|
70
|
+
omlish/dataclasses/impl/processing.py,sha256=iUvaNwRAt8rQsLIIkvRye5rfk6xhgR35EbcdwZCZec8,366
|
|
71
|
+
omlish/dataclasses/impl/reflect.py,sha256=9aVgupzs75wif-5tZ6oAEZ3bFcsJBvLgxJ5fL8raZc4,5292
|
|
72
|
+
omlish/dataclasses/impl/replace.py,sha256=wS9GHX4fIwaPv1JBJzIewdBfXyK3X3V7_t55Da87dYo,1217
|
|
73
|
+
omlish/dataclasses/impl/repr.py,sha256=oLXBTxqp88NKmz82HrJeGiTEiwK4l5LlXQT9Q0-tX3c,1605
|
|
74
|
+
omlish/dataclasses/impl/simple.py,sha256=EovA-GpmQYtB_svItO2byTAWqbKGF4njz0MdQts3QBU,3157
|
|
75
|
+
omlish/dataclasses/impl/slots.py,sha256=_sm-x9v1tPnXEHBHNUMTHZocgVyhZaPdvamIPPBUVyk,2635
|
|
76
|
+
omlish/dataclasses/impl/utils.py,sha256=aER2iL3UAtgS1BdLuEvTr9Tr2wC28wk1kiOeO-jIymw,6138
|
|
77
|
+
omlish/diag/__init__.py,sha256=BYQoq12W2qU0O7m2Z-RLCX6YLIYEW9MmfN7_i9--Yk0,132
|
|
78
|
+
omlish/diag/procfs.py,sha256=CjMDMtf6ToNu9_MbWAdQ-5cvuUyMs5R3aZOjyRtgHtw,9579
|
|
79
|
+
omlish/diag/procstats.py,sha256=9uQMvVL7Yzf_1F8dW55pcZeCFtP5yUbK1KuGn9bt2Qg,502
|
|
80
|
+
omlish/diag/ps.py,sha256=1JWxZen3fVG-20R6ZZ8BtO_gpzw_5bhHZiKdoHkgxoU,1004
|
|
81
|
+
omlish/diag/pydevd.py,sha256=Fsx9rfCOnwLD6RLBqH0uAdtq75rbNeBAQfiDvIBd3e0,7295
|
|
82
|
+
omlish/diag/threads.py,sha256=Vs05WqH0C6GlTcQo2CiSH5SbT1YlnETRX5slT7YBl9M,2058
|
|
83
|
+
omlish/diag/replserver/__init__.py,sha256=uLo6V2aQ29v9z3IMELlPDSlG3_2iOT4-_X8VniF-EgE,235
|
|
84
|
+
omlish/diag/replserver/__main__.py,sha256=LmU41lQ58bm1h4Mx7S8zhE_uEBSC6kPcp9mn5JRpulA,32
|
|
85
|
+
omlish/diag/replserver/console.py,sha256=XzBDVhYlr8FY6ym4OwoaIHuFOHnGK3dTYlMDIOMUUlA,7410
|
|
86
|
+
omlish/diag/replserver/server.py,sha256=MBLMouRuJ7eMXBHVsMQS8KGHwZuDThPoNkiJb32UVI0,4896
|
|
87
|
+
omlish/dispatch/__init__.py,sha256=GsiGJ91NKiQptSROtnCSkrZExBkvfDwYvdoTu5dBqF0,117
|
|
88
|
+
omlish/dispatch/_dispatch2.py,sha256=v3tCNyxGpOwY8qTwdp54TlM8mG6OVwtQoUZfYJ_griU,1756
|
|
89
|
+
omlish/dispatch/_dispatch3.py,sha256=Vnu5DfoPWFJLodudBqoZBXGTi2wYk-Az56MXJgdQvwc,2608
|
|
90
|
+
omlish/dispatch/dispatch.py,sha256=8B66wOat30HckcIsCq4pnutBy20iSPwPQOqJ4msHaGU,3739
|
|
91
|
+
omlish/dispatch/functions.py,sha256=S8ElsLi6DKxTdtFGigWaF0vAquwy2sK-3f4iRLaYq70,1522
|
|
92
|
+
omlish/dispatch/methods.py,sha256=utLvLioBgEqa0gR0fpfNEtMDZFGPM4G5p3XHnPt-oIw,5865
|
|
93
|
+
omlish/graphs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
94
|
+
omlish/graphs/dags.py,sha256=JpTGxt5rsK7hy5EUy9rNUlIeDStT9ri86m8xEKiHQLE,3063
|
|
95
|
+
omlish/graphs/domination.py,sha256=45iTyn7mZWPJ1ANrqD96aPXqzEeyFpybMvvcVxo9XvQ,7592
|
|
96
|
+
omlish/graphs/trees.py,sha256=TWWpCiOXak782jWkeJXZsAAZTzUrFpKHTCMufeqkXs8,8143
|
|
97
|
+
omlish/graphs/dot/__init__.py,sha256=6-LAx7ytHFQvfLrnxVQG1s8xmApgblERJJCTB2knOHk,642
|
|
98
|
+
omlish/graphs/dot/items.py,sha256=OWPf0-hjBgS1uyy2QgAEn4IgFHJcEg7sHVWeTx1ghZc,4083
|
|
99
|
+
omlish/graphs/dot/rendering.py,sha256=hUSJ5HvSvxnTIC9ynSxxP8IJnVH6quEeDbLzNlUnmuk,3626
|
|
100
|
+
omlish/graphs/dot/utils.py,sha256=_FMwn77WfiiAfLsRTOKWm4IYbNv5kQN22YJ5psw6CWg,801
|
|
101
|
+
omlish/http/__init__.py,sha256=v2f9Hh6bTgcz0MkG9T2JQarzeIgHlDxDT2cbINbpyw8,367
|
|
102
|
+
omlish/http/asgi.py,sha256=wXhBZ21bEl32Kv9yBrRwUR_7pHEgVtHP8ZZwbasQ6-4,3307
|
|
103
|
+
omlish/http/collections.py,sha256=s8w5s4Gewgxxhe2Ai0R45PgJYYifrLgTbU3VXVflHj4,260
|
|
104
|
+
omlish/http/consts.py,sha256=-Dm_Kcm3BH6kKSkqYnEHKHf-624YW7cjqsNM7mi75Wk,1914
|
|
105
|
+
omlish/http/cookies.py,sha256=x56AvYtwNyQKFzVD1zSGIsfg9oiArd6ICTMEdugP008,6356
|
|
106
|
+
omlish/http/dates.py,sha256=Otgp8wRxPgNGyzx8LFowu1vC4EKJYARCiAwLFncpfHM,2875
|
|
107
|
+
omlish/http/encodings.py,sha256=w2WoKajpaZnQH8j-IBvk5ZFL2O2pAU_iBvZnkocaTlw,164
|
|
108
|
+
omlish/http/json.py,sha256=9XwAsl4966Mxrv-1ytyCqhcE6lbBJw-0_tFZzGszgHE,7440
|
|
109
|
+
omlish/http/sessions.py,sha256=LfqVm0NYGN3tEXnX9uTrHIvPiKlg6ZM09AM3aBd-g-E,4781
|
|
110
|
+
omlish/http/wsgi.py,sha256=czZsVUX-l2YTlMrUjKN49wRoP4rVpS0qpeBn4O5BoMY,948
|
|
111
|
+
omlish/inject/__init__.py,sha256=NeW41Kbr0KCDAu1-9IiWf9P-HoO3FXfKhLgbigaT0iU,1841
|
|
112
|
+
omlish/inject/binder.py,sha256=Xxk3S3g8f6a0Gr7mi2dXgQwBuqlHgWGz2wNOVpcFmPE,4167
|
|
113
|
+
omlish/inject/bindings.py,sha256=pLXn2U3kvmAS-68IOG-tr77DbiI-wp9hGyy4lhG6_H8,525
|
|
114
|
+
omlish/inject/eagers.py,sha256=5AkGYuwijG0ihsH9NSaZotggalJ5_xWXhHE9mkn6IBA,329
|
|
115
|
+
omlish/inject/elements.py,sha256=njMqYexCwqXyBifORvV5Y3g7fFG_9QPLU4uAwZhcGbQ,1508
|
|
116
|
+
omlish/inject/exceptions.py,sha256=_wkN2tF55gQzmMOMKJC_9jYHBZzaBiCDcyqI9Sf2UZs,626
|
|
117
|
+
omlish/inject/injector.py,sha256=CoCUeMm1Oot4sG4Ti1sKCWrhlvtJ5QAeAI22AFWu2RQ,1066
|
|
118
|
+
omlish/inject/inspect.py,sha256=tw49r1RJVHrEHmT8WWA3_Bl9Z0L3lEGRqlLhbM5OmAM,592
|
|
119
|
+
omlish/inject/keys.py,sha256=05KePew5_Cn_zWgBpIcXsa5orxm6xn4YL_IWXEvrSr8,651
|
|
120
|
+
omlish/inject/listeners.py,sha256=AIWUs4OTUPeURU1tS2CXeEbJwC1bZiuya9K6I2ElMns,581
|
|
121
|
+
omlish/inject/managed.py,sha256=Ls54Ah5KDrLHYWmso64xipvCLWPcgl1sUOn2n1tuWag,2107
|
|
122
|
+
omlish/inject/multis.py,sha256=PQcIZbKpTJEOca_4pCp__3jLWLb9n90jZLbDe-xx8dQ,3351
|
|
123
|
+
omlish/inject/origins.py,sha256=lk7wkPry-2xN5PgEAYsfwMZd94VHr7fEZ-YkKnYsGXA,512
|
|
124
|
+
omlish/inject/overrides.py,sha256=hrm243slCw_DDRbn3dK5QK1jfHezVokG-WYO2JaQOV8,535
|
|
125
|
+
omlish/inject/privates.py,sha256=hZOa_keY3KlXAzyiZ-sfN697UKXpkfXXNUIEmGT5TAA,641
|
|
126
|
+
omlish/inject/providers.py,sha256=MAla7uDQR63zj9oB9XqN8rK3DGGLSzUKZ4rUU_5dM40,751
|
|
127
|
+
omlish/inject/scopes.py,sha256=0b8Y0VidkpEk7tyxKSbv_1fE-2LomKTYlhFeoEemkwg,1979
|
|
128
|
+
omlish/inject/types.py,sha256=11WVEPkZ-_8cv1BeTDRU-soIYxB_6x7dyWtsa2Iej9U,251
|
|
129
|
+
omlish/inject/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
130
|
+
omlish/inject/impl/bindings.py,sha256=8H586RCgmvwq53XBL9WMbb-1-Tdw_hh9zxIDCwcHA1c,414
|
|
131
|
+
omlish/inject/impl/elements.py,sha256=bJBbHce_eZyIua2wbcejMwd9Uv-QeYcQ-c5N1qOXSmU,5950
|
|
132
|
+
omlish/inject/impl/injector.py,sha256=PO8cpCq5sOhcGEC2rDL4xaQYBNgt__e1NX7wgP_rr_o,6297
|
|
133
|
+
omlish/inject/impl/inspect.py,sha256=erLL1w6GzoPVGwORm56ra9vR-IH5BoMQrr7POwaFDjU,3050
|
|
134
|
+
omlish/inject/impl/multis.py,sha256=rRIWNCiTGaSWQUz_jxEy8LUmzdJDAlG94sLHYDS-ncg,2048
|
|
135
|
+
omlish/inject/impl/origins.py,sha256=vmCLcZgg-j-55y3AwSnMU95qt5C1hzpbLdzNzi-uQ-w,1591
|
|
136
|
+
omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCFQ,2613
|
|
137
|
+
omlish/inject/impl/providers.py,sha256=QnwhsujJFIHC0JTgd2Wlo1kP53i3CWTrj1nKU2DNxwg,2375
|
|
138
|
+
omlish/inject/impl/proxy.py,sha256=1ko0VaKqzu9UG8bIldp9xtUrAVUOFTKWKTjOCqIGr4s,1636
|
|
139
|
+
omlish/inject/impl/scopes.py,sha256=M_RO_pGUr5mX84YyYmkr6CsMhkkV189_gOUsaYmYes4,5768
|
|
140
|
+
omlish/lang/__init__.py,sha256=GnAKAPoSjpf-BpURfiWt23JyOuq18MY8Zy6gFi4idFk,2957
|
|
141
|
+
omlish/lang/cached.py,sha256=0gjdxVELu69oRQ3kqSV3cGIHg6Nf4pcCIIRTEU52tCc,7607
|
|
142
|
+
omlish/lang/clsdct.py,sha256=LXwLCULeI_8Np-7-pZkyNAHpUZLcQiBEQiHwKYQ0WRo,1742
|
|
143
|
+
omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
|
|
144
|
+
omlish/lang/contextmanagers.py,sha256=X2p4FSSLCXRb3cMhJPnpk2_sbGcJILA94dcl_NsAoa8,8326
|
|
145
|
+
omlish/lang/datetimes.py,sha256=fqpgW5lF1oRYbzmrHvh-rNKKH1gRe5KTdYm0yNNmma0,2088
|
|
146
|
+
omlish/lang/descriptors.py,sha256=iXMS8efrClH17y4MvOADdjqal_C_KMVRixsCv4AhiaQ,5885
|
|
147
|
+
omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
|
|
148
|
+
omlish/lang/functions.py,sha256=T4nPl46EHHGjMkz3FTRjsVhS9Y8HKcwM0jROU6_-Rv0,3619
|
|
149
|
+
omlish/lang/imports.py,sha256=QjqGP3le0XbptADTfyeT9Rj9d8ssN71yycGpfbHuj6o,4248
|
|
150
|
+
omlish/lang/iterables.py,sha256=XyRcCKEAgczqGL7H-68B6DRWP8dJ3MIkAIwL2hqG3Ag,1396
|
|
151
|
+
omlish/lang/maybes.py,sha256=J2N3IDOnSSeGbrN342ln2adt0TDpz2SkyCIiZ0pVRDQ,3425
|
|
152
|
+
omlish/lang/objects.py,sha256=TAD84PYsD0cGtaQpqo3fQSm99tP4-hckixkQ_K_Iaic,2820
|
|
153
|
+
omlish/lang/resolving.py,sha256=UgrX-vxXtCGGEmnAMUYP4bUZ6-Ok0EcHVEKAZYbAS-o,1597
|
|
154
|
+
omlish/lang/strings.py,sha256=wdLo3m9GkV76ZKak3QqtwiR6rWqUd1XlZ-divZppcek,2372
|
|
155
|
+
omlish/lang/sys.py,sha256=Q316Bzy9cC6bFwztkgpc8CKnsCaz4ldYvjIGpTXlxf4,145
|
|
156
|
+
omlish/lang/timeouts.py,sha256=vECdWYhc_IZgcal1Ng1Y42wf2FV3KAx-i8As-MgGHIQ,1186
|
|
157
|
+
omlish/lang/typing.py,sha256=ehCIIrt5Jl94ioGFHBw6VrSoh4siTxvcDhz6BVI8xBs,2445
|
|
158
|
+
omlish/lang/classes/__init__.py,sha256=j1p0_uuMznKrY2EhMoj20uv6vx4LXljMzp7AaKe0mmU,530
|
|
159
|
+
omlish/lang/classes/abstract.py,sha256=goIV14oY24EOs88eVe6E6NyrSPOOLMOcWTXTMuYKiqc,2304
|
|
160
|
+
omlish/lang/classes/restrict.py,sha256=UATWUDh9UOvPN8AtlsxUejhEt4Uuj5TyoKKYMnk2fU0,3152
|
|
161
|
+
omlish/lang/classes/simple.py,sha256=U9WB3S9svudIWF7bitptXzVjLHnlG_Xh72K-jIAekaU,3068
|
|
162
|
+
omlish/lang/classes/virtual.py,sha256=54D4qOpDWHpP28Oc6bbBjdxquLvdvqMqLXj2XOnAeaQ,3323
|
|
163
|
+
omlish/lifecycles/__init__.py,sha256=1FjYceXs-4fc-S-C9zFYmc2axHs4znnQHcJVHdY7a6E,578
|
|
164
|
+
omlish/lifecycles/abstract.py,sha256=70CQyZy-c9a2o0ZJxPeUT7eYjWZTBrp2HpUBnrHdAOM,1109
|
|
165
|
+
omlish/lifecycles/base.py,sha256=ceXrNSzuv7iiTlX96UI1fvsQ70OgOmZl-UisDPyA3NA,1394
|
|
166
|
+
omlish/lifecycles/contextmanagers.py,sha256=W0trOo6atbPSCoswmtUVOayAYnJ722qHBgda1oYxUEc,2073
|
|
167
|
+
omlish/lifecycles/controller.py,sha256=L9U2KQohrOfxJnsu-LYNVBvLyUJnRCZyo1ehH1DjG14,3480
|
|
168
|
+
omlish/lifecycles/manager.py,sha256=Au66KaO-fI-SEJALaPUJsCHYW2GE20xextk1wKn2BEU,5445
|
|
169
|
+
omlish/lifecycles/states.py,sha256=zqMOU2ZU-MDNnWuwauM3_anIAiXM8LoBDElDEraptFg,1292
|
|
170
|
+
omlish/lifecycles/transitions.py,sha256=qQtFby-h4VzbvgaUqT2NnbNumlcOx9FVVADP9t83xj4,1939
|
|
171
|
+
omlish/logs/__init__.py,sha256=V8jEdb5rj9Dli0b9qtR0ZYstRoIlxWqbU38UmEOXbfY,419
|
|
172
|
+
omlish/logs/_abc.py,sha256=UgrCUQVUi_PvT3p1CEkb3P74CFrFcZq2AFby3GEUv9M,5974
|
|
173
|
+
omlish/logs/configs.py,sha256=vW4QMZKqeEBbtQY0JEi-VKBIt0CuLgcGDgG8aTlgmC0,1762
|
|
174
|
+
omlish/logs/filters.py,sha256=dk-_sRQhp_rCGF48qpPj5viHOBEOu78quXe9pHHs78c,187
|
|
175
|
+
omlish/logs/formatters.py,sha256=L6aEtjQTmyEK0ivO6F6WW82o7rqxCM3SqburgboTOsY,1910
|
|
176
|
+
omlish/logs/utils.py,sha256=MgGovbP0zUrZ3FGD3qYNQWn-l0jy0Y0bStcQvv5BOmQ,391
|
|
177
|
+
omlish/marshal/__init__.py,sha256=VM_koh4PG1Moyqs6O2670GF42lWD9Qs8GpcfImjDbf0,865
|
|
178
|
+
omlish/marshal/any.py,sha256=uWGEeBWaJvh5hjaGKIBL0ogGCg1jKH0Rq_onECYpHVs,821
|
|
179
|
+
omlish/marshal/base.py,sha256=w1zfL-eU5ZvVsoPWOwy_P8qi3VcxgI4I_3NuHNFUeww,5124
|
|
180
|
+
omlish/marshal/base64.py,sha256=kdkkFXjYaKx6iHxMM_7vYfaX-KUM3wXN3vzsOmBbou4,863
|
|
181
|
+
omlish/marshal/dataclasses.py,sha256=uTjpSxRtVJLWJr5-Bmb_PMGpRhr2gJjaL3oR2pToR1I,3522
|
|
182
|
+
omlish/marshal/datetimes.py,sha256=ANTgeUm8AuTKoxW6fLkwvsRPPBoUtAD6mfrOS5f4Xuc,2314
|
|
183
|
+
omlish/marshal/enums.py,sha256=xItDDXHoIsCL_wnhRZmTpK1zy6P0dYouOcbfPGFvyxE,1224
|
|
184
|
+
omlish/marshal/exceptions.py,sha256=5ub1eA0Wfd3gs8mT8XbPvPdqMVFUoCJfxvgbIjI5Uo0,142
|
|
185
|
+
omlish/marshal/factories.py,sha256=4Vt5Vr4r_toZQHGt_fTmcmG-gJoaZcpr6GJMU1P2lhA,2932
|
|
186
|
+
omlish/marshal/global_.py,sha256=kbq8gzjsKLlkieboQ-mYibPNrUGdb_kOt4Dzcmk3I4Y,881
|
|
187
|
+
omlish/marshal/iterables.py,sha256=ZHmvT79_i2m4bCahcuEE9aeeOukjtZhYnROCnxP53y8,2168
|
|
188
|
+
omlish/marshal/mappings.py,sha256=4bh1pdbvUh42Xp3mWQQa4J6da7MADmsuO029uqIYk3w,2469
|
|
189
|
+
omlish/marshal/naming.py,sha256=UCviMAXTTUpW1lyAGymybGP2rFUAW44P1X0zrIVbvi4,464
|
|
190
|
+
omlish/marshal/objects.py,sha256=JD7GBY1hYUyRpCufpxDAwgII98ewzGDct2IF0HxgFN0,2767
|
|
191
|
+
omlish/marshal/optionals.py,sha256=zZN34AGXkHobJRzM1g4UcW6jw82La8moPH5tmyxy9rc,1508
|
|
192
|
+
omlish/marshal/polymorphism.py,sha256=1WJRzTLyWSCxhsXDzTksQH09TqJXnFRzrHV5jlOkef8,3886
|
|
193
|
+
omlish/marshal/primitives.py,sha256=N7kXrdxz5CIrDnPnsYMdo0xLjEfMnVfKXLMANDu-L6Y,1139
|
|
194
|
+
omlish/marshal/registries.py,sha256=GI2KogcxawMkk02Ky7-TsnijChoe1I7YTOPIbUNwSAI,1665
|
|
195
|
+
omlish/marshal/standard.py,sha256=MPmtJH3B_LqeoSwQsxKjUm65-cq6albBc8z-gxyKAj4,2442
|
|
196
|
+
omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
|
|
197
|
+
omlish/marshal/uuids.py,sha256=_htkeMt1a6FUNBlstZIy2rrB1-1DiavV5dZrjSQNYVM,952
|
|
198
|
+
omlish/marshal/values.py,sha256=ssHiWdg_L6M17kAn8GiGdPW7UeQOm3RDikWkvwblf5I,263
|
|
199
|
+
omlish/secrets/__init__.py,sha256=4yMFQXAd-Rmb4w0uu-dFkjCnNXeq2SzWE2ckUpI1KbI,114
|
|
200
|
+
omlish/secrets/marshal.py,sha256=aAMdib-iudUXG1mx7_q0yb1l_aWJyRr3Dur3ig8GUQE,1206
|
|
201
|
+
omlish/secrets/passwords.py,sha256=3r-vEK6Gp6aq4L5Csnd06QnrjO9xfzHJP-g_7I9W_ao,4101
|
|
202
|
+
omlish/secrets/secrets.py,sha256=k5nRrZumNDlr9R0XUObpIzxHGqqfrNrVFUd7hpA-tgw,838
|
|
203
|
+
omlish/serde/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
204
|
+
omlish/serde/dotenv.py,sha256=bVWHo8Rr15IpoyEC8xklkccDXzJU5k7Yziyi8KAfOtI,17184
|
|
205
|
+
omlish/serde/json.py,sha256=KRfH-MLOrMXUFVy_eX6RagC37Z-KyfOIXlVdxM6nuxc,6787
|
|
206
|
+
omlish/serde/props.py,sha256=diYjZDsG1s50ImJhkpeinMwjr8952nIVI-0gYhBIvCY,18897
|
|
207
|
+
omlish/serde/yaml.py,sha256=t41GPx8O57_Lu235NVjvwOEY_PAvvefDZMuPxOVTCtM,6640
|
|
208
|
+
omlish/sql/__init__.py,sha256=pLv2EQmAwcGXN0Y3AE8K5JjyN_4GaHRMHyExaDFm5yU,181
|
|
209
|
+
omlish/sql/_abc.py,sha256=HLhnnLZ7l0r_N99I-RCqJe6VHth-9iluU7cR-7-5jfs,1519
|
|
210
|
+
omlish/sql/asyncs.py,sha256=Wye3dwh7oZEGYz2Y4DZQSHtW4xjI2AH5qjW-BSS2IfU,3688
|
|
211
|
+
omlish/sql/dbs.py,sha256=t_tV5aDOqoktddIyLVMOiRtNMTe7S0rQklEkmks2TEc,1775
|
|
212
|
+
omlish/sql/duckdb.py,sha256=Z3wiZEn_21Lu1ElFRX0ATzoBMCw0KJxINjTRuTexYGM,3748
|
|
213
|
+
omlish/sql/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,403
|
|
214
|
+
omlish/testing/__init__.py,sha256=l13axR7dyVE9T1e6w1pMYtAkW3vS2J97nBcYQ1FUv18,136
|
|
215
|
+
omlish/testing/testing.py,sha256=p1bP9fnxmYzOvPJ_7S1wq7PrKMzclK8PgYH5DwaQiHk,2918
|
|
216
|
+
omlish/testing/pytest/__init__.py,sha256=b6ObMEHTZnvGEI_de6nN1x5FyitV6B2mNYkurA4Q7fo,336
|
|
217
|
+
omlish/testing/pytest/helpers.py,sha256=TJpD60mBtLi9FtxX4TThfuXvg5FIRPSiZk1aeRwe-D4,197
|
|
218
|
+
omlish/testing/pytest/marks.py,sha256=LbI5lO29cbh_FA5-vktwtcZwWjxn9URI0pprzmPRyJo,1260
|
|
219
|
+
omlish/testing/pytest/inject/__init__.py,sha256=pdRKv1HcDmJ_yArKJbYITPXXZthRSGgBJWqITr0Er38,117
|
|
220
|
+
omlish/testing/pytest/inject/harness.py,sha256=IfcqR1rcIYkl_66Mmhy1KEeCWFJ95wr68Vs5687bPlY,5053
|
|
221
|
+
omlish/testing/pytest/plugins/__init__.py,sha256=Kx4OgGY_whB2I-5c7iI41j-dAaerEIlMEnWN2orGHQI,405
|
|
222
|
+
omlish/testing/pytest/plugins/_registry.py,sha256=IK04KlBgiOJxKAyCCgjpX2R-9tE-btalYJkgjLc8Te8,77
|
|
223
|
+
omlish/testing/pytest/plugins/asyncs.py,sha256=Gpj2c6TM33iJUE_bGfdGWTHKMt-nTWw30CHsre2V6pc,4274
|
|
224
|
+
omlish/testing/pytest/plugins/logging.py,sha256=1zs6Xe54wiaSjabCviaFXwKkoN97CKm3mA5mEoUeJGs,380
|
|
225
|
+
omlish/testing/pytest/plugins/managermarks.py,sha256=pDEcCNdDAcTS4jjZHSnAfmzqMJDBcJcSsM3QNhbJ6Gs,1485
|
|
226
|
+
omlish/testing/pytest/plugins/pydevd.py,sha256=u1fxfCgFw4wGKBkMV_H_l9WI8JoUwlRff4iHEr_WYeE,319
|
|
227
|
+
omlish/testing/pytest/plugins/repeat.py,sha256=flSQzE9GFOWksVKz-mUGnpxJpv3yRqn1G4K8pW7JHs0,498
|
|
228
|
+
omlish/testing/pytest/plugins/skips.py,sha256=EoZDg1uWccgbAegmzqI85c7RliycD1e2J4Y7vfDRhwM,1041
|
|
229
|
+
omlish/testing/pytest/plugins/spacing.py,sha256=JQQhi9q3c523Ro1a_K_9RGAb7HotiO74N8bYX2VESFE,707
|
|
230
|
+
omlish/testing/pytest/plugins/switches.py,sha256=qeCp3aDtZjnh6-po1FU4JEKCrR97q0MI9nJmIF_LRkg,1809
|
|
231
|
+
omlish/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
232
|
+
omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
|
|
233
|
+
omlish/text/glyphsplit.py,sha256=6h2mZcEzxbdOE_zspGYfbrcFQsv6T8F8sqV199BuesI,3035
|
|
234
|
+
omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
|
|
235
|
+
omlish/text/parts.py,sha256=KGgo0wHOIMVMZtDso-rhSWKAcAkYAH2IGpg9tULabu8,6505
|
|
236
|
+
omlish-0.0.0.dev6.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
|
237
|
+
omlish-0.0.0.dev6.dist-info/METADATA,sha256=BjJwsI-1K2VNfJ5HR_t9on8XqH2JySFrLY8_Cabx_Wc,1058
|
|
238
|
+
omlish-0.0.0.dev6.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
|
239
|
+
omlish-0.0.0.dev6.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
|
240
|
+
omlish-0.0.0.dev6.dist-info/RECORD,,
|
omlish/configs/props.py
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
TODO:
|
|
3
|
-
- \\uXXXX
|
|
4
|
-
"""
|
|
5
|
-
import re
|
|
6
|
-
import typing as ta
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
_NORMALIZE_PATTERN = re.compile(r'\\([:=\s])')
|
|
10
|
-
_ESCAPE_PATTERN = re.compile(r'([=:\s])')
|
|
11
|
-
_SEPARATOR_PATTERN = re.compile(r'(?<!\\)[=:]')
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def normalize(atom: str) -> str:
|
|
15
|
-
return _NORMALIZE_PATTERN.sub(r'\1', atom.strip())
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def escape(token: str) -> str:
|
|
19
|
-
return _ESCAPE_PATTERN.sub(r'\\\1', token)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def parse_line(line: str) -> tuple[str, str] | None:
|
|
23
|
-
if line and not line.startswith(('#', '!')):
|
|
24
|
-
match = _SEPARATOR_PATTERN.search(line)
|
|
25
|
-
if match:
|
|
26
|
-
return normalize(line[:match.start()]), normalize(line[match.end():])
|
|
27
|
-
else:
|
|
28
|
-
space_sep = line.find(' ')
|
|
29
|
-
if space_sep == -1:
|
|
30
|
-
return normalize(line), ''
|
|
31
|
-
else:
|
|
32
|
-
return normalize(line[:space_sep]), normalize(line[space_sep:])
|
|
33
|
-
return None
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def coalesce_lines(lines: ta.Iterable[str]) -> ta.Generator[str, None, None]:
|
|
37
|
-
line_iter = iter(lines)
|
|
38
|
-
try:
|
|
39
|
-
buffer = ''
|
|
40
|
-
while True:
|
|
41
|
-
line = next(line_iter)
|
|
42
|
-
if line.strip().endswith('\\'):
|
|
43
|
-
buffer += line.strip()[:-1]
|
|
44
|
-
else:
|
|
45
|
-
if buffer:
|
|
46
|
-
buffer += line.rstrip()
|
|
47
|
-
else:
|
|
48
|
-
buffer = line.strip()
|
|
49
|
-
try:
|
|
50
|
-
yield buffer
|
|
51
|
-
finally:
|
|
52
|
-
buffer = ''
|
|
53
|
-
except StopIteration:
|
|
54
|
-
pass
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def parse_lines(lines: ta.Iterable[str]) -> dict[str, str]:
|
|
58
|
-
props = {}
|
|
59
|
-
for line in coalesce_lines(lines):
|
|
60
|
-
kv_pair = parse_line(line)
|
|
61
|
-
if kv_pair:
|
|
62
|
-
key, value = kv_pair
|
|
63
|
-
props[key] = value
|
|
64
|
-
return props
|