omdev 0.0.0.dev220__tar.gz → 0.0.0.dev222__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 (232) hide show
  1. {omdev-0.0.0.dev220/omdev.egg-info → omdev-0.0.0.dev222}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/gen.py +2 -2
  3. omdev-0.0.0.dev222/omdev/oci/building.py +123 -0
  4. omdev-0.0.0.dev222/omdev/oci/data.py +127 -0
  5. omdev-0.0.0.dev222/omdev/oci/datarefs.py +98 -0
  6. omdev-0.0.0.dev222/omdev/oci/loading.py +122 -0
  7. omdev-0.0.0.dev222/omdev/oci/media.py +159 -0
  8. omdev-0.0.0.dev222/omdev/oci/repositories.py +83 -0
  9. omdev-0.0.0.dev222/omdev/tools/pawk/__init__.py +0 -0
  10. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222/omdev.egg-info}/PKG-INFO +2 -2
  11. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev.egg-info/SOURCES.txt +7 -0
  12. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev.egg-info/requires.txt +1 -1
  13. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/pyproject.toml +2 -2
  14. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/LICENSE +0 -0
  15. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/MANIFEST.in +0 -0
  16. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/README.rst +0 -0
  17. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/.manifests.json +0 -0
  18. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/__about__.py +0 -0
  19. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/__init__.py +0 -0
  20. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/__init__.py +0 -0
  21. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/__main__.py +0 -0
  22. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/imports.py +0 -0
  23. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/main.py +0 -0
  24. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/manifests.py +0 -0
  25. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/resources.py +0 -0
  26. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/srcfiles.py +0 -0
  27. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/strip.py +0 -0
  28. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/types.py +0 -0
  29. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/amalg/typing.py +0 -0
  30. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/antlr/__init__.py +0 -0
  31. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/antlr/consts.py +0 -0
  32. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/antlr/gen.py +0 -0
  33. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/bracepy.py +0 -0
  34. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/__init__.py +0 -0
  35. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/compute/__init__.py +0 -0
  36. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/compute/cache.py +0 -0
  37. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/compute/contexts.py +0 -0
  38. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/compute/currents.py +0 -0
  39. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/compute/fns.py +0 -0
  40. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/compute/resolvers.py +0 -0
  41. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/compute/storage.py +0 -0
  42. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/compute/types.py +0 -0
  43. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/data/__init__.py +0 -0
  44. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/data/actions.py +0 -0
  45. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/data/cache.py +0 -0
  46. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/data/consts.py +0 -0
  47. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/data/defaults.py +0 -0
  48. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/data/manifests.py +0 -0
  49. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cache/data/specs.py +0 -0
  50. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cc/__init__.py +0 -0
  51. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cc/__main__.py +0 -0
  52. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cc/cdeps.py +0 -0
  53. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cc/cdeps.toml +0 -0
  54. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cc/cli.py +0 -0
  55. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/__init__.py +0 -0
  56. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_boilerplate.cc +0 -0
  57. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/LICENSE +0 -0
  58. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/__init__.py +0 -0
  59. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/build_ext.py +0 -0
  60. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  61. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  62. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/compilers/options.py +0 -0
  63. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  64. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/dir_util.py +0 -0
  65. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/errors.py +0 -0
  66. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/extension.py +0 -0
  67. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/file_util.py +0 -0
  68. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/modified.py +0 -0
  69. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/spawn.py +0 -0
  70. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/sysconfig.py +0 -0
  71. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/util.py +0 -0
  72. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/_distutils/version.py +0 -0
  73. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/build.py +0 -0
  74. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/cmake.py +0 -0
  75. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/importhook.py +0 -0
  76. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/magic.py +0 -0
  77. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cexts/scan.py +0 -0
  78. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/__init__.py +0 -0
  79. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/__main__.py +0 -0
  80. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/cache.py +0 -0
  81. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/ci.py +0 -0
  82. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/cli.py +0 -0
  83. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/compose.py +0 -0
  84. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/consts.py +0 -0
  85. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/docker.py +0 -0
  86. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/github/__init__.py +0 -0
  87. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/github/api.py +0 -0
  88. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/github/bootstrap.py +0 -0
  89. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/github/cache.py +0 -0
  90. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/github/cli.py +0 -0
  91. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/github/client.py +0 -0
  92. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/github/env.py +0 -0
  93. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/requirements.py +0 -0
  94. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/shell.py +0 -0
  95. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ci/utils.py +0 -0
  96. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/classdot.py +0 -0
  97. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cli/__init__.py +0 -0
  98. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cli/__main__.py +0 -0
  99. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cli/_pathhack.py +0 -0
  100. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cli/clicli.py +0 -0
  101. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cli/install.py +0 -0
  102. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cli/main.py +0 -0
  103. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cli/managers.py +0 -0
  104. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cli/types.py +0 -0
  105. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/clipboard/__init__.py +0 -0
  106. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/clipboard/clipboard.py +0 -0
  107. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/clipboard/darwin_cf.py +0 -0
  108. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/clipboard/linux_x11.py +0 -0
  109. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/cmake.py +0 -0
  110. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/findimports.py +0 -0
  111. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/git/__init__.py +0 -0
  112. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/git/revisions.py +0 -0
  113. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/git/shallow.py +0 -0
  114. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/git/status.py +0 -0
  115. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/imgur.py +0 -0
  116. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/__init__.py +0 -0
  117. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/__main__.py +0 -0
  118. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/cli.py +0 -0
  119. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/default.py +0 -0
  120. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/inject.py +0 -0
  121. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/inspect.py +0 -0
  122. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/providers/__init__.py +0 -0
  123. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/providers/base.py +0 -0
  124. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/providers/inject.py +0 -0
  125. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/providers/running.py +0 -0
  126. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/providers/standalone.py +0 -0
  127. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/providers/system.py +0 -0
  128. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/pyenv/__init__.py +0 -0
  129. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/pyenv/inject.py +0 -0
  130. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/pyenv/install.py +0 -0
  131. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/pyenv/provider.py +0 -0
  132. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/pyenv/pyenv.py +0 -0
  133. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/resolvers.py +0 -0
  134. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/types.py +0 -0
  135. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/uv/__init__.py +0 -0
  136. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/uv/inject.py +0 -0
  137. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/uv/provider.py +0 -0
  138. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/uv/uv.py +0 -0
  139. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/interp/venvs.py +0 -0
  140. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/magic/__init__.py +0 -0
  141. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/magic/__main__.py +0 -0
  142. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/magic/cli.py +0 -0
  143. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/magic/find.py +0 -0
  144. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/magic/magic.py +0 -0
  145. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/magic/prepare.py +0 -0
  146. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/magic/styles.py +0 -0
  147. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/manifests/__init__.py +0 -0
  148. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/manifests/__main__.py +0 -0
  149. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/manifests/build.py +0 -0
  150. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/manifests/main.py +0 -0
  151. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/mypy/__init__.py +0 -0
  152. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/mypy/debug.py +0 -0
  153. {omdev-0.0.0.dev220/omdev/packaging → omdev-0.0.0.dev222/omdev/oci}/__init__.py +0 -0
  154. {omdev-0.0.0.dev220/omdev/precheck → omdev-0.0.0.dev222/omdev/packaging}/__init__.py +0 -0
  155. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/packaging/marshal.py +0 -0
  156. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/packaging/names.py +0 -0
  157. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/packaging/requires.py +0 -0
  158. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/packaging/specifiers.py +0 -0
  159. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/packaging/versions.py +0 -0
  160. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pip.py +0 -0
  161. {omdev-0.0.0.dev220/omdev/ptk/apps → omdev-0.0.0.dev222/omdev/precheck}/__init__.py +0 -0
  162. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/precheck/__main__.py +0 -0
  163. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/precheck/base.py +0 -0
  164. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/precheck/git.py +0 -0
  165. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/precheck/lite.py +0 -0
  166. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/precheck/main.py +0 -0
  167. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/precheck/manifests.py +0 -0
  168. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/precheck/scripts.py +0 -0
  169. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ptk/__init__.py +0 -0
  170. {omdev-0.0.0.dev220/omdev/pycharm → omdev-0.0.0.dev222/omdev/ptk/apps}/__init__.py +0 -0
  171. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/ptk/apps/ncdu.py +0 -0
  172. {omdev-0.0.0.dev220/omdev/pyproject/resources → omdev-0.0.0.dev222/omdev/pycharm}/__init__.py +0 -0
  173. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pycharm/__main__.py +0 -0
  174. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pycharm/cli.py +0 -0
  175. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/__init__.py +0 -0
  176. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/__main__.py +0 -0
  177. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/cexts.py +0 -0
  178. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/cli.py +0 -0
  179. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/configs.py +0 -0
  180. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/inject.py +0 -0
  181. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/pkg.py +0 -0
  182. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/reqs.py +0 -0
  183. {omdev-0.0.0.dev220/omdev/tokens → omdev-0.0.0.dev222/omdev/pyproject/resources}/__init__.py +0 -0
  184. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/resources/docker-dev.sh +0 -0
  185. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/resources/python.sh +0 -0
  186. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/pyproject/venvs.py +0 -0
  187. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/revisions.py +0 -0
  188. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/scripts/__init__.py +0 -0
  189. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/scripts/bumpversion.py +0 -0
  190. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/scripts/ci.py +0 -0
  191. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/scripts/execrss.py +0 -0
  192. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/scripts/exectime.py +0 -0
  193. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/scripts/importtrace.py +0 -0
  194. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/scripts/interp.py +0 -0
  195. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/scripts/pyproject.py +0 -0
  196. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/scripts/slowcat.py +0 -0
  197. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/scripts/tmpexec.py +0 -0
  198. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/secrets.py +0 -0
  199. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tagstrings.py +0 -0
  200. {omdev-0.0.0.dev220/omdev/tools/json → omdev-0.0.0.dev222/omdev/tokens}/__init__.py +0 -0
  201. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tokens/all.py +0 -0
  202. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tokens/tokenizert.py +0 -0
  203. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tokens/utils.py +0 -0
  204. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/__init__.py +0 -0
  205. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/cloc.py +0 -0
  206. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/doc.py +0 -0
  207. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/docker.py +0 -0
  208. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/git.py +0 -0
  209. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/importscan.py +0 -0
  210. {omdev-0.0.0.dev220/omdev/tools/pawk → omdev-0.0.0.dev222/omdev/tools/json}/__init__.py +0 -0
  211. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/json/__main__.py +0 -0
  212. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/json/cli.py +0 -0
  213. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/json/formats.py +0 -0
  214. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/json/io.py +0 -0
  215. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/json/parsing.py +0 -0
  216. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/json/processing.py +0 -0
  217. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/json/rendering.py +0 -0
  218. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/linehisto.py +0 -0
  219. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/mkenv.py +0 -0
  220. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/mkrelimp.py +0 -0
  221. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/notebook.py +0 -0
  222. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/pawk/__main__.py +0 -0
  223. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/pawk/pawk.py +0 -0
  224. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/pip.py +0 -0
  225. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/prof.py +0 -0
  226. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/qr.py +0 -0
  227. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/tools/sqlrepl.py +0 -0
  228. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev/wheelfile.py +0 -0
  229. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev.egg-info/dependency_links.txt +0 -0
  230. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev.egg-info/entry_points.txt +0 -0
  231. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/omdev.egg-info/top_level.txt +0 -0
  232. {omdev-0.0.0.dev220 → omdev-0.0.0.dev222}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omdev
3
- Version: 0.0.0.dev220
3
+ Version: 0.0.0.dev222
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.dev220
15
+ Requires-Dist: omlish==0.0.0.dev222
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -4,8 +4,8 @@ import textwrap
4
4
  import typing as ta
5
5
 
6
6
  from omlish import cached
7
- from omlish import collections as col
8
7
  from omlish import lang
8
+ from omlish.algorithm import all as alg
9
9
  from omlish.lite.runtime import LITE_REQUIRED_PYTHON_VERSION
10
10
 
11
11
  from ..tokens import all as tks
@@ -152,7 +152,7 @@ class AmalgGenerator:
152
152
 
153
153
  ##
154
154
 
155
- ts = list(col.toposort({ # noqa
155
+ ts = list(alg.toposort({ # noqa
156
156
  f.path: {mp for i in f.imports if (mp := i.mod_path) is not None}
157
157
  for f in src_files.values()
158
158
  }))
@@ -0,0 +1,123 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
3
+ import dataclasses as dc
4
+ import typing as ta
5
+
6
+ from omlish.lite.check import check
7
+ from omlish.lite.json import json_dumps_compact
8
+ from omlish.lite.marshal import marshal_obj
9
+
10
+ from .data import OciDataclass
11
+ from .data import OciImageConfig
12
+ from .data import OciImageIndex
13
+ from .data import OciImageLayer
14
+ from .data import OciImageManifest
15
+ from .datarefs import BytesOciDataRef
16
+ from .datarefs import OciDataRef
17
+ from .datarefs import OciDataRefInfo
18
+ from .media import OCI_IMAGE_LAYER_KIND_MEDIA_TYPES
19
+ from .media import OciMediaDataclass
20
+ from .media import OciMediaDescriptor
21
+ from .media import OciMediaImageConfig
22
+ from .media import OciMediaImageIndex
23
+ from .media import OciMediaImageManifest
24
+
25
+
26
+ ##
27
+
28
+
29
+ class OciRepositoryBuilder:
30
+ def __init__(self) -> None:
31
+ super().__init__()
32
+
33
+ self._blobs: ta.Dict[str, OciDataRef] = {}
34
+
35
+ def get_blobs(self) -> ta.Dict[str, OciDataRef]:
36
+ return dict(self._blobs)
37
+
38
+ def add_blob(
39
+ self,
40
+ r: OciDataRef,
41
+ ri: ta.Optional[OciDataRefInfo] = None,
42
+ ) -> None:
43
+ if ri is None:
44
+ ri = OciDataRefInfo(r)
45
+ if ri.digest() in self._blobs:
46
+ raise KeyError(ri.digest())
47
+ self._blobs[ri.digest()] = r
48
+
49
+ def marshal_media(self, obj: OciMediaDataclass) -> bytes:
50
+ check.isinstance(obj, OciMediaDataclass)
51
+ m = marshal_obj(obj)
52
+ j = json_dumps_compact(m)
53
+ b = j.encode('utf-8')
54
+ return b
55
+
56
+ def add_media(self, obj: OciMediaDataclass) -> OciMediaDescriptor:
57
+ b = self.marshal_media(obj)
58
+
59
+ r = BytesOciDataRef(b)
60
+ ri = OciDataRefInfo(r)
61
+ self.add_blob(r, ri)
62
+
63
+ return OciMediaDescriptor(
64
+ media_type=getattr(obj, 'media_type'),
65
+ digest=ri.digest(),
66
+ size=ri.size(),
67
+ )
68
+
69
+ def to_media(self, obj: OciDataclass) -> ta.Union[OciMediaDataclass, OciMediaDescriptor]:
70
+ def make_kw(*exclude):
71
+ return {
72
+ a: v
73
+ for f in dc.fields(obj)
74
+ if (a := f.name) not in exclude
75
+ for v in [getattr(obj, a)]
76
+ if v is not None
77
+ }
78
+
79
+ if isinstance(obj, OciImageIndex):
80
+ return OciMediaImageIndex(
81
+ **make_kw('manifests'),
82
+ manifests=[
83
+ self.add_data(m)
84
+ for m in obj.manifests
85
+ ],
86
+ )
87
+
88
+ elif isinstance(obj, OciImageManifest):
89
+ return OciMediaImageManifest(
90
+ **make_kw('config', 'layers'),
91
+ config=self.add_data(obj.config),
92
+ layers=[
93
+ self.add_data(l)
94
+ for l in obj.layers
95
+ ],
96
+ )
97
+
98
+ elif isinstance(obj, OciImageLayer):
99
+ ri = OciDataRefInfo(obj.data)
100
+ self.add_blob(obj.data, ri)
101
+ return OciMediaDescriptor(
102
+ media_type=OCI_IMAGE_LAYER_KIND_MEDIA_TYPES[obj.kind],
103
+ digest=ri.digest(),
104
+ size=ri.size(),
105
+ )
106
+
107
+ elif isinstance(obj, OciImageConfig):
108
+ return OciMediaImageConfig(**make_kw())
109
+
110
+ else:
111
+ raise TypeError(obj)
112
+
113
+ def add_data(self, obj: OciDataclass) -> OciMediaDescriptor:
114
+ ret = self.to_media(obj)
115
+
116
+ if isinstance(ret, OciMediaDataclass):
117
+ return self.add_media(ret)
118
+
119
+ elif isinstance(ret, OciMediaDescriptor):
120
+ return ret
121
+
122
+ else:
123
+ raise TypeError(ret)
@@ -0,0 +1,127 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
3
+ import abc
4
+ import dataclasses as dc
5
+ import enum
6
+ import typing as ta
7
+
8
+ from omlish.lite.marshal import OBJ_MARSHALER_FIELD_KEY
9
+ from omlish.lite.marshal import OBJ_MARSHALER_OMIT_IF_NONE
10
+
11
+ from .datarefs import OciDataRef
12
+
13
+
14
+ ##
15
+
16
+
17
+ @dc.dataclass()
18
+ class OciDataclass(abc.ABC): # noqa
19
+ pass
20
+
21
+
22
+ ##
23
+
24
+
25
+ @dc.dataclass()
26
+ class OciImageIndex(OciDataclass):
27
+ manifests: ta.List[ta.Union['OciImageIndex', 'OciImageManifest']]
28
+
29
+ annotations: ta.Optional[ta.Dict[str, str]] = None
30
+
31
+
32
+ #
33
+
34
+
35
+ @dc.dataclass()
36
+ class OciImageManifest(OciDataclass):
37
+ config: 'OciImageConfig'
38
+
39
+ layers: ta.List['OciImageLayer']
40
+
41
+ annotations: ta.Optional[ta.Dict[str, str]] = None
42
+
43
+ #
44
+
45
+
46
+ @dc.dataclass()
47
+ class OciImageLayer(OciDataclass):
48
+ class Kind(enum.Enum):
49
+ TAR = enum.auto()
50
+ TAR_GZIP = enum.auto()
51
+ TAR_ZSTD = enum.auto()
52
+
53
+ kind: Kind
54
+
55
+ data: OciDataRef
56
+
57
+
58
+ #
59
+
60
+
61
+ @dc.dataclass()
62
+ class OciImageConfig(OciDataclass):
63
+ """https://github.com/opencontainers/image-spec/blob/92353b0bee778725c617e7d57317b568a7796bd0/config.md"""
64
+
65
+ architecture: str
66
+ os: str
67
+
68
+ @dc.dataclass()
69
+ class RootFs:
70
+ type: str
71
+ diff_ids: ta.List[str]
72
+
73
+ rootfs: RootFs
74
+
75
+ #
76
+
77
+ created: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
78
+ author: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
79
+ os_version: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_FIELD_KEY: 'os.version', OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
80
+ os_features: ta.Optional[ta.List[str]] = dc.field(default=None, metadata={OBJ_MARSHALER_FIELD_KEY: 'os.features', OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
81
+ variant: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
82
+
83
+ """
84
+ config object, OPTIONAL
85
+ User string, OPTIONAL
86
+ ExposedPorts object, OPTIONAL
87
+ Env array of strings, OPTIONAL
88
+ Entrypoint array of strings, OPTIONAL
89
+ Cmd array of strings, OPTIONAL
90
+ Volumes object, OPTIONAL
91
+ WorkingDir string, OPTIONAL
92
+ Labels object, OPTIONAL
93
+ StopSignal string, OPTIONAL
94
+ ArgsEscaped boolean, OPTIONAL
95
+ Memory integer, OPTIONAL
96
+ MemorySwap integer, OPTIONAL
97
+ CpuShares integer, OPTIONAL
98
+ Healthcheck object, OPTIONAL
99
+ """
100
+ config: ta.Optional[ta.Dict[str, ta.Any]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
101
+
102
+ @dc.dataclass()
103
+ class History:
104
+ created: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
105
+ author: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
106
+ created_by: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
107
+ comment: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
108
+ empty_layer: ta.Optional[bool] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
109
+
110
+ history: ta.Optional[ta.List[History]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
111
+
112
+
113
+ ##
114
+
115
+
116
+ def is_empty_oci_dataclass(obj: OciDataclass) -> bool:
117
+ if not isinstance(obj, OciDataclass):
118
+ raise TypeError(obj)
119
+
120
+ elif isinstance(obj, OciImageIndex):
121
+ return not obj.manifests
122
+
123
+ elif isinstance(obj, OciImageManifest):
124
+ return not obj.layers
125
+
126
+ else:
127
+ return False
@@ -0,0 +1,98 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
3
+ import abc
4
+ import dataclasses as dc
5
+ import hashlib
6
+ import io
7
+ import os.path
8
+ import shutil
9
+ import typing as ta
10
+
11
+ from omlish.lite.cached import cached_nullary
12
+
13
+
14
+ ##
15
+
16
+
17
+ @dc.dataclass(frozen=True)
18
+ class OciDataRef(abc.ABC): # noqa
19
+ pass
20
+
21
+
22
+ @dc.dataclass(frozen=True)
23
+ class BytesOciDataRef(OciDataRef):
24
+ data: bytes
25
+
26
+
27
+ @dc.dataclass(frozen=True)
28
+ class FileOciDataRef(OciDataRef):
29
+ path: str
30
+
31
+
32
+ ##
33
+
34
+
35
+ @dc.dataclass(frozen=True)
36
+ class OciDataRefInfo:
37
+ data: OciDataRef
38
+
39
+ @cached_nullary
40
+ def sha256(self) -> str:
41
+ if isinstance(self.data, FileOciDataRef):
42
+ with open(self.data.path, 'rb') as f:
43
+ return hashlib.file_digest(f, 'sha256').hexdigest() # noqa
44
+
45
+ elif isinstance(self.data, BytesOciDataRef):
46
+ return hashlib.sha256(self.data.data).hexdigest()
47
+
48
+ else:
49
+ raise TypeError(self.data)
50
+
51
+ @cached_nullary
52
+ def digest(self) -> str:
53
+ return f'sha256:{self.sha256()}'
54
+
55
+ @cached_nullary
56
+ def size(self) -> int:
57
+ if isinstance(self.data, FileOciDataRef):
58
+ return os.path.getsize(self.data.path)
59
+
60
+ elif isinstance(self.data, BytesOciDataRef):
61
+ return len(self.data.data)
62
+
63
+ else:
64
+ raise TypeError(self.data)
65
+
66
+
67
+ def write_oci_data_ref_to_file(
68
+ data: OciDataRef,
69
+ dst: str,
70
+ *,
71
+ symlink: bool = False,
72
+ ) -> None:
73
+ if isinstance(data, FileOciDataRef):
74
+ if symlink:
75
+ os.symlink(
76
+ os.path.relpath(data.path, os.path.dirname(dst)),
77
+ dst,
78
+ )
79
+ else:
80
+ shutil.copyfile(data.path, dst)
81
+
82
+ elif isinstance(data, BytesOciDataRef):
83
+ with open(dst, 'wb') as f:
84
+ f.write(data.data)
85
+
86
+ else:
87
+ raise TypeError(data)
88
+
89
+
90
+ def open_oci_data_ref(data: OciDataRef) -> ta.BinaryIO:
91
+ if isinstance(data, FileOciDataRef):
92
+ return open(data.path, 'rb')
93
+
94
+ elif isinstance(data, BytesOciDataRef):
95
+ return io.BytesIO(data.data)
96
+
97
+ else:
98
+ raise TypeError(data)
@@ -0,0 +1,122 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
3
+ import dataclasses as dc
4
+ import json
5
+ import typing as ta
6
+
7
+ from omlish.lite.check import check
8
+
9
+ from .data import OciImageConfig
10
+ from .data import OciImageIndex
11
+ from .data import OciImageLayer
12
+ from .data import OciImageManifest
13
+ from .data import is_empty_oci_dataclass
14
+ from .media import OCI_IMAGE_LAYER_KIND_MEDIA_TYPES_
15
+ from .media import OCI_MEDIA_FIELDS
16
+ from .media import OciMediaDescriptor
17
+ from .media import OciMediaImageConfig
18
+ from .media import OciMediaImageIndex
19
+ from .media import OciMediaImageManifest
20
+ from .media import unmarshal_oci_media_dataclass
21
+ from .repositories import OciRepository
22
+
23
+
24
+ T = ta.TypeVar('T')
25
+
26
+
27
+ ##
28
+
29
+
30
+ class OciRepositoryLoader:
31
+ def __init__(
32
+ self,
33
+ repo: OciRepository,
34
+ ) -> None:
35
+ super().__init__()
36
+
37
+ self._repo = repo
38
+
39
+ #
40
+
41
+ def load_object(
42
+ self,
43
+ data: bytes,
44
+ cls: ta.Type[T] = object, # type: ignore[assignment]
45
+ *,
46
+ media_type: ta.Optional[str] = None,
47
+ ) -> T:
48
+ text = data.decode('utf-8')
49
+ dct = json.loads(text)
50
+ obj = unmarshal_oci_media_dataclass(
51
+ dct,
52
+ media_type=media_type,
53
+ )
54
+ return check.isinstance(obj, cls)
55
+
56
+ def read_object(
57
+ self,
58
+ digest: str,
59
+ cls: ta.Type[T] = object, # type: ignore[assignment]
60
+ *,
61
+ media_type: ta.Optional[str] = None,
62
+ ) -> T:
63
+ data = self._repo.read_blob(digest)
64
+ return self.load_object(
65
+ data,
66
+ cls,
67
+ media_type=media_type,
68
+ )
69
+
70
+ def read_descriptor(
71
+ self,
72
+ desc: OciMediaDescriptor,
73
+ cls: ta.Type[T] = object, # type: ignore[assignment]
74
+ ) -> ta.Any:
75
+ return self.read_object(
76
+ desc.digest,
77
+ cls,
78
+ media_type=desc.media_type,
79
+ )
80
+
81
+ #
82
+
83
+ def from_media(self, obj: ta.Any) -> ta.Any:
84
+ def make_kw(*exclude):
85
+ return {
86
+ a: getattr(obj, a)
87
+ for f in dc.fields(obj)
88
+ if (a := f.name) not in OCI_MEDIA_FIELDS
89
+ and a not in exclude
90
+ }
91
+
92
+ if isinstance(obj, OciMediaImageConfig):
93
+ return OciImageConfig(**make_kw())
94
+
95
+ elif isinstance(obj, OciMediaImageManifest):
96
+ return OciImageManifest(
97
+ **make_kw('config', 'layers'),
98
+ config=self.from_media(self.read_descriptor(obj.config)),
99
+ layers=[
100
+ OciImageLayer(
101
+ kind=lk,
102
+ data=self._repo.ref_blob(l.digest),
103
+ )
104
+ for l in obj.layers
105
+ if (lk := OCI_IMAGE_LAYER_KIND_MEDIA_TYPES_.get(l.media_type)) is not None
106
+ ],
107
+ )
108
+
109
+ elif isinstance(obj, OciMediaImageIndex):
110
+ return OciImageIndex(
111
+ **make_kw('manifests'),
112
+ manifests=[
113
+ fm
114
+ for m in obj.manifests
115
+ if self._repo.contains_blob(m.digest)
116
+ for fm in [self.from_media(self.read_descriptor(m))]
117
+ if not is_empty_oci_dataclass(fm)
118
+ ],
119
+ )
120
+
121
+ else:
122
+ raise TypeError(obj)
@@ -0,0 +1,159 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
3
+ import abc
4
+ import dataclasses as dc
5
+ import typing as ta
6
+
7
+ from omlish.lite.check import check
8
+ from omlish.lite.marshal import OBJ_MARSHALER_FIELD_KEY
9
+ from omlish.lite.marshal import OBJ_MARSHALER_OMIT_IF_NONE
10
+ from omlish.lite.marshal import unmarshal_obj
11
+
12
+ from .data import OciImageConfig
13
+ from .data import OciImageLayer
14
+
15
+
16
+ ##
17
+
18
+
19
+ OCI_MEDIA_FIELDS: ta.Collection[str] = frozenset([
20
+ 'schema_version',
21
+ 'media_type',
22
+ ])
23
+
24
+
25
+ @dc.dataclass()
26
+ class OciMediaDataclass(abc.ABC): # noqa
27
+ SCHEMA_VERSION: ta.ClassVar[int]
28
+ MEDIA_TYPE: ta.ClassVar[str]
29
+
30
+ def __init_subclass__(cls, **kwargs: ta.Any) -> None:
31
+ super().__init_subclass__(**kwargs)
32
+ for a in OCI_MEDIA_FIELDS:
33
+ check.in_(a, cls.__dict__)
34
+
35
+
36
+ _REGISTERED_OCI_MEDIA_DATACLASSES: ta.Dict[str, ta.Type[OciMediaDataclass]] = {}
37
+
38
+
39
+ def _register_oci_media_dataclass(cls):
40
+ check.issubclass(cls, OciMediaDataclass)
41
+ check.arg(dc.is_dataclass(cls))
42
+ mt = check.non_empty_str(cls.__dict__['MEDIA_TYPE'])
43
+ check.not_in(mt, _REGISTERED_OCI_MEDIA_DATACLASSES)
44
+ _REGISTERED_OCI_MEDIA_DATACLASSES[mt] = cls
45
+ return cls
46
+
47
+
48
+ def get_registered_oci_media_dataclass(media_type: str) -> ta.Optional[ta.Type[OciMediaDataclass]]:
49
+ return _REGISTERED_OCI_MEDIA_DATACLASSES.get(media_type)
50
+
51
+
52
+ def unmarshal_oci_media_dataclass(
53
+ dct: ta.Mapping[str, ta.Any],
54
+ *,
55
+ media_type: ta.Optional[str] = None,
56
+ ) -> ta.Any:
57
+ if media_type is None:
58
+ media_type = check.non_empty_str(dct['mediaType'])
59
+ cls = _REGISTERED_OCI_MEDIA_DATACLASSES[media_type]
60
+ return unmarshal_obj(dct, cls)
61
+
62
+
63
+ ##
64
+
65
+
66
+ @dc.dataclass()
67
+ class OciMediaDescriptor:
68
+ """https://github.com/opencontainers/image-spec/blob/92353b0bee778725c617e7d57317b568a7796bd0/descriptor.md#properties""" # noqa
69
+
70
+ media_type: str = dc.field(metadata={OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
71
+ digest: str
72
+ size: int
73
+
74
+ #
75
+
76
+ urls: ta.Optional[ta.Sequence[str]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
77
+ annotations: ta.Optional[ta.Mapping[str, str]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
78
+ data: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
79
+ artifact_type: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_FIELD_KEY: 'artifactType', OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
80
+
81
+ #
82
+
83
+ platform: ta.Optional[ta.Mapping[str, ta.Any]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
84
+
85
+
86
+ ##
87
+
88
+
89
+ @_register_oci_media_dataclass
90
+ @dc.dataclass()
91
+ class OciMediaImageIndex(OciMediaDataclass):
92
+ """https://github.com/opencontainers/image-spec/blob/92353b0bee778725c617e7d57317b568a7796bd0/image-index.md"""
93
+
94
+ manifests: ta.Sequence[OciMediaDescriptor] # -> OciMediaImageIndex | OciMediaImageManifest
95
+
96
+ #
97
+
98
+ annotations: ta.Optional[ta.Mapping[str, str]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
99
+
100
+ #
101
+
102
+ SCHEMA_VERSION: ta.ClassVar[int] = 2
103
+ schema_version: int = dc.field(default=SCHEMA_VERSION, metadata={OBJ_MARSHALER_FIELD_KEY: 'schemaVersion'})
104
+
105
+ MEDIA_TYPE: ta.ClassVar[str] = 'application/vnd.oci.image.index.v1+json'
106
+ media_type: str = dc.field(default=MEDIA_TYPE, metadata={OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
107
+
108
+
109
+ #
110
+
111
+
112
+ @_register_oci_media_dataclass
113
+ @dc.dataclass()
114
+ class OciMediaImageManifest(OciMediaDataclass):
115
+ """https://github.com/opencontainers/image-spec/blob/92353b0bee778725c617e7d57317b568a7796bd0/manifest.md"""
116
+
117
+ config: OciMediaDescriptor # -> OciMediaImageConfig
118
+
119
+ layers: ta.Sequence[OciMediaDescriptor]
120
+
121
+ #
122
+
123
+ annotations: ta.Optional[ta.Mapping[str, str]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
124
+
125
+ #
126
+
127
+ SCHEMA_VERSION: ta.ClassVar[int] = 2
128
+ schema_version: int = dc.field(default=SCHEMA_VERSION, metadata={OBJ_MARSHALER_FIELD_KEY: 'schemaVersion'})
129
+
130
+ MEDIA_TYPE: ta.ClassVar[str] = 'application/vnd.oci.image.manifest.v1+json'
131
+ media_type: str = dc.field(default=MEDIA_TYPE, metadata={OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
132
+
133
+
134
+ #
135
+
136
+
137
+ OCI_IMAGE_LAYER_KIND_MEDIA_TYPES: ta.Mapping[OciImageLayer.Kind, str] = {
138
+ OciImageLayer.Kind.TAR: 'application/vnd.oci.image.layer.v1.tar',
139
+ OciImageLayer.Kind.TAR_GZIP: 'application/vnd.oci.image.layer.v1.tar+gzip',
140
+ OciImageLayer.Kind.TAR_ZSTD: 'application/vnd.oci.image.layer.v1.tar+zstd',
141
+ }
142
+
143
+ OCI_IMAGE_LAYER_KIND_MEDIA_TYPES_: ta.Mapping[str, OciImageLayer.Kind] = {
144
+ v: k
145
+ for k, v in OCI_IMAGE_LAYER_KIND_MEDIA_TYPES.items()
146
+ }
147
+
148
+
149
+ #
150
+
151
+
152
+ @_register_oci_media_dataclass
153
+ @dc.dataclass()
154
+ class OciMediaImageConfig(OciImageConfig, OciMediaDataclass):
155
+ SCHEMA_VERSION: ta.ClassVar[int] = 2
156
+ schema_version: int = dc.field(default=SCHEMA_VERSION, metadata={OBJ_MARSHALER_FIELD_KEY: 'schemaVersion'})
157
+
158
+ MEDIA_TYPE: ta.ClassVar[str] = 'application/vnd.oci.image.config.v1+json'
159
+ media_type: str = dc.field(default=MEDIA_TYPE, metadata={OBJ_MARSHALER_FIELD_KEY: 'mediaType'})