omlish 0.0.0.dev67__py3-none-any.whl → 0.0.0.dev69__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
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,,