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.

Files changed (143) hide show
  1. omlish/__about__.py +1 -1
  2. omlish/__init__.py +1 -1
  3. omlish/asyncs/__init__.py +10 -4
  4. omlish/asyncs/anyio.py +142 -12
  5. omlish/asyncs/asyncio.py +23 -0
  6. omlish/asyncs/asyncs.py +9 -6
  7. omlish/asyncs/bridge.py +316 -0
  8. omlish/asyncs/flavors.py +27 -1
  9. omlish/asyncs/trio_asyncio.py +28 -18
  10. omlish/c3.py +1 -1
  11. omlish/cached.py +1 -2
  12. omlish/collections/__init__.py +5 -1
  13. omlish/collections/cache/impl.py +1 -1
  14. omlish/collections/identity.py +7 -0
  15. omlish/collections/indexed.py +1 -1
  16. omlish/collections/utils.py +38 -6
  17. omlish/configs/__init__.py +5 -0
  18. omlish/configs/classes.py +53 -0
  19. omlish/configs/strings.py +94 -0
  20. omlish/dataclasses/__init__.py +9 -0
  21. omlish/dataclasses/impl/api.py +1 -1
  22. omlish/dataclasses/impl/as_.py +1 -1
  23. omlish/dataclasses/impl/copy.py +30 -0
  24. omlish/dataclasses/impl/exceptions.py +6 -0
  25. omlish/dataclasses/impl/fields.py +25 -25
  26. omlish/dataclasses/impl/init.py +5 -3
  27. omlish/dataclasses/impl/main.py +3 -0
  28. omlish/dataclasses/impl/metaclass.py +6 -1
  29. omlish/dataclasses/impl/order.py +1 -1
  30. omlish/dataclasses/impl/reflect.py +15 -2
  31. omlish/dataclasses/utils.py +44 -0
  32. omlish/defs.py +1 -1
  33. omlish/diag/__init__.py +4 -0
  34. omlish/diag/procfs.py +31 -3
  35. omlish/diag/procstats.py +32 -0
  36. omlish/{testing → diag}/pydevd.py +35 -0
  37. omlish/diag/replserver/console.py +3 -3
  38. omlish/diag/replserver/server.py +6 -5
  39. omlish/diag/threads.py +86 -0
  40. omlish/dispatch/_dispatch2.py +65 -0
  41. omlish/dispatch/_dispatch3.py +104 -0
  42. omlish/docker.py +20 -1
  43. omlish/fnpairs.py +37 -18
  44. omlish/graphs/dags.py +113 -0
  45. omlish/graphs/domination.py +268 -0
  46. omlish/graphs/trees.py +2 -2
  47. omlish/http/__init__.py +25 -0
  48. omlish/http/asgi.py +132 -0
  49. omlish/http/collections.py +15 -0
  50. omlish/http/consts.py +47 -5
  51. omlish/http/cookies.py +194 -0
  52. omlish/http/dates.py +70 -0
  53. omlish/http/encodings.py +6 -0
  54. omlish/http/json.py +273 -0
  55. omlish/http/sessions.py +204 -0
  56. omlish/inject/__init__.py +51 -17
  57. omlish/inject/binder.py +185 -5
  58. omlish/inject/bindings.py +3 -36
  59. omlish/inject/eagers.py +2 -8
  60. omlish/inject/elements.py +30 -9
  61. omlish/inject/exceptions.py +3 -3
  62. omlish/inject/impl/elements.py +65 -31
  63. omlish/inject/impl/injector.py +20 -2
  64. omlish/inject/impl/inspect.py +33 -5
  65. omlish/inject/impl/multis.py +74 -0
  66. omlish/inject/impl/origins.py +75 -0
  67. omlish/inject/impl/{private.py → privates.py} +2 -2
  68. omlish/inject/impl/providers.py +19 -39
  69. omlish/inject/{proxy.py → impl/proxy.py} +2 -2
  70. omlish/inject/impl/scopes.py +7 -2
  71. omlish/inject/injector.py +9 -4
  72. omlish/inject/inspect.py +18 -0
  73. omlish/inject/keys.py +11 -23
  74. omlish/inject/listeners.py +26 -0
  75. omlish/inject/managed.py +76 -10
  76. omlish/inject/multis.py +120 -0
  77. omlish/inject/origins.py +27 -0
  78. omlish/inject/overrides.py +5 -4
  79. omlish/inject/{private.py → privates.py} +6 -10
  80. omlish/inject/providers.py +12 -85
  81. omlish/inject/scopes.py +20 -9
  82. omlish/inject/types.py +2 -8
  83. omlish/iterators.py +13 -0
  84. omlish/lang/__init__.py +12 -2
  85. omlish/lang/cached.py +2 -2
  86. omlish/lang/classes/restrict.py +3 -2
  87. omlish/lang/classes/simple.py +18 -8
  88. omlish/lang/classes/virtual.py +2 -2
  89. omlish/lang/contextmanagers.py +75 -2
  90. omlish/lang/datetimes.py +6 -5
  91. omlish/lang/descriptors.py +131 -0
  92. omlish/lang/functions.py +18 -28
  93. omlish/lang/imports.py +11 -2
  94. omlish/lang/iterables.py +20 -1
  95. omlish/lang/typing.py +6 -0
  96. omlish/lifecycles/__init__.py +34 -0
  97. omlish/lifecycles/abstract.py +43 -0
  98. omlish/lifecycles/base.py +51 -0
  99. omlish/lifecycles/contextmanagers.py +74 -0
  100. omlish/lifecycles/controller.py +116 -0
  101. omlish/lifecycles/manager.py +161 -0
  102. omlish/lifecycles/states.py +43 -0
  103. omlish/lifecycles/transitions.py +64 -0
  104. omlish/logs/formatters.py +1 -1
  105. omlish/logs/utils.py +1 -1
  106. omlish/marshal/__init__.py +4 -0
  107. omlish/marshal/datetimes.py +1 -1
  108. omlish/marshal/naming.py +4 -0
  109. omlish/marshal/objects.py +1 -0
  110. omlish/marshal/polymorphism.py +4 -4
  111. omlish/reflect.py +139 -18
  112. omlish/secrets/__init__.py +7 -0
  113. omlish/secrets/marshal.py +41 -0
  114. omlish/secrets/passwords.py +120 -0
  115. omlish/secrets/secrets.py +47 -0
  116. omlish/serde/__init__.py +0 -0
  117. omlish/serde/dotenv.py +574 -0
  118. omlish/{json.py → serde/json.py} +4 -2
  119. omlish/serde/props.py +604 -0
  120. omlish/serde/yaml.py +223 -0
  121. omlish/sql/dbs.py +1 -1
  122. omlish/sql/duckdb.py +136 -0
  123. omlish/sql/sqlean.py +17 -0
  124. omlish/sync.py +70 -0
  125. omlish/term.py +7 -2
  126. omlish/testing/pytest/__init__.py +8 -2
  127. omlish/testing/pytest/helpers.py +0 -24
  128. omlish/testing/pytest/inject/harness.py +4 -4
  129. omlish/testing/pytest/marks.py +45 -0
  130. omlish/testing/pytest/plugins/__init__.py +3 -0
  131. omlish/testing/pytest/plugins/asyncs.py +136 -0
  132. omlish/testing/pytest/plugins/managermarks.py +60 -0
  133. omlish/testing/pytest/plugins/pydevd.py +1 -1
  134. omlish/testing/testing.py +10 -0
  135. omlish/text/delimit.py +4 -0
  136. omlish/text/glyphsplit.py +92 -0
  137. {omlish-0.0.0.dev4.dist-info → omlish-0.0.0.dev6.dist-info}/METADATA +1 -1
  138. omlish-0.0.0.dev6.dist-info/RECORD +240 -0
  139. {omlish-0.0.0.dev4.dist-info → omlish-0.0.0.dev6.dist-info}/WHEEL +1 -1
  140. omlish/configs/props.py +0 -64
  141. omlish-0.0.0.dev4.dist-info/RECORD +0 -195
  142. {omlish-0.0.0.dev4.dist-info → omlish-0.0.0.dev6.dist-info}/LICENSE +0 -0
  143. {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
@@ -1,4 +1,4 @@
1
- from ... import pydevd as opd
1
+ from ....diag import pydevd as opd
2
2
  from ._registry import register
3
3
 
4
4
 
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
@@ -1,3 +1,7 @@
1
+ """
2
+ TODO:
3
+ - replace with codecs.StreamReader
4
+ """
1
5
  import io
2
6
  import typing as ta
3
7
 
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev4
3
+ Version: 0.0.0.dev6
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (72.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
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