omdev 0.0.0.dev363__tar.gz → 0.0.0.dev365__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.
Files changed (317) hide show
  1. {omdev-0.0.0.dev363/omdev.egg-info → omdev-0.0.0.dev365}/PKG-INFO +4 -4
  2. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/__about__.py +1 -1
  3. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cc/cli.py +4 -1
  4. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/docstrings/google.py +25 -18
  5. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/scripts/ci.py +29 -4
  6. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/scripts/interp.py +4 -4
  7. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/scripts/pyproject.py +4 -4
  8. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/docker.py +1 -1
  9. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/json/cli.py +2 -0
  10. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/json/processing.py +14 -0
  11. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365/omdev.egg-info}/PKG-INFO +4 -4
  12. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev.egg-info/requires.txt +3 -3
  13. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/pyproject.toml +4 -4
  14. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/LICENSE +0 -0
  15. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/MANIFEST.in +0 -0
  16. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/README.md +0 -0
  17. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/.manifests.json +0 -0
  18. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/__init__.py +0 -0
  19. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/__init__.py +0 -0
  20. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/__main__.py +0 -0
  21. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/gen.py +0 -0
  22. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/imports.py +0 -0
  23. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/main.py +0 -0
  24. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/manifests.py +0 -0
  25. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/resources.py +0 -0
  26. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/srcfiles.py +0 -0
  27. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/strip.py +0 -0
  28. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/types.py +0 -0
  29. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/amalg/typing.py +0 -0
  30. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/__init__.py +0 -0
  31. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/compute/__init__.py +0 -0
  32. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/compute/cache.py +0 -0
  33. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/compute/contexts.py +0 -0
  34. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/compute/currents.py +0 -0
  35. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/compute/fns.py +0 -0
  36. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/compute/resolvers.py +0 -0
  37. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/compute/storage.py +0 -0
  38. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/compute/types.py +0 -0
  39. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/data/__init__.py +0 -0
  40. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/data/actions.py +0 -0
  41. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/data/cache.py +0 -0
  42. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/data/consts.py +0 -0
  43. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/data/defaults.py +0 -0
  44. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/data/manifests.py +0 -0
  45. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cache/data/specs.py +0 -0
  46. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cc/__init__.py +0 -0
  47. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cc/__main__.py +0 -0
  48. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cc/cdeps.py +0 -0
  49. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cc/cdeps.toml +0 -0
  50. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cc/srclangs.py +0 -0
  51. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/__init__.py +0 -0
  52. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_boilerplate.cc +0 -0
  53. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/LICENSE +0 -0
  54. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/__init__.py +0 -0
  55. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/build_ext.py +0 -0
  56. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  57. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  58. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/compilers/options.py +0 -0
  59. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  60. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/dir_util.py +0 -0
  61. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/errors.py +0 -0
  62. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/extension.py +0 -0
  63. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/file_util.py +0 -0
  64. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/modified.py +0 -0
  65. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/spawn.py +0 -0
  66. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/sysconfig.py +0 -0
  67. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/util.py +0 -0
  68. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/_distutils/version.py +0 -0
  69. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/build.py +0 -0
  70. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/cmake.py +0 -0
  71. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/importhook.py +0 -0
  72. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/magic.py +0 -0
  73. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cexts/scan.py +0 -0
  74. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/__init__.py +0 -0
  75. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/__main__.py +0 -0
  76. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/cache.py +0 -0
  77. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/ci.py +0 -0
  78. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/cli.py +0 -0
  79. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/compose.py +0 -0
  80. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/consts.py +0 -0
  81. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/__init__.py +0 -0
  82. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/buildcaching.py +0 -0
  83. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/cache.py +0 -0
  84. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  85. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/cacheserved/cache.py +0 -0
  86. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  87. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/cmds.py +0 -0
  88. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/dataserver.py +0 -0
  89. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/imagepulling.py +0 -0
  90. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/inject.py +0 -0
  91. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/packing.py +0 -0
  92. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/repositories.py +0 -0
  93. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/docker/utils.py +0 -0
  94. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/__init__.py +0 -0
  95. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/api/__init__.py +0 -0
  96. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/api/clients.py +0 -0
  97. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/api/v1/__init__.py +0 -0
  98. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/api/v1/api.py +0 -0
  99. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/api/v1/client.py +0 -0
  100. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/api/v2/__init__.py +0 -0
  101. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/api/v2/api.py +0 -0
  102. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/api/v2/azure.py +0 -0
  103. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/api/v2/client.py +0 -0
  104. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/bootstrap.py +0 -0
  105. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/cache.py +0 -0
  106. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/cli.py +0 -0
  107. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/env.py +0 -0
  108. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/github/inject.py +0 -0
  109. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/inject.py +0 -0
  110. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/requirements.py +0 -0
  111. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/shell.py +0 -0
  112. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ci/utils.py +0 -0
  113. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cli/__init__.py +0 -0
  114. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cli/__main__.py +0 -0
  115. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cli/_pathhack.py +0 -0
  116. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cli/clicli.py +0 -0
  117. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cli/install.py +0 -0
  118. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cli/main.py +0 -0
  119. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cli/managers.py +0 -0
  120. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cli/types.py +0 -0
  121. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/clipboard/__init__.py +0 -0
  122. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/clipboard/clipboard.py +0 -0
  123. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/clipboard/darwin_cf.py +0 -0
  124. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/clipboard/linux_x11.py +0 -0
  125. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cmake.py +0 -0
  126. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cmdlog/__init__.py +0 -0
  127. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cmdlog/__main__.py +0 -0
  128. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cmdlog/_cmdlog.py +0 -0
  129. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cmdlog/cli.py +0 -0
  130. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/cmdlog/cmdlog.py +0 -0
  131. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/dataserver/__init__.py +0 -0
  132. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/dataserver/handlers.py +0 -0
  133. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/dataserver/http.py +0 -0
  134. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/dataserver/routes.py +0 -0
  135. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/dataserver/server.py +0 -0
  136. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/dataserver/targets.py +0 -0
  137. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/git/__init__.py +0 -0
  138. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/git/magic.py +0 -0
  139. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/git/revisions.py +0 -0
  140. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/git/shallow.py +0 -0
  141. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/git/status.py +0 -0
  142. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/home/__init__.py +0 -0
  143. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/home/paths.py +0 -0
  144. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/home/secrets.py +0 -0
  145. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/home/shadow.py +0 -0
  146. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/imgur.py +0 -0
  147. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/__init__.py +0 -0
  148. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/__main__.py +0 -0
  149. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/cli.py +0 -0
  150. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/default.py +0 -0
  151. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/inject.py +0 -0
  152. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/inspect.py +0 -0
  153. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/providers/__init__.py +0 -0
  154. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/providers/base.py +0 -0
  155. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/providers/inject.py +0 -0
  156. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/providers/running.py +0 -0
  157. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/providers/standalone.py +0 -0
  158. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/providers/system.py +0 -0
  159. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/pyenv/__init__.py +0 -0
  160. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/pyenv/inject.py +0 -0
  161. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/pyenv/install.py +0 -0
  162. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/pyenv/provider.py +0 -0
  163. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/pyenv/pyenv.py +0 -0
  164. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/resolvers.py +0 -0
  165. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/types.py +0 -0
  166. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/uv/__init__.py +0 -0
  167. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/uv/inject.py +0 -0
  168. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/uv/provider.py +0 -0
  169. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/uv/uv.py +0 -0
  170. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/interp/venvs.py +0 -0
  171. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/magic/__init__.py +0 -0
  172. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/magic/__main__.py +0 -0
  173. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/magic/cli.py +0 -0
  174. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/magic/find.py +0 -0
  175. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/magic/magic.py +0 -0
  176. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/magic/prepare.py +0 -0
  177. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/magic/styles.py +0 -0
  178. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/manifests/__init__.py +0 -0
  179. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/manifests/__main__.py +0 -0
  180. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/manifests/build.py +0 -0
  181. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/manifests/dumping.py +0 -0
  182. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/manifests/main.py +0 -0
  183. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/mypy/__init__.py +0 -0
  184. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/mypy/debug.py +0 -0
  185. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/mypy/report.py +0 -0
  186. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/__init__.py +0 -0
  187. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/building.py +0 -0
  188. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/compression.py +0 -0
  189. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/data.py +0 -0
  190. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/datarefs.py +0 -0
  191. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/dataserver.py +0 -0
  192. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/loading.py +0 -0
  193. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/media.py +0 -0
  194. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/pack/__init__.py +0 -0
  195. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/pack/packing.py +0 -0
  196. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/pack/repositories.py +0 -0
  197. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/pack/unpacking.py +0 -0
  198. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/repositories.py +0 -0
  199. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/oci/tars.py +0 -0
  200. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/packaging/__init__.py +0 -0
  201. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/packaging/marshal.py +0 -0
  202. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/packaging/names.py +0 -0
  203. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/packaging/requires.py +0 -0
  204. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/packaging/revisions.py +0 -0
  205. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/packaging/specifiers.py +0 -0
  206. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/packaging/versions.py +0 -0
  207. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/packaging/wheelfile.py +0 -0
  208. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pip.py +0 -0
  209. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/precheck/__init__.py +0 -0
  210. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/precheck/__main__.py +0 -0
  211. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/precheck/base.py +0 -0
  212. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/precheck/caches.py +0 -0
  213. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/precheck/git.py +0 -0
  214. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/precheck/imports.py +0 -0
  215. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/precheck/lite.py +0 -0
  216. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/precheck/main.py +0 -0
  217. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/precheck/manifests.py +0 -0
  218. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/precheck/scripts.py +0 -0
  219. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/__init__.py +0 -0
  220. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/apps/__init__.py +0 -0
  221. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/apps/ncdu.py +0 -0
  222. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/confirm.py +0 -0
  223. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/markdown/LICENSE +0 -0
  224. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/markdown/__init__.py +0 -0
  225. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/markdown/__main__.py +0 -0
  226. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/markdown/border.py +0 -0
  227. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/markdown/cli.py +0 -0
  228. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/markdown/markdown.py +0 -0
  229. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/markdown/parser.py +0 -0
  230. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/markdown/styles.py +0 -0
  231. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/markdown/tags.py +0 -0
  232. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/ptk/markdown/utils.py +0 -0
  233. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/__init__.py +0 -0
  234. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/attrdocs.py +0 -0
  235. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/bracepy.py +0 -0
  236. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/classdot.py +0 -0
  237. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/docstrings/LICENSE +0 -0
  238. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/docstrings/__init__.py +0 -0
  239. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/docstrings/attrdoc.py +0 -0
  240. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/docstrings/common.py +0 -0
  241. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/docstrings/epydoc.py +0 -0
  242. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/docstrings/numpydoc.py +0 -0
  243. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/docstrings/parser.py +0 -0
  244. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/docstrings/rest.py +0 -0
  245. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/findimports.py +0 -0
  246. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/scripts/__init__.py +0 -0
  247. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/scripts/bumpversion.py +0 -0
  248. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/scripts/execstat.py +0 -0
  249. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/scripts/importtrace.py +0 -0
  250. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/srcheaders.py +0 -0
  251. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/tools/__init__.py +0 -0
  252. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/tools/importscan.py +0 -0
  253. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/py/tools/mkrelimp.py +0 -0
  254. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/__init__.py +0 -0
  255. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/__main__.py +0 -0
  256. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/cexts.py +0 -0
  257. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/cli.py +0 -0
  258. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/configs.py +0 -0
  259. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/inject.py +0 -0
  260. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/pkg.py +0 -0
  261. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/reqs.py +0 -0
  262. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/resources/__init__.py +0 -0
  263. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/resources/docker-dev.sh +0 -0
  264. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/resources/python.sh +0 -0
  265. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/pyproject/venvs.py +0 -0
  266. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/scripts/__init__.py +0 -0
  267. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/scripts/slowcat.py +0 -0
  268. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/scripts/tmpexec.py +0 -0
  269. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tagstrings.py +0 -0
  270. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tokens/__init__.py +0 -0
  271. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tokens/all.py +0 -0
  272. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tokens/tokenizert.py +0 -0
  273. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tokens/utils.py +0 -0
  274. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/__init__.py +0 -0
  275. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/antlr/__init__.py +0 -0
  276. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/antlr/__main__.py +0 -0
  277. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/antlr/cli.py +0 -0
  278. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/antlr/consts.py +0 -0
  279. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/antlr/gen.py +0 -0
  280. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/cloc.py +0 -0
  281. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/diff.py +0 -0
  282. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/doc.py +0 -0
  283. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/git/__init__.py +0 -0
  284. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/git/__main__.py +0 -0
  285. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/git/cli.py +0 -0
  286. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/git/consts.py +0 -0
  287. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/git/messages.py +0 -0
  288. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/intellij.py +0 -0
  289. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/json/__init__.py +0 -0
  290. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/json/__main__.py +0 -0
  291. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/json/formats.py +0 -0
  292. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/json/io.py +0 -0
  293. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/json/parsing.py +0 -0
  294. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/json/rendering.py +0 -0
  295. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/jsonview/__init__.py +0 -0
  296. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/jsonview/__main__.py +0 -0
  297. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/jsonview/cli.py +0 -0
  298. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/jsonview/resources/__init__.py +0 -0
  299. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  300. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  301. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/linehisto.py +0 -0
  302. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/mkenv.py +0 -0
  303. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/notebook.py +0 -0
  304. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/pawk/__init__.py +0 -0
  305. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/pawk/__main__.py +0 -0
  306. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/pawk/pawk.py +0 -0
  307. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/pip.py +0 -0
  308. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/prof.py +0 -0
  309. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/qr.py +0 -0
  310. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/shadow.py +0 -0
  311. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/shell.py +0 -0
  312. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev/tools/sqlrepl.py +0 -0
  313. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev.egg-info/SOURCES.txt +0 -0
  314. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev.egg-info/dependency_links.txt +0 -0
  315. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev.egg-info/entry_points.txt +0 -0
  316. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/omdev.egg-info/top_level.txt +0 -0
  317. {omdev-0.0.0.dev363 → omdev-0.0.0.dev365}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev363
3
+ Version: 0.0.0.dev365
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.13
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev363
15
+ Requires-Dist: omlish==0.0.0.dev365
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -21,7 +21,7 @@ Requires-Dist: docutils~=0.21; extra == "all"
21
21
  Requires-Dist: markdown-it-py~=3.0; extra == "all"
22
22
  Requires-Dist: mdit-py-plugins~=0.4; extra == "all"
23
23
  Requires-Dist: pygments~=2.19; extra == "all"
24
- Requires-Dist: mypy~=1.16; extra == "all"
24
+ Requires-Dist: mypy~=1.17; extra == "all"
25
25
  Requires-Dist: gprof2dot~=2025.4; extra == "all"
26
26
  Requires-Dist: prompt-toolkit~=3.0; extra == "all"
27
27
  Requires-Dist: segno~=1.6; extra == "all"
@@ -36,7 +36,7 @@ Requires-Dist: markdown-it-py~=3.0; extra == "doc"
36
36
  Requires-Dist: mdit-py-plugins~=0.4; extra == "doc"
37
37
  Requires-Dist: pygments~=2.19; extra == "doc"
38
38
  Provides-Extra: mypy
39
- Requires-Dist: mypy~=1.16; extra == "mypy"
39
+ Requires-Dist: mypy~=1.17; extra == "mypy"
40
40
  Provides-Extra: prof
41
41
  Requires-Dist: gprof2dot~=2025.4; extra == "prof"
42
42
  Provides-Extra: ptk
@@ -31,7 +31,7 @@ class Project(ProjectBase):
31
31
  ],
32
32
 
33
33
  'mypy': [
34
- 'mypy ~= 1.16',
34
+ 'mypy ~= 1.17',
35
35
  ],
36
36
 
37
37
  'prof': [
@@ -17,8 +17,11 @@ Freestanding options:
17
17
 
18
18
  TODO:
19
19
  - cext interop
20
- - gen cmake
20
+ - cc cmake
21
+ - shlex shebang to extract opts
21
22
  - nanobind
23
+ - 2 dep mechanisms? not necessarily bad
24
+ - cc ij, based off of cmake
22
25
  - fix CFLAGS/CCFLAGS/CPPFLAGS/CXXFLAGS
23
26
  - jit-gen cmake mode? multi-src builds
24
27
  """
@@ -44,7 +44,7 @@ class Section(ta.NamedTuple):
44
44
  type: SectionType
45
45
 
46
46
 
47
- _GOOGLE_TYPED_ARG_PAT = re.compile(r'\s*(.+?)\s*\(\s*(.*[^\s]+)\s*\)')
47
+ _GOOGLE_TYPED_ARG_PAT = re.compile(r'\s*(.+?)\s*\(\s*(.*\S+)\s*\)')
48
48
  _GOOGLE_ARG_DESC_PAT = re.compile(r'.*\. Defaults to (.+)\.')
49
49
  _MULTIPLE_PATTERN = re.compile(r'(\s*[^:\s]+:)|([^:]*\]:.*)')
50
50
 
@@ -70,7 +70,9 @@ class GoogleParser:
70
70
  def __init__(
71
71
  self,
72
72
  sections: list[Section] | None = None,
73
+ *,
73
74
  title_colon: bool = True,
75
+ meta_separators: ta.Sequence[str] = ':-',
74
76
  ) -> None:
75
77
  """
76
78
  Setup sections.
@@ -85,6 +87,7 @@ class GoogleParser:
85
87
  sections = DEFAULT_SECTIONS
86
88
  self.sections = {s.title: s for s in sections}
87
89
  self.title_colon = title_colon
90
+ self.meta_separators = meta_separators
88
91
  self._setup()
89
92
 
90
93
  def _setup(self) -> None:
@@ -94,11 +97,11 @@ class GoogleParser:
94
97
  colon = ''
95
98
 
96
99
  self.titles_re = re.compile(
97
- '^('
98
- + '|'.join(f'({t})' for t in self.sections)
99
- + ')'
100
- + colon
101
- + '[ \t\r\f\v]*$',
100
+ '^(' +
101
+ '|'.join(f'({t})' for t in self.sections) +
102
+ ')' +
103
+ colon +
104
+ '[ \t\r\f\v]*$',
102
105
  flags=re.MULTILINE,
103
106
  )
104
107
 
@@ -122,19 +125,23 @@ class GoogleParser:
122
125
  ):
123
126
  return self._build_single_meta(section, text)
124
127
 
125
- if ':' not in text:
126
- raise ParseError(f'Expected a colon in {text!r}.')
128
+ seps = self.meta_separators
129
+ for sep in seps:
130
+ if sep not in text:
131
+ continue
132
+
133
+ # Split spec and description
134
+ before, desc = text.split(sep, 1)
135
+ if desc:
136
+ desc = desc[1:] if desc[0] == ' ' else desc
137
+ if '\n' in desc:
138
+ first_line, rest = desc.split('\n', 1)
139
+ desc = first_line + '\n' + inspect.cleandoc(rest)
140
+ desc = desc.strip('\n')
127
141
 
128
- # Split spec and description
129
- before, desc = text.split(':', 1)
130
- if desc:
131
- desc = desc[1:] if desc[0] == ' ' else desc
132
- if '\n' in desc:
133
- first_line, rest = desc.split('\n', 1)
134
- desc = first_line + '\n' + inspect.cleandoc(rest)
135
- desc = desc.strip('\n')
142
+ return self._build_multi_meta(section, before, desc)
136
143
 
137
- return self._build_multi_meta(section, before, desc)
144
+ raise ParseError(f'Expected some separator {seps!r} in {text!r}.')
138
145
 
139
146
  @staticmethod
140
147
  def _build_single_meta(section: Section, desc: str) -> DocstringMeta:
@@ -161,7 +168,7 @@ class GoogleParser:
161
168
  )
162
169
 
163
170
  if section.key in PARAM_KEYWORDS:
164
- raise ParseError('Expected paramenter name.')
171
+ raise ParseError('Expected parameter name.')
165
172
 
166
173
  return DocstringMeta(args=[section.key], description=desc)
167
174
 
@@ -962,7 +962,7 @@ class Checks:
962
962
  render_fmt='%s',
963
963
  )
964
964
 
965
- return v # type: ignore
965
+ return v
966
966
 
967
967
  def non_empty_str(self, v: ta.Optional[str], msg: CheckMessage = None) -> str:
968
968
  if not isinstance(v, str) or not v:
@@ -1975,6 +1975,31 @@ def unlinking_if_exists(path: str) -> ta.Iterator[None]:
1975
1975
  ##
1976
1976
 
1977
1977
 
1978
+ @ta.overload
1979
+ def path_dirname(p: str, n: int = 1) -> str:
1980
+ ...
1981
+
1982
+
1983
+ @ta.overload
1984
+ def path_dirname(p: bytes, n: int = 1) -> bytes:
1985
+ ...
1986
+
1987
+
1988
+ def path_dirname(p, n=1):
1989
+ if isinstance(p, bytes):
1990
+ sep: ta.Any = b'/'
1991
+ else:
1992
+ sep = '/'
1993
+ p = os.fspath(p)
1994
+ i = -1
1995
+ for _ in range(n):
1996
+ i = p.rindex(sep, 0, i)
1997
+ head = p[:i + 1]
1998
+ if head and head != sep * len(head):
1999
+ head = head.rstrip(sep)
2000
+ return head
2001
+
2002
+
1978
2003
  def abs_real_path(p: str) -> str:
1979
2004
  return os.path.abspath(os.path.realpath(p))
1980
2005
 
@@ -2858,7 +2883,7 @@ class ArgparseCli:
2858
2883
 
2859
2884
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
2860
2885
  msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
2861
- if (parser := self.get_parser()).exit_on_error: # type: ignore
2886
+ if (parser := self.get_parser()).exit_on_error:
2862
2887
  parser.error(msg)
2863
2888
  else:
2864
2889
  raise argparse.ArgumentError(None, msg)
@@ -5812,7 +5837,7 @@ class SubprocessRun:
5812
5837
  ) -> SubprocessRunOutput:
5813
5838
  if subprocesses is None:
5814
5839
  subprocesses = self._DEFAULT_SUBPROCESSES
5815
- return check.not_none(subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
5840
+ return check.not_none(subprocesses).run_(self.replace(**kwargs))
5816
5841
 
5817
5842
  _DEFAULT_ASYNC_SUBPROCESSES: ta.ClassVar[ta.Optional[ta.Any]] = None # AbstractAsyncSubprocesses
5818
5843
 
@@ -5823,7 +5848,7 @@ class SubprocessRun:
5823
5848
  ) -> SubprocessRunOutput:
5824
5849
  if async_subprocesses is None:
5825
5850
  async_subprocesses = self._DEFAULT_ASYNC_SUBPROCESSES
5826
- return await check.not_none(async_subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
5851
+ return await check.not_none(async_subprocesses).run_(self.replace(**kwargs))
5827
5852
 
5828
5853
 
5829
5854
  SubprocessRun._FIELD_NAMES = frozenset(fld.name for fld in dc.fields(SubprocessRun)) # noqa
@@ -989,7 +989,7 @@ class Checks:
989
989
  render_fmt='%s',
990
990
  )
991
991
 
992
- return v # type: ignore
992
+ return v
993
993
 
994
994
  def non_empty_str(self, v: ta.Optional[str], msg: CheckMessage = None) -> str:
995
995
  if not isinstance(v, str) or not v:
@@ -2560,7 +2560,7 @@ class ArgparseCli:
2560
2560
 
2561
2561
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
2562
2562
  msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
2563
- if (parser := self.get_parser()).exit_on_error: # type: ignore
2563
+ if (parser := self.get_parser()).exit_on_error:
2564
2564
  parser.error(msg)
2565
2565
  else:
2566
2566
  raise argparse.ArgumentError(None, msg)
@@ -3873,7 +3873,7 @@ class SubprocessRun:
3873
3873
  ) -> SubprocessRunOutput:
3874
3874
  if subprocesses is None:
3875
3875
  subprocesses = self._DEFAULT_SUBPROCESSES
3876
- return check.not_none(subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
3876
+ return check.not_none(subprocesses).run_(self.replace(**kwargs))
3877
3877
 
3878
3878
  _DEFAULT_ASYNC_SUBPROCESSES: ta.ClassVar[ta.Optional[ta.Any]] = None # AbstractAsyncSubprocesses
3879
3879
 
@@ -3884,7 +3884,7 @@ class SubprocessRun:
3884
3884
  ) -> SubprocessRunOutput:
3885
3885
  if async_subprocesses is None:
3886
3886
  async_subprocesses = self._DEFAULT_ASYNC_SUBPROCESSES
3887
- return await check.not_none(async_subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
3887
+ return await check.not_none(async_subprocesses).run_(self.replace(**kwargs))
3888
3888
 
3889
3889
 
3890
3890
  SubprocessRun._FIELD_NAMES = frozenset(fld.name for fld in dc.fields(SubprocessRun)) # noqa
@@ -2412,7 +2412,7 @@ class Checks:
2412
2412
  render_fmt='%s',
2413
2413
  )
2414
2414
 
2415
- return v # type: ignore
2415
+ return v
2416
2416
 
2417
2417
  def non_empty_str(self, v: ta.Optional[str], msg: CheckMessage = None) -> str:
2418
2418
  if not isinstance(v, str) or not v:
@@ -4352,7 +4352,7 @@ class ArgparseCli:
4352
4352
 
4353
4353
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
4354
4354
  msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
4355
- if (parser := self.get_parser()).exit_on_error: # type: ignore
4355
+ if (parser := self.get_parser()).exit_on_error:
4356
4356
  parser.error(msg)
4357
4357
  else:
4358
4358
  raise argparse.ArgumentError(None, msg)
@@ -6263,7 +6263,7 @@ class SubprocessRun:
6263
6263
  ) -> SubprocessRunOutput:
6264
6264
  if subprocesses is None:
6265
6265
  subprocesses = self._DEFAULT_SUBPROCESSES
6266
- return check.not_none(subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
6266
+ return check.not_none(subprocesses).run_(self.replace(**kwargs))
6267
6267
 
6268
6268
  _DEFAULT_ASYNC_SUBPROCESSES: ta.ClassVar[ta.Optional[ta.Any]] = None # AbstractAsyncSubprocesses
6269
6269
 
@@ -6274,7 +6274,7 @@ class SubprocessRun:
6274
6274
  ) -> SubprocessRunOutput:
6275
6275
  if async_subprocesses is None:
6276
6276
  async_subprocesses = self._DEFAULT_ASYNC_SUBPROCESSES
6277
- return await check.not_none(async_subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
6277
+ return await check.not_none(async_subprocesses).run_(self.replace(**kwargs))
6278
6278
 
6279
6279
 
6280
6280
  SubprocessRun._FIELD_NAMES = frozenset(fld.name for fld in dc.fields(SubprocessRun)) # noqa
@@ -115,7 +115,7 @@ class Cli(ap.Cli):
115
115
  dct: dict[str, list[PortEntry]] = {}
116
116
 
117
117
  with lang.disposing(yaml.WrappedLoaders.base(yml_src)) as loader:
118
- val = check.not_none(loader.get_single_data()) # type: ignore
118
+ val = check.not_none(loader.get_single_data())
119
119
  root = check.isinstance(val.value, ta.Mapping)
120
120
 
121
121
  services = check.isinstance(
@@ -88,6 +88,7 @@ def _build_args_parser() -> argparse.ArgumentParser:
88
88
  parser.add_argument('-x', '--jmespath-expr')
89
89
  parser.add_argument('-M', '--marshal', action='store_true')
90
90
  parser.add_argument('-F', '--flat', action='store_true')
91
+ parser.add_argument('-e', '--prune-empty', action='store_true')
91
92
  parser.add_argument('-E', '--omit-empty', action='store_true')
92
93
 
93
94
  parser.add_argument('-z', '--compact', action='store_true')
@@ -136,6 +137,7 @@ def _process_args(args: ta.Any) -> RunConfiguration:
136
137
  jmespath_expr=args.jmespath_expr,
137
138
  marshal=args.marshal,
138
139
  flat=args.flat,
140
+ prune_empty=args.prune_empty,
139
141
  omit_empty=args.omit_empty,
140
142
  )
141
143
 
@@ -20,9 +20,20 @@ class ProcessingOptions:
20
20
  jmespath_expr: ta.Any | None = None
21
21
  marshal: bool = False
22
22
  flat: bool = False
23
+ prune_empty: bool = False
23
24
  omit_empty: bool = False
24
25
 
25
26
 
27
+ def _prune_empty(v: ta.Any) -> ta.Any:
28
+ # if isinstance(v, ta.Mapping):
29
+ # v = type(v)([
30
+ # (_prune_empty(k), _prune_empty(v))
31
+ # for k, v in v.items()
32
+ # ])
33
+ # elif
34
+ raise NotImplementedError
35
+
36
+
26
37
  class Processor:
27
38
  def __init__(self, opts: ProcessingOptions) -> None:
28
39
  super().__init__()
@@ -68,6 +79,9 @@ class Processor:
68
79
  vs = [v]
69
80
 
70
81
  for v in vs:
82
+ if self._opts.prune_empty:
83
+ v = _prune_empty(v)
84
+
71
85
  if self._opts.omit_empty:
72
86
  if v is None or (isinstance(v, (ta.Sequence, ta.Mapping)) and not v):
73
87
  continue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev363
3
+ Version: 0.0.0.dev365
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.13
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev363
15
+ Requires-Dist: omlish==0.0.0.dev365
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -21,7 +21,7 @@ Requires-Dist: docutils~=0.21; extra == "all"
21
21
  Requires-Dist: markdown-it-py~=3.0; extra == "all"
22
22
  Requires-Dist: mdit-py-plugins~=0.4; extra == "all"
23
23
  Requires-Dist: pygments~=2.19; extra == "all"
24
- Requires-Dist: mypy~=1.16; extra == "all"
24
+ Requires-Dist: mypy~=1.17; extra == "all"
25
25
  Requires-Dist: gprof2dot~=2025.4; extra == "all"
26
26
  Requires-Dist: prompt-toolkit~=3.0; extra == "all"
27
27
  Requires-Dist: segno~=1.6; extra == "all"
@@ -36,7 +36,7 @@ Requires-Dist: markdown-it-py~=3.0; extra == "doc"
36
36
  Requires-Dist: mdit-py-plugins~=0.4; extra == "doc"
37
37
  Requires-Dist: pygments~=2.19; extra == "doc"
38
38
  Provides-Extra: mypy
39
- Requires-Dist: mypy~=1.16; extra == "mypy"
39
+ Requires-Dist: mypy~=1.17; extra == "mypy"
40
40
  Provides-Extra: prof
41
41
  Requires-Dist: gprof2dot~=2025.4; extra == "prof"
42
42
  Provides-Extra: ptk
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev363
1
+ omlish==0.0.0.dev365
2
2
 
3
3
  [all]
4
4
  black~=25.1
@@ -8,7 +8,7 @@ docutils~=0.21
8
8
  markdown-it-py~=3.0
9
9
  mdit-py-plugins~=0.4
10
10
  pygments~=2.19
11
- mypy~=1.16
11
+ mypy~=1.17
12
12
  gprof2dot~=2025.4
13
13
  prompt-toolkit~=3.0
14
14
  segno~=1.6
@@ -27,7 +27,7 @@ mdit-py-plugins~=0.4
27
27
  pygments~=2.19
28
28
 
29
29
  [mypy]
30
- mypy~=1.16
30
+ mypy~=1.17
31
31
 
32
32
  [prof]
33
33
  gprof2dot~=2025.4
@@ -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.13'
15
- version = '0.0.0.dev363'
15
+ version = '0.0.0.dev365'
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.dev363',
25
+ 'omlish == 0.0.0.dev365',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
@@ -34,7 +34,7 @@ all = [
34
34
  'markdown-it-py ~= 3.0',
35
35
  'mdit-py-plugins ~= 0.4',
36
36
  'pygments ~= 2.19',
37
- 'mypy ~= 1.16',
37
+ 'mypy ~= 1.17',
38
38
  'gprof2dot ~= 2025.4',
39
39
  'prompt-toolkit ~= 3.0',
40
40
  'segno ~= 1.6',
@@ -53,7 +53,7 @@ doc = [
53
53
  'pygments ~= 2.19',
54
54
  ]
55
55
  mypy = [
56
- 'mypy ~= 1.16',
56
+ 'mypy ~= 1.17',
57
57
  ]
58
58
  prof = [
59
59
  'gprof2dot ~= 2025.4',
File without changes
File without changes
File without changes