omdev 0.0.0.dev141__tar.gz → 0.0.0.dev143__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 (166) hide show
  1. {omdev-0.0.0.dev141/omdev.egg-info → omdev-0.0.0.dev143}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/.manifests.json +15 -15
  3. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/amalg/amalg.py +15 -4
  4. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/interp/pyenv.py +1 -0
  5. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/scripts/interp.py +14 -0
  6. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/scripts/pyproject.py +215 -129
  7. {omdev-0.0.0.dev141/omdev → omdev-0.0.0.dev143/omdev/tools}/json/__main__.py +1 -1
  8. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143/omdev.egg-info}/PKG-INFO +2 -2
  9. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev.egg-info/SOURCES.txt +8 -8
  10. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev.egg-info/requires.txt +1 -1
  11. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/pyproject.toml +2 -2
  12. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/LICENSE +0 -0
  13. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/MANIFEST.in +0 -0
  14. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/README.rst +0 -0
  15. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/__about__.py +0 -0
  16. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/__init__.py +0 -0
  17. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/amalg/__init__.py +0 -0
  18. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/amalg/__main__.py +0 -0
  19. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/antlr/__init__.py +0 -0
  20. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/antlr/consts.py +0 -0
  21. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/antlr/gen.py +0 -0
  22. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/bracepy.py +0 -0
  23. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/__init__.py +0 -0
  24. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/compute/__init__.py +0 -0
  25. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/compute/cache.py +0 -0
  26. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/compute/contexts.py +0 -0
  27. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/compute/currents.py +0 -0
  28. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/compute/fns.py +0 -0
  29. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/compute/resolvers.py +0 -0
  30. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/compute/storage.py +0 -0
  31. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/compute/types.py +0 -0
  32. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/data/__init__.py +0 -0
  33. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/data/actions.py +0 -0
  34. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/data/cache.py +0 -0
  35. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/data/consts.py +0 -0
  36. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/data/defaults.py +0 -0
  37. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/data/manifests.py +0 -0
  38. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cache/data/specs.py +0 -0
  39. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/__init__.py +0 -0
  40. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_boilerplate.cc +0 -0
  41. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/LICENSE +0 -0
  42. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/__init__.py +0 -0
  43. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/build_ext.py +0 -0
  44. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  45. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  46. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/compilers/options.py +0 -0
  47. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  48. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/dir_util.py +0 -0
  49. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/errors.py +0 -0
  50. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/extension.py +0 -0
  51. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/file_util.py +0 -0
  52. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/modified.py +0 -0
  53. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/spawn.py +0 -0
  54. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/sysconfig.py +0 -0
  55. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/util.py +0 -0
  56. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/_distutils/version.py +0 -0
  57. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/build.py +0 -0
  58. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/cmake.py +0 -0
  59. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/importhook.py +0 -0
  60. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/magic.py +0 -0
  61. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cexts/scan.py +0 -0
  62. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/classdot.py +0 -0
  63. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cli/__init__.py +0 -0
  64. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cli/__main__.py +0 -0
  65. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cli/_pathhack.py +0 -0
  66. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cli/clicli.py +0 -0
  67. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cli/install.py +0 -0
  68. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cli/main.py +0 -0
  69. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cli/managers.py +0 -0
  70. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cli/types.py +0 -0
  71. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/clipboard/__init__.py +0 -0
  72. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/clipboard/clipboard.py +0 -0
  73. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/clipboard/darwin_cf.py +0 -0
  74. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/clipboard/linux_x11.py +0 -0
  75. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/cmake.py +0 -0
  76. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/findimports.py +0 -0
  77. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/git.py +0 -0
  78. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/imgur.py +0 -0
  79. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/interp/__init__.py +0 -0
  80. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/interp/__main__.py +0 -0
  81. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/interp/cli.py +0 -0
  82. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/interp/inspect.py +0 -0
  83. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/interp/providers.py +0 -0
  84. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/interp/resolvers.py +0 -0
  85. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/interp/standalone.py +0 -0
  86. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/interp/system.py +0 -0
  87. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/interp/types.py +0 -0
  88. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/magic/__init__.py +0 -0
  89. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/magic/find.py +0 -0
  90. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/magic/magic.py +0 -0
  91. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/magic/prepare.py +0 -0
  92. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/magic/styles.py +0 -0
  93. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/manifests/__init__.py +0 -0
  94. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/manifests/build.py +0 -0
  95. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/manifests/load.py +0 -0
  96. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/manifests/types.py +0 -0
  97. {omdev-0.0.0.dev141/omdev/json → omdev-0.0.0.dev143/omdev/mypy}/__init__.py +0 -0
  98. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/mypy/debug.py +0 -0
  99. {omdev-0.0.0.dev141/omdev/mypy → omdev-0.0.0.dev143/omdev/packaging}/__init__.py +0 -0
  100. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/packaging/marshal.py +0 -0
  101. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/packaging/names.py +0 -0
  102. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/packaging/requires.py +0 -0
  103. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/packaging/specifiers.py +0 -0
  104. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/packaging/versions.py +0 -0
  105. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/pip.py +0 -0
  106. {omdev-0.0.0.dev141/omdev/packaging → omdev-0.0.0.dev143/omdev/precheck}/__init__.py +0 -0
  107. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/precheck/__main__.py +0 -0
  108. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/precheck/base.py +0 -0
  109. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/precheck/git.py +0 -0
  110. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/precheck/lite.py +0 -0
  111. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/precheck/main.py +0 -0
  112. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/precheck/manifests.py +0 -0
  113. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/precheck/scripts.py +0 -0
  114. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/ptk/__init__.py +0 -0
  115. {omdev-0.0.0.dev141/omdev/precheck → omdev-0.0.0.dev143/omdev/ptk/apps}/__init__.py +0 -0
  116. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/ptk/apps/ncdu.py +0 -0
  117. {omdev-0.0.0.dev141/omdev/ptk/apps → omdev-0.0.0.dev143/omdev/pycharm}/__init__.py +0 -0
  118. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/pycharm/__main__.py +0 -0
  119. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/pycharm/cli.py +0 -0
  120. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/pyproject/__init__.py +0 -0
  121. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/pyproject/__main__.py +0 -0
  122. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/pyproject/cexts.py +0 -0
  123. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/pyproject/cli.py +0 -0
  124. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/pyproject/configs.py +0 -0
  125. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/pyproject/pkg.py +0 -0
  126. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/pyproject/reqs.py +0 -0
  127. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/revisions.py +0 -0
  128. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/scripts/__init__.py +0 -0
  129. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/scripts/bumpversion.py +0 -0
  130. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/scripts/execrss.py +0 -0
  131. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/scripts/exectime.py +0 -0
  132. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/scripts/importtrace.py +0 -0
  133. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/scripts/slowcat.py +0 -0
  134. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/scripts/tmpexec.py +0 -0
  135. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/secrets.py +0 -0
  136. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tokens.py +0 -0
  137. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/toml/__init__.py +0 -0
  138. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/toml/parser.py +0 -0
  139. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/toml/writer.py +0 -0
  140. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/__init__.py +0 -0
  141. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/cloc.py +0 -0
  142. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/doc.py +0 -0
  143. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/docker.py +0 -0
  144. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/git.py +0 -0
  145. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/importscan.py +0 -0
  146. {omdev-0.0.0.dev141/omdev/pycharm → omdev-0.0.0.dev143/omdev/tools/json}/__init__.py +0 -0
  147. {omdev-0.0.0.dev141/omdev → omdev-0.0.0.dev143/omdev/tools}/json/cli.py +0 -0
  148. {omdev-0.0.0.dev141/omdev → omdev-0.0.0.dev143/omdev/tools}/json/formats.py +0 -0
  149. {omdev-0.0.0.dev141/omdev → omdev-0.0.0.dev143/omdev/tools}/json/io.py +0 -0
  150. {omdev-0.0.0.dev141/omdev → omdev-0.0.0.dev143/omdev/tools}/json/parsing.py +0 -0
  151. {omdev-0.0.0.dev141/omdev → omdev-0.0.0.dev143/omdev/tools}/json/processing.py +0 -0
  152. {omdev-0.0.0.dev141/omdev → omdev-0.0.0.dev143/omdev/tools}/json/rendering.py +0 -0
  153. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/mkrelimp.py +0 -0
  154. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/notebook.py +0 -0
  155. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/pawk/__init__.py +0 -0
  156. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/pawk/__main__.py +0 -0
  157. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/pawk/pawk.py +0 -0
  158. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/pip.py +0 -0
  159. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/prof.py +0 -0
  160. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/qr.py +0 -0
  161. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/tools/sqlrepl.py +0 -0
  162. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev/wheelfile.py +0 -0
  163. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev.egg-info/dependency_links.txt +0 -0
  164. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev.egg-info/entry_points.txt +0 -0
  165. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/omdev.egg-info/top_level.txt +0 -0
  166. {omdev-0.0.0.dev141 → omdev-0.0.0.dev143}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev141
3
+ Version: 0.0.0.dev143
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.dev141
15
+ Requires-Dist: omlish==0.0.0.dev143
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -95,21 +95,6 @@
95
95
  }
96
96
  }
97
97
  },
98
- {
99
- "module": ".json.__main__",
100
- "attr": "_CLI_MODULE",
101
- "file": "omdev/json/__main__.py",
102
- "line": 4,
103
- "value": {
104
- "$.cli.types.CliModule": {
105
- "cmd_name": [
106
- "json",
107
- "j"
108
- ],
109
- "mod_name": "omdev.json.__main__"
110
- }
111
- }
112
- },
113
98
  {
114
99
  "module": ".magic.find",
115
100
  "attr": "_CLI_MODULE",
@@ -290,6 +275,21 @@
290
275
  }
291
276
  }
292
277
  },
278
+ {
279
+ "module": ".tools.json.__main__",
280
+ "attr": "_CLI_MODULE",
281
+ "file": "omdev/tools/json/__main__.py",
282
+ "line": 4,
283
+ "value": {
284
+ "$.cli.types.CliModule": {
285
+ "cmd_name": [
286
+ "json",
287
+ "j"
288
+ ],
289
+ "mod_name": "omdev.tools.json.__main__"
290
+ }
291
+ }
292
+ },
293
293
  {
294
294
  "module": ".tools.mkrelimp",
295
295
  "attr": "_CLI_MODULE",
@@ -366,11 +366,22 @@ def make_src_file(
366
366
  ])
367
367
 
368
368
  elif is_root_level_if_type_checking_block(line):
369
- while True:
370
- nl = cls[i]
371
- if nl and nl[0].name != 'INDENT':
372
- break
369
+ def skip_block():
370
+ nonlocal i
371
+ while True:
372
+ nl = cls[i]
373
+ if nl and nl[0].name != 'INDENT':
374
+ return nl
375
+ i += 1
376
+
377
+ nl = skip_block()
378
+
379
+ if tks.match_toks(nl, [
380
+ ('DEDENT', None),
381
+ ('NAME', 'else'),
382
+ ]):
373
383
  i += 1
384
+ skip_block()
374
385
 
375
386
  else:
376
387
  ctls.append(line)
@@ -136,6 +136,7 @@ DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
136
136
  '-k',
137
137
  ],
138
138
  conf_opts=[
139
+ # FIXME: breaks on mac for older py's
139
140
  '--enable-loadable-sqlite-extensions',
140
141
 
141
142
  # '--enable-shared',
@@ -63,6 +63,9 @@ UnparsedVersion = ta.Union['Version', str]
63
63
  UnparsedVersionVar = ta.TypeVar('UnparsedVersionVar', bound=UnparsedVersion)
64
64
  CallableVersionOperator = ta.Callable[['Version', str], bool]
65
65
 
66
+ # ../../omlish/lite/subprocesses.py
67
+ SubprocessChannelOption = ta.Literal['pipe', 'stdout', 'devnull']
68
+
66
69
 
67
70
  ########################################
68
71
  # ../../packaging/versions.py
@@ -1659,6 +1662,16 @@ class Interp:
1659
1662
  ##
1660
1663
 
1661
1664
 
1665
+ SUBPROCESS_CHANNEL_OPTION_VALUES: ta.Mapping[SubprocessChannelOption, int] = {
1666
+ 'pipe': subprocess.PIPE,
1667
+ 'stdout': subprocess.STDOUT,
1668
+ 'devnull': subprocess.DEVNULL,
1669
+ }
1670
+
1671
+
1672
+ ##
1673
+
1674
+
1662
1675
  _SUBPROCESS_SHELL_WRAP_EXECS = False
1663
1676
 
1664
1677
 
@@ -2048,6 +2061,7 @@ DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
2048
2061
  '-k',
2049
2062
  ],
2050
2063
  conf_opts=[
2064
+ # FIXME: breaks on mac for older py's
2051
2065
  '--enable-loadable-sqlite-extensions',
2052
2066
 
2053
2067
  # '--enable-shared',
@@ -101,6 +101,9 @@ UnparsedVersion = ta.Union['Version', str]
101
101
  UnparsedVersionVar = ta.TypeVar('UnparsedVersionVar', bound=UnparsedVersion)
102
102
  CallableVersionOperator = ta.Callable[['Version', str], bool]
103
103
 
104
+ # ../../omlish/lite/subprocesses.py
105
+ SubprocessChannelOption = ta.Literal['pipe', 'stdout', 'devnull']
106
+
104
107
 
105
108
  ########################################
106
109
  # ../../magic/magic.py
@@ -3081,21 +3084,26 @@ TODO:
3081
3084
  ##
3082
3085
 
3083
3086
 
3087
+ @dc.dataclass(frozen=True)
3088
+ class ObjMarshalOptions:
3089
+ raw_bytes: bool = False
3090
+
3091
+
3084
3092
  class ObjMarshaler(abc.ABC):
3085
3093
  @abc.abstractmethod
3086
- def marshal(self, o: ta.Any) -> ta.Any:
3094
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3087
3095
  raise NotImplementedError
3088
3096
 
3089
3097
  @abc.abstractmethod
3090
- def unmarshal(self, o: ta.Any) -> ta.Any:
3098
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3091
3099
  raise NotImplementedError
3092
3100
 
3093
3101
 
3094
3102
  class NopObjMarshaler(ObjMarshaler):
3095
- def marshal(self, o: ta.Any) -> ta.Any:
3103
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3096
3104
  return o
3097
3105
 
3098
- def unmarshal(self, o: ta.Any) -> ta.Any:
3106
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3099
3107
  return o
3100
3108
 
3101
3109
 
@@ -3103,29 +3111,29 @@ class NopObjMarshaler(ObjMarshaler):
3103
3111
  class ProxyObjMarshaler(ObjMarshaler):
3104
3112
  m: ta.Optional[ObjMarshaler] = None
3105
3113
 
3106
- def marshal(self, o: ta.Any) -> ta.Any:
3107
- return check_not_none(self.m).marshal(o)
3114
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3115
+ return check_not_none(self.m).marshal(o, opts)
3108
3116
 
3109
- def unmarshal(self, o: ta.Any) -> ta.Any:
3110
- return check_not_none(self.m).unmarshal(o)
3117
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3118
+ return check_not_none(self.m).unmarshal(o, opts)
3111
3119
 
3112
3120
 
3113
3121
  @dc.dataclass(frozen=True)
3114
3122
  class CastObjMarshaler(ObjMarshaler):
3115
3123
  ty: type
3116
3124
 
3117
- def marshal(self, o: ta.Any) -> ta.Any:
3125
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3118
3126
  return o
3119
3127
 
3120
- def unmarshal(self, o: ta.Any) -> ta.Any:
3128
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3121
3129
  return self.ty(o)
3122
3130
 
3123
3131
 
3124
3132
  class DynamicObjMarshaler(ObjMarshaler):
3125
- def marshal(self, o: ta.Any) -> ta.Any:
3133
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3126
3134
  return marshal_obj(o)
3127
3135
 
3128
- def unmarshal(self, o: ta.Any) -> ta.Any:
3136
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3129
3137
  return o
3130
3138
 
3131
3139
 
@@ -3133,21 +3141,36 @@ class DynamicObjMarshaler(ObjMarshaler):
3133
3141
  class Base64ObjMarshaler(ObjMarshaler):
3134
3142
  ty: type
3135
3143
 
3136
- def marshal(self, o: ta.Any) -> ta.Any:
3144
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3137
3145
  return base64.b64encode(o).decode('ascii')
3138
3146
 
3139
- def unmarshal(self, o: ta.Any) -> ta.Any:
3147
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3140
3148
  return self.ty(base64.b64decode(o))
3141
3149
 
3142
3150
 
3151
+ @dc.dataclass(frozen=True)
3152
+ class BytesSwitchedObjMarshaler(ObjMarshaler):
3153
+ m: ObjMarshaler
3154
+
3155
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3156
+ if opts.raw_bytes:
3157
+ return o
3158
+ return self.m.marshal(o, opts)
3159
+
3160
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3161
+ if opts.raw_bytes:
3162
+ return o
3163
+ return self.m.unmarshal(o, opts)
3164
+
3165
+
3143
3166
  @dc.dataclass(frozen=True)
3144
3167
  class EnumObjMarshaler(ObjMarshaler):
3145
3168
  ty: type
3146
3169
 
3147
- def marshal(self, o: ta.Any) -> ta.Any:
3170
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3148
3171
  return o.name
3149
3172
 
3150
- def unmarshal(self, o: ta.Any) -> ta.Any:
3173
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3151
3174
  return self.ty.__members__[o] # type: ignore
3152
3175
 
3153
3176
 
@@ -3155,15 +3178,15 @@ class EnumObjMarshaler(ObjMarshaler):
3155
3178
  class OptionalObjMarshaler(ObjMarshaler):
3156
3179
  item: ObjMarshaler
3157
3180
 
3158
- def marshal(self, o: ta.Any) -> ta.Any:
3181
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3159
3182
  if o is None:
3160
3183
  return None
3161
- return self.item.marshal(o)
3184
+ return self.item.marshal(o, opts)
3162
3185
 
3163
- def unmarshal(self, o: ta.Any) -> ta.Any:
3186
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3164
3187
  if o is None:
3165
3188
  return None
3166
- return self.item.unmarshal(o)
3189
+ return self.item.unmarshal(o, opts)
3167
3190
 
3168
3191
 
3169
3192
  @dc.dataclass(frozen=True)
@@ -3172,11 +3195,11 @@ class MappingObjMarshaler(ObjMarshaler):
3172
3195
  km: ObjMarshaler
3173
3196
  vm: ObjMarshaler
3174
3197
 
3175
- def marshal(self, o: ta.Any) -> ta.Any:
3176
- return {self.km.marshal(k): self.vm.marshal(v) for k, v in o.items()}
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()}
3177
3200
 
3178
- def unmarshal(self, o: ta.Any) -> ta.Any:
3179
- return self.ty((self.km.unmarshal(k), self.vm.unmarshal(v)) for k, v in o.items())
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())
3180
3203
 
3181
3204
 
3182
3205
  @dc.dataclass(frozen=True)
@@ -3184,11 +3207,11 @@ class IterableObjMarshaler(ObjMarshaler):
3184
3207
  ty: type
3185
3208
  item: ObjMarshaler
3186
3209
 
3187
- def marshal(self, o: ta.Any) -> ta.Any:
3188
- return [self.item.marshal(e) for e in o]
3210
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3211
+ return [self.item.marshal(e, opts) for e in o]
3189
3212
 
3190
- def unmarshal(self, o: ta.Any) -> ta.Any:
3191
- return self.ty(self.item.unmarshal(e) for e in o)
3213
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3214
+ return self.ty(self.item.unmarshal(e, opts) for e in o)
3192
3215
 
3193
3216
 
3194
3217
  @dc.dataclass(frozen=True)
@@ -3197,11 +3220,11 @@ class DataclassObjMarshaler(ObjMarshaler):
3197
3220
  fs: ta.Mapping[str, ObjMarshaler]
3198
3221
  nonstrict: bool = False
3199
3222
 
3200
- def marshal(self, o: ta.Any) -> ta.Any:
3201
- return {k: m.marshal(getattr(o, k)) for k, m in self.fs.items()}
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()}
3202
3225
 
3203
- def unmarshal(self, o: ta.Any) -> ta.Any:
3204
- return self.ty(**{k: self.fs[k].unmarshal(v) for k, v in o.items() if not self.nonstrict or k in self.fs})
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})
3205
3228
 
3206
3229
 
3207
3230
  @dc.dataclass(frozen=True)
@@ -3221,50 +3244,50 @@ class PolymorphicObjMarshaler(ObjMarshaler):
3221
3244
  {i.tag: i for i in impls},
3222
3245
  )
3223
3246
 
3224
- def marshal(self, o: ta.Any) -> ta.Any:
3247
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3225
3248
  impl = self.impls_by_ty[type(o)]
3226
- return {impl.tag: impl.m.marshal(o)}
3249
+ return {impl.tag: impl.m.marshal(o, opts)}
3227
3250
 
3228
- def unmarshal(self, o: ta.Any) -> ta.Any:
3251
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3229
3252
  [(t, v)] = o.items()
3230
3253
  impl = self.impls_by_tag[t]
3231
- return impl.m.unmarshal(v)
3254
+ return impl.m.unmarshal(v, opts)
3232
3255
 
3233
3256
 
3234
3257
  @dc.dataclass(frozen=True)
3235
3258
  class DatetimeObjMarshaler(ObjMarshaler):
3236
3259
  ty: type
3237
3260
 
3238
- def marshal(self, o: ta.Any) -> ta.Any:
3261
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3239
3262
  return o.isoformat()
3240
3263
 
3241
- def unmarshal(self, o: ta.Any) -> ta.Any:
3264
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3242
3265
  return self.ty.fromisoformat(o) # type: ignore
3243
3266
 
3244
3267
 
3245
3268
  class DecimalObjMarshaler(ObjMarshaler):
3246
- def marshal(self, o: ta.Any) -> ta.Any:
3269
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3247
3270
  return str(check_isinstance(o, decimal.Decimal))
3248
3271
 
3249
- def unmarshal(self, v: ta.Any) -> ta.Any:
3272
+ def unmarshal(self, v: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3250
3273
  return decimal.Decimal(check_isinstance(v, str))
3251
3274
 
3252
3275
 
3253
3276
  class FractionObjMarshaler(ObjMarshaler):
3254
- def marshal(self, o: ta.Any) -> ta.Any:
3277
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3255
3278
  fr = check_isinstance(o, fractions.Fraction)
3256
3279
  return [fr.numerator, fr.denominator]
3257
3280
 
3258
- def unmarshal(self, v: ta.Any) -> ta.Any:
3281
+ def unmarshal(self, v: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3259
3282
  num, denom = check_isinstance(v, list)
3260
3283
  return fractions.Fraction(num, denom)
3261
3284
 
3262
3285
 
3263
3286
  class UuidObjMarshaler(ObjMarshaler):
3264
- def marshal(self, o: ta.Any) -> ta.Any:
3287
+ def marshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3265
3288
  return str(o)
3266
3289
 
3267
- def unmarshal(self, o: ta.Any) -> ta.Any:
3290
+ def unmarshal(self, o: ta.Any, opts: ObjMarshalOptions) -> ta.Any:
3268
3291
  return uuid.UUID(o)
3269
3292
 
3270
3293
 
@@ -3274,7 +3297,7 @@ class UuidObjMarshaler(ObjMarshaler):
3274
3297
  _DEFAULT_OBJ_MARSHALERS: ta.Dict[ta.Any, ObjMarshaler] = {
3275
3298
  **{t: NopObjMarshaler() for t in (type(None),)},
3276
3299
  **{t: CastObjMarshaler(t) for t in (int, float, str, bool)},
3277
- **{t: Base64ObjMarshaler(t) for t in (bytes, bytearray)},
3300
+ **{t: BytesSwitchedObjMarshaler(Base64ObjMarshaler(t)) for t in (bytes, bytearray)},
3278
3301
  **{t: IterableObjMarshaler(t, DynamicObjMarshaler()) for t in (list, tuple, set, frozenset)},
3279
3302
  **{t: MappingObjMarshaler(t, DynamicObjMarshaler(), DynamicObjMarshaler()) for t in (dict,)},
3280
3303
 
@@ -3300,120 +3323,172 @@ _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES: ta.Dict[ta.Any, type] = {
3300
3323
  }
3301
3324
 
3302
3325
 
3303
- def _make_obj_marshaler(
3304
- ty: ta.Any,
3305
- rec: ta.Callable[[ta.Any], ObjMarshaler],
3306
- *,
3307
- nonstrict_dataclasses: bool = False,
3308
- ) -> ObjMarshaler:
3309
- if isinstance(ty, type):
3310
- if abc.ABC in ty.__bases__:
3311
- return PolymorphicObjMarshaler.of([ # type: ignore
3312
- PolymorphicObjMarshaler.Impl(
3313
- ity,
3314
- ity.__qualname__,
3315
- rec(ity),
3316
- )
3317
- for ity in deep_subclasses(ty)
3318
- if abc.ABC not in ity.__bases__
3319
- ])
3326
+ ##
3320
3327
 
3321
- if issubclass(ty, enum.Enum):
3322
- return EnumObjMarshaler(ty)
3323
3328
 
3324
- if dc.is_dataclass(ty):
3325
- return DataclassObjMarshaler(
3326
- ty,
3327
- {f.name: rec(f.type) for f in dc.fields(ty)},
3328
- nonstrict=nonstrict_dataclasses,
3329
- )
3329
+ class ObjMarshalerManager:
3330
+ def __init__(
3331
+ self,
3332
+ *,
3333
+ default_options: ObjMarshalOptions = ObjMarshalOptions(),
3330
3334
 
3331
- if is_generic_alias(ty):
3332
- try:
3333
- mt = _OBJ_MARSHALER_GENERIC_MAPPING_TYPES[ta.get_origin(ty)]
3334
- except KeyError:
3335
- pass
3336
- else:
3337
- k, v = ta.get_args(ty)
3338
- return MappingObjMarshaler(mt, rec(k), rec(v))
3335
+ default_obj_marshalers: ta.Dict[ta.Any, ObjMarshaler] = _DEFAULT_OBJ_MARSHALERS, # noqa
3336
+ generic_mapping_types: ta.Dict[ta.Any, type] = _OBJ_MARSHALER_GENERIC_MAPPING_TYPES, # noqa
3337
+ generic_iterable_types: ta.Dict[ta.Any, type] = _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES, # noqa
3338
+ ) -> None:
3339
+ super().__init__()
3339
3340
 
3340
- try:
3341
- st = _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES[ta.get_origin(ty)]
3342
- except KeyError:
3343
- pass
3344
- else:
3345
- [e] = ta.get_args(ty)
3346
- return IterableObjMarshaler(st, rec(e))
3341
+ self._default_options = default_options
3347
3342
 
3348
- if is_union_alias(ty):
3349
- return OptionalObjMarshaler(rec(get_optional_alias_arg(ty)))
3343
+ self._obj_marshalers = dict(default_obj_marshalers)
3344
+ self._generic_mapping_types = generic_mapping_types
3345
+ self._generic_iterable_types = generic_iterable_types
3350
3346
 
3351
- raise TypeError(ty)
3347
+ self._lock = threading.RLock()
3348
+ self._marshalers: ta.Dict[ta.Any, ObjMarshaler] = dict(_DEFAULT_OBJ_MARSHALERS)
3349
+ self._proxies: ta.Dict[ta.Any, ProxyObjMarshaler] = {}
3352
3350
 
3351
+ #
3353
3352
 
3354
- ##
3353
+ def make_obj_marshaler(
3354
+ self,
3355
+ ty: ta.Any,
3356
+ rec: ta.Callable[[ta.Any], ObjMarshaler],
3357
+ *,
3358
+ nonstrict_dataclasses: bool = False,
3359
+ ) -> ObjMarshaler:
3360
+ if isinstance(ty, type):
3361
+ if abc.ABC in ty.__bases__:
3362
+ return PolymorphicObjMarshaler.of([ # type: ignore
3363
+ PolymorphicObjMarshaler.Impl(
3364
+ ity,
3365
+ ity.__qualname__,
3366
+ rec(ity),
3367
+ )
3368
+ for ity in deep_subclasses(ty)
3369
+ if abc.ABC not in ity.__bases__
3370
+ ])
3371
+
3372
+ if issubclass(ty, enum.Enum):
3373
+ return EnumObjMarshaler(ty)
3374
+
3375
+ if dc.is_dataclass(ty):
3376
+ return DataclassObjMarshaler(
3377
+ ty,
3378
+ {f.name: rec(f.type) for f in dc.fields(ty)},
3379
+ nonstrict=nonstrict_dataclasses,
3380
+ )
3355
3381
 
3382
+ if is_generic_alias(ty):
3383
+ try:
3384
+ mt = self._generic_mapping_types[ta.get_origin(ty)]
3385
+ except KeyError:
3386
+ pass
3387
+ else:
3388
+ k, v = ta.get_args(ty)
3389
+ return MappingObjMarshaler(mt, rec(k), rec(v))
3356
3390
 
3357
- _OBJ_MARSHALERS_LOCK = threading.RLock()
3391
+ try:
3392
+ st = self._generic_iterable_types[ta.get_origin(ty)]
3393
+ except KeyError:
3394
+ pass
3395
+ else:
3396
+ [e] = ta.get_args(ty)
3397
+ return IterableObjMarshaler(st, rec(e))
3358
3398
 
3359
- _OBJ_MARSHALERS: ta.Dict[ta.Any, ObjMarshaler] = dict(_DEFAULT_OBJ_MARSHALERS)
3399
+ if is_union_alias(ty):
3400
+ return OptionalObjMarshaler(rec(get_optional_alias_arg(ty)))
3360
3401
 
3361
- _OBJ_MARSHALER_PROXIES: ta.Dict[ta.Any, ProxyObjMarshaler] = {}
3402
+ raise TypeError(ty)
3362
3403
 
3404
+ #
3363
3405
 
3364
- def register_opj_marshaler(ty: ta.Any, m: ObjMarshaler) -> None:
3365
- with _OBJ_MARSHALERS_LOCK:
3366
- if ty in _OBJ_MARSHALERS:
3367
- raise KeyError(ty)
3368
- _OBJ_MARSHALERS[ty] = m
3406
+ def register_opj_marshaler(self, ty: ta.Any, m: ObjMarshaler) -> None:
3407
+ with self._lock:
3408
+ if ty in self._obj_marshalers:
3409
+ raise KeyError(ty)
3410
+ self._obj_marshalers[ty] = m
3369
3411
 
3412
+ def get_obj_marshaler(
3413
+ self,
3414
+ ty: ta.Any,
3415
+ *,
3416
+ no_cache: bool = False,
3417
+ **kwargs: ta.Any,
3418
+ ) -> ObjMarshaler:
3419
+ with self._lock:
3420
+ if not no_cache:
3421
+ try:
3422
+ return self._obj_marshalers[ty]
3423
+ except KeyError:
3424
+ pass
3370
3425
 
3371
- def get_obj_marshaler(
3372
- ty: ta.Any,
3373
- *,
3374
- no_cache: bool = False,
3375
- **kwargs: ta.Any,
3376
- ) -> ObjMarshaler:
3377
- with _OBJ_MARSHALERS_LOCK:
3378
- if not no_cache:
3379
3426
  try:
3380
- return _OBJ_MARSHALERS[ty]
3427
+ return self._proxies[ty]
3381
3428
  except KeyError:
3382
3429
  pass
3383
3430
 
3384
- try:
3385
- return _OBJ_MARSHALER_PROXIES[ty]
3386
- except KeyError:
3387
- pass
3431
+ rec = functools.partial(
3432
+ self.get_obj_marshaler,
3433
+ no_cache=no_cache,
3434
+ **kwargs,
3435
+ )
3388
3436
 
3389
- rec = functools.partial(
3390
- get_obj_marshaler,
3391
- no_cache=no_cache,
3392
- **kwargs,
3393
- )
3437
+ p = ProxyObjMarshaler()
3438
+ self._proxies[ty] = p
3439
+ try:
3440
+ m = self.make_obj_marshaler(ty, rec, **kwargs)
3441
+ finally:
3442
+ del self._proxies[ty]
3443
+ p.m = m
3394
3444
 
3395
- p = ProxyObjMarshaler()
3396
- _OBJ_MARSHALER_PROXIES[ty] = p
3397
- try:
3398
- m = _make_obj_marshaler(ty, rec, **kwargs)
3399
- finally:
3400
- del _OBJ_MARSHALER_PROXIES[ty]
3401
- p.m = m
3445
+ if not no_cache:
3446
+ self._obj_marshalers[ty] = m
3447
+ return m
3448
+
3449
+ #
3402
3450
 
3403
- if not no_cache:
3404
- _OBJ_MARSHALERS[ty] = m
3405
- return m
3451
+ def marshal_obj(
3452
+ self,
3453
+ o: ta.Any,
3454
+ ty: ta.Any = None,
3455
+ opts: ta.Optional[ObjMarshalOptions] = None,
3456
+ ) -> ta.Any:
3457
+ m = self.get_obj_marshaler(ty if ty is not None else type(o))
3458
+ return m.marshal(o, opts or self._default_options)
3459
+
3460
+ def unmarshal_obj(
3461
+ self,
3462
+ o: ta.Any,
3463
+ ty: ta.Union[ta.Type[T], ta.Any],
3464
+ opts: ta.Optional[ObjMarshalOptions] = None,
3465
+ ) -> T:
3466
+ m = self.get_obj_marshaler(ty)
3467
+ return m.unmarshal(o, opts or self._default_options)
3468
+
3469
+ def roundtrip_obj(
3470
+ self,
3471
+ o: ta.Any,
3472
+ ty: ta.Any = None,
3473
+ opts: ta.Optional[ObjMarshalOptions] = None,
3474
+ ) -> ta.Any:
3475
+ if ty is None:
3476
+ ty = type(o)
3477
+ m: ta.Any = self.marshal_obj(o, ty, opts)
3478
+ u: ta.Any = self.unmarshal_obj(m, ty, opts)
3479
+ return u
3406
3480
 
3407
3481
 
3408
3482
  ##
3409
3483
 
3410
3484
 
3411
- def marshal_obj(o: ta.Any, ty: ta.Any = None) -> ta.Any:
3412
- return get_obj_marshaler(ty if ty is not None else type(o)).marshal(o)
3485
+ OBJ_MARSHALER_MANAGER = ObjMarshalerManager()
3413
3486
 
3487
+ register_opj_marshaler = OBJ_MARSHALER_MANAGER.register_opj_marshaler
3488
+ get_obj_marshaler = OBJ_MARSHALER_MANAGER.get_obj_marshaler
3414
3489
 
3415
- def unmarshal_obj(o: ta.Any, ty: ta.Union[ta.Type[T], ta.Any]) -> T:
3416
- return get_obj_marshaler(ty).unmarshal(o)
3490
+ marshal_obj = OBJ_MARSHALER_MANAGER.marshal_obj
3491
+ unmarshal_obj = OBJ_MARSHALER_MANAGER.unmarshal_obj
3417
3492
 
3418
3493
 
3419
3494
  ########################################
@@ -3706,6 +3781,16 @@ class RequirementsRewriter:
3706
3781
  ##
3707
3782
 
3708
3783
 
3784
+ SUBPROCESS_CHANNEL_OPTION_VALUES: ta.Mapping[SubprocessChannelOption, int] = {
3785
+ 'pipe': subprocess.PIPE,
3786
+ 'stdout': subprocess.STDOUT,
3787
+ 'devnull': subprocess.DEVNULL,
3788
+ }
3789
+
3790
+
3791
+ ##
3792
+
3793
+
3709
3794
  _SUBPROCESS_SHELL_WRAP_EXECS = False
3710
3795
 
3711
3796
 
@@ -4616,6 +4701,7 @@ DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
4616
4701
  '-k',
4617
4702
  ],
4618
4703
  conf_opts=[
4704
+ # FIXME: breaks on mac for older py's
4619
4705
  '--enable-loadable-sqlite-extensions',
4620
4706
 
4621
4707
  # '--enable-shared',
@@ -1,4 +1,4 @@
1
- from ..cli import CliModule
1
+ from ...cli import CliModule
2
2
 
3
3
 
4
4
  # @omlish-manifest