omlish 0.0.0.dev67__py3-none-any.whl → 0.0.0.dev69__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,5 +1,5 @@
1
- __version__ = '0.0.0.dev67'
2
- __revision__ = '9c0328338df429462a1a603795fe20e4a05156ca'
1
+ __version__ = '0.0.0.dev69'
2
+ __revision__ = '3097a2b32b2d2b25ce6a2ae4d289e3b6f6447538'
3
3
 
4
4
 
5
5
  #
omlish/diag/__init__.py CHANGED
@@ -1,4 +1,32 @@
1
1
  """
2
2
  TODO:
3
3
  - https://github.com/aristocratos/btop/blob/00c90884c328eb3e44a0ab094e833161092aae9c/src/linux/btop_collect.cpp#L443
4
+
5
+ ==
6
+
7
+ Repls
8
+ - python - https://docs.python.org/3/tutorial/interpreter.html
9
+ - ipython - https://github.com/ipython/ipython/
10
+ - ptpython - https://github.com/prompt-toolkit/ptpython
11
+ - bpython - https://github.com/bpython/bpython
12
+
13
+ Debuggers
14
+ - pdb - https://docs.python.org/3/library/pdb.html
15
+ - ipdb - https://github.com/gotcha/ipdb
16
+ - pdub - https://github.com/inducer/pudb/
17
+
18
+ CPU Profilers
19
+ - cProfile - https://docs.python.org/3/library/profile.html
20
+ - pyinstrument - https://github.com/joerick/pyinstrument
21
+ - py-pspy - https://github.com/benfred/py-spy
22
+ - austin-dist - https://github.com/P403n1x87/austin
23
+ - yappi - https://github.com/sumerc/yappi
24
+
25
+ Memory Profilers
26
+ - tracemalloc - https://docs.python.org/3/library/tracemalloc.html
27
+ - guppy3 - https://github.com/zhuyifei1999/guppy3/
28
+ - objgraph - https://github.com/mgedmin/objgraph
29
+ - memory-profiler - https://github.com/pythonprofilers/memory_profiler
30
+ - memray - https://github.com/bloomberg/memray
31
+ - pympler - https://github.com/pympler/pympler
4
32
  """
@@ -100,12 +100,17 @@ def _get_env_path_list(k): # type: (str) -> list[str]
100
100
  ##
101
101
 
102
102
 
103
- class AsDict:
104
- def as_dict(self): # type: () -> dict[str, object]
105
- raise TypeError
103
+ class AttrsClass:
104
+ __attrs__ = () # type: tuple[str, ...]
105
+
106
+ def __repr__(self) -> str:
107
+ return _attr_repr(self, *self.__attrs__)
108
+
109
+ def attrs_dict(self): # type: () -> dict[str, object]
110
+ return {a: getattr(self, a) for a in self.__attrs__}
106
111
 
107
112
  def replace(self, **kwargs):
108
- return self.__class__(**{**self.as_dict(), **kwargs})
113
+ return self.__class__(**{**self.attrs_dict(), **kwargs})
109
114
 
110
115
 
111
116
  class AsJson:
@@ -116,7 +121,7 @@ class AsJson:
116
121
  ##
117
122
 
118
123
 
119
- class RunEnv(AsJson):
124
+ class RunEnv(AttrsClass, AsJson):
120
125
  def __init__(
121
126
  self,
122
127
  *,
@@ -171,7 +176,7 @@ class RunEnv(AsJson):
171
176
  sys_path = list(sys.path)
172
177
  self._sys_path = sys_path
173
178
 
174
- _ATTRS = (
179
+ __attrs__ = (
175
180
  'argv',
176
181
  'orig_argv',
177
182
 
@@ -186,12 +191,6 @@ class RunEnv(AsJson):
186
191
  'sys_path',
187
192
  )
188
193
 
189
- def as_json(self): # type: () -> dict[str, object]
190
- return {a: getattr(self, a) for a in self._ATTRS}
191
-
192
- def __repr__(self) -> str:
193
- return _attr_repr(self, *self._ATTRS)
194
-
195
194
  @property
196
195
  def argv(self): # type: () -> list[str]
197
196
  return self._argv
@@ -228,6 +227,9 @@ class RunEnv(AsJson):
228
227
  def sys_path(self): # type: () -> list[str]
229
228
  return self._sys_path
230
229
 
230
+ def as_json(self): # type: () -> dict[str, object]
231
+ return self.attrs_dict()
232
+
231
233
 
232
234
  ##
233
235
 
@@ -495,7 +497,7 @@ def render_args(args): # type: (list[Arg]) -> list[str]
495
497
  ##
496
498
 
497
499
 
498
- class Target(AsDict, AsJson):
500
+ class Target(AttrsClass, AsJson):
499
501
  pass
500
502
 
501
503
 
@@ -530,16 +532,10 @@ class FileTarget(UserTarget):
530
532
  def file(self) -> str:
531
533
  return self._file
532
534
 
533
- _ATTRS = ('file', 'argv')
534
-
535
- def __repr__(self) -> str:
536
- return _attr_repr(self, *self._ATTRS)
537
-
538
- def as_dict(self): # type: () -> dict[str, object]
539
- return _attr_dict(self, *self._ATTRS)
535
+ __attrs__ = ('file', 'argv')
540
536
 
541
537
  def as_json(self): # type: () -> dict[str, object]
542
- return self.as_dict()
538
+ return self.attrs_dict()
543
539
 
544
540
 
545
541
  class ModuleTarget(UserTarget):
@@ -556,16 +552,10 @@ class ModuleTarget(UserTarget):
556
552
  def module(self) -> str:
557
553
  return self._module
558
554
 
559
- _ATTRS = ('module', 'argv')
560
-
561
- def __repr__(self) -> str:
562
- return _attr_repr(self, *self._ATTRS)
563
-
564
- def as_dict(self): # type: () -> dict[str, object]
565
- return _attr_dict(self, *self._ATTRS)
555
+ __attrs__ = ('module', 'argv')
566
556
 
567
557
  def as_json(self): # type: () -> dict[str, object]
568
- return self.as_dict()
558
+ return self.attrs_dict()
569
559
 
570
560
 
571
561
  #
@@ -604,13 +594,7 @@ class DebuggerTarget(PycharmTarget):
604
594
  def target(self) -> Target:
605
595
  return self._target
606
596
 
607
- _ATTRS = ('file', 'args', 'target')
608
-
609
- def __repr__(self) -> str:
610
- return _attr_repr(self, *self._ATTRS)
611
-
612
- def as_dict(self): # type: () -> dict[str, object]
613
- return _attr_dict(self, *self._ATTRS)
597
+ __attrs__ = ('file', 'args', 'target')
614
598
 
615
599
  def as_json(self): # type: () -> dict[str, object]
616
600
  return {
@@ -662,13 +646,7 @@ class TestRunnerTarget(PycharmTarget):
662
646
  def tests(self): # type: () -> list[Test]
663
647
  return self._tests
664
648
 
665
- _ATTRS = ('file', 'args', 'tests')
666
-
667
- def __repr__(self) -> str:
668
- return _attr_repr(self, *self._ATTRS)
669
-
670
- def as_dict(self): # type: () -> dict[str, object]
671
- return _attr_dict(self, *self._ATTRS)
649
+ __attrs__ = ('file', 'args', 'tests')
672
650
 
673
651
  def as_json(self): # type: () -> dict[str, object]
674
652
  return {
@@ -884,7 +862,7 @@ def render_target_args(tgt): # type: (Target) -> list[str]
884
862
  ##
885
863
 
886
864
 
887
- class Exec(AsDict, AsJson):
865
+ class Exec(AttrsClass, AsJson):
888
866
  def __init__(
889
867
  self,
890
868
  exe: str,
@@ -909,13 +887,7 @@ class Exec(AsDict, AsJson):
909
887
  def target(self) -> Target:
910
888
  return self._target
911
889
 
912
- _ATTRS = ('exe', 'exe_args', 'target')
913
-
914
- def __repr__(self) -> str:
915
- return _attr_repr(self, *self._ATTRS)
916
-
917
- def as_dict(self): # type: () -> dict[str, object]
918
- return _attr_dict(self, *self._ATTRS)
890
+ __attrs__ = ('exe', 'exe_args', 'target')
919
891
 
920
892
  def as_json(self): # type: () -> dict[str, object]
921
893
  return {
@@ -979,7 +951,7 @@ def render_exec_args(exe): # type: (Exec) -> list[str]
979
951
  ##
980
952
 
981
953
 
982
- class ExecDecision(AsDict, AsJson):
954
+ class ExecDecision(AttrsClass, AsJson):
983
955
  def __init__(
984
956
  self,
985
957
  target: Target,
@@ -1020,7 +992,7 @@ class ExecDecision(AsDict, AsJson):
1020
992
  def os_exec(self) -> bool:
1021
993
  return self._os_exec
1022
994
 
1023
- _ATTRS = (
995
+ __attrs__ = (
1024
996
  'target',
1025
997
  'cwd',
1026
998
  'python_path',
@@ -1028,12 +1000,6 @@ class ExecDecision(AsDict, AsJson):
1028
1000
  'os_exec',
1029
1001
  )
1030
1002
 
1031
- def __repr__(self) -> str:
1032
- return _attr_repr(self, *self._ATTRS)
1033
-
1034
- def as_dict(self): # type: () -> dict[str, object]
1035
- return _attr_dict(self, *self._ATTRS)
1036
-
1037
1003
  def as_json(self): # type: () -> dict[str, object]
1038
1004
  return {
1039
1005
  'target': self._target.as_json(),
omlish/lang/imports.py CHANGED
@@ -12,7 +12,12 @@ from .cached import cached_function
12
12
 
13
13
 
14
14
  def can_import(name: str, package: str | None = None) -> bool:
15
- return importlib.util.find_spec(name, package) is not None
15
+ try:
16
+ spec = importlib.util.find_spec(name, package)
17
+ except ImportError:
18
+ return False
19
+ else:
20
+ return spec is not None
16
21
 
17
22
 
18
23
  ##
@@ -22,13 +27,23 @@ def lazy_import(name: str, package: str | None = None) -> ta.Callable[[], ta.Any
22
27
  return cached_function(functools.partial(importlib.import_module, name, package=package))
23
28
 
24
29
 
25
- def proxy_import(name: str, package: str | None = None) -> types.ModuleType:
30
+ def proxy_import(
31
+ name: str,
32
+ package: str | None = None,
33
+ extras: ta.Iterable[str] | None = None,
34
+ ) -> types.ModuleType:
35
+ if isinstance(extras, str):
36
+ raise TypeError(extras)
37
+
26
38
  omod = None
27
39
 
28
40
  def __getattr__(att): # noqa
29
41
  nonlocal omod
30
42
  if omod is None:
31
43
  omod = importlib.import_module(name, package=package)
44
+ if extras:
45
+ for x in extras:
46
+ importlib.import_module(f'{name}.{x}', package=package)
32
47
  return getattr(omod, att)
33
48
 
34
49
  lmod = types.ModuleType(name)
omlish/lang/objects.py CHANGED
@@ -87,7 +87,7 @@ def super_meta(
87
87
  ##
88
88
 
89
89
 
90
- def deep_subclasses(cls: type, *, concrete_only: bool = False) -> ta.Iterator[type]:
90
+ def deep_subclasses(cls: type[T], *, concrete_only: bool = False) -> ta.Iterator[type[T]]:
91
91
  seen = set()
92
92
  todo = list(reversed(cls.__subclasses__()))
93
93
  while todo:
omlish/libc.py CHANGED
@@ -1,4 +1,4 @@
1
- # ruff: noqa: ANN201, N801, N802
1
+ # ruff: noqa: ANN201 N801 N802
2
2
  import ctypes as ct
3
3
  import errno
4
4
  import platform
@@ -1,7 +1,6 @@
1
1
  from .testing import ( # noqa
2
2
  assert_dicts_equal_ordered,
3
3
  call_many_with_timeout,
4
- can_import,
5
4
  run_with_timeout,
6
5
  waitpid_with_timeout,
7
6
  xfail,
@@ -37,7 +37,7 @@ class ManagerMarksPlugin:
37
37
  def mark_classes(self) -> ta.Mapping[str, type[ManagerMark]]:
38
38
  return {
39
39
  cls.__name__: cls
40
- for cls in _deep_subclasses(ManagerMark)
40
+ for cls in lang.deep_subclasses(ManagerMark) # type: ignore[type-abstract]
41
41
  if not lang.is_abstract_class(cls)
42
42
  }
43
43
 
@@ -5,11 +5,11 @@ import typing as ta
5
5
 
6
6
  import pytest
7
7
 
8
- from ..testing import can_import
8
+ from ... import lang
9
9
 
10
10
 
11
11
  def if_cant_import(module: str, *args, **kwargs):
12
- return pytest.mark.skipif(not can_import(module, *args, **kwargs), reason=f'requires import {module}')
12
+ return pytest.mark.skipif(not lang.can_import(module, *args, **kwargs), reason=f'requires import {module}')
13
13
 
14
14
 
15
15
  def if_not_on_path(exe: str):
omlish/testing/testing.py CHANGED
@@ -1,5 +1,4 @@
1
1
  import functools
2
- import importlib
3
2
  import os
4
3
  import sys
5
4
  import threading
@@ -89,15 +88,6 @@ def waitpid_with_timeout(
89
88
  raise timeout_exception
90
89
 
91
90
 
92
- def can_import(*args, **kwargs) -> bool:
93
- try:
94
- importlib.import_module(*args, **kwargs)
95
- except ImportError:
96
- return False
97
- else:
98
- return True
99
-
100
-
101
91
  def xfail(fn):
102
92
  @functools.wraps(fn)
103
93
  def inner(*args, **kwargs):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev67
3
+ Version: 0.0.0.dev69
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=TXvFdkAU0Zr2FKdo7fyvt9nr3UjCtrnAZ0diZXSAteE,1430
2
- omlish/__about__.py,sha256=GBJLEW2X4D4jw_aYUOp97zWZQ0xVb4LJGcqAd4jBtnk,3420
2
+ omlish/__about__.py,sha256=IwGGP6Oe4Sux6iaJWcinkD3DfkrJmksEYnKmYdTly1I,3420
3
3
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omlish/argparse.py,sha256=Dc73G8lyoQBLvXhMYUbzQUh4SJu_OTvKUXjSUxq_ang,7499
5
5
  omlish/c3.py,sha256=4vogWgwPb8TbNS2KkZxpoWbwjj7MuHG2lQG-hdtkvjI,8062
@@ -12,7 +12,7 @@ omlish/fnpairs.py,sha256=Sl8CMFNyDS-1JYAjSWqnT5FmUm9Lj6o7FxSRo7g4jww,10875
12
12
  omlish/fnpipes.py,sha256=AJkgz9nvRRm7oqw7ZgYyz21klu276LWi54oYCLg-vOg,2196
13
13
  omlish/genmachine.py,sha256=LCMiqvK32dAWtrlB6lKw9tXdQFiXC8rRdk4TMQYIroU,1603
14
14
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
15
- omlish/libc.py,sha256=QSqAauv4o77T_ttyC6I4M-q33VROHjbZtkN-lEWJ6RU,15364
15
+ omlish/libc.py,sha256=8r7Ejyhttk9ruCfBkxNTrlzir5WPbDE2vmY7VPlceMA,15362
16
16
  omlish/matchfns.py,sha256=I1IlQGfEyk_AcFSy6ulVS3utC-uwyZM2YfUXYHc9Bw0,6152
17
17
  omlish/multiprocessing.py,sha256=QZT4C7I-uThCAjaEY3xgUYb-5GagUlnE4etN01LDyU4,5186
18
18
  omlish/os.py,sha256=vO1sZCzAhVxo46tDFLrD52q2KuMFWQwu5MPJgSsnliI,3107
@@ -149,7 +149,7 @@ omlish/dataclasses/impl/repr.py,sha256=oLXBTxqp88NKmz82HrJeGiTEiwK4l5LlXQT9Q0-tX
149
149
  omlish/dataclasses/impl/simple.py,sha256=EovA-GpmQYtB_svItO2byTAWqbKGF4njz0MdQts3QBU,3157
150
150
  omlish/dataclasses/impl/slots.py,sha256=_sm-x9v1tPnXEHBHNUMTHZocgVyhZaPdvamIPPBUVyk,2635
151
151
  omlish/dataclasses/impl/utils.py,sha256=aER2iL3UAtgS1BdLuEvTr9Tr2wC28wk1kiOeO-jIymw,6138
152
- omlish/diag/__init__.py,sha256=BYQoq12W2qU0O7m2Z-RLCX6YLIYEW9MmfN7_i9--Yk0,132
152
+ omlish/diag/__init__.py,sha256=4S8v0myJM4Zld6_FV6cPe_nSv0aJb6kXftEit0HkiGE,1141
153
153
  omlish/diag/asts.py,sha256=BveUUNUcaAm4Hg55f4ZxGSI313E4L8cCZ5XjHpEkKVI,3325
154
154
  omlish/diag/debug.py,sha256=YPzQXiBAJMYHYpBKzx0QhlLMZokjR5kkAVLodA3yddQ,424
155
155
  omlish/diag/procfs.py,sha256=vBovaMvAUKdl7FbtFq3TNsSmdhs8DaYfhoEsKeWYta8,9704
@@ -158,7 +158,7 @@ omlish/diag/ps.py,sha256=1JWxZen3fVG-20R6ZZ8BtO_gpzw_5bhHZiKdoHkgxoU,1004
158
158
  omlish/diag/pydevd.py,sha256=Fsx9rfCOnwLD6RLBqH0uAdtq75rbNeBAQfiDvIBd3e0,7295
159
159
  omlish/diag/threads.py,sha256=1-x02VCDZ407gfbtXm1pWK-ubqhqfePm9PMqkHCVoqk,3642
160
160
  omlish/diag/_pycharm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
161
- omlish/diag/_pycharm/runhack.py,sha256=PCH6K4yT1di3n5q9d1nqUQWHZRcEOi3piGKXPjVDb38,35428
161
+ omlish/diag/_pycharm/runhack.py,sha256=LFxuv7WibkC6Q7JmcKtPdytzinYFMZWqjane7YjPiVI,34463
162
162
  omlish/diag/pycharm/__init__.py,sha256=sT-ub7flKeCCbM_i32z9-eGV8hgGJ45hwdcqtGDkVRY,153
163
163
  omlish/diag/pycharm/cli.py,sha256=7SRh6yj8S5YGda4bq9BD4Kzwtgg4_Wa-K202ReZN2iI,1011
164
164
  omlish/diag/pycharm/pycharm.py,sha256=g-IfF8FBH93o6k_KDrLy8kIiFSLe3n39I2URipfFy0Q,3115
@@ -249,10 +249,10 @@ omlish/lang/datetimes.py,sha256=ehI_DhQRM-bDxAavnp470XcekbbXc4Gdw9y1KpHDJT0,223
249
249
  omlish/lang/descriptors.py,sha256=RRBbkMgTzg82fFFE4D0muqobpM-ZZaOta6yB1lpX3s8,6617
250
250
  omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
251
251
  omlish/lang/functions.py,sha256=kkPfcdocg-OmyN7skIqrFxNvqAv89Zc_kXKYAN8vw8g,3895
252
- omlish/lang/imports.py,sha256=04ugFC8NI5sbL7NH4V0r0q_nFsP_AMkHLz697CVkMtQ,6274
252
+ omlish/lang/imports.py,sha256=Oy7iInOTqgZv6nyRbnvGrPv4cKKIAzPbhfDXCajDUcc,6626
253
253
  omlish/lang/iterables.py,sha256=_q6rHbdFfW3VBqez0IV3rUABoNxsA_oBv_sykm5zsbQ,2243
254
254
  omlish/lang/maybes.py,sha256=NYHZDjqDtwPMheDrj2VtUVujxRPf8Qpgk4ZlZCTvBZc,3492
255
- omlish/lang/objects.py,sha256=PJXGm-WgC7vpWzaXGwofk48V2XZNaQLje60K1ariwvQ,4454
255
+ omlish/lang/objects.py,sha256=t7Pvj9ILoxfdAMy5HC7bb9LfUokW5WfpLaoH2YYyTjQ,4460
256
256
  omlish/lang/resolving.py,sha256=OuN2mDTPNyBUbcrswtvFKtj4xgH4H4WglgqSKv3MTy0,1606
257
257
  omlish/lang/resources.py,sha256=-NmVTrSMKFZ6smVfOMz46ekZYVGgYh8cPooxQlFpG6s,2135
258
258
  omlish/lang/strings.py,sha256=BsciSYnckD4vGtC6kmtnugR9IN6CIHdcjO4nZu-pSAw,3898
@@ -386,12 +386,12 @@ omlish/sql/alchemy/duckdb.py,sha256=kr7pIhiBLNAuZrcigHDtFg9zHkVcrRW3LfryO9VJ4mk,
386
386
  omlish/sql/alchemy/exprs.py,sha256=gO4Fj4xEY-PuDgV-N8hBMy55glZz7O-4H7v1LWabfZY,323
387
387
  omlish/sql/alchemy/secrets.py,sha256=EMfy4EfTbEvrlv_41oOhn8qsoF-eTkY7HciPenIE6rI,178
388
388
  omlish/sql/alchemy/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,403
389
- omlish/testing/__init__.py,sha256=kfiF10ykrjWXniedIl3g8j3pNAFyuSbp1D3ZXug3-Eo,168
390
- omlish/testing/testing.py,sha256=pJUbZ0ymdrQoNG9r9UlGXypeU1x9ntEp9xcYBnyOHUs,3088
389
+ omlish/testing/__init__.py,sha256=M_BQrcCHkoL-ZvE-UpQ8XxXNYRRawhjUz4rCJnAqM2A,152
390
+ omlish/testing/testing.py,sha256=TT2wwSzPZ_KhIvKxpM1qc1yHKD-LHDNgGrcr_h8vs7c,2895
391
391
  omlish/testing/pytest/__init__.py,sha256=B2nyJrjIoNcEopbg0IZ5UUDs4OHmQ8qqElFJfGcDdas,257
392
392
  omlish/testing/pytest/helpers.py,sha256=TJpD60mBtLi9FtxX4TThfuXvg5FIRPSiZk1aeRwe-D4,197
393
393
  omlish/testing/pytest/marks.py,sha256=ExuwitbMr1txMbaAcWZ652pYa30M-i3wVacnjqschTs,424
394
- omlish/testing/pytest/skip.py,sha256=uACMFtQQNJfFDbWrppjWevdrQgKVH1MUmH5rXIpv0IE,846
394
+ omlish/testing/pytest/skip.py,sha256=NxTkAQiS3HKZR3sfFdxOR2LCFwtCveY6Ap-qtexiZbw,839
395
395
  omlish/testing/pytest/inject/__init__.py,sha256=pdRKv1HcDmJ_yArKJbYITPXXZthRSGgBJWqITr0Er38,117
396
396
  omlish/testing/pytest/inject/harness.py,sha256=v4DaKJ0KL8oQjzIMK43Gh8GHP4hiI6-lY37O9lyOHRk,5724
397
397
  omlish/testing/pytest/plugins/__init__.py,sha256=ys1zXrYrNm7Uo6YOIVJ6Bd3dQo6kv387k7MbTYlqZSI,467
@@ -399,7 +399,7 @@ omlish/testing/pytest/plugins/_registry.py,sha256=IK04KlBgiOJxKAyCCgjpX2R-9tE-bt
399
399
  omlish/testing/pytest/plugins/asyncs.py,sha256=SV6oKCy50CGkzLGYX-CT4MfWNqsrH8ONEbIWC3tFcHA,5324
400
400
  omlish/testing/pytest/plugins/depskip.py,sha256=xithY-OMtjwhv8mcRNkv-WI_PSQtHldQ8H1s60MIXkk,2673
401
401
  omlish/testing/pytest/plugins/logging.py,sha256=1zs6Xe54wiaSjabCviaFXwKkoN97CKm3mA5mEoUeJGs,380
402
- omlish/testing/pytest/plugins/managermarks.py,sha256=pDEcCNdDAcTS4jjZHSnAfmzqMJDBcJcSsM3QNhbJ6Gs,1485
402
+ omlish/testing/pytest/plugins/managermarks.py,sha256=AP3ty-QB-8O5DkulwUOudBlUOvXMHhBfNyY-0yCmejk,1520
403
403
  omlish/testing/pytest/plugins/pydevd.py,sha256=u1fxfCgFw4wGKBkMV_H_l9WI8JoUwlRff4iHEr_WYeE,319
404
404
  omlish/testing/pytest/plugins/repeat.py,sha256=flSQzE9GFOWksVKz-mUGnpxJpv3yRqn1G4K8pW7JHs0,498
405
405
  omlish/testing/pytest/plugins/skips.py,sha256=EoZDg1uWccgbAegmzqI85c7RliycD1e2J4Y7vfDRhwM,1041
@@ -412,9 +412,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
412
412
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
413
413
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
414
414
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
415
- omlish-0.0.0.dev67.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
416
- omlish-0.0.0.dev67.dist-info/METADATA,sha256=hkhdhVlLm3TrbEEx22WjxDY4HDUOG_i2F--9ZwlK-ZE,4167
417
- omlish-0.0.0.dev67.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
418
- omlish-0.0.0.dev67.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
419
- omlish-0.0.0.dev67.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
420
- omlish-0.0.0.dev67.dist-info/RECORD,,
415
+ omlish-0.0.0.dev69.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
416
+ omlish-0.0.0.dev69.dist-info/METADATA,sha256=60bC4G8a17heJL6mUwr4rCB1VrowRiVCdww0ArlUTXk,4167
417
+ omlish-0.0.0.dev69.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
418
+ omlish-0.0.0.dev69.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
419
+ omlish-0.0.0.dev69.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
420
+ omlish-0.0.0.dev69.dist-info/RECORD,,