omdev 0.0.0.dev391__tar.gz → 0.0.0.dev393__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 (331) hide show
  1. {omdev-0.0.0.dev391/omdev.egg-info → omdev-0.0.0.dev393}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/.manifests.json +11 -0
  3. omdev-0.0.0.dev391/omdev/manifests/build.py → omdev-0.0.0.dev393/omdev/manifests/building.py +134 -46
  4. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/manifests/dumping.py +16 -3
  5. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/manifests/main.py +12 -9
  6. omdev-0.0.0.dev393/omdev/tools/pawk/__init__.py +0 -0
  7. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393/omdev.egg-info}/PKG-INFO +2 -2
  8. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev.egg-info/SOURCES.txt +1 -1
  9. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev.egg-info/requires.txt +1 -1
  10. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/pyproject.toml +2 -2
  11. omdev-0.0.0.dev391/omdev/pyproject/__init__.py +0 -1
  12. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/LICENSE +0 -0
  13. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/MANIFEST.in +0 -0
  14. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/README.md +0 -0
  15. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/__about__.py +0 -0
  16. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/__init__.py +0 -0
  17. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/__init__.py +0 -0
  18. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/__main__.py +0 -0
  19. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/gen.py +0 -0
  20. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/imports.py +0 -0
  21. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/main.py +0 -0
  22. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/manifests.py +0 -0
  23. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/resources.py +0 -0
  24. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/srcfiles.py +0 -0
  25. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/strip.py +0 -0
  26. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/types.py +0 -0
  27. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/amalg/typing.py +0 -0
  28. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/__init__.py +0 -0
  29. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/compute/__init__.py +0 -0
  30. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/compute/cache.py +0 -0
  31. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/compute/contexts.py +0 -0
  32. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/compute/currents.py +0 -0
  33. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/compute/fns.py +0 -0
  34. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/compute/resolvers.py +0 -0
  35. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/compute/storage.py +0 -0
  36. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/compute/types.py +0 -0
  37. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/data/__init__.py +0 -0
  38. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/data/actions.py +0 -0
  39. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/data/cache.py +0 -0
  40. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/data/consts.py +0 -0
  41. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/data/defaults.py +0 -0
  42. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/data/manifests.py +0 -0
  43. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cache/data/specs.py +0 -0
  44. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/capi/__init__.py +0 -0
  45. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/capi/darwin/__init__.py +0 -0
  46. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/capi/darwin/aps.py +0 -0
  47. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/capi/darwin/ax.py +0 -0
  48. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/capi/darwin/cf.py +0 -0
  49. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/capi/darwin/cg.py +0 -0
  50. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/capi/linux/__init__.py +0 -0
  51. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/capi/linux/x11.py +0 -0
  52. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cc/__init__.py +0 -0
  53. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cc/__main__.py +0 -0
  54. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cc/cdeps.py +0 -0
  55. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cc/cdeps.toml +0 -0
  56. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cc/cli.py +0 -0
  57. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cc/srclangs.py +0 -0
  58. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/__init__.py +0 -0
  59. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_boilerplate.cc +0 -0
  60. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/LICENSE +0 -0
  61. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/__init__.py +0 -0
  62. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/build_ext.py +0 -0
  63. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  64. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  65. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/compilers/options.py +0 -0
  66. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  67. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/dir_util.py +0 -0
  68. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/errors.py +0 -0
  69. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/extension.py +0 -0
  70. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/file_util.py +0 -0
  71. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/modified.py +0 -0
  72. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/spawn.py +0 -0
  73. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/sysconfig.py +0 -0
  74. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/util.py +0 -0
  75. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/_distutils/version.py +0 -0
  76. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/build.py +0 -0
  77. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/cmake.py +0 -0
  78. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/importhook.py +0 -0
  79. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/magic.py +0 -0
  80. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cexts/scan.py +0 -0
  81. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/__init__.py +0 -0
  82. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/__main__.py +0 -0
  83. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/cache.py +0 -0
  84. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/ci.py +0 -0
  85. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/cli.py +0 -0
  86. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/compose.py +0 -0
  87. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/consts.py +0 -0
  88. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/__init__.py +0 -0
  89. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/buildcaching.py +0 -0
  90. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/cache.py +0 -0
  91. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  92. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/cacheserved/cache.py +0 -0
  93. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  94. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/cmds.py +0 -0
  95. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/dataserver.py +0 -0
  96. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/imagepulling.py +0 -0
  97. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/inject.py +0 -0
  98. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/packing.py +0 -0
  99. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/repositories.py +0 -0
  100. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/docker/utils.py +0 -0
  101. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/__init__.py +0 -0
  102. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/api/__init__.py +0 -0
  103. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/api/clients.py +0 -0
  104. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/api/v1/__init__.py +0 -0
  105. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/api/v1/api.py +0 -0
  106. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/api/v1/client.py +0 -0
  107. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/api/v2/__init__.py +0 -0
  108. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/api/v2/api.py +0 -0
  109. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/api/v2/azure.py +0 -0
  110. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/api/v2/client.py +0 -0
  111. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/bootstrap.py +0 -0
  112. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/cache.py +0 -0
  113. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/cli.py +0 -0
  114. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/env.py +0 -0
  115. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/github/inject.py +0 -0
  116. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/inject.py +0 -0
  117. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/requirements.py +0 -0
  118. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/shell.py +0 -0
  119. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ci/utils.py +0 -0
  120. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cli/__init__.py +0 -0
  121. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cli/__main__.py +0 -0
  122. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cli/_pathhack.py +0 -0
  123. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cli/clicli.py +0 -0
  124. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cli/install.py +0 -0
  125. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cli/main.py +0 -0
  126. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cli/managers.py +0 -0
  127. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cli/types.py +0 -0
  128. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/clipboard/__init__.py +0 -0
  129. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/clipboard/clipboard.py +0 -0
  130. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/clipboard/darwin_cf.py +0 -0
  131. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/clipboard/linux_x11.py +0 -0
  132. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cmake.py +0 -0
  133. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cmdlog/__init__.py +0 -0
  134. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cmdlog/__main__.py +0 -0
  135. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cmdlog/_cmdlog.py +0 -0
  136. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cmdlog/cli.py +0 -0
  137. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/cmdlog/cmdlog.py +0 -0
  138. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/dataserver/__init__.py +0 -0
  139. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/dataserver/handlers.py +0 -0
  140. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/dataserver/http.py +0 -0
  141. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/dataserver/routes.py +0 -0
  142. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/dataserver/server.py +0 -0
  143. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/dataserver/targets.py +0 -0
  144. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/git/__init__.py +0 -0
  145. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/git/magic.py +0 -0
  146. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/git/revisions.py +0 -0
  147. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/git/shallow.py +0 -0
  148. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/git/status.py +0 -0
  149. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/home/__init__.py +0 -0
  150. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/home/paths.py +0 -0
  151. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/home/secrets.py +0 -0
  152. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/home/shadow.py +0 -0
  153. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/imgur.py +0 -0
  154. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/intellij/__init__.py +0 -0
  155. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/intellij/cli.py +0 -0
  156. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/intellij/ides.py +0 -0
  157. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/intellij/open.py +0 -0
  158. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/__init__.py +0 -0
  159. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/__main__.py +0 -0
  160. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/cli.py +0 -0
  161. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/default.py +0 -0
  162. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/inject.py +0 -0
  163. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/inspect.py +0 -0
  164. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/providers/__init__.py +0 -0
  165. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/providers/base.py +0 -0
  166. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/providers/inject.py +0 -0
  167. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/providers/running.py +0 -0
  168. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/providers/standalone.py +0 -0
  169. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/providers/system.py +0 -0
  170. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/pyenv/__init__.py +0 -0
  171. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/pyenv/inject.py +0 -0
  172. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/pyenv/install.py +0 -0
  173. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/pyenv/provider.py +0 -0
  174. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/pyenv/pyenv.py +0 -0
  175. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/resolvers.py +0 -0
  176. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/types.py +0 -0
  177. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/uv/__init__.py +0 -0
  178. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/uv/inject.py +0 -0
  179. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/uv/provider.py +0 -0
  180. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/uv/uv.py +0 -0
  181. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/interp/venvs.py +0 -0
  182. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/magic/__init__.py +0 -0
  183. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/magic/__main__.py +0 -0
  184. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/magic/cli.py +0 -0
  185. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/magic/find.py +0 -0
  186. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/magic/magic.py +0 -0
  187. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/magic/prepare.py +0 -0
  188. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/magic/styles.py +0 -0
  189. {omdev-0.0.0.dev391/omdev/mypy → omdev-0.0.0.dev393/omdev/manifests}/__init__.py +0 -0
  190. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/manifests/__main__.py +0 -0
  191. {omdev-0.0.0.dev391/omdev/oci → omdev-0.0.0.dev393/omdev/mypy}/__init__.py +0 -0
  192. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/mypy/debug.py +0 -0
  193. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/mypy/report.py +0 -0
  194. {omdev-0.0.0.dev391/omdev/oci/pack → omdev-0.0.0.dev393/omdev/oci}/__init__.py +0 -0
  195. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/building.py +0 -0
  196. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/compression.py +0 -0
  197. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/data.py +0 -0
  198. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/datarefs.py +0 -0
  199. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/dataserver.py +0 -0
  200. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/loading.py +0 -0
  201. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/media.py +0 -0
  202. {omdev-0.0.0.dev391/omdev/packaging → omdev-0.0.0.dev393/omdev/oci/pack}/__init__.py +0 -0
  203. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/pack/packing.py +0 -0
  204. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/pack/repositories.py +0 -0
  205. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/pack/unpacking.py +0 -0
  206. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/repositories.py +0 -0
  207. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/oci/tars.py +0 -0
  208. {omdev-0.0.0.dev391/omdev/precheck → omdev-0.0.0.dev393/omdev/packaging}/__init__.py +0 -0
  209. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/packaging/marshal.py +0 -0
  210. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/packaging/names.py +0 -0
  211. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/packaging/requires.py +0 -0
  212. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/packaging/revisions.py +0 -0
  213. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/packaging/specifiers.py +0 -0
  214. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/packaging/versions.py +0 -0
  215. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/packaging/wheelfile.py +0 -0
  216. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pip.py +0 -0
  217. {omdev-0.0.0.dev391/omdev/ptk/apps → omdev-0.0.0.dev393/omdev/precheck}/__init__.py +0 -0
  218. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/precheck/__main__.py +0 -0
  219. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/precheck/base.py +0 -0
  220. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/precheck/caches.py +0 -0
  221. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/precheck/git.py +0 -0
  222. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/precheck/imports.py +0 -0
  223. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/precheck/lite.py +0 -0
  224. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/precheck/main.py +0 -0
  225. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/precheck/manifests.py +0 -0
  226. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/precheck/scripts.py +0 -0
  227. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/precheck/unicode.py +0 -0
  228. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/__init__.py +0 -0
  229. {omdev-0.0.0.dev391/omdev/py/scripts → omdev-0.0.0.dev393/omdev/ptk/apps}/__init__.py +0 -0
  230. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/apps/ncdu.py +0 -0
  231. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/confirm.py +0 -0
  232. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/markdown/LICENSE +0 -0
  233. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/markdown/__init__.py +0 -0
  234. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/markdown/__main__.py +0 -0
  235. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/markdown/border.py +0 -0
  236. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/markdown/cli.py +0 -0
  237. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/markdown/markdown.py +0 -0
  238. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/markdown/parser.py +0 -0
  239. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/markdown/styles.py +0 -0
  240. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/markdown/tags.py +0 -0
  241. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/ptk/markdown/utils.py +0 -0
  242. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/__init__.py +0 -0
  243. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/attrdocs.py +0 -0
  244. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/bracepy.py +0 -0
  245. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/classdot.py +0 -0
  246. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/docstrings/LICENSE +0 -0
  247. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/docstrings/__init__.py +0 -0
  248. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/docstrings/attrdoc.py +0 -0
  249. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/docstrings/common.py +0 -0
  250. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/docstrings/epydoc.py +0 -0
  251. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/docstrings/google.py +0 -0
  252. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/docstrings/numpydoc.py +0 -0
  253. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/docstrings/parser.py +0 -0
  254. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/docstrings/rest.py +0 -0
  255. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/findimports.py +0 -0
  256. {omdev-0.0.0.dev391/omdev/py/tools → omdev-0.0.0.dev393/omdev/py/scripts}/__init__.py +0 -0
  257. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/scripts/bumpversion.py +0 -0
  258. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/scripts/execstat.py +0 -0
  259. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/scripts/importtrace.py +0 -0
  260. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/srcheaders.py +0 -0
  261. {omdev-0.0.0.dev391/omdev/pyproject/resources → omdev-0.0.0.dev393/omdev/py/tools}/__init__.py +0 -0
  262. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/tools/importscan.py +0 -0
  263. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/py/tools/mkrelimp.py +0 -0
  264. {omdev-0.0.0.dev391/omdev/manifests → omdev-0.0.0.dev393/omdev/pyproject}/__init__.py +0 -0
  265. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pyproject/__main__.py +0 -0
  266. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pyproject/cexts.py +0 -0
  267. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pyproject/cli.py +0 -0
  268. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pyproject/configs.py +0 -0
  269. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pyproject/inject.py +0 -0
  270. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pyproject/pkg.py +0 -0
  271. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pyproject/reqs.py +0 -0
  272. {omdev-0.0.0.dev391/omdev/tokens → omdev-0.0.0.dev393/omdev/pyproject/resources}/__init__.py +0 -0
  273. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pyproject/resources/docker-dev.sh +0 -0
  274. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pyproject/resources/python.sh +0 -0
  275. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/pyproject/venvs.py +0 -0
  276. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/scripts/__init__.py +0 -0
  277. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/scripts/ci.py +0 -0
  278. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/scripts/interp.py +0 -0
  279. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/scripts/pyproject.py +0 -0
  280. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/scripts/slowcat.py +0 -0
  281. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/scripts/tmpexec.py +0 -0
  282. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tagstrings.py +0 -0
  283. {omdev-0.0.0.dev391/omdev/tools/antlr → omdev-0.0.0.dev393/omdev/tokens}/__init__.py +0 -0
  284. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tokens/all.py +0 -0
  285. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tokens/tokenizert.py +0 -0
  286. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tokens/utils.py +0 -0
  287. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/__init__.py +0 -0
  288. {omdev-0.0.0.dev391/omdev/tools/git → omdev-0.0.0.dev393/omdev/tools/antlr}/__init__.py +0 -0
  289. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/antlr/__main__.py +0 -0
  290. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/antlr/cli.py +0 -0
  291. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/antlr/consts.py +0 -0
  292. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/antlr/gen.py +0 -0
  293. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/cloc.py +0 -0
  294. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/diff.py +0 -0
  295. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/doc.py +0 -0
  296. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/docker.py +0 -0
  297. {omdev-0.0.0.dev391/omdev/tools/json → omdev-0.0.0.dev393/omdev/tools/git}/__init__.py +0 -0
  298. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/git/__main__.py +0 -0
  299. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/git/cli.py +0 -0
  300. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/git/cloning.py +0 -0
  301. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/git/consts.py +0 -0
  302. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/git/messages.py +0 -0
  303. {omdev-0.0.0.dev391/omdev/tools/jsonview → omdev-0.0.0.dev393/omdev/tools/json}/__init__.py +0 -0
  304. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/json/__main__.py +0 -0
  305. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/json/cli.py +0 -0
  306. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/json/formats.py +0 -0
  307. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/json/io.py +0 -0
  308. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/json/parsing.py +0 -0
  309. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/json/processing.py +0 -0
  310. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/json/rendering.py +0 -0
  311. {omdev-0.0.0.dev391/omdev/tools/jsonview/resources → omdev-0.0.0.dev393/omdev/tools/jsonview}/__init__.py +0 -0
  312. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/jsonview/__main__.py +0 -0
  313. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/jsonview/cli.py +0 -0
  314. {omdev-0.0.0.dev391/omdev/tools/pawk → omdev-0.0.0.dev393/omdev/tools/jsonview/resources}/__init__.py +0 -0
  315. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  316. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  317. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/linehisto.py +0 -0
  318. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/mkenv.py +0 -0
  319. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/notebook.py +0 -0
  320. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/pawk/__main__.py +0 -0
  321. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/pawk/pawk.py +0 -0
  322. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/pip.py +0 -0
  323. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/prof.py +0 -0
  324. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/qr.py +0 -0
  325. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/shadow.py +0 -0
  326. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/shell.py +0 -0
  327. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev/tools/sqlrepl.py +0 -0
  328. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev.egg-info/dependency_links.txt +0 -0
  329. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev.egg-info/entry_points.txt +0 -0
  330. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/omdev.egg-info/top_level.txt +0 -0
  331. {omdev-0.0.0.dev391 → omdev-0.0.0.dev393}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev391
3
+ Version: 0.0.0.dev393
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omlish==0.0.0.dev391
17
+ Requires-Dist: omlish==0.0.0.dev393
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.1; extra == "all"
20
20
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -122,6 +122,17 @@
122
122
  }
123
123
  }
124
124
  },
125
+ {
126
+ "module": ".manifests.tests.packages.foo.fargles",
127
+ "attr": "_SIMPLE_THINGY",
128
+ "file": "omdev/manifests/tests/packages/foo/fargles.py",
129
+ "line": 4,
130
+ "value": {
131
+ "$.manifests.tests.packages.foo.thingies.manifests.SimpleThingyManifest": {
132
+ "what": "fargles"
133
+ }
134
+ }
135
+ },
125
136
  {
126
137
  "module": ".precheck.__main__",
127
138
  "attr": "_CLI_MODULE",
@@ -1,4 +1,5 @@
1
1
  # ruff: noqa: UP006 UP007 UP045
2
+ # @omlish-lite
2
3
  """
3
4
  TODO:
4
5
  - verify classes instantiate
@@ -6,6 +7,10 @@ TODO:
6
7
  - roundtrip flexibility regarding json-ness - tuples vs lists vs sets vs frozensets etc
7
8
  - kill _MANIFEST_GLOBAL_PATS lol, ast walk
8
9
  - garbage skip_pat doesn't handle multiline decos, etc
10
+ - relative paths
11
+ - is this lite? or not?
12
+ - can this run externally? or not? what does it have to import?
13
+ - has to import manifest classes, but not modules with manifest magics
9
14
 
10
15
  See (entry_points):
11
16
  - https://github.com/pytest-dev/pluggy/blob/main/src/pluggy/_manager.py#L405
@@ -44,6 +49,8 @@ from .dumping import _ModuleManifestDumper
44
49
 
45
50
  T = ta.TypeVar('T')
46
51
 
52
+ ManifestDumperTarget = ta.Union['InlineManifestDumperTarget', 'AttrManifestDumperTarget'] # ta.TypeAlias
53
+
47
54
 
48
55
  ##
49
56
 
@@ -87,45 +94,56 @@ _INLINE_MANIFEST_CLS_NAME_PAT = re.compile(r'^(?P<cls_name>[_a-zA-Z][_a-zA-Z0-9.
87
94
  ##
88
95
 
89
96
 
97
+ class InlineManifestDumperTarget(ta.TypedDict):
98
+ origin: ta.Mapping[str, ta.Any]
99
+ kind: ta.Literal['inline']
100
+ cls_mod_name: str
101
+ cls_qualname: str
102
+ init_src: str
103
+ kwargs: ta.Mapping[str, ta.Any]
104
+
105
+
106
+ class AttrManifestDumperTarget(ta.TypedDict):
107
+ origin: ta.Mapping[str, ta.Any]
108
+ kind: ta.Literal['attr']
109
+ attr: str
110
+
111
+
112
+ ##
113
+
114
+
90
115
  @cached_nullary
91
- def _payload_src() -> str:
116
+ def _module_manifest_dumper_payload_src() -> str:
92
117
  return inspect.getsource(_ModuleManifestDumper)
93
118
 
94
119
 
95
120
  class ManifestBuilder:
96
121
  def __init__(
97
122
  self,
98
- base: str,
123
+ base_dir: str,
99
124
  concurrency: int = 8,
100
125
  *,
101
- write: bool = False,
126
+ subprocess_kwargs: ta.Optional[ta.Mapping[str, ta.Any]] = None,
127
+ module_dumper_payload_src: ta.Optional[str] = None,
102
128
  ) -> None:
103
129
  super().__init__()
104
130
 
105
- self._base = base
131
+ self._base_dir = base_dir
132
+ self._subprocess_kwargs = subprocess_kwargs
133
+ self._module_dumper_payload_src = module_dumper_payload_src
134
+
106
135
  self._sem = asyncio.Semaphore(concurrency)
107
- self._write = write
108
136
 
109
- async def _spawn(self, fn: ta.Callable[..., ta.Awaitable[T]], *args: ta.Any, **kwargs: ta.Any) -> T:
110
- await self._sem.acquire()
111
- try:
112
- try:
113
- return await fn(*args, **kwargs)
114
- except Exception: # noqa
115
- log.exception('Exception in task: %s, %r, %r', fn, args, kwargs)
116
- raise
117
- finally:
118
- self._sem.release()
137
+ #
119
138
 
120
- async def build_module_manifests(
121
- self,
122
- file: str,
123
- *,
124
- shell_wrap: bool = True,
125
- warn_threshold_s: ta.Optional[float] = 1.,
126
- ) -> ta.Sequence[Manifest]:
127
- log.info('Extracting manifests from file %s', file)
139
+ @dc.dataclass(frozen=True)
140
+ class FileModule:
141
+ file: str
142
+
143
+ mod_name: str
144
+ mod_base: str
128
145
 
146
+ def build_file_module(self, file: str) -> FileModule:
129
147
  if not file.endswith('.py'):
130
148
  raise Exception(file)
131
149
 
@@ -134,31 +152,41 @@ class ManifestBuilder:
134
152
  if mod_base != (first_dir := file.split(os.path.sep)[0]):
135
153
  raise Exception(f'Unexpected module base: {mod_base=} != {first_dir=}')
136
154
 
137
- with open(os.path.join(self._base, file)) as f: # noqa
155
+ return ManifestBuilder.FileModule(
156
+ file=file,
157
+
158
+ mod_name=mod_name,
159
+ mod_base=mod_base,
160
+ )
161
+
162
+ #
163
+
164
+ def collect_module_manifest_targets(self, fm: FileModule) -> ta.List[ManifestDumperTarget]:
165
+ with open(os.path.join(self._base_dir, fm.file)) as f: # noqa
138
166
  src = f.read()
139
167
 
140
168
  lines = src.splitlines(keepends=True)
141
169
 
142
170
  def prepare(s: str) -> ta.Any:
143
171
  if s.startswith('$.'):
144
- s = f'{mod_base}.{s[2:]}'
172
+ s = f'{fm.mod_base}.{s[2:]}'
145
173
  return magic.py_compile_magic_preparer(s)
146
174
 
147
175
  magics = magic.find_magic(
148
176
  magic.PY_MAGIC_STYLE,
149
177
  lines,
150
- file=file,
178
+ file=fm.file,
151
179
  keys={MANIFEST_MAGIC_KEY},
152
180
  preparer=prepare,
153
181
  )
154
182
 
155
183
  origins: ta.List[ManifestOrigin] = []
156
- targets: ta.List[dict] = []
184
+ targets: ta.List[ManifestDumperTarget] = []
157
185
  for m in magics:
158
186
  if m.body:
159
187
  body = m.body
160
188
  if body.startswith('$.'):
161
- body = f'{mod_base}.{body[2:]}'
189
+ body = f'{fm.mod_base}.{body[2:]}'
162
190
 
163
191
  pat_match = check.not_none(_INLINE_MANIFEST_CLS_NAME_PAT.match(body))
164
192
  cls_name = check.non_empty_str(pat_match.groupdict()['cls_name'])
@@ -184,15 +212,15 @@ class ManifestBuilder:
184
212
  if issubclass(cls, ModAttrManifest):
185
213
  attr_name = extract_manifest_target_name(lines, m.end_line)
186
214
  inl_kw.update({
187
- 'mod_name': mod_name,
215
+ 'mod_name': fm.mod_name,
188
216
  'attr_name': attr_name,
189
217
  })
190
218
 
191
219
  origin = ManifestOrigin(
192
- module='.'.join(['', *mod_name.split('.')[1:]]),
220
+ module='.'.join(['', *fm.mod_name.split('.')[1:]]),
193
221
  attr=None,
194
222
 
195
- file=file,
223
+ file=fm.file,
196
224
  line=m.start_line,
197
225
  )
198
226
 
@@ -210,10 +238,10 @@ class ManifestBuilder:
210
238
  attr_name = extract_manifest_target_name(lines, m.end_line)
211
239
 
212
240
  origin = ManifestOrigin(
213
- module='.'.join(['', *mod_name.split('.')[1:]]),
241
+ module='.'.join(['', *fm.mod_name.split('.')[1:]]),
214
242
  attr=attr_name,
215
243
 
216
- file=file,
244
+ file=fm.file,
217
245
  line=m.start_line,
218
246
  )
219
247
 
@@ -230,9 +258,27 @@ class ManifestBuilder:
230
258
  if (dups := [k for k, v in collections.Counter(o.attr for o in origins if o.attr is not None).items() if v > 1]): # noqa
231
259
  raise Exception(f'Duplicate attrs: {dups}')
232
260
 
261
+ return targets
262
+
263
+ #
264
+
265
+ async def _dump_module_manifests(
266
+ self,
267
+ fm: FileModule,
268
+ targets: ta.Sequence[ManifestDumperTarget],
269
+ *,
270
+ shell_wrap: bool = True,
271
+ warn_threshold_s: ta.Optional[float] = 1.,
272
+ ):
273
+ dumper_payload_src: str
274
+ if self._module_dumper_payload_src is not None:
275
+ dumper_payload_src = self._module_dumper_payload_src
276
+ else:
277
+ dumper_payload_src = _module_manifest_dumper_payload_src()
278
+
233
279
  subproc_src = '\n\n'.join([
234
- _payload_src(),
235
- f'_ModuleManifestDumper({mod_name!r})({", ".join(repr(tgt) for tgt in targets)})\n',
280
+ dumper_payload_src,
281
+ f'_ModuleManifestDumper({fm.mod_name!r})({", ".join(repr(tgt) for tgt in targets)})\n',
236
282
  ])
237
283
 
238
284
  args = [
@@ -246,7 +292,12 @@ class ManifestBuilder:
246
292
 
247
293
  start_time = time.time()
248
294
 
249
- proc = await asyncio.create_subprocess_exec(*args, stdout=subprocess.PIPE)
295
+ proc = await asyncio.create_subprocess_exec(
296
+ *args,
297
+ stdout=subprocess.PIPE,
298
+ **(self._subprocess_kwargs or {}),
299
+ )
300
+
250
301
  subproc_out, _ = await proc.communicate()
251
302
  if proc.returncode:
252
303
  raise Exception('Subprocess failed')
@@ -254,17 +305,20 @@ class ManifestBuilder:
254
305
  end_time = time.time()
255
306
 
256
307
  if warn_threshold_s is not None and (elapsed_time := (end_time - start_time)) >= warn_threshold_s:
257
- log.warning('Manifest extraction took a long time: %s, %.2f s', file, elapsed_time)
308
+ log.warning('Manifest extraction took a long time: %s, %.2f s', fm.file, elapsed_time)
258
309
 
259
310
  sp_lines = subproc_out.decode().strip().splitlines()
260
311
  if len(sp_lines) != 1:
261
312
  raise Exception('Unexpected subprocess output')
262
313
 
263
314
  sp_outs = json.loads(sp_lines[0])
264
- # FIXME:
265
- # if set(dct) != set(attrs):
266
- # raise Exception('Unexpected subprocess output keys')
315
+ return sp_outs
267
316
 
317
+ def _process_module_dump_output(
318
+ self,
319
+ fm: FileModule,
320
+ sp_outs: ta.Sequence[ta.Mapping[str, ta.Any]],
321
+ ) -> ta.List[Manifest]:
268
322
  out: ta.List[Manifest] = []
269
323
  for sp_out in sp_outs:
270
324
  value = sp_out['value']
@@ -278,7 +332,7 @@ class ManifestBuilder:
278
332
 
279
333
  [(key, value_dct)] = value.items()
280
334
  kb, _, kr = key[1:].partition('.') # noqa
281
- if kb == mod_base: # noqa
335
+ if kb == fm.mod_base: # noqa
282
336
  key = f'$.{kr}'
283
337
  value = {key: value_dct}
284
338
 
@@ -289,11 +343,45 @@ class ManifestBuilder:
289
343
 
290
344
  return out
291
345
 
346
+ #
347
+
348
+ async def build_module_manifests(self, file: str) -> ta.Sequence[Manifest]:
349
+ log.info('Extracting manifests from file %s', file)
350
+
351
+ fm = self.build_file_module(file)
352
+
353
+ targets = self.collect_module_manifest_targets(fm)
354
+
355
+ sp_outs = await self._dump_module_manifests(fm, targets)
356
+
357
+ # FIXME:
358
+ # if set(dct) != set(attrs):
359
+ # raise Exception('Unexpected subprocess output keys')
360
+
361
+ out = self._process_module_dump_output(fm, sp_outs)
362
+
363
+ return out
364
+
365
+ #
366
+
367
+ async def _spawn(self, fn: ta.Callable[..., ta.Awaitable[T]], *args: ta.Any, **kwargs: ta.Any) -> T:
368
+ await self._sem.acquire()
369
+ try:
370
+ try:
371
+ return await fn(*args, **kwargs)
372
+ except Exception: # noqa
373
+ log.exception('Exception in task: %s, %r, %r', fn, args, kwargs)
374
+ raise
375
+ finally:
376
+ self._sem.release()
377
+
292
378
  async def build_package_manifests(
293
379
  self,
294
380
  name: str,
381
+ *,
382
+ write: bool = False,
295
383
  ) -> ta.List[Manifest]:
296
- pkg_dir = os.path.join(self._base, name)
384
+ pkg_dir = os.path.join(self._base_dir, name)
297
385
  if not os.path.isdir(pkg_dir) or not os.path.isfile(os.path.join(pkg_dir, '__init__.py')):
298
386
  raise Exception(pkg_dir)
299
387
 
@@ -305,12 +393,12 @@ class ManifestBuilder:
305
393
  manifests: ta.List[Manifest] = list(itertools.chain.from_iterable(await asyncio.gather(*[
306
394
  self._spawn(
307
395
  self.build_module_manifests,
308
- os.path.relpath(file, self._base),
396
+ os.path.relpath(file, self._base_dir),
309
397
  )
310
398
  for file in files
311
399
  ])))
312
400
 
313
- if self._write:
401
+ if write:
314
402
  with open(os.path.join(pkg_dir, '.manifests.json'), 'w') as f: # noqa
315
403
  f.write(json_dumps_pretty([dc.asdict(m) for m in manifests]))
316
404
  f.write('\n')
@@ -323,9 +411,9 @@ class ManifestBuilder:
323
411
 
324
412
  def check_package_manifests(
325
413
  name: str,
326
- base: str,
414
+ base_dir: str,
327
415
  ) -> None:
328
- pkg_dir = os.path.join(base, name)
416
+ pkg_dir = os.path.join(base_dir, name)
329
417
  if not os.path.isdir(pkg_dir) or not os.path.isfile(os.path.join(pkg_dir, '__init__.py')):
330
418
  raise Exception(pkg_dir)
331
419
 
@@ -1,4 +1,5 @@
1
1
  # ruff: noqa: UP006 UP007 UP037 UP045
2
+ # @omlish-lite
2
3
  import typing as ta
3
4
 
4
5
 
@@ -6,10 +7,19 @@ import typing as ta
6
7
 
7
8
 
8
9
  class _ModuleManifestDumper:
9
- def __init__(self, spec: str) -> None:
10
+ def __init__(
11
+ self,
12
+ spec: str,
13
+ *,
14
+ output: 'ta.Optional[ta.Callable[[str], None]]' = None,
15
+ ) -> None:
10
16
  super().__init__()
11
17
 
12
18
  self._spec = spec
19
+ if output is None:
20
+ output = print
21
+ self._output = output
22
+
13
23
  self._imported_mod: 'ta.Optional[ta.Any]' = None
14
24
 
15
25
  def _mod(self) -> 'ta.Any':
@@ -32,7 +42,10 @@ class _ModuleManifestDumper:
32
42
  def __missing__(self, key):
33
43
  return self.__get_missing(key)
34
44
 
35
- def __call__(self, *targets: dict) -> None:
45
+ def __call__(
46
+ self,
47
+ *targets: dict, # .build.ManifestDumperTarget
48
+ ) -> None:
36
49
  import collections.abc
37
50
  import dataclasses as dc # noqa
38
51
  import functools
@@ -115,4 +128,4 @@ class _ModuleManifestDumper:
115
128
  })
116
129
 
117
130
  out_json = json.dumps(out, indent=None, separators=(',', ':'))
118
- print(out_json)
131
+ self._output(out_json)
@@ -1,4 +1,5 @@
1
1
  # ruff: noqa: UP006 UP007 UP045
2
+ # @omlish-lite
2
3
  import argparse
3
4
  import asyncio
4
5
  import dataclasses as dc
@@ -8,14 +9,14 @@ import os.path
8
9
  from omlish.lite.json import json_dumps_pretty
9
10
  from omlish.logs.standard import configure_standard_logging
10
11
 
11
- from .build import ManifestBuilder
12
- from .build import check_package_manifests
12
+ from .building import ManifestBuilder
13
+ from .building import check_package_manifests
13
14
 
14
15
 
15
16
  ##
16
17
 
17
18
 
18
- def _get_base(args) -> str:
19
+ def _get_base_dir(args) -> str:
19
20
  if args.base is not None:
20
21
  base = args.base
21
22
  else:
@@ -27,18 +28,20 @@ def _get_base(args) -> str:
27
28
 
28
29
 
29
30
  def _gen_cmd(args) -> None:
30
- base = _get_base(args)
31
+ base_dir = _get_base_dir(args)
31
32
 
32
33
  jobs = args.jobs or int(max(mp.cpu_count() // 1.5, 1))
33
34
  builder = ManifestBuilder(
34
- base,
35
+ base_dir,
35
36
  jobs,
36
- write=args.write or False,
37
37
  )
38
38
 
39
39
  async def do():
40
40
  return await asyncio.gather(*[
41
- builder.build_package_manifests(pkg)
41
+ builder.build_package_manifests(
42
+ pkg,
43
+ write=bool(args.write),
44
+ )
42
45
  for pkg in args.package
43
46
  ])
44
47
 
@@ -49,12 +52,12 @@ def _gen_cmd(args) -> None:
49
52
 
50
53
 
51
54
  def _check_cmd(args) -> None:
52
- base = _get_base(args)
55
+ base_dir = _get_base_dir(args)
53
56
 
54
57
  for pkg in args.package:
55
58
  check_package_manifests(
56
59
  pkg,
57
- base,
60
+ base_dir,
58
61
  )
59
62
 
60
63
 
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev391
3
+ Version: 0.0.0.dev393
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omlish==0.0.0.dev391
17
+ Requires-Dist: omlish==0.0.0.dev393
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.1; extra == "all"
20
20
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -187,7 +187,7 @@ omdev/magic/prepare.py
187
187
  omdev/magic/styles.py
188
188
  omdev/manifests/__init__.py
189
189
  omdev/manifests/__main__.py
190
- omdev/manifests/build.py
190
+ omdev/manifests/building.py
191
191
  omdev/manifests/dumping.py
192
192
  omdev/manifests/main.py
193
193
  omdev/mypy/__init__.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev391
1
+ omlish==0.0.0.dev393
2
2
 
3
3
  [all]
4
4
  black~=25.1
@@ -13,7 +13,7 @@ urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = 'BSD-3-Clause'
14
14
  readme = 'README.md'
15
15
  requires-python = '>=3.13'
16
- version = '0.0.0.dev391'
16
+ version = '0.0.0.dev393'
17
17
  classifiers = [
18
18
  'Development Status :: 2 - Pre-Alpha',
19
19
  'Intended Audience :: Developers',
@@ -24,7 +24,7 @@ classifiers = [
24
24
  ]
25
25
  description = 'omdev'
26
26
  dependencies = [
27
- 'omlish == 0.0.0.dev391',
27
+ 'omlish == 0.0.0.dev393',
28
28
  ]
29
29
 
30
30
  [project.optional-dependencies]
@@ -1 +0,0 @@
1
- # @omlish-lite
File without changes
File without changes
File without changes