omdev 0.0.0.dev145__py3-none-any.whl → 0.0.0.dev146__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.

Potentially problematic release.


This version of omdev might be problematic. Click here for more details.

omdev/.manifests.json CHANGED
@@ -243,7 +243,7 @@
243
243
  "module": ".tools.docker",
244
244
  "attr": "_CLI_MODULE",
245
245
  "file": "omdev/tools/docker.py",
246
- "line": 236,
246
+ "line": 249,
247
247
  "value": {
248
248
  "$.cli.types.CliModule": {
249
249
  "cmd_name": "docker",
@@ -255,7 +255,7 @@
255
255
  "module": ".tools.git",
256
256
  "attr": "_CLI_MODULE",
257
257
  "file": "omdev/tools/git.py",
258
- "line": 211,
258
+ "line": 215,
259
259
  "value": {
260
260
  "$.cli.types.CliModule": {
261
261
  "cmd_name": "git",
omdev/amalg/amalg.py CHANGED
@@ -25,8 +25,10 @@ Targets:
25
25
  """
26
26
  import argparse
27
27
  import ast
28
+ import base64
28
29
  import dataclasses as dc
29
30
  import io
31
+ import itertools
30
32
  import logging
31
33
  import os.path
32
34
  import re
@@ -286,6 +288,37 @@ def is_root_level_if_type_checking_block(lts: Tokens) -> bool:
286
288
  ##
287
289
 
288
290
 
291
+ class RootLevelResourcesRead(ta.NamedTuple):
292
+ variable: str
293
+ kind: ta.Literal['binary', 'text']
294
+ resource: str
295
+
296
+
297
+ def is_root_level_resources_read(lts: Tokens) -> RootLevelResourcesRead | None:
298
+ wts = list(tks.ignore_ws(lts, keep=['INDENT']))
299
+
300
+ if not tks.match_toks(wts, [
301
+ ('NAME', None),
302
+ ('OP', '='),
303
+ ('NAME', ('read_package_resource_binary', 'read_package_resource_text')),
304
+ ('OP', '('),
305
+ ('NAME', '__package__'),
306
+ ('OP', ','),
307
+ ('STRING', None),
308
+ ('OP', ')'),
309
+ ]):
310
+ return None
311
+
312
+ return RootLevelResourcesRead(
313
+ wts[0].src,
314
+ 'binary' if wts[2].src == 'read_package_resource_binary' else 'text',
315
+ ast.literal_eval(wts[6].src),
316
+ )
317
+
318
+
319
+ ##
320
+
321
+
289
322
  @dc.dataclass(frozen=True, kw_only=True)
290
323
  class SrcFile:
291
324
  path: str
@@ -301,6 +334,8 @@ class SrcFile:
301
334
 
302
335
  ruff_noqa: ta.AbstractSet[str] = dc.field(repr=False)
303
336
 
337
+ has_binary_resources: bool = False
338
+
304
339
 
305
340
  def make_src_file(
306
341
  path: str,
@@ -322,6 +357,8 @@ def make_src_file(
322
357
  tys: list[Typing] = []
323
358
  ctls: list[Tokens] = []
324
359
 
360
+ has_binary_resources = False
361
+
325
362
  i = 0
326
363
  while i < len(cls):
327
364
  line = cls[i]
@@ -383,6 +420,57 @@ def make_src_file(
383
420
  i += 1
384
421
  skip_block()
385
422
 
423
+ elif (rsrc := is_root_level_resources_read(line)) is not None:
424
+ rf = os.path.join(os.path.dirname(path), rsrc.resource)
425
+
426
+ if rsrc.kind == 'binary':
427
+ with open(rf, 'rb') as bf:
428
+ rb = bf.read() # noqa
429
+
430
+ ctls.append([
431
+ trt.Token(name='NAME', src=rsrc.variable),
432
+ trt.Token(name='UNIMPORTANT_WS', src=' '),
433
+ trt.Token(name='OP', src='='),
434
+ trt.Token(name='UNIMPORTANT_WS', src=' '),
435
+ trt.Token(name='NAME', src='base64'),
436
+ trt.Token(name='OP', src='.'),
437
+ trt.Token(name='NAME', src='b64decode'),
438
+ trt.Token(name='OP', src='('),
439
+ trt.Token(name='NL', src='\n'),
440
+ ])
441
+
442
+ rb64 = base64.b64encode(rb).decode('ascii')
443
+ for chunk in itertools.batched(rb64, 96):
444
+ ctls.append([
445
+ trt.Token(name='UNIMPORTANT_WS', src=' '),
446
+ trt.Token(name='STRING', src=f"'{''.join(chunk)}'"),
447
+ trt.Token(name='NL', src='\n'),
448
+ ])
449
+
450
+ ctls.append([
451
+ trt.Token(name='OP', src=')'),
452
+ trt.Token(name='NEWLINE', src='\n'),
453
+ ])
454
+
455
+ has_binary_resources = True
456
+
457
+ elif rsrc.kind == 'text':
458
+ with open(rf) as tf:
459
+ rt = tf.read() # noqa
460
+ rt = rt.replace('\\', '\\\\') # Escape backslashes
461
+ rt = rt.replace('"""', r'\"\"\"')
462
+ ctls.append([
463
+ trt.Token(name='NAME', src=rsrc.variable),
464
+ trt.Token(name='UNIMPORTANT_WS', src=' '),
465
+ trt.Token(name='OP', src='='),
466
+ trt.Token(name='UNIMPORTANT_WS', src=' '),
467
+ trt.Token(name='STRING', src=f'"""\\\n{rt}"""\n'),
468
+ trt.Token(name='NEWLINE', src=''),
469
+ ])
470
+
471
+ else:
472
+ raise ValueError(rsrc.kind)
473
+
386
474
  else:
387
475
  ctls.append(line)
388
476
 
@@ -399,6 +487,8 @@ def make_src_file(
399
487
  content_lines=ctls,
400
488
 
401
489
  ruff_noqa=set(lang.flatten(tks.join_toks(l).strip().split()[3:] for l in rnls)), # noqa
490
+
491
+ has_binary_resources=has_binary_resources,
402
492
  )
403
493
 
404
494
 
@@ -488,6 +578,8 @@ def gen_amalg(
488
578
  dct: dict = {
489
579
  ('sys', None, None): ['import sys\n'],
490
580
  }
581
+ if any(sf.has_binary_resources for sf in src_files.values()):
582
+ dct[('base64', None, None)] = ['import base64\n']
491
583
  for imp in gl_imps:
492
584
  dct.setdefault((imp.mod, imp.item, imp.as_), []).append(imp)
493
585
  for _, l in sorted(dct.items()):
omdev/interp/resolvers.py CHANGED
@@ -35,7 +35,7 @@ class InterpResolver:
35
35
  if spec.contains(si)
36
36
  ]
37
37
 
38
- slst = sorted(lst, key=lambda t: (-t[0], t[1]))
38
+ slst = sorted(lst, key=lambda t: (-t[0], t[1].version))
39
39
  if not slst:
40
40
  return None
41
41
 
omdev/scripts/interp.py CHANGED
@@ -2530,7 +2530,7 @@ class InterpResolver:
2530
2530
  if spec.contains(si)
2531
2531
  ]
2532
2532
 
2533
- slst = sorted(lst, key=lambda t: (-t[0], t[1]))
2533
+ slst = sorted(lst, key=lambda t: (-t[0], t[1].version))
2534
2534
  if not slst:
2535
2535
  return None
2536
2536
 
@@ -5748,7 +5748,7 @@ class InterpResolver:
5748
5748
  if spec.contains(si)
5749
5749
  ]
5750
5750
 
5751
- slst = sorted(lst, key=lambda t: (-t[0], t[1]))
5751
+ slst = sorted(lst, key=lambda t: (-t[0], t[1].version))
5752
5752
  if not slst:
5753
5753
  return None
5754
5754
 
omdev/tokens.py CHANGED
@@ -61,7 +61,7 @@ def join_lines(ls: ta.Iterable[Tokens]) -> str:
61
61
 
62
62
  def match_toks(
63
63
  ts: ta.Iterable['trt.Token'],
64
- pat: ta.Sequence[tuple[str | None, str | None]],
64
+ pat: ta.Sequence[tuple[str | None, str | tuple[str, ...] | None]],
65
65
  ) -> bool:
66
66
  it = iter(ts)
67
67
  for pn, ps in pat:
@@ -71,6 +71,13 @@ def match_toks(
71
71
  return False
72
72
  if pn is not None and t.name != pn:
73
73
  return False
74
- if ps is not None and t.src != ps:
75
- return False
74
+ if ps is not None:
75
+ if isinstance(ps, str):
76
+ if t.src != ps:
77
+ return False
78
+ elif isinstance(ps, tuple):
79
+ if t.src not in ps:
80
+ return False
81
+ else:
82
+ raise TypeError(ps)
76
83
  return True
omdev/tools/docker.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """
2
2
  TODO:
3
- - check for updates
3
+ - https://github.com/zeromake/docker-debug
4
4
  """
5
5
  import os
6
6
  import re
@@ -232,6 +232,19 @@ class Cli(ap.Cli):
232
232
 
233
233
  print(f'{svc_name}: {lt}')
234
234
 
235
+ @ap.command()
236
+ def dockly(self) -> None:
237
+ os.execl(
238
+ exe := docker_exe(),
239
+ exe,
240
+ 'run',
241
+ '-it',
242
+ '--rm',
243
+ '-v',
244
+ '/var/run/docker.sock:/var/run/docker.sock',
245
+ 'lirantal/dockly',
246
+ )
247
+
235
248
 
236
249
  # @omlish-manifest
237
250
  _CLI_MODULE = CliModule('docker', __name__)
omdev/tools/git.py CHANGED
@@ -1,3 +1,7 @@
1
+ """
2
+ TODO:
3
+ - https://github.com/vegardit/bash-funk/blob/main/docs/git.md
4
+ """
1
5
  import os
2
6
  import re
3
7
  import subprocess
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev145
3
+ Version: 0.0.0.dev146
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev145
15
+ Requires-Dist: omlish==0.0.0.dev146
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -1,4 +1,4 @@
1
- omdev/.manifests.json,sha256=Uq3VB0ovogq663SM_1fuRBjqbod7kE30wNxBByQI2zo,8033
1
+ omdev/.manifests.json,sha256=ln-OyFCqhvwbtxlfrQk-6s4Ilao4ufYVmQJQI_4UtT8,8033
2
2
  omdev/__about__.py,sha256=n5x-SO70OgbDQFzQ1d7sZDVMsnkQc4PxQZPFaIQFa0E,1281
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omdev/bracepy.py,sha256=I8EdqtDvxzAi3I8TuMEW-RBfwXfqKbwp06CfOdj3L1o,2743
@@ -10,11 +10,11 @@ omdev/imgur.py,sha256=il12R3t19tALolteYCZywvcdQUEOcgvPyUYgWtKiqt4,2993
10
10
  omdev/pip.py,sha256=7cZ_IOpekQvgPm_gKnX3Pr8xjqUid50PPScTlZCYVlM,2118
11
11
  omdev/revisions.py,sha256=7tRBeDECSOhYfwSxJDrMFypQjtghLu9P4P0oFT3NHdQ,5008
12
12
  omdev/secrets.py,sha256=bcquaBIDKqX4UIKOzUuKrX7nxVCenj67rRHIMIrd9bk,540
13
- omdev/tokens.py,sha256=eCppK7BtlgAK_AmfO-Or_B-x85tqmu0HVla8d2gvB3I,1333
13
+ omdev/tokens.py,sha256=zh2TCAfCbcq8ZnoVdQ824jrTiwNy3XJ_oCqlZpLpcCY,1574
14
14
  omdev/wheelfile.py,sha256=yfupGcGkbFlmzGzKU64k_vmOKpaKnUlDWxeGn2KdekU,10005
15
15
  omdev/amalg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  omdev/amalg/__main__.py,sha256=h94M-VqZ3AFBU2a8zOsjeKK7RF6uINhTHl6OiGbVMgw,163
17
- omdev/amalg/amalg.py,sha256=AEhgXmc9y3zfvMpAdJUuTwlhYZ5bCAUrVf1WHsgV5PI,16084
17
+ omdev/amalg/amalg.py,sha256=_5goY2wRrP9X4nma3MzDHTbCj7_bkfNxi98bRbd6eSQ,19240
18
18
  omdev/antlr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  omdev/antlr/consts.py,sha256=8pR6r0m0P3hAiyiAoJZ-nptd2GYbZ98mxwPL9cpaRuw,279
20
20
  omdev/antlr/gen.py,sha256=QnPyVWUrJYqHoOc3XsXA8fJdoiwAj6pyUwdG-DVrIeA,2953
@@ -75,7 +75,7 @@ omdev/interp/cli.py,sha256=sh7PZQoLletUViw1Y9OXNr9ekyNZ6YyxYuOQ_n9hyqU,2072
75
75
  omdev/interp/inspect.py,sha256=55_il4ehoW6Q468YE57w5CyZxHLNsndkRIH4W80OplM,2848
76
76
  omdev/interp/providers.py,sha256=PFEjozW0c33eqg8sno-GHMKbhVUzQF9jrAx-M0uQimk,1787
77
77
  omdev/interp/pyenv.py,sha256=rHps4saqLxp-udbZp-5RpFxNhZNQc6plqIvaCQpNBHo,13837
78
- omdev/interp/resolvers.py,sha256=tpzlmqGp1C4QKdA6TfcPmtmaygu7mb6WK2RPSbyNQ6s,3022
78
+ omdev/interp/resolvers.py,sha256=O4QTqWGL7KXiJl3JN5BlbqT52FbhycrDSRd7M_jTeRs,3030
79
79
  omdev/interp/standalone.py,sha256=XcltiL7ypcfV89C82_3knQ3Kx7aW4wnnxf2056ZXC3A,7731
80
80
  omdev/interp/system.py,sha256=bI-JhX4GVJqW7wMxnIa-DGJWnCLmFcIsnl9pc1RGY2g,3513
81
81
  omdev/interp/types.py,sha256=EMN3StEMkFoQAMUIZd7JYL4uUWqzFGY-2hTL8EBznYM,2437
@@ -120,8 +120,8 @@ omdev/scripts/bumpversion.py,sha256=Kn7fo73Hs8uJh3Hi3EIyLOlzLPWAC6dwuD_lZ3cIzuY,
120
120
  omdev/scripts/execrss.py,sha256=mR0G0wERBYtQmVIn63lCIIFb5zkCM6X_XOENDFYDBKc,651
121
121
  omdev/scripts/exectime.py,sha256=sFb376GflU6s9gNX-2-we8hgH6w5MuQNS9g6i4SqJIo,610
122
122
  omdev/scripts/importtrace.py,sha256=oa7CtcWJVMNDbyIEiRHej6ICfABfErMeo4_haIqe18Q,14041
123
- omdev/scripts/interp.py,sha256=Xzki1bTvF2uahDrK65_A-lbN29W67jE4t7v8SY__F44,74287
124
- omdev/scripts/pyproject.py,sha256=2EGOnpEQoFwWMmbeRgQ2aUhPDXkRNjJgttK5IGHK8RQ,179651
123
+ omdev/scripts/interp.py,sha256=nda-QHD-do9MVfXrDlfqdaEXdNwacil48RHd3OG0DIw,74295
124
+ omdev/scripts/pyproject.py,sha256=SW4lGBmdgoXD_2ekbeIj-LIGMqSnQoTV36eXWuvyhik,179659
125
125
  omdev/scripts/slowcat.py,sha256=lssv4yrgJHiWfOiHkUut2p8E8Tq32zB-ujXESQxFFHY,2728
126
126
  omdev/scripts/tmpexec.py,sha256=WTYcf56Tj2qjYV14AWmV8SfT0u6Y8eIU6cKgQRvEK3c,1442
127
127
  omdev/toml/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
@@ -130,8 +130,8 @@ omdev/toml/writer.py,sha256=lk3on3YXVbWuLJa-xsOzOhs1bBAT1vXqw4mBbluZl_w,3040
130
130
  omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
131
131
  omdev/tools/cloc.py,sha256=13lUsYLyn1LoelhsCeKrRkIwwPE0x54JmdhXJ_lvWh0,3811
132
132
  omdev/tools/doc.py,sha256=mv9XfitzqXl3vFHSenv01xHCxWf8g03rUAb_sqoty98,2556
133
- omdev/tools/docker.py,sha256=k2BrVvFYwyGov064CPHd_HWo9aqR1zHc2UeEsVwPth4,6827
134
- omdev/tools/git.py,sha256=bfhYUFip7zVxtsyXk8yEFbK2y2zguhvgraLhXc7A53M,6899
133
+ omdev/tools/docker.py,sha256=jRmKn2fiDy6szeC3MA-mN34EuU_Pbc_jWtnPJG6LIac,7141
134
+ omdev/tools/git.py,sha256=WJ7iEsC5UkMnsCv8jN5FAcjj8cURF_nK4pcaZQjY6NY,6976
135
135
  omdev/tools/importscan.py,sha256=nhJIhtjDY6eFVlReP7fegvv6L5ZjN-Z2VeyhsBonev4,4639
136
136
  omdev/tools/mkrelimp.py,sha256=wsJAjTIf3nqcSfnT9TkDpS1VUOoM9W2Az5tZdWuzyLM,4054
137
137
  omdev/tools/notebook.py,sha256=M8Xi_gfZdlahnyFLtp0RBgYZPSHWQStMMDYZc71Zync,3494
@@ -150,9 +150,9 @@ omdev/tools/json/rendering.py,sha256=jNShMfCpFR9-Kcn6cUFuOChXHjg71diuTC4x7Ofmz-o
150
150
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
151
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
152
152
  omdev/tools/pawk/pawk.py,sha256=Eckymn22GfychCQcQi96BFqRo_LmiJ-EPhC8TTUJdB4,11446
153
- omdev-0.0.0.dev145.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
154
- omdev-0.0.0.dev145.dist-info/METADATA,sha256=5S-8kZx2EiUTEJZcw9CXWE1y9mnu_oo4UJQ1J2cOHP4,1760
155
- omdev-0.0.0.dev145.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
156
- omdev-0.0.0.dev145.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
157
- omdev-0.0.0.dev145.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
158
- omdev-0.0.0.dev145.dist-info/RECORD,,
153
+ omdev-0.0.0.dev146.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
154
+ omdev-0.0.0.dev146.dist-info/METADATA,sha256=IOaFWNLrbiDx0sOwGaw5D3Ae874Vk2qCBZE_-B88Blo,1760
155
+ omdev-0.0.0.dev146.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
156
+ omdev-0.0.0.dev146.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
157
+ omdev-0.0.0.dev146.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
158
+ omdev-0.0.0.dev146.dist-info/RECORD,,