omlish 0.0.0.dev10__py3-none-any.whl → 0.0.0.dev12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
omlish/__about__.py CHANGED
@@ -1,4 +1,5 @@
1
- __version__ = '0.0.0.dev10'
1
+ __version__ = '0.0.0.dev12'
2
+ __revision__ = 'b35ec8b30c5a0e8c2cb883539abc75fd33de252a'
2
3
 
3
4
 
4
5
  #
@@ -77,7 +78,7 @@ class Project(ProjectBase):
77
78
  ],
78
79
 
79
80
  'sqlx': [
80
- "sqlean.py >= 3.45; python_version < '3.13'",
81
+ 'sqlean.py >= 3.45; python_version < "3.13"',
81
82
 
82
83
  'duckdb >= 1',
83
84
  ],
@@ -10,6 +10,7 @@ import typing as ta
10
10
  import weakref
11
11
 
12
12
  from .. import check
13
+ from .. import lang
13
14
  from .dispatch import Dispatcher
14
15
  from .dispatch import get_impl_func_cls_set
15
16
 
@@ -17,20 +18,6 @@ from .dispatch import get_impl_func_cls_set
17
18
  T = ta.TypeVar('T')
18
19
 
19
20
 
20
- def build_mro_dct(instance_cls: type, owner_cls: type | None = None) -> ta.Mapping[str, ta.Any]:
21
- if owner_cls is None:
22
- owner_cls = instance_cls
23
- mro = instance_cls.__mro__[-2::-1]
24
- try:
25
- pos = mro.index(owner_cls)
26
- except ValueError:
27
- raise TypeError(f'Owner class {owner_cls} not in mro of instance class {instance_cls}') from None
28
- dct: dict[str, ta.Any] = {}
29
- for cur_cls in mro[:pos + 1]:
30
- dct.update(cur_cls.__dict__)
31
- return dct
32
-
33
-
34
21
  class Method:
35
22
  def __init__(self, func: ta.Callable) -> None:
36
23
  if not callable(func) and not hasattr(func, '__get__'): # type: ignore
@@ -91,7 +78,7 @@ class Method:
91
78
  def build_attr_dispatcher(self, instance_cls: type, owner_cls: type | None = None) -> Dispatcher[str]:
92
79
  disp: Dispatcher[str] = Dispatcher()
93
80
 
94
- mro_dct = build_mro_dct(instance_cls, owner_cls)
81
+ mro_dct = lang.build_mro_dict(instance_cls, owner_cls)
95
82
  seen: ta.Mapping[ta.Any, str] = {}
96
83
  for nam, att in mro_dct.items():
97
84
  if att in self._impls:
omlish/fnpairs.py CHANGED
@@ -52,9 +52,7 @@ else:
52
52
 
53
53
 
54
54
  F = ta.TypeVar('F')
55
- F2 = ta.TypeVar('F2')
56
55
  T = ta.TypeVar('T')
57
- T2 = ta.TypeVar('T2')
58
56
  U = ta.TypeVar('U')
59
57
 
60
58
 
@@ -121,6 +119,9 @@ class Inverted(FnPair[F, T]):
121
119
  return self.fp.forward(t)
122
120
 
123
121
 
122
+ ##
123
+
124
+
124
125
  @dc.dataclass(frozen=True)
125
126
  class Composite(FnPair[F, T]):
126
127
  children: ta.Sequence[FnPair]
@@ -136,7 +137,69 @@ class Composite(FnPair[F, T]):
136
137
  return ta.cast(F, t)
137
138
 
138
139
 
140
+ I0 = ta.TypeVar('I0')
141
+ I1 = ta.TypeVar('I1')
142
+ I2 = ta.TypeVar('I2')
143
+ I3 = ta.TypeVar('I3')
144
+ I4 = ta.TypeVar('I4')
145
+
146
+
147
+ @ta.overload
148
+ def compose(
149
+ fp0: FnPair[F, I0],
150
+ f01: FnPair[I0, T],
151
+ ) -> FnPair[F, T]:
152
+ ...
153
+
154
+
155
+ @ta.overload
156
+ def compose(
157
+ fp0: FnPair[F, I0],
158
+ f01: FnPair[I0, I1],
159
+ fp2: FnPair[I1, T],
160
+ ) -> FnPair[F, T]:
161
+ ...
162
+
163
+
164
+ @ta.overload
165
+ def compose(
166
+ fp0: FnPair[F, I0],
167
+ f01: FnPair[I0, I1],
168
+ fp2: FnPair[I1, I2],
169
+ fp3: FnPair[I2, T],
170
+ ) -> FnPair[F, T]:
171
+ ...
172
+
173
+
174
+ @ta.overload
175
+ def compose(
176
+ fp0: FnPair[F, I0],
177
+ f01: FnPair[I0, I1],
178
+ fp2: FnPair[I1, I2],
179
+ fp3: FnPair[I2, I3],
180
+ fp4: FnPair[I3, T],
181
+ ) -> FnPair[F, T]:
182
+ ...
183
+
184
+
185
+ @ta.overload
186
+ def compose(
187
+ fp0: FnPair[F, I0],
188
+ f01: FnPair[I0, I1],
189
+ fp2: FnPair[I1, I2],
190
+ fp3: FnPair[I2, I3],
191
+ fp4: FnPair[I3, I4],
192
+ fp5: FnPair[I4, T],
193
+ ) -> FnPair[F, T]:
194
+ ...
195
+
196
+
197
+ @ta.overload
139
198
  def compose(*ps: FnPair) -> FnPair:
199
+ ...
200
+
201
+
202
+ def compose(*ps):
140
203
  if not ps:
141
204
  return NOP
142
205
  if len(ps) == 1:
omlish/lang/__init__.py CHANGED
@@ -146,6 +146,7 @@ from .objects import ( # noqa
146
146
  SimpleProxy,
147
147
  arg_repr,
148
148
  attr_repr,
149
+ build_mro_dict,
149
150
  can_weakref,
150
151
  deep_subclasses,
151
152
  new_type,
omlish/lang/objects.py CHANGED
@@ -97,6 +97,31 @@ def deep_subclasses(cls: type) -> ta.Iterator[type]:
97
97
  todo.extend(reversed(cur.__subclasses__()))
98
98
 
99
99
 
100
+ def build_mro_dict(
101
+ instance_cls: type,
102
+ owner_cls: type | None = None,
103
+ *,
104
+ bottom_up_key_order: bool = False,
105
+ ) -> ta.Mapping[str, ta.Any]:
106
+ if owner_cls is None:
107
+ owner_cls = instance_cls
108
+ mro = instance_cls.__mro__[-2::-1]
109
+ try:
110
+ pos = mro.index(owner_cls)
111
+ except ValueError:
112
+ raise TypeError(f'Owner class {owner_cls} not in mro of instance class {instance_cls}') from None
113
+ dct: dict[str, ta.Any] = {}
114
+ if not bottom_up_key_order:
115
+ for cur_cls in mro[:pos + 1][::-1]:
116
+ for k, v in cur_cls.__dict__.items():
117
+ if k not in dct:
118
+ dct[k] = v
119
+ else:
120
+ for cur_cls in mro[:pos + 1]:
121
+ dct.update(cur_cls.__dict__)
122
+ return dct
123
+
124
+
100
125
  ##
101
126
 
102
127
 
omlish/matchfns.py CHANGED
@@ -1,3 +1,9 @@
1
+ """
2
+ TODO:
3
+ - unify MatchFnClass with dispatch.method?
4
+ - __call__ = mfs.method(); @__call__.register(lambda: ...) def _call_... ?
5
+ - not really the same thing, dispatch is unordered this is necessarily ordered
6
+ """
1
7
  import abc
2
8
  import dataclasses as dc
3
9
  import typing as ta
@@ -117,7 +123,7 @@ class MultiMatchFn(MatchFn[P, T]):
117
123
  )
118
124
 
119
125
 
120
- def multi(*children: MatchFn[P, T], strict: bool = False):
126
+ def multi(*children: MatchFn[P, T], strict: bool = False) -> MultiMatchFn: # MultiMatchFn[P[0], T[-1]]
121
127
  return MultiMatchFn(children, strict=strict) # noqa
122
128
 
123
129
 
@@ -200,7 +206,7 @@ class MatchFnClass(MatchFn[P, T]):
200
206
  mf = self.__match_fn = self._cls_match_fn.__get__(self)
201
207
  return mf
202
208
 
203
- def __init_subclass__(cls, strict: bool = False, **kwargs):
209
+ def __init_subclass__(cls, strict: bool = False, **kwargs: ta.Any) -> None:
204
210
  super().__init_subclass__()
205
211
  if '_cls_match_fn' in cls.__dict__:
206
212
  raise AttributeError('_cls_match_fn')
@@ -1,4 +1,5 @@
1
1
  from .testing import ( # noqa
2
+ assert_dicts_equal_ordered,
2
3
  call_many_with_timeout,
3
4
  can_import,
4
5
  run_with_timeout,
@@ -120,29 +120,44 @@ class Harness:
120
120
 
121
121
  @plugins.register
122
122
  class HarnessPlugin:
123
+ def __init__(self) -> None:
124
+ super().__init__()
125
+ self._harnesses_by_session: dict[ta.Any, Harness] = {}
126
+
127
+ def get_session_harness(self, session: ta.Any) -> Harness:
128
+ return self._harnesses_by_session[session]
123
129
 
124
130
  @pytest.fixture(scope='session', autouse=True)
125
- def _harness_scope_listener_session(self, harness, request):
126
- with harness._pytest_scope_manager(PytestScope.SESSION, request): # noqa
127
- yield
131
+ def _harness_scope_listener_session(self, request):
132
+ with Harness(inj.as_elements(*_HARNESS_ELEMENTS_LIST)).activate() as harness:
133
+ self._harnesses_by_session[request.session] = harness
134
+ try:
135
+ with harness._pytest_scope_manager(PytestScope.SESSION, request): # noqa
136
+ yield
137
+ finally:
138
+ del self._harnesses_by_session[request.session]
128
139
 
129
140
  @pytest.fixture(scope='package', autouse=True)
130
- def _harness_scope_listener_package(self, harness, request):
141
+ def _harness_scope_listener_package(self, request):
142
+ harness = self.get_session_harness(request.session)
131
143
  with harness._pytest_scope_manager(PytestScope.PACKAGE, request): # noqa
132
144
  yield
133
145
 
134
146
  @pytest.fixture(scope='module', autouse=True)
135
- def _harness_scope_listener_module(self, harness, request):
147
+ def _harness_scope_listener_module(self, request):
148
+ harness = self.get_session_harness(request.session)
136
149
  with harness._pytest_scope_manager(PytestScope.MODULE, request): # noqa
137
150
  yield
138
151
 
139
152
  @pytest.fixture(scope='class', autouse=True)
140
- def _harness_scope_listener_class(self, harness, request):
153
+ def _harness_scope_listener_class(self, request):
154
+ harness = self.get_session_harness(request.session)
141
155
  with harness._pytest_scope_manager(PytestScope.CLASS, request): # noqa
142
156
  yield
143
157
 
144
158
  @pytest.fixture(scope='function', autouse=True) # noqa
145
- def _harness_scope_listener_function(self, harness, request):
159
+ def _harness_scope_listener_function(self, request):
160
+ harness = self.get_session_harness(request.session)
146
161
  with harness._pytest_scope_manager(PytestScope.FUNCTION, request): # noqa
147
162
  yield
148
163
 
@@ -163,7 +178,7 @@ TypeT = ta.TypeVar('TypeT', bound=type)
163
178
  def bind(
164
179
  scope: PytestScope | str = PytestScope.SESSION,
165
180
  *,
166
- eager: bool = False,
181
+ eager: bool = False, # FIXME
167
182
  ) -> ta.Callable[[TypeT], TypeT]:
168
183
  def inner(cls):
169
184
  pts = scope if isinstance(scope, PytestScope) else PytestScope[check.isinstance(scope, str).upper()]
@@ -175,7 +190,8 @@ def bind(
175
190
  return inner
176
191
 
177
192
 
178
- @pytest.fixture(scope='session', autouse=True)
179
- def harness() -> ta.Generator[Harness, None, None]:
180
- with Harness(inj.as_elements(*_HARNESS_ELEMENTS_LIST)).activate() as h:
181
- yield h
193
+ @pytest.fixture
194
+ def harness(request) -> Harness:
195
+ pm = request.session.config.pluginmanager
196
+ hp = check.single(p for n, p in pm.list_name_plugin() if isinstance(p, HarnessPlugin))
197
+ return hp.get_session_harness(request.session)
@@ -39,7 +39,9 @@ https://github.com/agronholm/anyio/blob/8907964926a24461840eee0925d3f355e729f15d
39
39
  """ # noqa
40
40
  import functools
41
41
  import inspect
42
+ import sys
42
43
  import typing as ta
44
+ import warnings
43
45
 
44
46
  import pytest
45
47
 
@@ -80,6 +82,20 @@ class AsyncsPlugin:
80
82
  *[s for s in KNOWN_BACKENDS if lang.can_import(s)],
81
83
  ]
82
84
 
85
+ def pytest_cmdline_main(self, config):
86
+ if (aio_plugin := sys.modules.get('pytest_asyncio.plugin')):
87
+ # warnings.filterwarnings is clobbered by pytest using warnings.catch_warnings
88
+ def aio_plugin_warn(message, *args, **kwargs):
89
+ if (
90
+ isinstance(message, pytest.PytestDeprecationWarning) and
91
+ message.args[0].startswith('The configuration option "asyncio_default_fixture_loop_scope" is unset.') # noqa
92
+ ):
93
+ return
94
+ warnings.warn(message, *args, **kwargs)
95
+
96
+ aio_plugin.warnings = lang.proxy_import('warnings') # type: ignore
97
+ aio_plugin.warnings.warn = aio_plugin_warn # type: ignore
98
+
83
99
  def pytest_configure(self, config):
84
100
  config.addinivalue_line('markers', f'{ASYNCS_MARK}: marks for all async backends')
85
101
  config.addinivalue_line('markers', 'trio_asyncio: marks for trio_asyncio backend')
omlish/testing/testing.py CHANGED
@@ -11,6 +11,12 @@ import typing as ta
11
11
  DEFAULT_TIMEOUT_S = 30
12
12
 
13
13
  T = ta.TypeVar('T')
14
+ K = ta.TypeVar('K')
15
+ V = ta.TypeVar('V')
16
+
17
+
18
+ def assert_dicts_equal_ordered(l: ta.Mapping[K, V], r: ta.Mapping[K, V]) -> None:
19
+ assert list(l.items()) == list(r.items())
14
20
 
15
21
 
16
22
  def call_many_with_timeout(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev10
3
+ Version: 0.0.0.dev12
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,4 +1,4 @@
1
- omlish/__about__.py,sha256=c8Him0ItNsPSlI4VlPK_lI_nqEs2jQHHXVbs6uRKUCc,2280
1
+ omlish/__about__.py,sha256=izHgi4tLqykkJ7ZSMoTzByFQFy7lJ7aY-vVzRDfYXKQ,2338
2
2
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  omlish/argparse.py,sha256=QRQmX9G0-L_nATkFtGHvpd4qrpYzKATdjuFLbBqzJPM,6224
4
4
  omlish/bootstrap.py,sha256=3pGNiHlUcQl81q76_Wesd4pblmy82EOKkcdgectF15Q,18820
@@ -10,10 +10,10 @@ omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
10
10
  omlish/defs.py,sha256=N8O1murtr4mdSE_vjAcWGfnN7GyBXbW8rJM4qPF8na0,4737
11
11
  omlish/docker.py,sha256=5WyXJyFwqIJJ11QWwPIjHjDHnsaOVZszZAjyTvg3xew,4693
12
12
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
13
- omlish/fnpairs.py,sha256=FgP8lzygrbRo5E1f8wbWy_-opoR6Dy8BKRi776kOrIY,9445
13
+ omlish/fnpairs.py,sha256=Bt_5dfjI4c-ejU9SSSWxozKGLgB-7xMrn86h5J79UNU,10404
14
14
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
15
15
  omlish/libc.py,sha256=u0481imCiTFqP_e-v9g0pD-0WD249j5vYzhtn-fnNkY,15308
16
- omlish/matchfns.py,sha256=rW-kEHZvMkRno0Imn8rskAoVjpR5rKtOtUUzQ6wLqdU,5878
16
+ omlish/matchfns.py,sha256=o2evI7q0CAMHR8RQ_Jks6L0UoNpEDltnLjOiamJDtmU,6155
17
17
  omlish/math.py,sha256=AVqp5Y8yxKA-wO0BgrzaxA0Ga3PZiCXnYcwivMneC-0,3804
18
18
  omlish/os.py,sha256=cz4nL2ujaxH_-XRq3JUD8af8mSe1JXGPIoXP9XAEd0M,2607
19
19
  omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
@@ -93,7 +93,7 @@ omlish/dispatch/_dispatch2.py,sha256=v3tCNyxGpOwY8qTwdp54TlM8mG6OVwtQoUZfYJ_griU
93
93
  omlish/dispatch/_dispatch3.py,sha256=Vnu5DfoPWFJLodudBqoZBXGTi2wYk-Az56MXJgdQvwc,2608
94
94
  omlish/dispatch/dispatch.py,sha256=8B66wOat30HckcIsCq4pnutBy20iSPwPQOqJ4msHaGU,3739
95
95
  omlish/dispatch/functions.py,sha256=S8ElsLi6DKxTdtFGigWaF0vAquwy2sK-3f4iRLaYq70,1522
96
- omlish/dispatch/methods.py,sha256=utLvLioBgEqa0gR0fpfNEtMDZFGPM4G5p3XHnPt-oIw,5865
96
+ omlish/dispatch/methods.py,sha256=XHjwwC9Gn4iDWxbyLAcbdSwRgVaq-8Bnn5cAwf5oZdA,5403
97
97
  omlish/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  omlish/formats/dotenv.py,sha256=UjZl3gac-0U24sDjCCGMcCqO1UCWG2Zs8PZ4JdAg2YE,17348
99
99
  omlish/formats/json.py,sha256=KRfH-MLOrMXUFVy_eX6RagC37Z-KyfOIXlVdxM6nuxc,6787
@@ -147,7 +147,7 @@ omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCF
147
147
  omlish/inject/impl/providers.py,sha256=QnwhsujJFIHC0JTgd2Wlo1kP53i3CWTrj1nKU2DNxwg,2375
148
148
  omlish/inject/impl/proxy.py,sha256=1ko0VaKqzu9UG8bIldp9xtUrAVUOFTKWKTjOCqIGr4s,1636
149
149
  omlish/inject/impl/scopes.py,sha256=M_RO_pGUr5mX84YyYmkr6CsMhkkV189_gOUsaYmYes4,5768
150
- omlish/lang/__init__.py,sha256=DSFUT2mChw4kZjr3lUgVfzUf5BwtXMVzwtFFmmvno-Y,3145
150
+ omlish/lang/__init__.py,sha256=sjeN4p46itXbYfYJNqgin8olSU62xD700Af_vlgWiwI,3165
151
151
  omlish/lang/cached.py,sha256=0gjdxVELu69oRQ3kqSV3cGIHg6Nf4pcCIIRTEU52tCc,7607
152
152
  omlish/lang/clsdct.py,sha256=LXwLCULeI_8Np-7-pZkyNAHpUZLcQiBEQiHwKYQ0WRo,1742
153
153
  omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
@@ -158,7 +158,7 @@ omlish/lang/functions.py,sha256=T4nPl46EHHGjMkz3FTRjsVhS9Y8HKcwM0jROU6_-Rv0,3619
158
158
  omlish/lang/imports.py,sha256=04ugFC8NI5sbL7NH4V0r0q_nFsP_AMkHLz697CVkMtQ,6274
159
159
  omlish/lang/iterables.py,sha256=_q6rHbdFfW3VBqez0IV3rUABoNxsA_oBv_sykm5zsbQ,2243
160
160
  omlish/lang/maybes.py,sha256=NYHZDjqDtwPMheDrj2VtUVujxRPf8Qpgk4ZlZCTvBZc,3492
161
- omlish/lang/objects.py,sha256=GTfVRpbPIuJeZggK-Ek7nsrZog8LGjt10YfDJ07pttQ,3536
161
+ omlish/lang/objects.py,sha256=ewGWcbtjNQtoRba0uAEekLbn1e884ZJh09xPHzZkfy4,4306
162
162
  omlish/lang/resolving.py,sha256=UgrX-vxXtCGGEmnAMUYP4bUZ6-Ok0EcHVEKAZYbAS-o,1597
163
163
  omlish/lang/strings.py,sha256=ykeoou4JK7CEZXzrUJfqVOalEDvE--j0uhHt_SrsrUs,2834
164
164
  omlish/lang/sys.py,sha256=UoZz_PJYVKLQAKqYxxn-LHz1okK_38I__maZgnXMcxU,406
@@ -238,16 +238,16 @@ omlish/sql/duckdb.py,sha256=Z3wiZEn_21Lu1ElFRX0ATzoBMCw0KJxINjTRuTexYGM,3748
238
238
  omlish/sql/exprs.py,sha256=gO4Fj4xEY-PuDgV-N8hBMy55glZz7O-4H7v1LWabfZY,323
239
239
  omlish/sql/secrets.py,sha256=mDUunIACxHBsPD_ONbHQJVndeMMzJR4vMC2WWX7tGfY,177
240
240
  omlish/sql/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,403
241
- omlish/testing/__init__.py,sha256=l13axR7dyVE9T1e6w1pMYtAkW3vS2J97nBcYQ1FUv18,136
242
- omlish/testing/testing.py,sha256=p1bP9fnxmYzOvPJ_7S1wq7PrKMzclK8PgYH5DwaQiHk,2918
241
+ omlish/testing/__init__.py,sha256=kfiF10ykrjWXniedIl3g8j3pNAFyuSbp1D3ZXug3-Eo,168
242
+ omlish/testing/testing.py,sha256=pJUbZ0ymdrQoNG9r9UlGXypeU1x9ntEp9xcYBnyOHUs,3088
243
243
  omlish/testing/pytest/__init__.py,sha256=b6ObMEHTZnvGEI_de6nN1x5FyitV6B2mNYkurA4Q7fo,336
244
244
  omlish/testing/pytest/helpers.py,sha256=TJpD60mBtLi9FtxX4TThfuXvg5FIRPSiZk1aeRwe-D4,197
245
245
  omlish/testing/pytest/marks.py,sha256=LbI5lO29cbh_FA5-vktwtcZwWjxn9URI0pprzmPRyJo,1260
246
246
  omlish/testing/pytest/inject/__init__.py,sha256=pdRKv1HcDmJ_yArKJbYITPXXZthRSGgBJWqITr0Er38,117
247
- omlish/testing/pytest/inject/harness.py,sha256=IfcqR1rcIYkl_66Mmhy1KEeCWFJ95wr68Vs5687bPlY,5053
247
+ omlish/testing/pytest/inject/harness.py,sha256=sMKjP2EWHq-eeTB1YVXcANli2Czxt56_9ERg4HtkVPg,5810
248
248
  omlish/testing/pytest/plugins/__init__.py,sha256=Kx4OgGY_whB2I-5c7iI41j-dAaerEIlMEnWN2orGHQI,405
249
249
  omlish/testing/pytest/plugins/_registry.py,sha256=IK04KlBgiOJxKAyCCgjpX2R-9tE-btalYJkgjLc8Te8,77
250
- omlish/testing/pytest/plugins/asyncs.py,sha256=Gpj2c6TM33iJUE_bGfdGWTHKMt-nTWw30CHsre2V6pc,4274
250
+ omlish/testing/pytest/plugins/asyncs.py,sha256=1eiKJMzSxhMMGHXbYyCTDElTyRrA31sK5Q80JR9YlBE,5054
251
251
  omlish/testing/pytest/plugins/logging.py,sha256=1zs6Xe54wiaSjabCviaFXwKkoN97CKm3mA5mEoUeJGs,380
252
252
  omlish/testing/pytest/plugins/managermarks.py,sha256=pDEcCNdDAcTS4jjZHSnAfmzqMJDBcJcSsM3QNhbJ6Gs,1485
253
253
  omlish/testing/pytest/plugins/pydevd.py,sha256=u1fxfCgFw4wGKBkMV_H_l9WI8JoUwlRff4iHEr_WYeE,319
@@ -260,8 +260,8 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
260
260
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
261
261
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
262
262
  omlish/text/parts.py,sha256=KGgo0wHOIMVMZtDso-rhSWKAcAkYAH2IGpg9tULabu8,6505
263
- omlish-0.0.0.dev10.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
264
- omlish-0.0.0.dev10.dist-info/METADATA,sha256=1cJuK4P4dcmFs4t41JoSe4UXa3ep4zhFaj5Y2UlJZFI,3563
265
- omlish-0.0.0.dev10.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
266
- omlish-0.0.0.dev10.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
267
- omlish-0.0.0.dev10.dist-info/RECORD,,
263
+ omlish-0.0.0.dev12.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
264
+ omlish-0.0.0.dev12.dist-info/METADATA,sha256=0QsB_sFImufctXgwlmQWcwoq8GttI7wLkE5a8OYso0o,3563
265
+ omlish-0.0.0.dev12.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
266
+ omlish-0.0.0.dev12.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
267
+ omlish-0.0.0.dev12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (73.0.1)
2
+ Generator: setuptools (74.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5