omlish 0.0.0.dev247__py3-none-any.whl → 0.0.0.dev248__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.
Files changed (47) hide show
  1. omlish/.manifests.json +2 -2
  2. omlish/__about__.py +2 -2
  3. omlish/collections/cache/descriptor.py +0 -2
  4. omlish/concurrent/executors.py +0 -1
  5. omlish/concurrent/futures.py +0 -1
  6. omlish/dataclasses/impl/descriptors.py +0 -2
  7. omlish/diag/replserver/server.py +0 -1
  8. omlish/dispatch/_dispatch2.py +7 -3
  9. omlish/dispatch/_dispatch3.py +7 -3
  10. omlish/dispatch/dispatch.py +29 -63
  11. omlish/dispatch/functions.py +1 -1
  12. omlish/dispatch/impls.py +69 -0
  13. omlish/dispatch/methods.py +1 -1
  14. omlish/dynamic.py +0 -3
  15. omlish/formats/json/stream/build.py +2 -0
  16. omlish/formats/yaml.py +0 -3
  17. omlish/graphs/dags.py +0 -2
  18. omlish/graphs/domination.py +0 -5
  19. omlish/graphs/dot/items.py +0 -1
  20. omlish/graphs/dot/rendering.py +0 -1
  21. omlish/graphs/trees.py +0 -1
  22. omlish/inject/binder.py +0 -10
  23. omlish/iterators/iterators.py +0 -4
  24. omlish/lang/__init__.py +1 -0
  25. omlish/lang/collections.py +36 -0
  26. omlish/lang/descriptors.py +0 -1
  27. omlish/lifecycles/base.py +0 -1
  28. omlish/lifecycles/contextmanagers.py +0 -1
  29. omlish/lifecycles/controller.py +0 -2
  30. omlish/lifecycles/manager.py +0 -1
  31. omlish/marshal/trivial/any.py +0 -1
  32. omlish/math/bits.py +0 -1
  33. omlish/math/stats.py +0 -1
  34. omlish/term/codes.py +0 -1
  35. omlish/testing/pytest/plugins/logging.py +0 -1
  36. omlish/testing/pytest/plugins/pydevd.py +0 -1
  37. omlish/testing/pytest/plugins/repeat.py +0 -1
  38. omlish/testing/pytest/plugins/skips.py +0 -1
  39. omlish/testing/pytest/plugins/spacing.py +0 -1
  40. omlish/testing/pytest/plugins/switches.py +0 -1
  41. omlish/text/delimit.py +0 -1
  42. {omlish-0.0.0.dev247.dist-info → omlish-0.0.0.dev248.dist-info}/METADATA +1 -1
  43. {omlish-0.0.0.dev247.dist-info → omlish-0.0.0.dev248.dist-info}/RECORD +47 -46
  44. {omlish-0.0.0.dev247.dist-info → omlish-0.0.0.dev248.dist-info}/LICENSE +0 -0
  45. {omlish-0.0.0.dev247.dist-info → omlish-0.0.0.dev248.dist-info}/WHEEL +0 -0
  46. {omlish-0.0.0.dev247.dist-info → omlish-0.0.0.dev248.dist-info}/entry_points.txt +0 -0
  47. {omlish-0.0.0.dev247.dist-info → omlish-0.0.0.dev248.dist-info}/top_level.txt +0 -0
omlish/.manifests.json CHANGED
@@ -167,7 +167,7 @@
167
167
  "module": ".formats.yaml",
168
168
  "attr": "_YAML_LAZY_CODEC",
169
169
  "file": "omlish/formats/yaml.py",
170
- "line": 258,
170
+ "line": 255,
171
171
  "value": {
172
172
  "$.codecs.base.LazyLoadedCodec": {
173
173
  "mod_name": "omlish.formats.yaml",
@@ -183,7 +183,7 @@
183
183
  "module": ".formats.yaml",
184
184
  "attr": "_YAML_UNSAFE_LAZY_CODEC",
185
185
  "file": "omlish/formats/yaml.py",
186
- "line": 265,
186
+ "line": 262,
187
187
  "value": {
188
188
  "$.codecs.base.LazyLoadedCodec": {
189
189
  "mod_name": "omlish.formats.yaml",
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev247'
2
- __revision__ = '537438b3d967f194ec6ec7277d9e06205bac12b5'
1
+ __version__ = '0.0.0.dev248'
2
+ __revision__ = 'c1cc77db1e3c02c65fabdb24e9696526d61559e3'
3
3
 
4
4
 
5
5
  #
@@ -63,7 +63,6 @@ def _make_key(
63
63
 
64
64
 
65
65
  class Ignore:
66
-
67
66
  def __init__(self, value: ta.Any) -> None:
68
67
  super().__init__()
69
68
 
@@ -75,7 +74,6 @@ def ignore(value: ta.Any) -> ta.Any:
75
74
 
76
75
 
77
76
  class _CacheDescriptor:
78
-
79
77
  def __init__(
80
78
  self,
81
79
  fn: ta.Callable,
@@ -8,7 +8,6 @@ P = ta.ParamSpec('P')
8
8
 
9
9
 
10
10
  class ImmediateExecutor(cf.Executor):
11
-
12
11
  def __init__(self, *, immediate_exceptions: bool = False) -> None:
13
12
  super().__init__()
14
13
  self._immediate_exceptions = immediate_exceptions
@@ -10,7 +10,6 @@ T = ta.TypeVar('T')
10
10
 
11
11
 
12
12
  class FutureError(Exception, ta.Generic[T]):
13
-
14
13
  def __init__(self, future: cf.Future, target: T | None = None) -> None:
15
14
  super().__init__()
16
15
 
@@ -6,7 +6,6 @@ from ... import defs
6
6
 
7
7
 
8
8
  class AbstractFieldDescriptor(abc.ABC):
9
-
10
9
  def __init__(
11
10
  self,
12
11
  *,
@@ -69,7 +68,6 @@ class AbstractFieldDescriptor(abc.ABC):
69
68
 
70
69
 
71
70
  class PyFieldDescriptor(AbstractFieldDescriptor):
72
-
73
71
  def __init__(
74
72
  self,
75
73
  attr: str,
@@ -38,7 +38,6 @@ log = logging.getLogger(__name__)
38
38
 
39
39
 
40
40
  class ReplServer:
41
-
42
41
  CONNECTION_THREAD_NAME = 'ReplServerConnection'
43
42
 
44
43
  @dc.dataclass(frozen=True)
@@ -2,7 +2,7 @@ import abc
2
2
  import typing as ta
3
3
  import weakref
4
4
 
5
- from .dispatch import find_impl
5
+ from .impls import find_impl as default_find_impl
6
6
 
7
7
 
8
8
  T = ta.TypeVar('T')
@@ -12,9 +12,13 @@ T = ta.TypeVar('T')
12
12
 
13
13
 
14
14
  class Dispatcher(ta.Generic[T]):
15
- def __init__(self) -> None:
15
+ def __init__(self, find_impl: ta.Callable[[type, ta.Mapping[type, T]], T | None] | None = None) -> None:
16
16
  super().__init__()
17
17
 
18
+ if find_impl is None:
19
+ find_impl = default_find_impl
20
+ self._find_impl = find_impl
21
+
18
22
  self._impls_by_arg_cls: dict[type, T] = {}
19
23
  self._dispatch_cache: dict[ta.Any, T | None] = {}
20
24
 
@@ -59,7 +63,7 @@ class Dispatcher(ta.Generic[T]):
59
63
  try:
60
64
  impl = self._impls_by_arg_cls[cls]
61
65
  except KeyError:
62
- impl = find_impl(cls, self._impls_by_arg_cls)
66
+ impl = self._find_impl(cls, self._impls_by_arg_cls)
63
67
 
64
68
  self._dispatch_cache[weakref.ref(cls, self._cache_remove)] = impl
65
69
  return impl
@@ -2,7 +2,7 @@ import abc
2
2
  import typing as ta
3
3
  import weakref
4
4
 
5
- from .dispatch import find_impl
5
+ from .impls import find_impl as default_find_impl
6
6
 
7
7
 
8
8
  T = ta.TypeVar('T')
@@ -72,9 +72,13 @@ class DispatchCache(DispatchCacheProtocol[T]):
72
72
 
73
73
 
74
74
  class Dispatcher(DispatcherProtocol[T]):
75
- def __init__(self) -> None:
75
+ def __init__(self, find_impl: ta.Callable[[type, ta.Mapping[type, T]], T | None] | None = None) -> None:
76
76
  super().__init__()
77
77
 
78
+ if find_impl is None:
79
+ find_impl = default_find_impl
80
+ self._find_impl = find_impl
81
+
78
82
  self._impls_by_arg_cls: dict[type, T] = {}
79
83
  self._cache: DispatchCache[T | None] = DispatchCache()
80
84
 
@@ -98,7 +102,7 @@ class Dispatcher(DispatcherProtocol[T]):
98
102
  try:
99
103
  impl = self._impls_by_arg_cls[cls]
100
104
  except KeyError:
101
- impl = find_impl(cls, self._impls_by_arg_cls)
105
+ impl = self._find_impl(cls, self._impls_by_arg_cls)
102
106
 
103
107
  self._cache.put(cls, impl)
104
108
  return impl
@@ -3,9 +3,7 @@ import contextlib
3
3
  import typing as ta
4
4
  import weakref
5
5
 
6
- from .. import c3
7
- from .. import check
8
- from .. import reflect as rfl
6
+ from .impls import find_impl as default_find_impl
9
7
 
10
8
 
11
9
  T = ta.TypeVar('T')
@@ -14,69 +12,13 @@ T = ta.TypeVar('T')
14
12
  ##
15
13
 
16
14
 
17
- _IMPL_FUNC_CLS_SET_CACHE: ta.MutableMapping[ta.Callable, frozenset[type]] = weakref.WeakKeyDictionary()
18
-
19
-
20
- def get_impl_func_cls_set(func: ta.Callable) -> frozenset[type]:
21
- with contextlib.suppress(KeyError):
22
- return _IMPL_FUNC_CLS_SET_CACHE[func]
23
-
24
- ann = getattr(func, '__annotations__', {})
25
- if not ann:
26
- raise TypeError(f'Invalid impl func: {func!r}')
27
-
28
- def erase(a):
29
- if isinstance(a, rfl.Generic):
30
- return a.cls
31
- else:
32
- return check.isinstance(a, type)
33
-
34
- # Exclude 'return' to support difficult to handle return types - they are unimportant.
35
- # TODO: only get hints for first arg - requires inspection, which requires chopping off `self`, which can be tricky.
36
- _, cls = next(iter(rfl.get_filtered_type_hints(func, exclude=['return']).items()))
37
-
38
- rty = rfl.type_(cls)
39
- if isinstance(rty, rfl.Union):
40
- ret = frozenset(erase(arg) for arg in rty.args)
41
- else:
42
- ret = frozenset([erase(rty)])
43
-
44
- _IMPL_FUNC_CLS_SET_CACHE[func] = ret
45
- return ret
46
-
47
-
48
- def find_impl(cls: type, registry: ta.Mapping[type, T]) -> T | None:
49
- mro = c3.compose_mro(cls, registry.keys())
50
-
51
- match: type | None = None
52
- for t in mro:
53
- if match is not None:
54
- # If *match* is an implicit ABC but there is another unrelated, equally matching implicit ABC, refuse the
55
- # temptation to guess.
56
- if (
57
- t in registry
58
- and t not in cls.__mro__
59
- and match not in cls.__mro__
60
- and not issubclass(match, t)
61
- ):
62
- raise RuntimeError(f'Ambiguous dispatch: {match} or {t}')
63
- break
64
-
65
- if t in registry:
66
- match = t
67
-
68
- if match is None:
69
- return None
70
- return registry.get(match)
71
-
72
-
73
- ##
74
-
75
-
76
15
  class Dispatcher(ta.Generic[T]):
77
- def __init__(self) -> None:
16
+ def __init__(self, find_impl: ta.Callable[[type, ta.Mapping[type, T]], T | None] | None = None) -> None:
78
17
  super().__init__()
79
18
 
19
+ if find_impl is None:
20
+ find_impl = default_find_impl
21
+
80
22
  impls_by_arg_cls: dict[type, T] = {}
81
23
  self._impls_by_arg_cls = impls_by_arg_cls
82
24
 
@@ -142,3 +84,27 @@ class Dispatcher(ta.Generic[T]):
142
84
  dispatch: ta.Callable[[type], T | None]
143
85
 
144
86
  register: ta.Callable[[T, ta.Iterable[type]], T]
87
+
88
+
89
+ ##
90
+
91
+
92
+ # from x.dispatch import _gpto1_2 as _dispatch # noqa
93
+ #
94
+ #
95
+ # class Dispatcher(ta.Generic[T]): # noqa
96
+ # def __init__(self, find_impl: ta.Callable[[type, ta.Mapping[type, T]], T | None] | None = None) -> None:
97
+ # super().__init__()
98
+ #
99
+ # if find_impl is None:
100
+ # find_impl = default_find_impl
101
+ # self._x = _dispatch.Dispatcher(find_impl)
102
+ #
103
+ # def cache_size(self) -> int:
104
+ # return self._x.cache_size()
105
+ #
106
+ # def dispatch(self, cls: type) -> T | None:
107
+ # return self._x.dispatch(cls)
108
+ #
109
+ # def register(self, impl: T, cls_col: ta.Iterable[type]) -> T:
110
+ # return self._x.register(impl, cls_col)
@@ -3,7 +3,7 @@ import typing as ta
3
3
 
4
4
  from .. import check
5
5
  from .dispatch import Dispatcher
6
- from .dispatch import get_impl_func_cls_set
6
+ from .impls import get_impl_func_cls_set
7
7
 
8
8
 
9
9
  # USE_EXTENSION = True
@@ -0,0 +1,69 @@
1
+ import contextlib
2
+ import typing as ta
3
+ import weakref
4
+
5
+ from .. import c3
6
+ from .. import check
7
+ from .. import reflect as rfl
8
+
9
+
10
+ T = ta.TypeVar('T')
11
+
12
+
13
+ ##
14
+
15
+
16
+ _IMPL_FUNC_CLS_SET_CACHE: ta.MutableMapping[ta.Callable, frozenset[type]] = weakref.WeakKeyDictionary()
17
+
18
+
19
+ def get_impl_func_cls_set(func: ta.Callable) -> frozenset[type]:
20
+ with contextlib.suppress(KeyError):
21
+ return _IMPL_FUNC_CLS_SET_CACHE[func]
22
+
23
+ ann = getattr(func, '__annotations__', {})
24
+ if not ann:
25
+ raise TypeError(f'Invalid impl func: {func!r}')
26
+
27
+ def erase(a):
28
+ if isinstance(a, rfl.Generic):
29
+ return a.cls
30
+ else:
31
+ return check.isinstance(a, type)
32
+
33
+ # Exclude 'return' to support difficult to handle return types - they are unimportant.
34
+ # TODO: only get hints for first arg - requires inspection, which requires chopping off `self`, which can be tricky.
35
+ _, cls = next(iter(rfl.get_filtered_type_hints(func, exclude=['return']).items()))
36
+
37
+ rty = rfl.type_(cls)
38
+ if isinstance(rty, rfl.Union):
39
+ ret = frozenset(erase(arg) for arg in rty.args)
40
+ else:
41
+ ret = frozenset([erase(rty)])
42
+
43
+ _IMPL_FUNC_CLS_SET_CACHE[func] = ret
44
+ return ret
45
+
46
+
47
+ def find_impl(cls: type, registry: ta.Mapping[type, T]) -> T | None:
48
+ mro = c3.compose_mro(cls, registry.keys())
49
+
50
+ match: type | None = None
51
+ for t in mro:
52
+ if match is not None:
53
+ # If *match* is an implicit ABC but there is another unrelated, equally matching implicit ABC, refuse the
54
+ # temptation to guess.
55
+ if (
56
+ t in registry
57
+ and t not in cls.__mro__
58
+ and match not in cls.__mro__
59
+ and not issubclass(match, t)
60
+ ):
61
+ raise RuntimeError(f'Ambiguous dispatch: {match} or {t}')
62
+ break
63
+
64
+ if t in registry:
65
+ match = t
66
+
67
+ if match is None:
68
+ return None
69
+ return registry.get(match)
@@ -12,7 +12,7 @@ import weakref
12
12
  from .. import check
13
13
  from .. import lang
14
14
  from .dispatch import Dispatcher
15
- from .dispatch import get_impl_func_cls_set
15
+ from .impls import get_impl_func_cls_set
16
16
 
17
17
 
18
18
  T = ta.TypeVar('T')
omlish/dynamic.py CHANGED
@@ -46,7 +46,6 @@ class UnboundVarError(ValueError):
46
46
 
47
47
 
48
48
  class Var(ta.Generic[T]):
49
-
50
49
  def __init__(
51
50
  self,
52
51
  default: type[MISSING] | T = MISSING,
@@ -152,7 +151,6 @@ class Var(ta.Generic[T]):
152
151
 
153
152
 
154
153
  class Binding(ta.Generic[T]):
155
-
156
154
  _frame: types.FrameType
157
155
  _frame_bindings: ta.MutableMapping[int, 'Binding']
158
156
  _level: int
@@ -207,7 +205,6 @@ class Binding(ta.Generic[T]):
207
205
 
208
206
 
209
207
  class _GeneratorContextManager(contextlib._GeneratorContextManager): # noqa
210
-
211
208
  @hoist(2)
212
209
  def __enter__(self):
213
210
  return super().__enter__()
@@ -19,6 +19,8 @@ class JsonObjectBuilder:
19
19
  *,
20
20
  yield_object_lists: bool = False,
21
21
  ) -> None:
22
+ super().__init__()
23
+
22
24
  self._stack: list[JsonStreamObject | list | Key] = []
23
25
  self._yield_object_lists = yield_object_lists
24
26
 
omlish/formats/yaml.py CHANGED
@@ -45,7 +45,6 @@ class NodeWrapped(lang.Final, ta.Generic[T]):
45
45
 
46
46
 
47
47
  class NodeUnwrapper:
48
-
49
48
  seq_types: tuple[type, ...] = (
50
49
  list,
51
50
  set,
@@ -95,7 +94,6 @@ def unwrap(nw: NodeWrapped[T]) -> T:
95
94
 
96
95
 
97
96
  class NodeWrappingConstructorMixin:
98
-
99
97
  def __init__(self, *args, **kwargs):
100
98
  super().__init__(*args, **kwargs)
101
99
 
@@ -159,7 +157,6 @@ class _cached_class_property: # noqa
159
157
 
160
158
 
161
159
  class WrappedLoaders(lang.Namespace):
162
-
163
160
  @staticmethod
164
161
  def _wrap(cls): # noqa
165
162
  return type('NodeWrapping$' + cls.__name__, (NodeWrappingConstructorMixin, cls), {})
omlish/graphs/dags.py CHANGED
@@ -51,7 +51,6 @@ def invert_symmetric_set_map(src: ta.Mapping[T, ta.Iterable[T]]) -> dict[T, set[
51
51
 
52
52
 
53
53
  class Dag(ta.Generic[T]):
54
-
55
54
  def __init__(self, input_its_by_outputs: ta.Mapping[T, ta.Iterable[T]]) -> None:
56
55
  super().__init__()
57
56
 
@@ -70,7 +69,6 @@ class Dag(ta.Generic[T]):
70
69
 
71
70
 
72
71
  class Subdag(ta.Generic[U]):
73
-
74
72
  def __init__(
75
73
  self,
76
74
  dag: 'Dag[U]',
@@ -13,7 +13,6 @@ SetMap = ta.Mapping[MK, ta.AbstractSet[MV]]
13
13
 
14
14
 
15
15
  class DirectedGraph(ta.Generic[V], lang.Abstract):
16
-
17
16
  @abc.abstractmethod
18
17
  def get_successors(self, vertex: V) -> ta.Collection[V]:
19
18
  raise NotImplementedError
@@ -24,7 +23,6 @@ class DirectedGraph(ta.Generic[V], lang.Abstract):
24
23
 
25
24
 
26
25
  class ListDictDirectedGraph(DirectedGraph[V]):
27
-
28
26
  def __init__(self, items: ta.Iterable[tuple[V, ta.Iterable[V]]]) -> None:
29
27
  super().__init__()
30
28
 
@@ -59,7 +57,6 @@ class ListDictDirectedGraph(DirectedGraph[V]):
59
57
 
60
58
 
61
59
  class DominatorTree(ta.Generic[V]):
62
-
63
60
  def __init__(self, graph: DirectedGraph[V], root: V) -> None:
64
61
  super().__init__()
65
62
 
@@ -138,7 +135,6 @@ class DominatorTree(ta.Generic[V]):
138
135
 
139
136
 
140
137
  class _Dfs(ta.Generic[V]):
141
-
142
138
  def __init__(self, graph: DirectedGraph[V], root: V) -> None:
143
139
  super().__init__()
144
140
 
@@ -191,7 +187,6 @@ class _Dfs(ta.Generic[V]):
191
187
 
192
188
 
193
189
  class _ImmediateDominanceComputer(ta.Generic[V]):
194
-
195
190
  def __init__(self, dfs: _Dfs[V]) -> None:
196
191
  super().__init__()
197
192
 
@@ -17,7 +17,6 @@ class Item(dc.Frozen, lang.Abstract, lang.Sealed):
17
17
 
18
18
 
19
19
  class Value(Item, lang.Abstract):
20
-
21
20
  @classmethod
22
21
  def of(cls, obj: ta.Union['Value', str, ta.Sequence]) -> 'Value':
23
22
  if isinstance(obj, Value):
@@ -21,7 +21,6 @@ from .items import Text
21
21
 
22
22
 
23
23
  class Renderer:
24
-
25
24
  def __init__(self, out: ta.TextIO) -> None:
26
25
  super().__init__()
27
26
 
omlish/graphs/trees.py CHANGED
@@ -40,7 +40,6 @@ class UnknownNodeError(NodeError[NodeT]):
40
40
 
41
41
 
42
42
  class BasicTreeAnalysis(ta.Generic[NodeT]):
43
-
44
43
  def __init__(
45
44
  self,
46
45
  root: NodeT,
omlish/inject/binder.py CHANGED
@@ -1,13 +1,3 @@
1
- """
2
- TODO:
3
- - multis?
4
-
5
- class SetBinding(Element, lang.Final):
6
- class SetProvider(Provider):
7
-
8
- class MapBinding(Element, lang.Final):
9
- class MapProvider(Provider):
10
- """
11
1
  import functools
12
2
  import inspect
13
3
  import types
@@ -9,7 +9,6 @@ _MISSING = object()
9
9
 
10
10
 
11
11
  class PeekIterator(ta.Iterator[T]):
12
-
13
12
  def __init__(self, it: ta.Iterable[T]) -> None:
14
13
  super().__init__()
15
14
 
@@ -78,7 +77,6 @@ class PeekIterator(ta.Iterator[T]):
78
77
 
79
78
 
80
79
  class ProxyIterator(ta.Iterator[T]):
81
-
82
80
  def __init__(self, fn: ta.Callable[[], T]) -> None:
83
81
  self._fn = fn
84
82
 
@@ -90,7 +88,6 @@ class ProxyIterator(ta.Iterator[T]):
90
88
 
91
89
 
92
90
  class PrefetchIterator(ta.Iterator[T]):
93
-
94
91
  def __init__(self, fn: ta.Callable[[], T] | None = None) -> None:
95
92
  super().__init__()
96
93
 
@@ -113,7 +110,6 @@ class PrefetchIterator(ta.Iterator[T]):
113
110
 
114
111
 
115
112
  class RetainIterator(ta.Iterator[T]):
116
-
117
113
  def __init__(self, fn: ta.Callable[[], T]) -> None:
118
114
  super().__init__()
119
115
 
omlish/lang/__init__.py CHANGED
@@ -78,6 +78,7 @@ from .cmp import ( # noqa
78
78
  )
79
79
 
80
80
  from .collections import ( # noqa
81
+ empty_map,
81
82
  merge_dicts,
82
83
  yield_dict_init,
83
84
  )
@@ -48,3 +48,39 @@ def merge_dicts(
48
48
  out[k] = v
49
49
 
50
50
  return out
51
+
52
+
53
+ ##
54
+
55
+
56
+ class _EmptyMap(ta.Mapping[K, V]):
57
+ def __init_subclass__(cls, **kwargs):
58
+ raise TypeError
59
+
60
+ def __new__(cls, *args, **kwargs):
61
+ if args or kwargs:
62
+ raise TypeError
63
+ return _EMPTY_MAP
64
+
65
+ def __repr__(self) -> str:
66
+ return f'{self.__class__.__name__}()'
67
+
68
+ def __init__(self) -> None:
69
+ super().__init__()
70
+
71
+ def __getitem__(self, k: K) -> V:
72
+ raise KeyError
73
+
74
+ def __len__(self) -> int:
75
+ return 0
76
+
77
+ def __iter__(self) -> ta.Iterator[K]:
78
+ return
79
+ yield # noqa
80
+
81
+
82
+ _EMPTY_MAP = object.__new__(_EmptyMap)
83
+
84
+
85
+ def empty_map() -> ta.Mapping[K, V]:
86
+ return _EMPTY_MAP
@@ -204,7 +204,6 @@ class AccessForbiddenError(Exception):
204
204
 
205
205
 
206
206
  class AccessForbiddenDescriptor:
207
-
208
207
  def __init__(self, name: str | None = None) -> None:
209
208
  super().__init__()
210
209
 
omlish/lifecycles/base.py CHANGED
@@ -9,7 +9,6 @@ LifecycleCallback: ta.TypeAlias = ta.Callable[[LifecycleT], None]
9
9
 
10
10
 
11
11
  class Lifecycle:
12
-
13
12
  def lifecycle_construct(self) -> None:
14
13
  pass
15
14
 
@@ -28,7 +28,6 @@ class ContextManagerLifecycle(Lifecycle, lang.Final, ta.Generic[ContextManagerT]
28
28
 
29
29
 
30
30
  class LifecycleContextManager(ta.Generic[LifecycleT]):
31
-
32
31
  def __init__(self, lifecycle: LifecycleT) -> None:
33
32
  super().__init__()
34
33
  self._lifecycle = lifecycle
@@ -14,7 +14,6 @@ LifecycleT = ta.TypeVar('LifecycleT', bound='Lifecycle')
14
14
 
15
15
 
16
16
  class LifecycleListener(ta.Generic[LifecycleT]):
17
-
18
17
  def on_starting(self, obj: LifecycleT) -> None:
19
18
  pass
20
19
 
@@ -29,7 +28,6 @@ class LifecycleListener(ta.Generic[LifecycleT]):
29
28
 
30
29
 
31
30
  class LifecycleController(Lifecycle, ta.Generic[LifecycleT]):
32
-
33
31
  def __init__(
34
32
  self,
35
33
  lifecycle: LifecycleT,
@@ -13,7 +13,6 @@ from .states import LifecycleStates
13
13
 
14
14
 
15
15
  class LifecycleManager(AbstractLifecycle):
16
-
17
16
  @dc.dataclass(frozen=True)
18
17
  class Entry(lang.Final):
19
18
  controller: LifecycleController
@@ -11,7 +11,6 @@ from ..values import Value
11
11
 
12
12
 
13
13
  class AnyMarshalerUnmarshaler(Marshaler, Unmarshaler):
14
-
15
14
  def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
16
15
  return ctx.make(type(o)).marshal(ctx, o)
17
16
 
omlish/math/bits.py CHANGED
@@ -44,7 +44,6 @@ def _gen_tuple_proxy_method(name):
44
44
 
45
45
 
46
46
  class FixedWidthInt(int):
47
-
48
47
  BITS: ta.ClassVar[int]
49
48
  SIGNED: ta.ClassVar[bool]
50
49
 
omlish/math/stats.py CHANGED
@@ -234,7 +234,6 @@ class Stats(ta.Sequence[float]):
234
234
 
235
235
 
236
236
  class SamplingHistogram:
237
-
238
237
  @dc.dataclass(frozen=True)
239
238
  class Entry:
240
239
  value: float
omlish/term/codes.py CHANGED
@@ -27,7 +27,6 @@ def strip_ansi_codes(s: str) -> str:
27
27
 
28
28
 
29
29
  class ControlSequence:
30
-
31
30
  def __init__(self, fn: ta.Callable[..., str], desc: str) -> None:
32
31
  super().__init__()
33
32
  self._fn = fn
@@ -4,7 +4,6 @@ from ._registry import register
4
4
 
5
5
  @register
6
6
  class LoggingPlugin:
7
-
8
7
  def pytest_addoption(self, parser):
9
8
  parser.addoption('--log', action='store', help='Configures logging with given log level')
10
9
 
@@ -4,7 +4,6 @@ from ._registry import register
4
4
 
5
5
  @register
6
6
  class PydevdPlugin:
7
-
8
7
  def pytest_addoption(self, parser):
9
8
  parser.addoption('--no-pydevd', action='store_true', default=False, help='Disables pydevd debugging')
10
9
 
@@ -6,7 +6,6 @@ PARAM_NAME = '__repeat'
6
6
 
7
7
  @register
8
8
  class RepeatPlugin:
9
-
10
9
  def pytest_addoption(self, parser):
11
10
  parser.addoption('--repeat', action='store', type=int, help='Number of times to repeat each test')
12
11
 
@@ -10,7 +10,6 @@ from ._registry import register
10
10
 
11
11
  @register
12
12
  class SkipsPlugin:
13
-
14
13
  def pytest_collection_modifyitems(self, session, items):
15
14
  dct: dict[str, set[str]] = {}
16
15
  for arg in session.config.args:
@@ -3,7 +3,6 @@ from ._registry import register
3
3
 
4
4
  @register
5
5
  class SpacingPlugin:
6
-
7
6
  def pytest_addoption(self, parser):
8
7
  parser.addoption('--newlines-before', action='store', type=int, help='Adds newlines before tests')
9
8
  parser.addoption('--newlines-after', action='store', type=int, help='Adds newlines after tests')
@@ -75,7 +75,6 @@ def get_specified_switches(obj: Configable) -> ta.Mapping[str, SwitchState]:
75
75
 
76
76
  @register
77
77
  class SwitchesPlugin:
78
-
79
78
  def pytest_configure(self, config):
80
79
  for sw in SWITCH_ATTRS:
81
80
  config.addinivalue_line('markers', f'{sw}: mark test as {sw}')
omlish/text/delimit.py CHANGED
@@ -7,7 +7,6 @@ import typing as ta
7
7
 
8
8
 
9
9
  class DelimitedEscaping:
10
-
11
10
  def __init__(
12
11
  self,
13
12
  delimit_char: str,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omlish
3
- Version: 0.0.0.dev247
3
+ Version: 0.0.0.dev248
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,12 +1,12 @@
1
- omlish/.manifests.json,sha256=vQTAIvR8OblSq-uP2GUfnbei0RnmAnM5j0T1-OToh9E,8253
2
- omlish/__about__.py,sha256=bQqOi2ALumtKm7vdnP1J3xHEquOOa8I2437ZblRqbuU,3380
1
+ omlish/.manifests.json,sha256=x26AIwDzScUvnX-p4xlq6Zc5QYrAo0Vmgf1qHc1KL_M,8253
2
+ omlish/__about__.py,sha256=vdUCdVH6QPJp23FjKOh9VC2Pxz8yofiz_tArVxvhOyU,3380
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
6
6
  omlish/check.py,sha256=THqm6jD1a0skAO5EC8SOVg58yq96Vk5wcuruBkCYxyU,2016
7
7
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
8
8
  omlish/defs.py,sha256=9uUjJuVIbCBL3g14fyzAp-9gH935MFofvlfOGwcBIaM,4913
9
- omlish/dynamic.py,sha256=kIZokHHid8a0pIAPXMNiXrVJvJJyBnY49WP1a2m-HUQ,6525
9
+ omlish/dynamic.py,sha256=xQ8LlOt_fUPApg-yz7-gNq8JdVgTqJ0_R6vhJq2WbpI,6522
10
10
  omlish/libc.py,sha256=8K4c66YV1ziJerl5poAAYCmsV-VSsHkT3EHhPW04ufg,15639
11
11
  omlish/metadata.py,sha256=q8UG-fpcXhEF7BZnhVikIE_IHyud9-8YT8iv646zU2s,3589
12
12
  omlish/outcome.py,sha256=ABIE0zjjTyTNtn-ZqQ_9_mUzLiBQ3sDAyqc9JVD8N2k,7852
@@ -149,7 +149,7 @@ omlish/collections/ranked.py,sha256=rg6DL36oOUiG5JQEAkGnT8b6f9mSndQlIovtt8GQj_w,
149
149
  omlish/collections/unmodifiable.py,sha256=-zys__n6L7liWzhmHAIvfxprq7cUE5HoR3foGvXc_7I,4748
150
150
  omlish/collections/utils.py,sha256=Q0lHhNDokVxdOvApmu1QX5fABYwbn1ATiIwp194Ur_E,2889
151
151
  omlish/collections/cache/__init__.py,sha256=D1gO71VcwxFTZP9gAc9isHfg_TEdalwhsJcgGLvS9hg,233
152
- omlish/collections/cache/descriptor.py,sha256=t-1Gh4DTABDuNmeDJlpoW4LV3gi_uSlBd9ZfBINfYCM,5023
152
+ omlish/collections/cache/descriptor.py,sha256=aa-OOChFAJLMPHjuc8YPCvVsE0INntPxxXoq-kl4jtg,5021
153
153
  omlish/collections/cache/impl.py,sha256=ySRU9UJG7jH9VPvuXdwZQ_rSqrleY-1mtie5Ml738wY,14755
154
154
  omlish/collections/cache/types.py,sha256=yNjwd6CGyTJQdxN2CQxFqqBAlcs1Z7vvNV-aU1K7p8E,685
155
155
  omlish/collections/persistent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -160,8 +160,8 @@ omlish/collections/sorted/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
160
160
  omlish/collections/sorted/skiplist.py,sha256=eU_cYQVnT-EZxv_dN9PYQZdOP0km5usEcOQRiJKL7Rw,5986
161
161
  omlish/collections/sorted/sorted.py,sha256=euHJan3FqTYSCJGsVcYYRV-yhAAQ5_htnjymnNoVHRE,3319
162
162
  omlish/concurrent/__init__.py,sha256=9p-s8MvBEYDqHIoYU3OYoe-Nni22QdkW7nhZGEukJTM,197
163
- omlish/concurrent/executors.py,sha256=FYKCDYYuj-OgMa8quLsA47SfFNX3KDJvRENVk8NDsrA,1292
164
- omlish/concurrent/futures.py,sha256=J2s9wYURUskqRJiBbAR0PNEAp1pXbIMYldOVBTQduQY,4239
163
+ omlish/concurrent/executors.py,sha256=mF-rjJWzNFxwB1-_H7rHuwoImpl4FtNM6W3wcqM3NEE,1291
164
+ omlish/concurrent/futures.py,sha256=870tx8ELI8THvMnTrQoYIlEFKO9hM4KUrlehckJqKBU,4238
165
165
  omlish/concurrent/threadlets.py,sha256=JfirbTDJgy9Ouokz_VmHeAAPS7cih8qMUJrN-owwXD4,2423
166
166
  omlish/configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
167
  omlish/configs/all.py,sha256=kziwjzUBkf8AT0w7Pq7JX2jtkQVOQ5R1wJyn6hfTN5k,1055
@@ -195,7 +195,7 @@ omlish/dataclasses/impl/__init__.py,sha256=zqGBC5gSbjJxaqG_zS1LL1PX-zAfhIua8UqOE
195
195
  omlish/dataclasses/impl/api.py,sha256=RhU4f50GVdn-dxilia8NA3F7VIm2R5z78pFfpIVXPRQ,6635
196
196
  omlish/dataclasses/impl/as_.py,sha256=CD-t7hkC1EP2F_jvZKIA_cVoDuwZ-Ln_xC4fJumPYX0,2598
197
197
  omlish/dataclasses/impl/copy.py,sha256=Tn8_n6Vohs-w4otbGdubBEvhd3TsSTaM3EfNGdS2LYo,591
198
- omlish/dataclasses/impl/descriptors.py,sha256=rEYE1Len99agTQCC25hSPMnM19BgPr0ZChABGi58Fdk,2476
198
+ omlish/dataclasses/impl/descriptors.py,sha256=jSYNkKdy2rKddGpQqRwNuhw-ggpcvp_SWHpLwIWPOzc,2474
199
199
  omlish/dataclasses/impl/exceptions.py,sha256=-vqxZmfXVflymVuiM553XTlJProse5HEMktTpfdPCIY,1275
200
200
  omlish/dataclasses/impl/fields.py,sha256=8p7Uzvr0C4yBR0NqHzkq--OY2HXFQlGsb1HC3K17-7k,6985
201
201
  omlish/dataclasses/impl/frozen.py,sha256=x87DSM8FIMZ3c_BIUE8NooCkExFjPsabeqIueEP5qKs,2988
@@ -231,13 +231,14 @@ omlish/diag/_pycharm/runhack.py,sha256=JFz4GVN4AXndJo38iwnK5X_vH2MS6wyO8YmVZss5Y
231
231
  omlish/diag/replserver/__init__.py,sha256=uLo6V2aQ29v9z3IMELlPDSlG3_2iOT4-_X8VniF-EgE,235
232
232
  omlish/diag/replserver/__main__.py,sha256=LmU41lQ58bm1h4Mx7S8zhE_uEBSC6kPcp9mn5JRpulA,32
233
233
  omlish/diag/replserver/console.py,sha256=XzBDVhYlr8FY6ym4OwoaIHuFOHnGK3dTYlMDIOMUUlA,7410
234
- omlish/diag/replserver/server.py,sha256=Hnfp-aFgUtkWGyVXjWJ33HhhBrrtZnJu5FZRV6MTKoI,5375
234
+ omlish/diag/replserver/server.py,sha256=pqJZXKnD-Cc03hnL_FNqGYaW9kH-IM3e11vCyDAcBD8,5374
235
235
  omlish/dispatch/__init__.py,sha256=GsiGJ91NKiQptSROtnCSkrZExBkvfDwYvdoTu5dBqF0,117
236
- omlish/dispatch/_dispatch2.py,sha256=v3tCNyxGpOwY8qTwdp54TlM8mG6OVwtQoUZfYJ_griU,1756
237
- omlish/dispatch/_dispatch3.py,sha256=Vnu5DfoPWFJLodudBqoZBXGTi2wYk-Az56MXJgdQvwc,2608
238
- omlish/dispatch/dispatch.py,sha256=p3-RqBf9RKZaNub1FMGHZkETewF43mU_rv4fYD_ERqU,4090
239
- omlish/dispatch/functions.py,sha256=S8ElsLi6DKxTdtFGigWaF0vAquwy2sK-3f4iRLaYq70,1522
240
- omlish/dispatch/methods.py,sha256=Sg134xzG41-__czfnWdzDlXdsxVt7ELOq90N2E6NSzI,5501
236
+ omlish/dispatch/_dispatch2.py,sha256=70k1tKKvuhxtAu6v4skECfHKIKVWrmlt7G_JKLUsKEs,1966
237
+ omlish/dispatch/_dispatch3.py,sha256=9Zjd7bINAC3keiaBdssc4v5dY0-8OI6XooV2DR9U7Z0,2818
238
+ omlish/dispatch/dispatch.py,sha256=KA5l49AiGLRjp4J7RDJW9RiDp9WUD1ewR1AOPEF8g38,3062
239
+ omlish/dispatch/functions.py,sha256=8Qvj62XKn9SKfiqoVQdBD3wVRE4JUWpZDqs0oouuDIw,1519
240
+ omlish/dispatch/impls.py,sha256=f7uLDjtDcykx_iFYRSmIrQYbVmXlaqXZ3qFIuOTUiD8,1967
241
+ omlish/dispatch/methods.py,sha256=dr8xQo-zVRckIo_V2Wp8Reqor3NE6APuzomUfsSBGdk,5498
241
242
  omlish/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
242
243
  omlish/docker/all.py,sha256=xXRgJgLGPwAtr7bDMJ_Dp9jTfOwfGvohNhc6LsoELJc,514
243
244
  omlish/docker/cli.py,sha256=gtb9kitVfGnd4cr587NsVVk8D5Ok5y5SAsqD_SwGrSA,2565
@@ -258,7 +259,7 @@ omlish/formats/pickle.py,sha256=jdp4E9WH9qVPBE3sSqbqDtUo18RbTSIiSpSzJ-IEVZw,529
258
259
  omlish/formats/props.py,sha256=auCv-Jx79KGlWfyG1-Qo0ou-Ex0W_mF3r_lDFdsVkWI,18920
259
260
  omlish/formats/repr.py,sha256=kYrNs4o-ji8nOdp6u_L3aMgBMWN1ZAZJSAWgQQfStSQ,414
260
261
  omlish/formats/xml.py,sha256=VJfqHR60dhAtjeG8WXFMozFqesTBSGvv264d67eDFXc,3514
261
- omlish/formats/yaml.py,sha256=ffOwGnLA6chdiFyaS7X0TBMGmHG9AoGudzKVWfQ1UOs,7389
262
+ omlish/formats/yaml.py,sha256=jGPQlTE0vSV-p0O7TJRNlf6o1uq4gx8PrHZe1ApJ_o8,7386
262
263
  omlish/formats/ini/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
263
264
  omlish/formats/ini/codec.py,sha256=omuFg0kiDksv8rRlWd_v32ebzEcKlgmiPgGID3bRi2M,631
264
265
  omlish/formats/ini/sections.py,sha256=7wYyZdVTQbMPFpjQEACKJfAEPzUBrogINsrvFgxJoZ0,1015
@@ -278,7 +279,7 @@ omlish/formats/json/backends/orjson.py,sha256=wR8pMGFtkhZGHcNVk7vNYUnv8lUapdK89p
278
279
  omlish/formats/json/backends/std.py,sha256=PM00Kh9ZR2XzollHMEvdo35Eml1N-zFfRW-LOCV5ftM,3085
279
280
  omlish/formats/json/backends/ujson.py,sha256=BNJCU4kluGHdqTUKLJEuHhE2m2TmqR7HEN289S0Eokg,2278
280
281
  omlish/formats/json/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
281
- omlish/formats/json/stream/build.py,sha256=MSxgreWSfI5CzNAdgQrArZ0yWqDsaHl-shI_jmjLDms,2505
282
+ omlish/formats/json/stream/build.py,sha256=EveVyYjc3lbVQRs8Y5uMGEKp0E_gJAUR5bd2ToSVnSU,2533
282
283
  omlish/formats/json/stream/errors.py,sha256=c8M8UAYmIZ-vWZLeKD2jMj4EDCJbr9QR8Jq_DyHjujQ,43
283
284
  omlish/formats/json/stream/lex.py,sha256=ItsWvtl5SZH-HwQtPy8Cpf4nszqDzvUTdIOEmSRiZ-E,6807
284
285
  omlish/formats/json/stream/parse.py,sha256=JuYmXwtTHmQJTFKoJNoEHUpCPxXdl_gvKPykVXgED34,6208
@@ -304,13 +305,13 @@ omlish/funcs/match.py,sha256=gMLZn1enNiFvQaWrQubY300M1BrmdKWzeePihBS7Ywc,6153
304
305
  omlish/funcs/pairs.py,sha256=VCkZjDmJGtR76BsejsHNfb4TcpHCtkkmak-zWDFchAo,3904
305
306
  omlish/funcs/pipes.py,sha256=E7Sz8Aj8ke_vCs5AMNwg1I36kRdHVGTnzxVQaDyn43U,2490
306
307
  omlish/graphs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
307
- omlish/graphs/dags.py,sha256=zp55lYgUdRCxmADwiGDHeehMJczZFA_tzdWqy77icOk,3047
308
- omlish/graphs/domination.py,sha256=oCGoWzWTxLwow0LDyGjjEf2AjFiOiDz4WaBtczwSbsQ,7576
309
- omlish/graphs/trees.py,sha256=OgGDnCJKfpOeWgDJPSkuVEoeYp72o06jpm0jwUB96Xc,8189
308
+ omlish/graphs/dags.py,sha256=7ee4GfzHcAVUA5-LMJyT7odwxoooh4cTwz4H8qi8Anc,3045
309
+ omlish/graphs/domination.py,sha256=N-rCzB3uAug964Tx4YGew1Nuh7GvzGjA598GcOj-Who,7571
310
+ omlish/graphs/trees.py,sha256=IA2lMbPec-4UrkYFUjUqqxAKeww6YMV35xj8uQhILYk,8188
310
311
  omlish/graphs/dot/__init__.py,sha256=Y1MZRQBZkcYyG1Tn7K2FhL8aYbm4v4tk6f5g9AqEkUw,359
311
- omlish/graphs/dot/items.py,sha256=OWPf0-hjBgS1uyy2QgAEn4IgFHJcEg7sHVWeTx1ghZc,4083
312
+ omlish/graphs/dot/items.py,sha256=7c-lvB2pp6LKWDI2di-S6Zh4vlUZt97eJeNQzuGilGc,4082
312
313
  omlish/graphs/dot/make.py,sha256=RN30gHfJPiXx5Q51kbDdhVJYf59Fr84Lz9J-mXRt9sI,360
313
- omlish/graphs/dot/rendering.py,sha256=2UgXvMRN4Z9cfIqLlC7Iu_8bWbwUDEL4opHHkFfSqTw,3630
314
+ omlish/graphs/dot/rendering.py,sha256=eN1NufiUaKFeRxRTOfIT-oLTg1YQCuPybBx3AmrhdBw,3629
314
315
  omlish/graphs/dot/utils.py,sha256=_FMwn77WfiiAfLsRTOKWm4IYbNv5kQN22YJ5psw6CWg,801
315
316
  omlish/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
316
317
  omlish/http/all.py,sha256=OqCovZi_jv1Mnk975idaXA8FCGy4laoQIvNZ3hdKpRQ,722
@@ -336,7 +337,7 @@ omlish/http/coro/server.py,sha256=30FTcJG8kuFeThf0HJYpTzMZN-giLTBP7wr5Wl3b9X0,18
336
337
  omlish/http/coro/simple.py,sha256=inWA_ss6Nz5Rqmy4dL9_SGah4anYoDecDTRQqVIGYeY,3200
337
338
  omlish/http/coro/sockets.py,sha256=rtpZZ-XCOfC5tXr4Fmo1HSn-8f5nxfIOlJaPUkQeDyU,1654
338
339
  omlish/inject/__init__.py,sha256=n0RC9UDGsBQQ39cST39-XJqJPq2M0tnnh9yJubW9azo,1891
339
- omlish/inject/binder.py,sha256=DAbc8TZi5w8Mna0TUtq0mT4jeDVA7i7SlBtOFrh2swc,4185
340
+ omlish/inject/binder.py,sha256=3-6KMOcSgFE5bvthy3YUrRzCX5w7YSGmdJ3Tv2yXZGw,4022
340
341
  omlish/inject/bindings.py,sha256=pLXn2U3kvmAS-68IOG-tr77DbiI-wp9hGyy4lhG6_H8,525
341
342
  omlish/inject/eagers.py,sha256=5AkGYuwijG0ihsH9NSaZotggalJ5_xWXhHE9mkn6IBA,329
342
343
  omlish/inject/elements.py,sha256=npppGgYBQja0oPHkdBDmRhpm3md1mZT1FVcIQ--W2qI,1398
@@ -395,18 +396,18 @@ omlish/io/fdio/kqueue.py,sha256=YgGBQibkAUYODYDiGl7Enjtx1oQsJXuDsBLBXgqlLQw,3832
395
396
  omlish/io/fdio/manager.py,sha256=q4wWf7nKrNtjx6yPEvrVnFt4UtK_BTvVlquEGw7poEo,1250
396
397
  omlish/io/fdio/pollers.py,sha256=yNadAt3W5wd90PFmd3vD77bq5QwoVb2A6SM2JjZpKRs,5507
397
398
  omlish/iterators/__init__.py,sha256=yMavf5FofiS1EU4UFuWPXiFZ03W0H-y7MuMxW8FUaEE,358
398
- omlish/iterators/iterators.py,sha256=ghI4dO6WPyyFOLTIIMaHQ_IOy2xXaFpGPqveZ5YGIBU,3158
399
+ omlish/iterators/iterators.py,sha256=iTQQwBE6Wzoy36dnbPIws17zbjE3zNN4KwVw4Fzh-gY,3154
399
400
  omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
400
401
  omlish/iterators/tools.py,sha256=Pi4ybXytUXVZ3xwK89xpPImQfYYId9p1vIFQvVqVLqA,2551
401
402
  omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
402
- omlish/lang/__init__.py,sha256=7QEQKrw1ojkB3kwFQrh-p7EH-UQI7sMemtxNX2OTTJI,4685
403
+ omlish/lang/__init__.py,sha256=7UEkGV5eWdCQRSqWvr3QNOfLKjkzLkF_ngm6fK0SUTk,4700
403
404
  omlish/lang/attrs.py,sha256=fofCKN0X8TMu1yGqHpLpNLih9r9HWl3D3Vn3b6O791w,3891
404
405
  omlish/lang/clsdct.py,sha256=sJYadm-fwzti-gsi98knR5qQUxriBmOqQE_qz3RopNk,1743
405
406
  omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
406
- omlish/lang/collections.py,sha256=I0x5BI_cjTbL-uunoKFWA_RfNEz3gyuPkYIajdTH1CA,1236
407
+ omlish/lang/collections.py,sha256=aGi0j6VzVe2nz4l357Y4RD5_XNl8OJbmM5qM6BclrrY,1895
407
408
  omlish/lang/contextmanagers.py,sha256=UPH6daYwSP9cH5AfSVsJyEHk1UURMGhVPM5ZRhp_Hvw,7576
408
409
  omlish/lang/datetimes.py,sha256=ehI_DhQRM-bDxAavnp470XcekbbXc4Gdw9y1KpHDJT0,223
409
- omlish/lang/descriptors.py,sha256=mZ2h9zJ__MMpw8hByjRbAiONcwfVb6GD0btNnVi8C5w,6573
410
+ omlish/lang/descriptors.py,sha256=zBtgO9LjdSTGHNUgiIqswh78WOVoGH6KzS0NbgB1Wls,6572
410
411
  omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
411
412
  omlish/lang/functions.py,sha256=0ql9EXA_gEEhvUVzMJCjVhEnVtHecsLKmfmAXuQqeGY,4388
412
413
  omlish/lang/generators.py,sha256=5LX17j-Ej3QXhwBgZvRTm_dq3n9veC4IOUcVmvSu2vU,5243
@@ -429,10 +430,10 @@ omlish/lang/classes/simple.py,sha256=XQ8b86WvQA0qtSYqlbMOJS7tHgE8sv9onda33uQmbkM
429
430
  omlish/lang/classes/virtual.py,sha256=z0MYQD9Q5MkX8DzF325wDB4J9XoYbsB09jZ1omC62To,3366
430
431
  omlish/lifecycles/__init__.py,sha256=1FjYceXs-4fc-S-C9zFYmc2axHs4znnQHcJVHdY7a6E,578
431
432
  omlish/lifecycles/abstract.py,sha256=70CQyZy-c9a2o0ZJxPeUT7eYjWZTBrp2HpUBnrHdAOM,1109
432
- omlish/lifecycles/base.py,sha256=ceXrNSzuv7iiTlX96UI1fvsQ70OgOmZl-UisDPyA3NA,1394
433
- omlish/lifecycles/contextmanagers.py,sha256=W0trOo6atbPSCoswmtUVOayAYnJ722qHBgda1oYxUEc,2073
434
- omlish/lifecycles/controller.py,sha256=ToYNJKH1Mxr7HyyF1cJrrec8NV_m84jrcvTMX0V5emM,3464
435
- omlish/lifecycles/manager.py,sha256=Au66KaO-fI-SEJALaPUJsCHYW2GE20xextk1wKn2BEU,5445
433
+ omlish/lifecycles/base.py,sha256=JSW5rFVCWLLVx_ASe4G49MeuKI1yN8kXcdh9U94kLYo,1393
434
+ omlish/lifecycles/contextmanagers.py,sha256=gojUTE1hjoP9hjXRPIgWFVwQcSIuOcmkXGLA5JEuYBA,2072
435
+ omlish/lifecycles/controller.py,sha256=p5S4_OZQ-h5elI803D5_bxbIn9MKIGRe6ECG4XhBXXA,3462
436
+ omlish/lifecycles/manager.py,sha256=x4wsVUtrjgnLKuBn0Wd4QmULCmzMu6LiMUuHjXH7MBQ,5444
436
437
  omlish/lifecycles/states.py,sha256=zqMOU2ZU-MDNnWuwauM3_anIAiXM8LoBDElDEraptFg,1292
437
438
  omlish/lifecycles/transitions.py,sha256=qQtFby-h4VzbvgaUqT2NnbNumlcOx9FVVADP9t83xj4,1939
438
439
  omlish/lite/__init__.py,sha256=ISLhM4q0LR1XXTCaHdZOZxBRyIsoZqYm4u0bf1BPcVk,148
@@ -515,13 +516,13 @@ omlish/marshal/singular/numbers.py,sha256=12a8HxjDHMTgtJTxO7VY_h5llaPyYB-QEPY09d
515
516
  omlish/marshal/singular/primitives.py,sha256=EZi2AIi_Onw1pekAiL4ujz4w-ASuOGWCu4MUIE_dCnk,1299
516
517
  omlish/marshal/singular/uuids.py,sha256=rZoE6NE5z6x_ZRmVMjjR2iK7CR8ijfDOvhMKgmm8Mgk,918
517
518
  omlish/marshal/trivial/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
518
- omlish/marshal/trivial/any.py,sha256=42XmUbX_AaiHGFwS2QmA-huPCcZ1_jzVyrnBUYVm21U,787
519
+ omlish/marshal/trivial/any.py,sha256=m2eywIbOU3YpR9a33vE2djSnbcpYGDQVwekXXokF4zc,786
519
520
  omlish/marshal/trivial/forbidden.py,sha256=7buKYamev2T3Q4RAhCBRzHO700vs8biH0--V5iBDqx4,874
520
521
  omlish/marshal/trivial/nop.py,sha256=41bpwsLGeDGqIwzZ7j88lbc4wIYh0EcPROhCU98mQxo,466
521
522
  omlish/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
522
- omlish/math/bits.py,sha256=yip1l8agOYzT7bFyMGc0RR3XlnGCfHMpjw_SECLLh1I,3477
523
+ omlish/math/bits.py,sha256=LC3dTgrvodNbfxy9dvlya61eQuDEy0azzQLCvEbFHj4,3476
523
524
  omlish/math/floats.py,sha256=UimhOT7KRl8LXTzOI5cQWoX_9h6WNWe_3vcOuO7-h_8,327
524
- omlish/math/stats.py,sha256=MegzKVsmv2kra4jDWLOUgV0X7Ee2Tbl5u6ql1v4-dEY,10053
525
+ omlish/math/stats.py,sha256=C700sib97E-IywlNKoByHFEtgA51n7Lffg7d3WSO4js,10052
525
526
  omlish/multiprocessing/__init__.py,sha256=jwlWGOaSGcX8DkzyZwJ49nfkHocWWeKgKb7kMpgcj_Y,485
526
527
  omlish/multiprocessing/proxies.py,sha256=bInhGds2rv6xT9q3qRMlZuSXFAjwfspkiohXZ36aUpY,484
527
528
  omlish/multiprocessing/spawn.py,sha256=sTvPLIJGYnjjI6ASqhFzHF-97tCnaOXX7u7s-33SUMw,1875
@@ -690,7 +691,7 @@ omlish/subprocesses/sync.py,sha256=HKmKM99_Y7tkJRg_n5onXrw41IZt5M5fqU0281LY-mo,3
690
691
  omlish/subprocesses/utils.py,sha256=MJb6hvKhZceTmBeFVqlc5oM7rDxWkUzSzK9nKvbIvM8,396
691
692
  omlish/subprocesses/wrap.py,sha256=v7vrbDhl_FVWESnXIOJ3oGtE3Y-OHQa5sH3MTtFTBUE,504
692
693
  omlish/term/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
693
- omlish/term/codes.py,sha256=gqouA7KDyGzyCmmu8ejGhT_8XJGsejdTQh2pSCMbWAQ,6150
694
+ omlish/term/codes.py,sha256=d8oii_9UJDm_TAowXYH3XDckX0XNBf2kiEPJKkVMMow,6149
694
695
  omlish/term/progressbar.py,sha256=TiwdmPSMa5jQj35i1NQURTWQGy4eWUNx_XiPM38JtvQ,3184
695
696
  omlish/term/vt100/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
696
697
  omlish/term/vt100/c.py,sha256=cAhDKXI81PZRtFmTotfad3HZGREP1QnOlWYoAw6v-Fw,3532
@@ -706,13 +707,13 @@ omlish/testing/pytest/inject/harness.py,sha256=_Qf7lLcYc_dpauYOE68u_a65jPCFWmQUY
706
707
  omlish/testing/pytest/plugins/__init__.py,sha256=ys1zXrYrNm7Uo6YOIVJ6Bd3dQo6kv387k7MbTYlqZSI,467
707
708
  omlish/testing/pytest/plugins/_registry.py,sha256=IK04KlBgiOJxKAyCCgjpX2R-9tE-btalYJkgjLc8Te8,77
708
709
  omlish/testing/pytest/plugins/depskip.py,sha256=xithY-OMtjwhv8mcRNkv-WI_PSQtHldQ8H1s60MIXkk,2673
709
- omlish/testing/pytest/plugins/logging.py,sha256=Y1I_3DiiuDSynObkm8bNPZxdvljUWXbqD6YUM5uI34o,391
710
+ omlish/testing/pytest/plugins/logging.py,sha256=ZUy4sQOMYroZubUnjYe4_KC1kqukgBbA84VjO0NwfsA,390
710
711
  omlish/testing/pytest/plugins/managermarks.py,sha256=IzkspjT8-ToPIlHZs9cHt6RYbm51poJLjYVvkFPbJhE,1300
711
- omlish/testing/pytest/plugins/pydevd.py,sha256=AXtN83M39ZKJ4VH3MJEhvPnAmYzD5u1r8ehz-0om50Q,842
712
- omlish/testing/pytest/plugins/repeat.py,sha256=flSQzE9GFOWksVKz-mUGnpxJpv3yRqn1G4K8pW7JHs0,498
713
- omlish/testing/pytest/plugins/skips.py,sha256=EoZDg1uWccgbAegmzqI85c7RliycD1e2J4Y7vfDRhwM,1041
714
- omlish/testing/pytest/plugins/spacing.py,sha256=JQQhi9q3c523Ro1a_K_9RGAb7HotiO74N8bYX2VESFE,707
715
- omlish/testing/pytest/plugins/switches.py,sha256=CflHe6gLhkLt_9OcAmzskuZsrhZhwOuL_bIdogibARc,3815
712
+ omlish/testing/pytest/plugins/pydevd.py,sha256=5moE64LrNRV6gKRaeCuONDiwuh-4UFxJPWD9K9PR8GM,841
713
+ omlish/testing/pytest/plugins/repeat.py,sha256=jiZCI-17042jBvUEbZCxNwqWtr7s3EhTBSeSHh_Uz4E,497
714
+ omlish/testing/pytest/plugins/skips.py,sha256=eMir_n777Kk2BvOwjQzRROKL4iAMYKSHFwWCHJ-bdPI,1040
715
+ omlish/testing/pytest/plugins/spacing.py,sha256=tzq-L-exegHe2BImumkYIsVcUwpUUhLJJOuSrsKDuCU,706
716
+ omlish/testing/pytest/plugins/switches.py,sha256=U8tDP-WSI2yjxwp4hocgZNJEmEv8UO8_CFEv8mXWH3A,3814
716
717
  omlish/testing/pytest/plugins/utils.py,sha256=L5C622UXcA_AUKDcvyh5IMiRfqSGGz0McdhwZWvfMlU,261
717
718
  omlish/testing/pytest/plugins/asyncs/__init__.py,sha256=TTNhFmP_krug1973sq_bpWBTIvg68-1nbuVLSs92Z6k,41
718
719
  omlish/testing/pytest/plugins/asyncs/consts.py,sha256=0NOCkzV43dOu3u97BqYMQ4mPG8JuFncpWibkOZpCqX4,55
@@ -726,16 +727,16 @@ omlish/testing/pytest/plugins/asyncs/backends/trio.py,sha256=xty9TR7-Kk6n0cdOqEr
726
727
  omlish/testing/pytest/plugins/asyncs/backends/trio_asyncio.py,sha256=VcGVwf4V-1ZFK_70FrFS9b11EU1dOy1ozhhIDXGNSEo,3169
727
728
  omlish/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
728
729
  omlish/text/asdl.py,sha256=AS3irh-sag5pqyH3beJif78PjCbOaFso1NeKq-HXuTs,16867
729
- omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
730
+ omlish/text/delimit.py,sha256=Y0ID9Y9nfgQu3tYCiMS3hLa-ugA2cc-29PV4fF1343g,4927
730
731
  omlish/text/glyphsplit.py,sha256=kqqjglRdxGo0czYZxOz9Vi8aBmVsCOq8h6lPwRA5xe0,3803
731
732
  omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
732
733
  omlish/text/mangle.py,sha256=kfzFLfvepH-chl1P89_mdc5vC4FSqyPA2aVtgzuB8IY,1133
733
734
  omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
734
735
  omlish/text/parts.py,sha256=JkNZpyR2tv2CNcTaWJJhpQ9E4F0yPR8P_YfDbZfMtwQ,6182
735
736
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
736
- omlish-0.0.0.dev247.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
737
- omlish-0.0.0.dev247.dist-info/METADATA,sha256=82nI3LSDtkEUH8RynMRyrECBuyL-TP_WYtoC8UNk_OU,4176
738
- omlish-0.0.0.dev247.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
739
- omlish-0.0.0.dev247.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
740
- omlish-0.0.0.dev247.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
741
- omlish-0.0.0.dev247.dist-info/RECORD,,
737
+ omlish-0.0.0.dev248.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
738
+ omlish-0.0.0.dev248.dist-info/METADATA,sha256=2MDwQ1CC7YMd2LkHobPoRqjE_TqGmuPaic_MlQcnojI,4176
739
+ omlish-0.0.0.dev248.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
740
+ omlish-0.0.0.dev248.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
741
+ omlish-0.0.0.dev248.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
742
+ omlish-0.0.0.dev248.dist-info/RECORD,,