omdev 0.0.0.dev102__tar.gz → 0.0.0.dev104__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 (150) hide show
  1. {omdev-0.0.0.dev102/omdev.egg-info → omdev-0.0.0.dev104}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/.manifests.json +2 -2
  3. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/ptk/apps/ncdu.py +4 -6
  4. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/scripts/execrss.py +11 -1
  5. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/scripts/exectime.py +11 -1
  6. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/scripts/interp.py +24 -2
  7. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/scripts/pyproject.py +93 -30
  8. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/git.py +36 -32
  9. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104/omdev.egg-info}/PKG-INFO +2 -2
  10. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev.egg-info/requires.txt +1 -1
  11. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/pyproject.toml +2 -2
  12. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/LICENSE +0 -0
  13. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/MANIFEST.in +0 -0
  14. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/README.rst +0 -0
  15. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/__about__.py +0 -0
  16. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/__init__.py +0 -0
  17. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/amalg/__init__.py +0 -0
  18. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/amalg/__main__.py +0 -0
  19. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/amalg/amalg.py +0 -0
  20. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/antlr/__init__.py +0 -0
  21. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/antlr/_antlr/__init__.py +0 -0
  22. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/antlr/consts.py +0 -0
  23. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/antlr/gen.py +0 -0
  24. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/bracepy.py +0 -0
  25. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/__init__.py +0 -0
  26. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/compute/__init__.py +0 -0
  27. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/compute/cache.py +0 -0
  28. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/compute/contexts.py +0 -0
  29. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/compute/currents.py +0 -0
  30. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/compute/fns.py +0 -0
  31. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/compute/resolvers.py +0 -0
  32. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/compute/storage.py +0 -0
  33. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/compute/types.py +0 -0
  34. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/data/__init__.py +0 -0
  35. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/data/actions.py +0 -0
  36. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/data/cache.py +0 -0
  37. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/data/consts.py +0 -0
  38. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/data/defaults.py +0 -0
  39. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/data/manifests.py +0 -0
  40. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cache/data/specs.py +0 -0
  41. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/__init__.py +0 -0
  42. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_boilerplate.cc +0 -0
  43. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/LICENSE +0 -0
  44. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/__init__.py +0 -0
  45. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/build_ext.py +0 -0
  46. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  47. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  48. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/compilers/options.py +0 -0
  49. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  50. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/dir_util.py +0 -0
  51. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/errors.py +0 -0
  52. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/extension.py +0 -0
  53. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/file_util.py +0 -0
  54. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/modified.py +0 -0
  55. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/spawn.py +0 -0
  56. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/sysconfig.py +0 -0
  57. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/util.py +0 -0
  58. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/_distutils/version.py +0 -0
  59. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/build.py +0 -0
  60. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/cmake.py +0 -0
  61. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/importhook.py +0 -0
  62. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/magic.py +0 -0
  63. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cexts/scan.py +0 -0
  64. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/classdot.py +0 -0
  65. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cli/__init__.py +0 -0
  66. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cli/__main__.py +0 -0
  67. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cli/_pathhack.py +0 -0
  68. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cli/clicli.py +0 -0
  69. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cli/install.py +0 -0
  70. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cli/main.py +0 -0
  71. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cli/managers.py +0 -0
  72. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cli/types.py +0 -0
  73. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/clipboard/__init__.py +0 -0
  74. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/clipboard/clipboard.py +0 -0
  75. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/clipboard/darwin.py +0 -0
  76. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/cmake.py +0 -0
  77. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/findimports.py +0 -0
  78. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/git.py +0 -0
  79. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/imgur.py +0 -0
  80. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/interp/__init__.py +0 -0
  81. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/interp/__main__.py +0 -0
  82. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/interp/cli.py +0 -0
  83. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/interp/inspect.py +0 -0
  84. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/interp/providers.py +0 -0
  85. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/interp/pyenv.py +0 -0
  86. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/interp/resolvers.py +0 -0
  87. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/interp/standalone.py +0 -0
  88. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/interp/system.py +0 -0
  89. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/interp/types.py +0 -0
  90. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/magic/__init__.py +0 -0
  91. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/magic/find.py +0 -0
  92. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/magic/magic.py +0 -0
  93. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/magic/prepare.py +0 -0
  94. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/magic/styles.py +0 -0
  95. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/manifests/__init__.py +0 -0
  96. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/manifests/build.py +0 -0
  97. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/manifests/load.py +0 -0
  98. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/manifests/types.py +0 -0
  99. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/mypy/__init__.py +0 -0
  100. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/mypy/debug.py +0 -0
  101. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/packaging/__init__.py +0 -0
  102. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/packaging/names.py +0 -0
  103. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/packaging/requires.py +0 -0
  104. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/packaging/specifiers.py +0 -0
  105. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/packaging/versions.py +0 -0
  106. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/precheck/__init__.py +0 -0
  107. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/precheck/__main__.py +0 -0
  108. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/precheck/base.py +0 -0
  109. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/precheck/git.py +0 -0
  110. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/precheck/lite.py +0 -0
  111. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/precheck/main.py +0 -0
  112. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/precheck/manifests.py +0 -0
  113. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/precheck/scripts.py +0 -0
  114. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/ptk/__init__.py +0 -0
  115. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/ptk/apps/__init__.py +0 -0
  116. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/pyproject/__init__.py +0 -0
  117. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/pyproject/__main__.py +0 -0
  118. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/pyproject/cexts.py +0 -0
  119. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/pyproject/cli.py +0 -0
  120. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/pyproject/configs.py +0 -0
  121. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/pyproject/pkg.py +0 -0
  122. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/pyproject/reqs.py +0 -0
  123. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/revisions.py +0 -0
  124. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/scripts/__init__.py +0 -0
  125. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/scripts/bumpversion.py +0 -0
  126. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/scripts/importtrace.py +0 -0
  127. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/scripts/slowcat.py +0 -0
  128. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/secrets.py +0 -0
  129. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tokens.py +0 -0
  130. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/toml/__init__.py +0 -0
  131. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/toml/parser.py +0 -0
  132. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/toml/writer.py +0 -0
  133. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/__init__.py +0 -0
  134. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/doc.py +0 -0
  135. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/docker.py +0 -0
  136. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/importscan.py +0 -0
  137. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/mkrelimp.py +0 -0
  138. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/notebook.py +0 -0
  139. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/pawk/__init__.py +0 -0
  140. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/pawk/__main__.py +0 -0
  141. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/pawk/pawk.py +0 -0
  142. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/pip.py +0 -0
  143. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/prof.py +0 -0
  144. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/tools/sqlrepl.py +0 -0
  145. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev/wheelfile.py +0 -0
  146. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev.egg-info/SOURCES.txt +0 -0
  147. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev.egg-info/dependency_links.txt +0 -0
  148. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev.egg-info/entry_points.txt +0 -0
  149. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/omdev.egg-info/top_level.txt +0 -0
  150. {omdev-0.0.0.dev102 → omdev-0.0.0.dev104}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev102
3
+ Version: 0.0.0.dev104
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.dev102
15
+ Requires-Dist: omlish==0.0.0.dev104
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -123,7 +123,7 @@
123
123
  "module": ".ptk.apps.ncdu",
124
124
  "attr": "_CLI_MODULE",
125
125
  "file": "omdev/ptk/apps/ncdu.py",
126
- "line": 157,
126
+ "line": 155,
127
127
  "value": {
128
128
  "$.cli.types.CliModule": {
129
129
  "cmd_name": "ptk/ncdu",
@@ -219,7 +219,7 @@
219
219
  "module": ".tools.git",
220
220
  "attr": "_CLI_MODULE",
221
221
  "file": "omdev/tools/git.py",
222
- "line": 124,
222
+ "line": 128,
223
223
  "value": {
224
224
  "$.cli.types.CliModule": {
225
225
  "cmd_name": "git",
@@ -69,12 +69,10 @@ class NcduApp:
69
69
 
70
70
  self._kb = ptk.KeyBindings()
71
71
  self._kb.add('q')(self.exit_app)
72
- for k in ['up', 'p']:
73
- self._kb.add(k)(self.move_up)
74
- for k in ['down', 'n']:
75
- self._kb.add(k)(self.move_down)
76
- self._kb.add('enter')(self.enter_directory)
77
- self._kb.add('backspace')(self.go_back)
72
+ self._kb.add('up', 'p')(self.move_up)
73
+ self._kb.add('down', 'n')(self.move_down)
74
+ self._kb.add('right', 'enter')(self.enter_directory)
75
+ self._kb.add('left', 'backspace')(self.go_back)
78
76
 
79
77
  self._layout = ptk.Layout(ptk.Frame(self._text_area))
80
78
 
@@ -16,7 +16,17 @@ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
16
16
 
17
17
 
18
18
  def _main() -> None:
19
- [src] = sys.argv[1:]
19
+ if len(sys.argv) == 2:
20
+ pre = None
21
+ [src] = sys.argv[1:]
22
+ elif len(sys.argv) == 3:
23
+ [pre, src] = sys.argv[1:]
24
+ else:
25
+ raise Exception('Invalid arguments')
26
+
27
+ if pre:
28
+ exec(pre)
29
+
20
30
  start = _get_rss()
21
31
  exec(src)
22
32
  end = _get_rss()
@@ -12,7 +12,17 @@ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
12
12
 
13
13
 
14
14
  def _main() -> None:
15
- [src] = sys.argv[1:]
15
+ if len(sys.argv) == 2:
16
+ pre = None
17
+ [src] = sys.argv[1:]
18
+ elif len(sys.argv) == 3:
19
+ [pre, src] = sys.argv[1:]
20
+ else:
21
+ raise Exception('Invalid arguments')
22
+
23
+ if pre:
24
+ exec(pre)
25
+
16
26
  co = compile(src, '<string>', 'exec')
17
27
  start = time.time_ns()
18
28
  exec(co)
@@ -51,7 +51,7 @@ VersionCmpLocalType = ta.Union['NegativeInfinityVersionType', _VersionCmpLocalTy
51
51
  VersionCmpKey = ta.Tuple[int, ta.Tuple[int, ...], VersionCmpPrePostDevType, VersionCmpPrePostDevType, VersionCmpPrePostDevType, VersionCmpLocalType] # noqa
52
52
  VersionComparisonMethod = ta.Callable[[VersionCmpKey, VersionCmpKey], bool]
53
53
 
54
- # ../../../omlish/lite/check.py
54
+ # ../../../omlish/lite/cached.py
55
55
  T = ta.TypeVar('T')
56
56
 
57
57
  # ../../packaging/specifiers.py
@@ -471,7 +471,7 @@ def canonicalize_version(
471
471
  # ../../../omlish/lite/cached.py
472
472
 
473
473
 
474
- class cached_nullary: # noqa
474
+ class _cached_nullary: # noqa
475
475
  def __init__(self, fn):
476
476
  super().__init__()
477
477
  self._fn = fn
@@ -488,6 +488,10 @@ class cached_nullary: # noqa
488
488
  return bound
489
489
 
490
490
 
491
+ def cached_nullary(fn: ta.Callable[..., T]) -> ta.Callable[..., T]:
492
+ return _cached_nullary(fn)
493
+
494
+
491
495
  ########################################
492
496
  # ../../../omlish/lite/check.py
493
497
 
@@ -1692,6 +1696,24 @@ def subprocess_try_output_str(*args: str, **kwargs: ta.Any) -> ta.Optional[str]:
1692
1696
  return out.decode().strip() if out is not None else None
1693
1697
 
1694
1698
 
1699
+ ##
1700
+
1701
+
1702
+ def subprocess_close(
1703
+ proc: subprocess.Popen,
1704
+ timeout: ta.Optional[float] = None,
1705
+ ) -> None:
1706
+ # TODO: terminate, sleep, kill
1707
+ if proc.stdout:
1708
+ proc.stdout.close()
1709
+ if proc.stderr:
1710
+ proc.stderr.close()
1711
+ if proc.stdin:
1712
+ proc.stdin.close()
1713
+
1714
+ proc.wait(timeout)
1715
+
1716
+
1695
1717
  ########################################
1696
1718
  # ../inspect.py
1697
1719
 
@@ -90,7 +90,7 @@ TomlParseFloat = ta.Callable[[str], ta.Any]
90
90
  TomlKey = ta.Tuple[str, ...]
91
91
  TomlPos = int # ta.TypeAlias
92
92
 
93
- # ../../../omlish/lite/check.py
93
+ # ../../../omlish/lite/cached.py
94
94
  T = ta.TypeVar('T')
95
95
 
96
96
  # ../../packaging/specifiers.py
@@ -1862,7 +1862,7 @@ class WheelFile(zipfile.ZipFile):
1862
1862
  # ../../../omlish/lite/cached.py
1863
1863
 
1864
1864
 
1865
- class cached_nullary: # noqa
1865
+ class _cached_nullary: # noqa
1866
1866
  def __init__(self, fn):
1867
1867
  super().__init__()
1868
1868
  self._fn = fn
@@ -1879,6 +1879,10 @@ class cached_nullary: # noqa
1879
1879
  return bound
1880
1880
 
1881
1881
 
1882
+ def cached_nullary(fn: ta.Callable[..., T]) -> ta.Callable[..., T]:
1883
+ return _cached_nullary(fn)
1884
+
1885
+
1882
1886
  ########################################
1883
1887
  # ../../../omlish/lite/check.py
1884
1888
 
@@ -3235,7 +3239,7 @@ class DataclassObjMarshaler(ObjMarshaler):
3235
3239
  return {k: m.marshal(getattr(o, k)) for k, m in self.fs.items()}
3236
3240
 
3237
3241
  def unmarshal(self, o: ta.Any) -> ta.Any:
3238
- return self.ty(**{k: self.fs[k].unmarshal(v) for k, v in o.items() if self.nonstrict or k in self.fs})
3242
+ return self.ty(**{k: self.fs[k].unmarshal(v) for k, v in o.items() if not self.nonstrict or k in self.fs})
3239
3243
 
3240
3244
 
3241
3245
  @dc.dataclass(frozen=True)
@@ -3295,7 +3299,10 @@ class UuidObjMarshaler(ObjMarshaler):
3295
3299
  return uuid.UUID(o)
3296
3300
 
3297
3301
 
3298
- _OBJ_MARSHALERS: ta.Dict[ta.Any, ObjMarshaler] = {
3302
+ ##
3303
+
3304
+
3305
+ _DEFAULT_OBJ_MARSHALERS: ta.Dict[ta.Any, ObjMarshaler] = {
3299
3306
  **{t: NopObjMarshaler() for t in (type(None),)},
3300
3307
  **{t: CastObjMarshaler(t) for t in (int, float, str, bool)},
3301
3308
  **{t: Base64ObjMarshaler(t) for t in (bytes, bytearray)},
@@ -3324,20 +3331,19 @@ _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES: ta.Dict[ta.Any, type] = {
3324
3331
  }
3325
3332
 
3326
3333
 
3327
- def register_opj_marshaler(ty: ta.Any, m: ObjMarshaler) -> None:
3328
- if ty in _OBJ_MARSHALERS:
3329
- raise KeyError(ty)
3330
- _OBJ_MARSHALERS[ty] = m
3331
-
3332
-
3333
- def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
3334
+ def _make_obj_marshaler(
3335
+ ty: ta.Any,
3336
+ rec: ta.Callable[[ta.Any], ObjMarshaler],
3337
+ *,
3338
+ nonstrict_dataclasses: bool = False,
3339
+ ) -> ObjMarshaler:
3334
3340
  if isinstance(ty, type):
3335
3341
  if abc.ABC in ty.__bases__:
3336
3342
  impls = [ # type: ignore
3337
3343
  PolymorphicObjMarshaler.Impl(
3338
3344
  ity,
3339
3345
  ity.__qualname__,
3340
- get_obj_marshaler(ity),
3346
+ rec(ity),
3341
3347
  )
3342
3348
  for ity in deep_subclasses(ty)
3343
3349
  if abc.ABC not in ity.__bases__
@@ -3353,7 +3359,8 @@ def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
3353
3359
  if dc.is_dataclass(ty):
3354
3360
  return DataclassObjMarshaler(
3355
3361
  ty,
3356
- {f.name: get_obj_marshaler(f.type) for f in dc.fields(ty)},
3362
+ {f.name: rec(f.type) for f in dc.fields(ty)},
3363
+ nonstrict=nonstrict_dataclasses,
3357
3364
  )
3358
3365
 
3359
3366
  if is_generic_alias(ty):
@@ -3363,7 +3370,7 @@ def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
3363
3370
  pass
3364
3371
  else:
3365
3372
  k, v = ta.get_args(ty)
3366
- return MappingObjMarshaler(mt, get_obj_marshaler(k), get_obj_marshaler(v))
3373
+ return MappingObjMarshaler(mt, rec(k), rec(v))
3367
3374
 
3368
3375
  try:
3369
3376
  st = _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES[ta.get_origin(ty)]
@@ -3371,33 +3378,71 @@ def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
3371
3378
  pass
3372
3379
  else:
3373
3380
  [e] = ta.get_args(ty)
3374
- return IterableObjMarshaler(st, get_obj_marshaler(e))
3381
+ return IterableObjMarshaler(st, rec(e))
3375
3382
 
3376
3383
  if is_union_alias(ty):
3377
- return OptionalObjMarshaler(get_obj_marshaler(get_optional_alias_arg(ty)))
3384
+ return OptionalObjMarshaler(rec(get_optional_alias_arg(ty)))
3378
3385
 
3379
3386
  raise TypeError(ty)
3380
3387
 
3381
3388
 
3382
- def get_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
3383
- try:
3384
- return _OBJ_MARSHALERS[ty]
3385
- except KeyError:
3386
- pass
3389
+ ##
3387
3390
 
3388
- p = ProxyObjMarshaler()
3389
- _OBJ_MARSHALERS[ty] = p
3390
- try:
3391
- m = _make_obj_marshaler(ty)
3392
- except Exception:
3393
- del _OBJ_MARSHALERS[ty]
3394
- raise
3395
- else:
3396
- p.m = m
3391
+
3392
+ _OBJ_MARSHALERS_LOCK = threading.RLock()
3393
+
3394
+ _OBJ_MARSHALERS: ta.Dict[ta.Any, ObjMarshaler] = dict(_DEFAULT_OBJ_MARSHALERS)
3395
+
3396
+ _OBJ_MARSHALER_PROXIES: ta.Dict[ta.Any, ProxyObjMarshaler] = {}
3397
+
3398
+
3399
+ def register_opj_marshaler(ty: ta.Any, m: ObjMarshaler) -> None:
3400
+ with _OBJ_MARSHALERS_LOCK:
3401
+ if ty in _OBJ_MARSHALERS:
3402
+ raise KeyError(ty)
3397
3403
  _OBJ_MARSHALERS[ty] = m
3404
+
3405
+
3406
+ def get_obj_marshaler(
3407
+ ty: ta.Any,
3408
+ *,
3409
+ no_cache: bool = False,
3410
+ **kwargs: ta.Any,
3411
+ ) -> ObjMarshaler:
3412
+ with _OBJ_MARSHALERS_LOCK:
3413
+ if not no_cache:
3414
+ try:
3415
+ return _OBJ_MARSHALERS[ty]
3416
+ except KeyError:
3417
+ pass
3418
+
3419
+ try:
3420
+ return _OBJ_MARSHALER_PROXIES[ty]
3421
+ except KeyError:
3422
+ pass
3423
+
3424
+ rec = functools.partial(
3425
+ get_obj_marshaler,
3426
+ no_cache=no_cache,
3427
+ **kwargs,
3428
+ )
3429
+
3430
+ p = ProxyObjMarshaler()
3431
+ _OBJ_MARSHALER_PROXIES[ty] = p
3432
+ try:
3433
+ m = _make_obj_marshaler(ty, rec, **kwargs)
3434
+ finally:
3435
+ del _OBJ_MARSHALER_PROXIES[ty]
3436
+ p.m = m
3437
+
3438
+ if not no_cache:
3439
+ _OBJ_MARSHALERS[ty] = m
3398
3440
  return m
3399
3441
 
3400
3442
 
3443
+ ##
3444
+
3445
+
3401
3446
  def marshal_obj(o: ta.Any, ty: ta.Any = None) -> ta.Any:
3402
3447
  return get_obj_marshaler(ty if ty is not None else type(o)).marshal(o)
3403
3448
 
@@ -3916,6 +3961,24 @@ def subprocess_try_output_str(*args: str, **kwargs: ta.Any) -> ta.Optional[str]:
3916
3961
  return out.decode().strip() if out is not None else None
3917
3962
 
3918
3963
 
3964
+ ##
3965
+
3966
+
3967
+ def subprocess_close(
3968
+ proc: subprocess.Popen,
3969
+ timeout: ta.Optional[float] = None,
3970
+ ) -> None:
3971
+ # TODO: terminate, sleep, kill
3972
+ if proc.stdout:
3973
+ proc.stdout.close()
3974
+ if proc.stderr:
3975
+ proc.stderr.close()
3976
+ if proc.stdin:
3977
+ proc.stdin.close()
3978
+
3979
+ proc.wait(timeout)
3980
+
3981
+
3919
3982
  ########################################
3920
3983
  # ../../interp/inspect.py
3921
3984
 
@@ -61,38 +61,42 @@ class Cli(ap.Cli):
61
61
  accepts_unknown=True,
62
62
  )
63
63
  def clone(self) -> None:
64
- out_dir: str
65
-
66
- if (m := self._GITHUB_PAT.fullmatch(self.args.repo)):
67
- user = m.group('user')
68
- repo = m.group('repo')
69
-
70
- os.makedirs(user, 0o755, exist_ok=True)
71
-
72
- subprocess.check_call([
73
- 'git',
74
- 'clone',
75
- *self.unknown_args,
76
- *self.args.args,
77
- f'https://github.com/{user}/{repo}.git',
78
- os.path.join(user, repo),
79
- ])
80
-
81
- out_dir = os.path.join(user, repo)
82
-
83
- else:
84
- parsed = urllib.parse.urlparse(self.args.repo)
85
- out_dir = parsed.path.split('/')[-1]
86
-
87
- subprocess.check_call([
88
- 'git',
89
- 'clone',
90
- *self.unknown_args,
91
- *self.args.args,
92
- self.args.repo,
93
- ])
94
-
95
- print(out_dir)
64
+ # And expected usage is `cd $(om git clone foo/bar)` and an empty cd arg will return to the previous directory,
65
+ # so always output at least a . so it'll cd to the current dir at least lol - it still runs even if the proc
66
+ # fails.
67
+ out_dir = '.'
68
+ try:
69
+ if (m := self._GITHUB_PAT.fullmatch(self.args.repo)):
70
+ user = m.group('user')
71
+ repo = m.group('repo')
72
+
73
+ os.makedirs(user, 0o755, exist_ok=True)
74
+
75
+ subprocess.check_call([
76
+ 'git',
77
+ 'clone',
78
+ *self.unknown_args,
79
+ *self.args.args,
80
+ f'https://github.com/{user}/{repo}.git',
81
+ os.path.join(user, repo),
82
+ ])
83
+
84
+ out_dir = os.path.join(user, repo)
85
+
86
+ else:
87
+ parsed = urllib.parse.urlparse(self.args.repo)
88
+ out_dir = parsed.path.split('/')[-1]
89
+
90
+ subprocess.check_call([
91
+ 'git',
92
+ 'clone',
93
+ *self.unknown_args,
94
+ *self.args.args,
95
+ self.args.repo,
96
+ ])
97
+
98
+ finally:
99
+ print(out_dir)
96
100
 
97
101
  @ap.command(
98
102
  ap.arg('rev', nargs='?', default='HEAD'),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev102
3
+ Version: 0.0.0.dev104
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.dev102
15
+ Requires-Dist: omlish==0.0.0.dev104
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
- omlish==0.0.0.dev102
1
+ omlish==0.0.0.dev104
2
2
 
3
3
  [all]
4
4
  black~=24.10
@@ -12,7 +12,7 @@ authors = [
12
12
  urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = {text = 'BSD-3-Clause'}
14
14
  requires-python = '>=3.12'
15
- version = '0.0.0.dev102'
15
+ version = '0.0.0.dev104'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
@@ -22,7 +22,7 @@ classifiers = [
22
22
  ]
23
23
  description = 'omdev'
24
24
  dependencies = [
25
- 'omlish == 0.0.0.dev102',
25
+ 'omlish == 0.0.0.dev104',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
File without changes
File without changes
File without changes
File without changes
File without changes