omdev 0.0.0.dev144__tar.gz → 0.0.0.dev146__tar.gz

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.

Files changed (167) hide show
  1. {omdev-0.0.0.dev144/omdev.egg-info → omdev-0.0.0.dev146}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/.manifests.json +2 -2
  3. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/amalg/amalg.py +92 -0
  4. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cli/main.py +1 -1
  5. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/interp/resolvers.py +1 -1
  6. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/manifests/build.py +4 -4
  7. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/precheck/manifests.py +2 -1
  8. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/scripts/interp.py +1 -1
  9. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/scripts/pyproject.py +74 -54
  10. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tokens.py +10 -3
  11. omdev-0.0.0.dev146/omdev/toml/__init__.py +1 -0
  12. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/docker.py +14 -1
  13. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/git.py +4 -0
  14. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/json/io.py +1 -1
  15. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146/omdev.egg-info}/PKG-INFO +2 -2
  16. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev.egg-info/SOURCES.txt +0 -2
  17. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev.egg-info/requires.txt +1 -1
  18. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/pyproject.toml +2 -2
  19. omdev-0.0.0.dev144/omdev/manifests/__init__.py +0 -2
  20. omdev-0.0.0.dev144/omdev/manifests/load.py +0 -165
  21. omdev-0.0.0.dev144/omdev/manifests/types.py +0 -16
  22. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/LICENSE +0 -0
  23. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/MANIFEST.in +0 -0
  24. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/README.rst +0 -0
  25. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/__about__.py +0 -0
  26. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/__init__.py +0 -0
  27. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/amalg/__init__.py +0 -0
  28. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/amalg/__main__.py +0 -0
  29. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/antlr/__init__.py +0 -0
  30. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/antlr/consts.py +0 -0
  31. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/antlr/gen.py +0 -0
  32. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/bracepy.py +0 -0
  33. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/__init__.py +0 -0
  34. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/compute/__init__.py +0 -0
  35. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/compute/cache.py +0 -0
  36. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/compute/contexts.py +0 -0
  37. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/compute/currents.py +0 -0
  38. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/compute/fns.py +0 -0
  39. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/compute/resolvers.py +0 -0
  40. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/compute/storage.py +0 -0
  41. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/compute/types.py +0 -0
  42. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/data/__init__.py +0 -0
  43. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/data/actions.py +0 -0
  44. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/data/cache.py +0 -0
  45. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/data/consts.py +0 -0
  46. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/data/defaults.py +0 -0
  47. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/data/manifests.py +0 -0
  48. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cache/data/specs.py +0 -0
  49. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/__init__.py +0 -0
  50. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_boilerplate.cc +0 -0
  51. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/LICENSE +0 -0
  52. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/__init__.py +0 -0
  53. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/build_ext.py +0 -0
  54. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  55. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  56. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/compilers/options.py +0 -0
  57. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  58. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/dir_util.py +0 -0
  59. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/errors.py +0 -0
  60. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/extension.py +0 -0
  61. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/file_util.py +0 -0
  62. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/modified.py +0 -0
  63. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/spawn.py +0 -0
  64. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/sysconfig.py +0 -0
  65. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/util.py +0 -0
  66. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/_distutils/version.py +0 -0
  67. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/build.py +0 -0
  68. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/cmake.py +0 -0
  69. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/importhook.py +0 -0
  70. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/magic.py +0 -0
  71. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cexts/scan.py +0 -0
  72. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/classdot.py +0 -0
  73. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cli/__init__.py +0 -0
  74. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cli/__main__.py +0 -0
  75. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cli/_pathhack.py +0 -0
  76. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cli/clicli.py +0 -0
  77. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cli/install.py +0 -0
  78. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cli/managers.py +0 -0
  79. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cli/types.py +0 -0
  80. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/clipboard/__init__.py +0 -0
  81. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/clipboard/clipboard.py +0 -0
  82. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/clipboard/darwin_cf.py +0 -0
  83. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/clipboard/linux_x11.py +0 -0
  84. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/cmake.py +0 -0
  85. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/findimports.py +0 -0
  86. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/git.py +0 -0
  87. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/imgur.py +0 -0
  88. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/interp/__init__.py +0 -0
  89. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/interp/__main__.py +0 -0
  90. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/interp/cli.py +0 -0
  91. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/interp/inspect.py +0 -0
  92. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/interp/providers.py +0 -0
  93. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/interp/pyenv.py +0 -0
  94. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/interp/standalone.py +0 -0
  95. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/interp/system.py +0 -0
  96. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/interp/types.py +0 -0
  97. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/magic/__init__.py +0 -0
  98. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/magic/find.py +0 -0
  99. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/magic/magic.py +0 -0
  100. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/magic/prepare.py +0 -0
  101. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/magic/styles.py +0 -0
  102. {omdev-0.0.0.dev144/omdev/pyproject → omdev-0.0.0.dev146/omdev/manifests}/__init__.py +0 -0
  103. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/mypy/__init__.py +0 -0
  104. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/mypy/debug.py +0 -0
  105. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/packaging/__init__.py +0 -0
  106. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/packaging/marshal.py +0 -0
  107. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/packaging/names.py +0 -0
  108. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/packaging/requires.py +0 -0
  109. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/packaging/specifiers.py +0 -0
  110. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/packaging/versions.py +0 -0
  111. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/pip.py +0 -0
  112. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/precheck/__init__.py +0 -0
  113. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/precheck/__main__.py +0 -0
  114. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/precheck/base.py +0 -0
  115. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/precheck/git.py +0 -0
  116. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/precheck/lite.py +0 -0
  117. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/precheck/main.py +0 -0
  118. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/precheck/scripts.py +0 -0
  119. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/ptk/__init__.py +0 -0
  120. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/ptk/apps/__init__.py +0 -0
  121. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/ptk/apps/ncdu.py +0 -0
  122. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/pycharm/__init__.py +0 -0
  123. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/pycharm/__main__.py +0 -0
  124. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/pycharm/cli.py +0 -0
  125. {omdev-0.0.0.dev144/omdev/toml → omdev-0.0.0.dev146/omdev/pyproject}/__init__.py +0 -0
  126. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/pyproject/__main__.py +0 -0
  127. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/pyproject/cexts.py +0 -0
  128. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/pyproject/cli.py +0 -0
  129. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/pyproject/configs.py +0 -0
  130. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/pyproject/pkg.py +0 -0
  131. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/pyproject/reqs.py +0 -0
  132. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/revisions.py +0 -0
  133. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/scripts/__init__.py +0 -0
  134. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/scripts/bumpversion.py +0 -0
  135. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/scripts/execrss.py +0 -0
  136. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/scripts/exectime.py +0 -0
  137. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/scripts/importtrace.py +0 -0
  138. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/scripts/slowcat.py +0 -0
  139. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/scripts/tmpexec.py +0 -0
  140. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/secrets.py +0 -0
  141. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/toml/parser.py +0 -0
  142. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/toml/writer.py +0 -0
  143. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/__init__.py +0 -0
  144. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/cloc.py +0 -0
  145. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/doc.py +0 -0
  146. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/importscan.py +0 -0
  147. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/json/__init__.py +0 -0
  148. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/json/__main__.py +0 -0
  149. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/json/cli.py +0 -0
  150. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/json/formats.py +0 -0
  151. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/json/parsing.py +0 -0
  152. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/json/processing.py +0 -0
  153. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/json/rendering.py +0 -0
  154. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/mkrelimp.py +0 -0
  155. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/notebook.py +0 -0
  156. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/pawk/__init__.py +0 -0
  157. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/pawk/__main__.py +0 -0
  158. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/pawk/pawk.py +0 -0
  159. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/pip.py +0 -0
  160. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/prof.py +0 -0
  161. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/qr.py +0 -0
  162. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/tools/sqlrepl.py +0 -0
  163. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev/wheelfile.py +0 -0
  164. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev.egg-info/dependency_links.txt +0 -0
  165. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev.egg-info/entry_points.txt +0 -0
  166. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/omdev.egg-info/top_level.txt +0 -0
  167. {omdev-0.0.0.dev144 → omdev-0.0.0.dev146}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev144
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.dev144
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"
@@ -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",
@@ -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()):
@@ -13,8 +13,8 @@ import typing as ta
13
13
 
14
14
  from omlish import check
15
15
  from omlish.lite.cached import cached_nullary
16
+ from omlish.manifests.load import ManifestLoader
16
17
 
17
- from ..manifests.load import ManifestLoader
18
18
  from .types import CliCmd
19
19
  from .types import CliFunc
20
20
  from .types import CliModule
@@ -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
 
@@ -1,3 +1,4 @@
1
+ # ruff: noqa: UP006 UP007
1
2
  """
2
3
  TODO:
3
4
  - separate build from cli
@@ -10,7 +11,6 @@ See (entry_points):
10
11
  - https://packaging.python.org/en/latest/guides/creating-and-discovering-plugins/
11
12
  - [project.entry-points.omlish-manifests] \n omdev = omdev
12
13
  """
13
- # ruff: noqa: UP006 UP007
14
14
  import argparse
15
15
  import asyncio
16
16
  import collections
@@ -31,11 +31,11 @@ from omlish.lite.cached import cached_nullary
31
31
  from omlish.lite.json import json_dumps_pretty
32
32
  from omlish.lite.logs import configure_standard_logging
33
33
  from omlish.lite.logs import log
34
+ from omlish.manifests.load import ManifestLoader
35
+ from omlish.manifests.types import Manifest
36
+ from omlish.manifests.types import ManifestOrigin
34
37
 
35
38
  from .. import magic
36
- from .load import ManifestLoader
37
- from .types import Manifest
38
- from .types import ManifestOrigin
39
39
 
40
40
 
41
41
  T = ta.TypeVar('T')
@@ -1,7 +1,8 @@
1
1
  import dataclasses as dc
2
2
  import typing as ta
3
3
 
4
- from ..manifests.load import ManifestLoader
4
+ from omlish.manifests.load import ManifestLoader
5
+
5
6
  from .base import Precheck
6
7
  from .base import PrecheckContext
7
8
 
@@ -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
 
@@ -3087,23 +3087,24 @@ TODO:
3087
3087
  @dc.dataclass(frozen=True)
3088
3088
  class ObjMarshalOptions:
3089
3089
  raw_bytes: bool = False
3090
+ nonstrict_dataclasses: bool = False
3090
3091
 
3091
3092
 
3092
3093
  class ObjMarshaler(abc.ABC):
3093
3094
  @abc.abstractmethod
3094
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3095
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3095
3096
  raise NotImplementedError
3096
3097
 
3097
3098
  @abc.abstractmethod
3098
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3099
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3099
3100
  raise NotImplementedError
3100
3101
 
3101
3102
 
3102
3103
  class NopObjMarshaler(ObjMarshaler):
3103
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3104
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3104
3105
  return o
3105
3106
 
3106
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3107
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3107
3108
  return o
3108
3109
 
3109
3110
 
@@ -3111,29 +3112,29 @@ class NopObjMarshaler(ObjMarshaler):
3111
3112
  class ProxyObjMarshaler(ObjMarshaler):
3112
3113
  m: ta.Optional[ObjMarshaler] = None
3113
3114
 
3114
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3115
- return check_not_none(self.m).marshal(o, opts)
3115
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3116
+ return check_not_none(self.m).marshal(o, ctx)
3116
3117
 
3117
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3118
- return check_not_none(self.m).unmarshal(o, opts)
3118
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3119
+ return check_not_none(self.m).unmarshal(o, ctx)
3119
3120
 
3120
3121
 
3121
3122
  @dc.dataclass(frozen=True)
3122
3123
  class CastObjMarshaler(ObjMarshaler):
3123
3124
  ty: type
3124
3125
 
3125
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3126
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3126
3127
  return o
3127
3128
 
3128
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3129
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3129
3130
  return self.ty(o)
3130
3131
 
3131
3132
 
3132
3133
  class DynamicObjMarshaler(ObjMarshaler):
3133
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3134
- return marshal_obj(o)
3134
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3135
+ return ctx.manager.marshal_obj(o, opts=ctx.options)
3135
3136
 
3136
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3137
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3137
3138
  return o
3138
3139
 
3139
3140
 
@@ -3141,10 +3142,10 @@ class DynamicObjMarshaler(ObjMarshaler):
3141
3142
  class Base64ObjMarshaler(ObjMarshaler):
3142
3143
  ty: type
3143
3144
 
3144
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3145
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3145
3146
  return base64.b64encode(o).decode('ascii')
3146
3147
 
3147
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3148
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3148
3149
  return self.ty(base64.b64decode(o))
3149
3150
 
3150
3151
 
@@ -3152,25 +3153,25 @@ class Base64ObjMarshaler(ObjMarshaler):
3152
3153
  class BytesSwitchedObjMarshaler(ObjMarshaler):
3153
3154
  m: ObjMarshaler
3154
3155
 
3155
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3156
- if opts.raw_bytes:
3156
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3157
+ if ctx.options.raw_bytes:
3157
3158
  return o
3158
- return self.m.marshal(o, opts)
3159
+ return self.m.marshal(o, ctx)
3159
3160
 
3160
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3161
- if opts.raw_bytes:
3161
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3162
+ if ctx.options.raw_bytes:
3162
3163
  return o
3163
- return self.m.unmarshal(o, opts)
3164
+ return self.m.unmarshal(o, ctx)
3164
3165
 
3165
3166
 
3166
3167
  @dc.dataclass(frozen=True)
3167
3168
  class EnumObjMarshaler(ObjMarshaler):
3168
3169
  ty: type
3169
3170
 
3170
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3171
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3171
3172
  return o.name
3172
3173
 
3173
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3174
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3174
3175
  return self.ty.__members__[o] # type: ignore
3175
3176
 
3176
3177
 
@@ -3178,15 +3179,15 @@ class EnumObjMarshaler(ObjMarshaler):
3178
3179
  class OptionalObjMarshaler(ObjMarshaler):
3179
3180
  item: ObjMarshaler
3180
3181
 
3181
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3182
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3182
3183
  if o is None:
3183
3184
  return None
3184
- return self.item.marshal(o, opts)
3185
+ return self.item.marshal(o, ctx)
3185
3186
 
3186
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3187
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3187
3188
  if o is None:
3188
3189
  return None
3189
- return self.item.unmarshal(o, opts)
3190
+ return self.item.unmarshal(o, ctx)
3190
3191
 
3191
3192
 
3192
3193
  @dc.dataclass(frozen=True)
@@ -3195,11 +3196,11 @@ class MappingObjMarshaler(ObjMarshaler):
3195
3196
  km: ObjMarshaler
3196
3197
  vm: ObjMarshaler
3197
3198
 
3198
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3199
- return {self.km.marshal(k, opts): self.vm.marshal(v, opts) for k, v in o.items()}
3199
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3200
+ return {self.km.marshal(k, ctx): self.vm.marshal(v, ctx) for k, v in o.items()}
3200
3201
 
3201
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3202
- return self.ty((self.km.unmarshal(k, opts), self.vm.unmarshal(v, opts)) for k, v in o.items())
3202
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3203
+ return self.ty((self.km.unmarshal(k, ctx), self.vm.unmarshal(v, ctx)) for k, v in o.items())
3203
3204
 
3204
3205
 
3205
3206
  @dc.dataclass(frozen=True)
@@ -3207,11 +3208,11 @@ class IterableObjMarshaler(ObjMarshaler):
3207
3208
  ty: type
3208
3209
  item: ObjMarshaler
3209
3210
 
3210
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3211
- return [self.item.marshal(e, opts) for e in o]
3211
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3212
+ return [self.item.marshal(e, ctx) for e in o]
3212
3213
 
3213
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3214
- return self.ty(self.item.unmarshal(e, opts) for e in o)
3214
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3215
+ return self.ty(self.item.unmarshal(e, ctx) for e in o)
3215
3216
 
3216
3217
 
3217
3218
  @dc.dataclass(frozen=True)
@@ -3220,11 +3221,18 @@ class DataclassObjMarshaler(ObjMarshaler):
3220
3221
  fs: ta.Mapping[str, ObjMarshaler]
3221
3222
  nonstrict: bool = False
3222
3223
 
3223
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3224
- return {k: m.marshal(getattr(o, k), opts) for k, m in self.fs.items()}
3224
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3225
+ return {
3226
+ k: m.marshal(getattr(o, k), ctx)
3227
+ for k, m in self.fs.items()
3228
+ }
3225
3229
 
3226
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3227
- return self.ty(**{k: self.fs[k].unmarshal(v, opts) for k, v in o.items() if not self.nonstrict or k in self.fs})
3230
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3231
+ return self.ty(**{
3232
+ k: self.fs[k].unmarshal(v, ctx)
3233
+ for k, v in o.items()
3234
+ if not (self.nonstrict or ctx.options.nonstrict_dataclasses) or k in self.fs
3235
+ })
3228
3236
 
3229
3237
 
3230
3238
  @dc.dataclass(frozen=True)
@@ -3244,50 +3252,50 @@ class PolymorphicObjMarshaler(ObjMarshaler):
3244
3252
  {i.tag: i for i in impls},
3245
3253
  )
3246
3254
 
3247
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3255
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3248
3256
  impl = self.impls_by_ty[type(o)]
3249
- return {impl.tag: impl.m.marshal(o, opts)}
3257
+ return {impl.tag: impl.m.marshal(o, ctx)}
3250
3258
 
3251
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3259
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3252
3260
  [(t, v)] = o.items()
3253
3261
  impl = self.impls_by_tag[t]
3254
- return impl.m.unmarshal(v, opts)
3262
+ return impl.m.unmarshal(v, ctx)
3255
3263
 
3256
3264
 
3257
3265
  @dc.dataclass(frozen=True)
3258
3266
  class DatetimeObjMarshaler(ObjMarshaler):
3259
3267
  ty: type
3260
3268
 
3261
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3269
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3262
3270
  return o.isoformat()
3263
3271
 
3264
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3272
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3265
3273
  return self.ty.fromisoformat(o) # type: ignore
3266
3274
 
3267
3275
 
3268
3276
  class DecimalObjMarshaler(ObjMarshaler):
3269
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3277
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3270
3278
  return str(check_isinstance(o, decimal.Decimal))
3271
3279
 
3272
- def unmarshal(self, v: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3280
+ def unmarshal(self, v: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3273
3281
  return decimal.Decimal(check_isinstance(v, str))
3274
3282
 
3275
3283
 
3276
3284
  class FractionObjMarshaler(ObjMarshaler):
3277
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3285
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3278
3286
  fr = check_isinstance(o, fractions.Fraction)
3279
3287
  return [fr.numerator, fr.denominator]
3280
3288
 
3281
- def unmarshal(self, v: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3289
+ def unmarshal(self, v: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3282
3290
  num, denom = check_isinstance(v, list)
3283
3291
  return fractions.Fraction(num, denom)
3284
3292
 
3285
3293
 
3286
3294
  class UuidObjMarshaler(ObjMarshaler):
3287
- def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3295
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3288
3296
  return str(o)
3289
3297
 
3290
- def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3298
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3291
3299
  return uuid.UUID(o)
3292
3300
 
3293
3301
 
@@ -3448,6 +3456,12 @@ class ObjMarshalerManager:
3448
3456
 
3449
3457
  #
3450
3458
 
3459
+ def _make_context(self, opts: ta.Optional[ObjMarshalOptions]) -> 'ObjMarshalContext':
3460
+ return ObjMarshalContext(
3461
+ options=opts or self._default_options,
3462
+ manager=self,
3463
+ )
3464
+
3451
3465
  def marshal_obj(
3452
3466
  self,
3453
3467
  o: ta.Any,
@@ -3455,7 +3469,7 @@ class ObjMarshalerManager:
3455
3469
  opts: ta.Optional[ObjMarshalOptions] = None,
3456
3470
  ) -> ta.Any:
3457
3471
  m = self.get_obj_marshaler(ty if ty is not None else type(o))
3458
- return m.marshal(o, opts or self._default_options)
3472
+ return m.marshal(o, self._make_context(opts))
3459
3473
 
3460
3474
  def unmarshal_obj(
3461
3475
  self,
@@ -3464,7 +3478,7 @@ class ObjMarshalerManager:
3464
3478
  opts: ta.Optional[ObjMarshalOptions] = None,
3465
3479
  ) -> T:
3466
3480
  m = self.get_obj_marshaler(ty)
3467
- return m.unmarshal(o, opts or self._default_options)
3481
+ return m.unmarshal(o, self._make_context(opts))
3468
3482
 
3469
3483
  def roundtrip_obj(
3470
3484
  self,
@@ -3479,6 +3493,12 @@ class ObjMarshalerManager:
3479
3493
  return u
3480
3494
 
3481
3495
 
3496
+ @dc.dataclass(frozen=True)
3497
+ class ObjMarshalContext:
3498
+ options: ObjMarshalOptions
3499
+ manager: ObjMarshalerManager
3500
+
3501
+
3482
3502
  ##
3483
3503
 
3484
3504
 
@@ -5728,7 +5748,7 @@ class InterpResolver:
5728
5748
  if spec.contains(si)
5729
5749
  ]
5730
5750
 
5731
- slst = sorted(lst, key=lambda t: (-t[0], t[1]))
5751
+ slst = sorted(lst, key=lambda t: (-t[0], t[1].version))
5732
5752
  if not slst:
5733
5753
  return None
5734
5754
 
@@ -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
@@ -0,0 +1 @@
1
+ # @omlish-lite
@@ -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__)
@@ -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
@@ -53,7 +53,7 @@
53
53
  #
54
54
  #
55
55
  # @dc.dataclass(frozen=True)
56
- # class FdIo(Input, Output):
56
+ # class Fdio(Input, Output):
57
57
  # fd: int
58
58
  #
59
59
  # default_read_sz: int = DEFAULT_READ_SZ
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev144
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.dev144
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"
@@ -96,8 +96,6 @@ omdev/magic/prepare.py
96
96
  omdev/magic/styles.py
97
97
  omdev/manifests/__init__.py
98
98
  omdev/manifests/build.py
99
- omdev/manifests/load.py
100
- omdev/manifests/types.py
101
99
  omdev/mypy/__init__.py
102
100
  omdev/mypy/debug.py
103
101
  omdev/packaging/__init__.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev144
1
+ omlish==0.0.0.dev146
2
2
 
3
3
  [all]
4
4
  black~=24.10