omlish 0.0.0.dev77__py3-none-any.whl → 0.0.0.dev78__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.dev77'
2
- __revision__ = '8b46b6eef1d8ddc8c6ccd65f76b7d9f3d0759919'
1
+ __version__ = '0.0.0.dev78'
2
+ __revision__ = 'ab358221dace7193463b9b1a32f06ed9f09cc0f5'
3
3
 
4
4
 
5
5
  #
@@ -1190,6 +1190,18 @@ class HackRunner:
1190
1190
  self._is_debug = is_debug
1191
1191
  self._is_enabled = is_enabled
1192
1192
 
1193
+ @_cached_nullary
1194
+ def _debug_formatter(self):
1195
+ try:
1196
+ import pprint # noqa
1197
+ except ImportError:
1198
+ return repr
1199
+
1200
+ def df(arg):
1201
+ return pprint.pformat(arg, sort_dicts=False)
1202
+
1203
+ return df
1204
+
1193
1205
  def _debug(self, arg):
1194
1206
  if not self._is_debug:
1195
1207
  return
@@ -1197,12 +1209,7 @@ class HackRunner:
1197
1209
  if isinstance(arg, str):
1198
1210
  s = arg
1199
1211
  else:
1200
- try:
1201
- import pprint # noqa
1202
- except ImportError:
1203
- s = repr(arg)
1204
- else:
1205
- s = pprint.pformat(arg, sort_dicts=False)
1212
+ s = self._debug_formatter()(arg)
1206
1213
 
1207
1214
  print(f'{_DEBUG_PREFIX}: {s}', file=sys.stderr)
1208
1215
 
@@ -1343,23 +1350,23 @@ def _install_pth_file(
1343
1350
  ) -> bool:
1344
1351
  import site
1345
1352
  lib_dir = site.getsitepackages()[0]
1346
- verbose and print(f'{lib_dir=}')
1353
+ verbose and print(f'{lib_dir=}', file=sys.stderr)
1347
1354
 
1348
1355
  pth_file = os.path.join(lib_dir, file_name)
1349
- verbose and print(f'{pth_file=}')
1356
+ verbose and print(f'{pth_file=}', file=sys.stderr)
1350
1357
  if not force and os.path.isfile(pth_file):
1351
- verbose and print('pth_file exists, exiting')
1358
+ verbose and print('pth_file exists, exiting', file=sys.stderr)
1352
1359
  return False
1353
1360
 
1354
1361
  if not editable:
1355
1362
  if module_name is None:
1356
1363
  module_name = '_' + file_name.removesuffix('.pth').replace('-', '_')
1357
- verbose and print(f'{module_name=}')
1364
+ verbose and print(f'{module_name=}', file=sys.stderr)
1358
1365
 
1359
1366
  mod_file = os.path.join(lib_dir, module_name + '.py')
1360
- verbose and print(f'{mod_file=}')
1367
+ verbose and print(f'{mod_file=}', file=sys.stderr)
1361
1368
  if not force and os.path.isfile(mod_file):
1362
- verbose and print('mod_file exists, exiting')
1369
+ verbose and print('mod_file exists, exiting', file=sys.stderr)
1363
1370
  return False
1364
1371
 
1365
1372
  import inspect
@@ -1368,20 +1375,20 @@ def _install_pth_file(
1368
1375
  else:
1369
1376
  if module_name is None:
1370
1377
  module_name = __package__ + '.runhack'
1371
- verbose and print(f'{module_name=}')
1378
+ verbose and print(f'{module_name=}', file=sys.stderr)
1372
1379
 
1373
1380
  mod_file = mod_src = None # type: ignore
1374
1381
 
1375
1382
  pth_src = _build_pth_file_src(module_name)
1376
- verbose and print(f'{pth_src=}')
1383
+ verbose and print(f'{pth_src=}', file=sys.stderr)
1377
1384
 
1378
1385
  if not dry_run:
1379
1386
  if mod_file is not None:
1380
- verbose and print(f'writing {mod_file}')
1387
+ verbose and print(f'writing {mod_file}', file=sys.stderr)
1381
1388
  with open(mod_file, 'w') as f:
1382
1389
  f.write(mod_src) # type: ignore
1383
1390
 
1384
- verbose and print(f'writing {pth_file}')
1391
+ verbose and print(f'writing {pth_file}', file=sys.stderr)
1385
1392
  with open(pth_file, 'w') as f:
1386
1393
  f.write(pth_src)
1387
1394
 
omlish/lite/check.py CHANGED
@@ -38,3 +38,20 @@ def check_non_empty_str(v: ta.Optional[str]) -> str:
38
38
  def check_state(v: bool, msg: str = 'Illegal state') -> None:
39
39
  if not v:
40
40
  raise ValueError(msg)
41
+
42
+
43
+ def check_equal(l: T, r: T) -> T:
44
+ if l != r:
45
+ raise ValueError(l, r)
46
+ return l
47
+
48
+
49
+ def check_not_equal(l: T, r: T) -> T:
50
+ if l == r:
51
+ raise ValueError(l, r)
52
+ return l
53
+
54
+
55
+ def check_single(vs: ta.Iterable[T]) -> T:
56
+ [v] = vs
57
+ return v
@@ -1,31 +1,31 @@
1
- import dataclasses as dc
1
+ # ruff: noqa: UP007
2
2
  import io
3
3
  import typing as ta
4
4
 
5
- from . import check
5
+ from .check import check_isinstance
6
+ from .check import check_not_none
7
+ from .strings import attr_repr
6
8
 
7
9
 
8
- @dc.dataclass(frozen=True)
9
- class DelimitingBufferError(Exception):
10
- buffer: 'DelimitingBuffer'
11
-
12
-
13
- class ClosedDelimitingBufferError(DelimitingBufferError):
14
- pass
10
+ class DelimitingBuffer:
11
+ """
12
+ https://github.com/python-trio/trio/issues/796 :|
13
+ """
15
14
 
15
+ #
16
16
 
17
- class FullDelimitingBufferError(DelimitingBufferError):
18
- pass
17
+ class Error(Exception):
18
+ def __init__(self, buffer: 'DelimitingBuffer') -> None:
19
+ super().__init__(buffer)
20
+ self.buffer = buffer
19
21
 
22
+ def __repr__(self) -> str:
23
+ return attr_repr(self, 'buffer')
20
24
 
21
- class IncompleteDelimitingBufferError(DelimitingBufferError):
22
- pass
25
+ class ClosedError(Error):
26
+ pass
23
27
 
24
-
25
- class DelimitingBuffer:
26
- """
27
- https://github.com/python-trio/trio/issues/796 :|
28
- """
28
+ #
29
29
 
30
30
  DEFAULT_DELIMITERS: bytes = b'\n'
31
31
 
@@ -34,19 +34,17 @@ class DelimitingBuffer:
34
34
  delimiters: ta.Iterable[int] = DEFAULT_DELIMITERS,
35
35
  *,
36
36
  keep_ends: bool = False,
37
- max_size: int | None = None,
38
- on_full: ta.Literal['raise', 'yield'] = 'raise',
39
- on_incomplete: ta.Literal['raise', 'yield'] = 'yield',
37
+ max_size: ta.Optional[int] = None,
40
38
  ) -> None:
41
39
  super().__init__()
42
40
 
43
- self._delimiters = frozenset(check.isinstance(d, int) for d in delimiters)
41
+ self._delimiters = frozenset(check_isinstance(d, int) for d in delimiters)
44
42
  self._keep_ends = keep_ends
45
43
  self._max_size = max_size
46
- self._on_full = on_full
47
- self._on_incomplete = on_incomplete
48
44
 
49
- self._buf: io.BytesIO | None = io.BytesIO()
45
+ self._buf: ta.Optional[io.BytesIO] = io.BytesIO()
46
+
47
+ #
50
48
 
51
49
  @property
52
50
  def is_closed(self) -> bool:
@@ -54,15 +52,15 @@ class DelimitingBuffer:
54
52
 
55
53
  def tell(self) -> int:
56
54
  if (buf := self._buf) is None:
57
- raise ClosedDelimitingBufferError(self)
55
+ raise self.ClosedError(self)
58
56
  return buf.tell()
59
57
 
60
58
  def peek(self) -> bytes:
61
59
  if (buf := self._buf) is None:
62
- raise ClosedDelimitingBufferError(self)
60
+ raise self.ClosedError(self)
63
61
  return buf.getvalue()
64
62
 
65
- def _find_delim(self, data: bytes | bytearray, i: int) -> int | None:
63
+ def _find_delim(self, data: ta.Union[bytes, bytearray], i: int) -> ta.Optional[int]:
66
64
  r = None # type: int | None
67
65
  for d in self._delimiters:
68
66
  if (p := data.find(d, i)) >= 0:
@@ -71,7 +69,7 @@ class DelimitingBuffer:
71
69
  return r
72
70
 
73
71
  def _append_and_reset(self, chunk: bytes) -> bytes:
74
- buf = check.not_none(self._buf)
72
+ buf = check_not_none(self._buf)
75
73
  if not buf.tell():
76
74
  return chunk
77
75
 
@@ -80,22 +78,18 @@ class DelimitingBuffer:
80
78
  buf.seek(0)
81
79
  return ret
82
80
 
83
- def feed(self, data: bytes | bytearray) -> ta.Generator[bytes, None, None]:
81
+ class Incomplete(ta.NamedTuple):
82
+ b: bytes
83
+
84
+ def feed(self, data: ta.Union[bytes, bytearray]) -> ta.Generator[ta.Union[bytes, Incomplete], None, None]:
84
85
  if (buf := self._buf) is None:
85
- raise ClosedDelimitingBufferError(self)
86
+ raise self.ClosedError(self)
86
87
 
87
88
  if not data:
88
89
  self._buf = None
89
90
 
90
91
  if buf.tell():
91
- if self._on_incomplete == 'raise':
92
- raise IncompleteDelimitingBufferError(self)
93
-
94
- elif self._on_incomplete == 'yield':
95
- yield buf.getvalue()
96
-
97
- else:
98
- raise ValueError(f'Unknown on_incomplete value: {self._on_incomplete!r}')
92
+ yield self.Incomplete(buf.getvalue())
99
93
 
100
94
  return
101
95
 
@@ -128,15 +122,6 @@ class DelimitingBuffer:
128
122
  buf.write(data[i:])
129
123
  return
130
124
 
131
- if self._on_full == 'raise':
132
- raise FullDelimitingBufferError(self)
133
-
134
- elif self._on_full == 'yield':
135
- p = i + remaining_buf_capacity
136
-
137
- yield self._append_and_reset(data[i:p])
138
-
139
- i = p
140
-
141
- else:
142
- raise ValueError(f'Unknown on_full value: {self._on_full!r}')
125
+ p = i + remaining_buf_capacity
126
+ yield self.Incomplete(self._append_and_reset(data[i:p]))
127
+ i = p
omlish/lite/strings.py CHANGED
@@ -1,5 +1,13 @@
1
- def camel_case(name: str) -> str:
2
- return ''.join(map(str.capitalize, name.split('_'))) # noqa
1
+ import typing as ta
2
+
3
+
4
+ def camel_case(name: str, lower: bool = False) -> str:
5
+ if not name:
6
+ return ''
7
+ s = ''.join(map(str.capitalize, name.split('_'))) # noqa
8
+ if lower:
9
+ s = s[0].lower() + s[1:]
10
+ return s
3
11
 
4
12
 
5
13
  def snake_case(name: str) -> str:
@@ -23,3 +31,7 @@ def is_sunder(name: str) -> bool:
23
31
  name[-2:-1] != '_' and
24
32
  len(name) > 2
25
33
  )
34
+
35
+
36
+ def attr_repr(obj: ta.Any, *attrs: str) -> str:
37
+ return f'{type(obj).__name__}({", ".join(f"{attr}={getattr(obj, attr)!r}" for attr in attrs)})'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev77
3
+ Version: 0.0.0.dev78
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=ucaSu1XcJPryi-AqINUejkVDeJAFk7Bp5ar5_tJTgME,1692
2
- omlish/__about__.py,sha256=i1Q9Y1vMY4lpwFfOBqcBVeNNdDLETm1ZG2fP6UX9CXE,3420
2
+ omlish/__about__.py,sha256=V-NjYdq77UjSL6Wh4-iy3PPEIixpdndH7m4d-i_05EE,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
@@ -11,7 +11,6 @@ omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
11
11
  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
- omlish/io.py,sha256=4_0naIRniQ_xGhCW44xkk3sKqgddCbtIjbs72SGqK9g,3679
15
14
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
16
15
  omlish/libc.py,sha256=8r7Ejyhttk9ruCfBkxNTrlzir5WPbDE2vmY7VPlceMA,15362
17
16
  omlish/matchfns.py,sha256=I1IlQGfEyk_AcFSy6ulVS3utC-uwyZM2YfUXYHc9Bw0,6152
@@ -159,7 +158,7 @@ omlish/diag/ps.py,sha256=1JWxZen3fVG-20R6ZZ8BtO_gpzw_5bhHZiKdoHkgxoU,1004
159
158
  omlish/diag/pydevd.py,sha256=Fsx9rfCOnwLD6RLBqH0uAdtq75rbNeBAQfiDvIBd3e0,7295
160
159
  omlish/diag/threads.py,sha256=1-x02VCDZ407gfbtXm1pWK-ubqhqfePm9PMqkHCVoqk,3642
161
160
  omlish/diag/_pycharm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
162
- omlish/diag/_pycharm/runhack.py,sha256=SRL3ay-bGPNzyjZ7dya8T_2ucBhlK9WMKUrLI1-_YTQ,34678
161
+ omlish/diag/_pycharm/runhack.py,sha256=eJlaUXIcFzAjOop_793RwNS_KF9NmhLv0i22xRVVeo0,34951
163
162
  omlish/diag/pycharm/__init__.py,sha256=sT-ub7flKeCCbM_i32z9-eGV8hgGJ45hwdcqtGDkVRY,153
164
163
  omlish/diag/pycharm/cli.py,sha256=7SRh6yj8S5YGda4bq9BD4Kzwtgg4_Wa-K202ReZN2iI,1011
165
164
  omlish/diag/pycharm/pycharm.py,sha256=g-IfF8FBH93o6k_KDrLy8kIiFSLe3n39I2URipfFy0Q,3115
@@ -278,15 +277,16 @@ omlish/lifecycles/states.py,sha256=zqMOU2ZU-MDNnWuwauM3_anIAiXM8LoBDElDEraptFg,1
278
277
  omlish/lifecycles/transitions.py,sha256=qQtFby-h4VzbvgaUqT2NnbNumlcOx9FVVADP9t83xj4,1939
279
278
  omlish/lite/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
280
279
  omlish/lite/cached.py,sha256=dUm647FbIsoxWT23XUFM51F7i-C2Buxr5b5zzgbCtQI,546
281
- omlish/lite/check.py,sha256=B0VnyBSWI5qipidkwnU-BP43S9E-UOgp4WUM17pVpHc,750
280
+ omlish/lite/check.py,sha256=ouJme9tkzWXKymm_xZDK4mngdYSkxDrok6CSegvf-1w,1015
282
281
  omlish/lite/contextmanagers.py,sha256=HnQJiyrOmSvTL22XRJrFl5CLpCyHD9fsntEUAr9G-60,427
282
+ omlish/lite/io.py,sha256=6qixpFyLwCVRi44Np49xknvwZEtCz1yYMgsawE_Gh0Y,3125
283
283
  omlish/lite/json.py,sha256=7-02Ny4fq-6YAu5ynvqoijhuYXWpLmfCI19GUeZnb1c,740
284
284
  omlish/lite/logs.py,sha256=vkFkSX0Izb2P-NNMqqNLSec0BzeLOtHoQWgdXwQuDPU,6007
285
285
  omlish/lite/marshal.py,sha256=kZtfIiFfmxEi8ZKne3fT0R8g8kLmJ-Q5nq4kOvwhiqk,8656
286
286
  omlish/lite/reflect.py,sha256=9QYJwdINraq1JNMEgvoqeSlVvRRgOXpxAkpgX8EgRXc,1307
287
287
  omlish/lite/runtime.py,sha256=VUhmNQvwf8QzkWSKj4Q0ReieJA_PzHaJNRBivfTseow,452
288
288
  omlish/lite/secrets.py,sha256=3Mz3V2jf__XU9qNHcH56sBSw95L3U2UPL24bjvobG0c,816
289
- omlish/lite/strings.py,sha256=9dO_A6EkhcTZ2xmOUGSOMT-mx9BnoOzYu1-ocSrDJaA,670
289
+ omlish/lite/strings.py,sha256=GFkkp-q6sgO06EACyp33oiyCQQKAbpGMnVMFHZE5KP8,955
290
290
  omlish/lite/subprocesses.py,sha256=KuGV3ImehMjCUK0JoV3pUtG_7o5wei1lRDn9HxzByAg,3063
291
291
  omlish/logs/__init__.py,sha256=FbOyAW-lGH8gyBlSVArwljdYAU6RnwZLI5LwAfuNnrk,438
292
292
  omlish/logs/_abc.py,sha256=UgrCUQVUi_PvT3p1CEkb3P74CFrFcZq2AFby3GEUv9M,5974
@@ -439,9 +439,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
439
439
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
440
440
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
441
441
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
442
- omlish-0.0.0.dev77.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
443
- omlish-0.0.0.dev77.dist-info/METADATA,sha256=VlK72KOPqQ5bEM1S_-WWEjL40m4-gBNAOS_1vO1Ckpc,4167
444
- omlish-0.0.0.dev77.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
445
- omlish-0.0.0.dev77.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
446
- omlish-0.0.0.dev77.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
447
- omlish-0.0.0.dev77.dist-info/RECORD,,
442
+ omlish-0.0.0.dev78.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
443
+ omlish-0.0.0.dev78.dist-info/METADATA,sha256=Ux9SWMjTdMbbivRndYxzrL5D3GOcd0ZHsaXHwwyhDWU,4167
444
+ omlish-0.0.0.dev78.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
445
+ omlish-0.0.0.dev78.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
446
+ omlish-0.0.0.dev78.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
447
+ omlish-0.0.0.dev78.dist-info/RECORD,,