omdev 0.0.0.dev103__tar.gz → 0.0.0.dev105__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.dev103/omdev.egg-info → omdev-0.0.0.dev105}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/.manifests.json +1 -1
  3. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/scripts/execrss.py +11 -1
  4. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/scripts/exectime.py +11 -1
  5. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/scripts/pyproject.py +68 -27
  6. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/git.py +36 -32
  7. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105/omdev.egg-info}/PKG-INFO +2 -2
  8. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev.egg-info/requires.txt +1 -1
  9. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/pyproject.toml +2 -2
  10. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/LICENSE +0 -0
  11. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/MANIFEST.in +0 -0
  12. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/README.rst +0 -0
  13. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/__about__.py +0 -0
  14. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/__init__.py +0 -0
  15. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/amalg/__init__.py +0 -0
  16. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/amalg/__main__.py +0 -0
  17. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/amalg/amalg.py +0 -0
  18. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/antlr/__init__.py +0 -0
  19. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/antlr/_antlr/__init__.py +0 -0
  20. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/antlr/consts.py +0 -0
  21. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/antlr/gen.py +0 -0
  22. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/bracepy.py +0 -0
  23. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/__init__.py +0 -0
  24. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/compute/__init__.py +0 -0
  25. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/compute/cache.py +0 -0
  26. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/compute/contexts.py +0 -0
  27. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/compute/currents.py +0 -0
  28. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/compute/fns.py +0 -0
  29. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/compute/resolvers.py +0 -0
  30. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/compute/storage.py +0 -0
  31. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/compute/types.py +0 -0
  32. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/data/__init__.py +0 -0
  33. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/data/actions.py +0 -0
  34. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/data/cache.py +0 -0
  35. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/data/consts.py +0 -0
  36. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/data/defaults.py +0 -0
  37. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/data/manifests.py +0 -0
  38. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cache/data/specs.py +0 -0
  39. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/__init__.py +0 -0
  40. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_boilerplate.cc +0 -0
  41. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/LICENSE +0 -0
  42. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/__init__.py +0 -0
  43. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/build_ext.py +0 -0
  44. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  45. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  46. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/compilers/options.py +0 -0
  47. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  48. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/dir_util.py +0 -0
  49. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/errors.py +0 -0
  50. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/extension.py +0 -0
  51. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/file_util.py +0 -0
  52. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/modified.py +0 -0
  53. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/spawn.py +0 -0
  54. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/sysconfig.py +0 -0
  55. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/util.py +0 -0
  56. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/_distutils/version.py +0 -0
  57. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/build.py +0 -0
  58. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/cmake.py +0 -0
  59. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/importhook.py +0 -0
  60. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/magic.py +0 -0
  61. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cexts/scan.py +0 -0
  62. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/classdot.py +0 -0
  63. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cli/__init__.py +0 -0
  64. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cli/__main__.py +0 -0
  65. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cli/_pathhack.py +0 -0
  66. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cli/clicli.py +0 -0
  67. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cli/install.py +0 -0
  68. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cli/main.py +0 -0
  69. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cli/managers.py +0 -0
  70. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cli/types.py +0 -0
  71. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/clipboard/__init__.py +0 -0
  72. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/clipboard/clipboard.py +0 -0
  73. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/clipboard/darwin.py +0 -0
  74. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/cmake.py +0 -0
  75. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/findimports.py +0 -0
  76. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/git.py +0 -0
  77. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/imgur.py +0 -0
  78. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/interp/__init__.py +0 -0
  79. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/interp/__main__.py +0 -0
  80. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/interp/cli.py +0 -0
  81. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/interp/inspect.py +0 -0
  82. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/interp/providers.py +0 -0
  83. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/interp/pyenv.py +0 -0
  84. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/interp/resolvers.py +0 -0
  85. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/interp/standalone.py +0 -0
  86. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/interp/system.py +0 -0
  87. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/interp/types.py +0 -0
  88. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/magic/__init__.py +0 -0
  89. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/magic/find.py +0 -0
  90. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/magic/magic.py +0 -0
  91. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/magic/prepare.py +0 -0
  92. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/magic/styles.py +0 -0
  93. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/manifests/__init__.py +0 -0
  94. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/manifests/build.py +0 -0
  95. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/manifests/load.py +0 -0
  96. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/manifests/types.py +0 -0
  97. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/mypy/__init__.py +0 -0
  98. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/mypy/debug.py +0 -0
  99. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/packaging/__init__.py +0 -0
  100. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/packaging/names.py +0 -0
  101. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/packaging/requires.py +0 -0
  102. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/packaging/specifiers.py +0 -0
  103. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/packaging/versions.py +0 -0
  104. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/precheck/__init__.py +0 -0
  105. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/precheck/__main__.py +0 -0
  106. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/precheck/base.py +0 -0
  107. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/precheck/git.py +0 -0
  108. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/precheck/lite.py +0 -0
  109. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/precheck/main.py +0 -0
  110. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/precheck/manifests.py +0 -0
  111. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/precheck/scripts.py +0 -0
  112. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/ptk/__init__.py +0 -0
  113. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/ptk/apps/__init__.py +0 -0
  114. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/ptk/apps/ncdu.py +0 -0
  115. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/pyproject/__init__.py +0 -0
  116. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/pyproject/__main__.py +0 -0
  117. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/pyproject/cexts.py +0 -0
  118. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/pyproject/cli.py +0 -0
  119. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/pyproject/configs.py +0 -0
  120. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/pyproject/pkg.py +0 -0
  121. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/pyproject/reqs.py +0 -0
  122. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/revisions.py +0 -0
  123. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/scripts/__init__.py +0 -0
  124. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/scripts/bumpversion.py +0 -0
  125. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/scripts/importtrace.py +0 -0
  126. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/scripts/interp.py +0 -0
  127. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/scripts/slowcat.py +0 -0
  128. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/secrets.py +0 -0
  129. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tokens.py +0 -0
  130. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/toml/__init__.py +0 -0
  131. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/toml/parser.py +0 -0
  132. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/toml/writer.py +0 -0
  133. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/__init__.py +0 -0
  134. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/doc.py +0 -0
  135. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/docker.py +0 -0
  136. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/importscan.py +0 -0
  137. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/mkrelimp.py +0 -0
  138. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/notebook.py +0 -0
  139. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/pawk/__init__.py +0 -0
  140. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/pawk/__main__.py +0 -0
  141. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/pawk/pawk.py +0 -0
  142. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/pip.py +0 -0
  143. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/prof.py +0 -0
  144. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/tools/sqlrepl.py +0 -0
  145. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev/wheelfile.py +0 -0
  146. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev.egg-info/SOURCES.txt +0 -0
  147. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev.egg-info/dependency_links.txt +0 -0
  148. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev.egg-info/entry_points.txt +0 -0
  149. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/omdev.egg-info/top_level.txt +0 -0
  150. {omdev-0.0.0.dev103 → omdev-0.0.0.dev105}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev103
3
+ Version: 0.0.0.dev105
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.dev103
15
+ Requires-Dist: omlish==0.0.0.dev105
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -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",
@@ -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)
@@ -3299,7 +3299,10 @@ class UuidObjMarshaler(ObjMarshaler):
3299
3299
  return uuid.UUID(o)
3300
3300
 
3301
3301
 
3302
- _OBJ_MARSHALERS: ta.Dict[ta.Any, ObjMarshaler] = {
3302
+ ##
3303
+
3304
+
3305
+ _DEFAULT_OBJ_MARSHALERS: ta.Dict[ta.Any, ObjMarshaler] = {
3303
3306
  **{t: NopObjMarshaler() for t in (type(None),)},
3304
3307
  **{t: CastObjMarshaler(t) for t in (int, float, str, bool)},
3305
3308
  **{t: Base64ObjMarshaler(t) for t in (bytes, bytearray)},
@@ -3328,20 +3331,19 @@ _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES: ta.Dict[ta.Any, type] = {
3328
3331
  }
3329
3332
 
3330
3333
 
3331
- def register_opj_marshaler(ty: ta.Any, m: ObjMarshaler) -> None:
3332
- if ty in _OBJ_MARSHALERS:
3333
- raise KeyError(ty)
3334
- _OBJ_MARSHALERS[ty] = m
3335
-
3336
-
3337
- 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:
3338
3340
  if isinstance(ty, type):
3339
3341
  if abc.ABC in ty.__bases__:
3340
3342
  impls = [ # type: ignore
3341
3343
  PolymorphicObjMarshaler.Impl(
3342
3344
  ity,
3343
3345
  ity.__qualname__,
3344
- get_obj_marshaler(ity),
3346
+ rec(ity),
3345
3347
  )
3346
3348
  for ity in deep_subclasses(ty)
3347
3349
  if abc.ABC not in ity.__bases__
@@ -3357,7 +3359,8 @@ def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
3357
3359
  if dc.is_dataclass(ty):
3358
3360
  return DataclassObjMarshaler(
3359
3361
  ty,
3360
- {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,
3361
3364
  )
3362
3365
 
3363
3366
  if is_generic_alias(ty):
@@ -3367,7 +3370,7 @@ def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
3367
3370
  pass
3368
3371
  else:
3369
3372
  k, v = ta.get_args(ty)
3370
- return MappingObjMarshaler(mt, get_obj_marshaler(k), get_obj_marshaler(v))
3373
+ return MappingObjMarshaler(mt, rec(k), rec(v))
3371
3374
 
3372
3375
  try:
3373
3376
  st = _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES[ta.get_origin(ty)]
@@ -3375,33 +3378,71 @@ def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
3375
3378
  pass
3376
3379
  else:
3377
3380
  [e] = ta.get_args(ty)
3378
- return IterableObjMarshaler(st, get_obj_marshaler(e))
3381
+ return IterableObjMarshaler(st, rec(e))
3379
3382
 
3380
3383
  if is_union_alias(ty):
3381
- return OptionalObjMarshaler(get_obj_marshaler(get_optional_alias_arg(ty)))
3384
+ return OptionalObjMarshaler(rec(get_optional_alias_arg(ty)))
3382
3385
 
3383
3386
  raise TypeError(ty)
3384
3387
 
3385
3388
 
3386
- def get_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
3387
- try:
3388
- return _OBJ_MARSHALERS[ty]
3389
- except KeyError:
3390
- pass
3389
+ ##
3391
3390
 
3392
- p = ProxyObjMarshaler()
3393
- _OBJ_MARSHALERS[ty] = p
3394
- try:
3395
- m = _make_obj_marshaler(ty)
3396
- except Exception:
3397
- del _OBJ_MARSHALERS[ty]
3398
- raise
3399
- else:
3400
- 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)
3401
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
3402
3440
  return m
3403
3441
 
3404
3442
 
3443
+ ##
3444
+
3445
+
3405
3446
  def marshal_obj(o: ta.Any, ty: ta.Any = None) -> ta.Any:
3406
3447
  return get_obj_marshaler(ty if ty is not None else type(o)).marshal(o)
3407
3448
 
@@ -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.dev103
3
+ Version: 0.0.0.dev105
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.dev103
15
+ Requires-Dist: omlish==0.0.0.dev105
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.dev103
1
+ omlish==0.0.0.dev105
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.dev103'
15
+ version = '0.0.0.dev105'
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.dev103',
25
+ 'omlish == 0.0.0.dev105',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
File without changes
File without changes
File without changes
File without changes
File without changes