omdev 0.0.0.dev312__tar.gz → 0.0.0.dev314__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 (308) hide show
  1. {omdev-0.0.0.dev312/omdev.egg-info → omdev-0.0.0.dev314}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/README.md +14 -10
  3. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/.manifests.json +1 -1
  4. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/magic/styles.py +9 -2
  5. omdev-0.0.0.dev314/omdev/py/docstrings/LICENSE +16 -0
  6. omdev-0.0.0.dev314/omdev/py/docstrings/__init__.py +19 -0
  7. omdev-0.0.0.dev314/omdev/py/docstrings/attrdoc.py +151 -0
  8. omdev-0.0.0.dev314/omdev/py/docstrings/common.py +285 -0
  9. omdev-0.0.0.dev314/omdev/py/docstrings/epydoc.py +198 -0
  10. omdev-0.0.0.dev314/omdev/py/docstrings/google.py +329 -0
  11. omdev-0.0.0.dev314/omdev/py/docstrings/numpydoc.py +403 -0
  12. omdev-0.0.0.dev314/omdev/py/docstrings/parser.py +84 -0
  13. omdev-0.0.0.dev314/omdev/py/docstrings/rest.py +176 -0
  14. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/scripts/pyproject.py +9 -2
  15. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/antlr/gen.py +1 -0
  16. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/docker.py +11 -6
  17. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314/omdev.egg-info}/PKG-INFO +2 -2
  18. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev.egg-info/SOURCES.txt +9 -0
  19. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev.egg-info/requires.txt +1 -1
  20. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/pyproject.toml +2 -2
  21. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/LICENSE +0 -0
  22. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/MANIFEST.in +0 -0
  23. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/__about__.py +0 -0
  24. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/__init__.py +0 -0
  25. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/__init__.py +0 -0
  26. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/__main__.py +0 -0
  27. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/gen.py +0 -0
  28. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/imports.py +0 -0
  29. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/main.py +0 -0
  30. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/manifests.py +0 -0
  31. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/resources.py +0 -0
  32. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/srcfiles.py +0 -0
  33. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/strip.py +0 -0
  34. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/types.py +0 -0
  35. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/amalg/typing.py +0 -0
  36. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/__init__.py +0 -0
  37. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/compute/__init__.py +0 -0
  38. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/compute/cache.py +0 -0
  39. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/compute/contexts.py +0 -0
  40. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/compute/currents.py +0 -0
  41. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/compute/fns.py +0 -0
  42. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/compute/resolvers.py +0 -0
  43. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/compute/storage.py +0 -0
  44. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/compute/types.py +0 -0
  45. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/data/__init__.py +0 -0
  46. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/data/actions.py +0 -0
  47. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/data/cache.py +0 -0
  48. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/data/consts.py +0 -0
  49. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/data/defaults.py +0 -0
  50. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/data/manifests.py +0 -0
  51. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cache/data/specs.py +0 -0
  52. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cc/__init__.py +0 -0
  53. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cc/__main__.py +0 -0
  54. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cc/cdeps.py +0 -0
  55. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cc/cdeps.toml +0 -0
  56. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cc/cli.py +0 -0
  57. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/__init__.py +0 -0
  58. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_boilerplate.cc +0 -0
  59. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/LICENSE +0 -0
  60. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/__init__.py +0 -0
  61. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/build_ext.py +0 -0
  62. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  63. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  64. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/compilers/options.py +0 -0
  65. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  66. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/dir_util.py +0 -0
  67. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/errors.py +0 -0
  68. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/extension.py +0 -0
  69. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/file_util.py +0 -0
  70. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/modified.py +0 -0
  71. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/spawn.py +0 -0
  72. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/sysconfig.py +0 -0
  73. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/util.py +0 -0
  74. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/_distutils/version.py +0 -0
  75. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/build.py +0 -0
  76. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/cmake.py +0 -0
  77. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/importhook.py +0 -0
  78. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/magic.py +0 -0
  79. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cexts/scan.py +0 -0
  80. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/__init__.py +0 -0
  81. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/__main__.py +0 -0
  82. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/cache.py +0 -0
  83. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/ci.py +0 -0
  84. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/cli.py +0 -0
  85. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/compose.py +0 -0
  86. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/consts.py +0 -0
  87. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/__init__.py +0 -0
  88. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/buildcaching.py +0 -0
  89. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/cache.py +0 -0
  90. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  91. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/cacheserved/cache.py +0 -0
  92. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  93. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/cmds.py +0 -0
  94. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/dataserver.py +0 -0
  95. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/imagepulling.py +0 -0
  96. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/inject.py +0 -0
  97. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/packing.py +0 -0
  98. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/repositories.py +0 -0
  99. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/docker/utils.py +0 -0
  100. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/__init__.py +0 -0
  101. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/api/__init__.py +0 -0
  102. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/api/clients.py +0 -0
  103. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/api/v1/__init__.py +0 -0
  104. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/api/v1/api.py +0 -0
  105. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/api/v1/client.py +0 -0
  106. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/api/v2/__init__.py +0 -0
  107. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/api/v2/api.py +0 -0
  108. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/api/v2/azure.py +0 -0
  109. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/api/v2/client.py +0 -0
  110. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/bootstrap.py +0 -0
  111. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/cache.py +0 -0
  112. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/cli.py +0 -0
  113. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/env.py +0 -0
  114. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/github/inject.py +0 -0
  115. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/inject.py +0 -0
  116. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/requirements.py +0 -0
  117. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/shell.py +0 -0
  118. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ci/utils.py +0 -0
  119. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cli/__init__.py +0 -0
  120. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cli/__main__.py +0 -0
  121. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cli/_pathhack.py +0 -0
  122. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cli/clicli.py +0 -0
  123. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cli/install.py +0 -0
  124. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cli/main.py +0 -0
  125. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cli/managers.py +0 -0
  126. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cli/types.py +0 -0
  127. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/clipboard/__init__.py +0 -0
  128. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/clipboard/clipboard.py +0 -0
  129. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/clipboard/darwin_cf.py +0 -0
  130. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/clipboard/linux_x11.py +0 -0
  131. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cmake.py +0 -0
  132. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cmdlog/__init__.py +0 -0
  133. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cmdlog/__main__.py +0 -0
  134. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cmdlog/_cmdlog.py +0 -0
  135. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cmdlog/cli.py +0 -0
  136. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/cmdlog/cmdlog.py +0 -0
  137. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/dataserver/__init__.py +0 -0
  138. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/dataserver/handlers.py +0 -0
  139. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/dataserver/http.py +0 -0
  140. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/dataserver/routes.py +0 -0
  141. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/dataserver/server.py +0 -0
  142. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/dataserver/targets.py +0 -0
  143. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/git/__init__.py +0 -0
  144. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/git/magic.py +0 -0
  145. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/git/revisions.py +0 -0
  146. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/git/shallow.py +0 -0
  147. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/git/status.py +0 -0
  148. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/home/__init__.py +0 -0
  149. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/home/paths.py +0 -0
  150. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/home/secrets.py +0 -0
  151. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/home/shadow.py +0 -0
  152. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/imgur.py +0 -0
  153. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/__init__.py +0 -0
  154. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/__main__.py +0 -0
  155. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/cli.py +0 -0
  156. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/default.py +0 -0
  157. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/inject.py +0 -0
  158. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/inspect.py +0 -0
  159. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/providers/__init__.py +0 -0
  160. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/providers/base.py +0 -0
  161. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/providers/inject.py +0 -0
  162. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/providers/running.py +0 -0
  163. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/providers/standalone.py +0 -0
  164. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/providers/system.py +0 -0
  165. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/pyenv/__init__.py +0 -0
  166. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/pyenv/inject.py +0 -0
  167. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/pyenv/install.py +0 -0
  168. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/pyenv/provider.py +0 -0
  169. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/pyenv/pyenv.py +0 -0
  170. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/resolvers.py +0 -0
  171. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/types.py +0 -0
  172. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/uv/__init__.py +0 -0
  173. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/uv/inject.py +0 -0
  174. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/uv/provider.py +0 -0
  175. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/uv/uv.py +0 -0
  176. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/interp/venvs.py +0 -0
  177. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/magic/__init__.py +0 -0
  178. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/magic/__main__.py +0 -0
  179. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/magic/cli.py +0 -0
  180. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/magic/find.py +0 -0
  181. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/magic/magic.py +0 -0
  182. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/magic/prepare.py +0 -0
  183. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/manifests/__init__.py +0 -0
  184. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/manifests/__main__.py +0 -0
  185. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/manifests/build.py +0 -0
  186. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/manifests/dumping.py +0 -0
  187. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/manifests/main.py +0 -0
  188. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/mypy/__init__.py +0 -0
  189. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/mypy/debug.py +0 -0
  190. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/__init__.py +0 -0
  191. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/building.py +0 -0
  192. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/compression.py +0 -0
  193. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/data.py +0 -0
  194. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/datarefs.py +0 -0
  195. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/dataserver.py +0 -0
  196. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/loading.py +0 -0
  197. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/media.py +0 -0
  198. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/pack/__init__.py +0 -0
  199. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/pack/packing.py +0 -0
  200. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/pack/repositories.py +0 -0
  201. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/pack/unpacking.py +0 -0
  202. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/repositories.py +0 -0
  203. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/oci/tars.py +0 -0
  204. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/packaging/__init__.py +0 -0
  205. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/packaging/marshal.py +0 -0
  206. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/packaging/names.py +0 -0
  207. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/packaging/requires.py +0 -0
  208. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/packaging/revisions.py +0 -0
  209. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/packaging/specifiers.py +0 -0
  210. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/packaging/versions.py +0 -0
  211. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/packaging/wheelfile.py +0 -0
  212. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pip.py +0 -0
  213. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/precheck/__init__.py +0 -0
  214. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/precheck/__main__.py +0 -0
  215. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/precheck/base.py +0 -0
  216. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/precheck/caches.py +0 -0
  217. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/precheck/git.py +0 -0
  218. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/precheck/imports.py +0 -0
  219. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/precheck/lite.py +0 -0
  220. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/precheck/main.py +0 -0
  221. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/precheck/manifests.py +0 -0
  222. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/precheck/scripts.py +0 -0
  223. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/__init__.py +0 -0
  224. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/apps/__init__.py +0 -0
  225. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/apps/ncdu.py +0 -0
  226. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/confirm.py +0 -0
  227. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/markdown/LICENSE +0 -0
  228. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/markdown/__init__.py +0 -0
  229. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/markdown/__main__.py +0 -0
  230. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/markdown/border.py +0 -0
  231. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/markdown/cli.py +0 -0
  232. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/markdown/markdown.py +0 -0
  233. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/markdown/parser.py +0 -0
  234. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/markdown/styles.py +0 -0
  235. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/markdown/tags.py +0 -0
  236. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/ptk/markdown/utils.py +0 -0
  237. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/__init__.py +0 -0
  238. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/attrdocs.py +0 -0
  239. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/bracepy.py +0 -0
  240. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/classdot.py +0 -0
  241. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/findimports.py +0 -0
  242. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/scripts/__init__.py +0 -0
  243. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/scripts/bumpversion.py +0 -0
  244. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/scripts/execstat.py +0 -0
  245. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/scripts/importtrace.py +0 -0
  246. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/srcheaders.py +0 -0
  247. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/tools/__init__.py +0 -0
  248. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/tools/importscan.py +0 -0
  249. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/py/tools/mkrelimp.py +0 -0
  250. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/__init__.py +0 -0
  251. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/__main__.py +0 -0
  252. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/cexts.py +0 -0
  253. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/cli.py +0 -0
  254. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/configs.py +0 -0
  255. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/inject.py +0 -0
  256. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/pkg.py +0 -0
  257. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/reqs.py +0 -0
  258. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/resources/__init__.py +0 -0
  259. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/resources/docker-dev.sh +0 -0
  260. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/resources/python.sh +0 -0
  261. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/pyproject/venvs.py +0 -0
  262. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/scripts/__init__.py +0 -0
  263. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/scripts/ci.py +0 -0
  264. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/scripts/interp.py +0 -0
  265. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/scripts/slowcat.py +0 -0
  266. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/scripts/tmpexec.py +0 -0
  267. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tagstrings.py +0 -0
  268. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tokens/__init__.py +0 -0
  269. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tokens/all.py +0 -0
  270. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tokens/tokenizert.py +0 -0
  271. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tokens/utils.py +0 -0
  272. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/__init__.py +0 -0
  273. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/antlr/__init__.py +0 -0
  274. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/antlr/__main__.py +0 -0
  275. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/antlr/cli.py +0 -0
  276. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/antlr/consts.py +0 -0
  277. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/cloc.py +0 -0
  278. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/diff.py +0 -0
  279. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/doc.py +0 -0
  280. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/git/__init__.py +0 -0
  281. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/git/__main__.py +0 -0
  282. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/git/cli.py +0 -0
  283. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/git/consts.py +0 -0
  284. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/git/messages.py +0 -0
  285. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/intellij.py +0 -0
  286. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/json/__init__.py +0 -0
  287. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/json/__main__.py +0 -0
  288. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/json/cli.py +0 -0
  289. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/json/formats.py +0 -0
  290. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/json/io.py +0 -0
  291. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/json/parsing.py +0 -0
  292. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/json/processing.py +0 -0
  293. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/json/rendering.py +0 -0
  294. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/linehisto.py +0 -0
  295. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/mkenv.py +0 -0
  296. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/notebook.py +0 -0
  297. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/pawk/__init__.py +0 -0
  298. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/pawk/__main__.py +0 -0
  299. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/pawk/pawk.py +0 -0
  300. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/pip.py +0 -0
  301. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/prof.py +0 -0
  302. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/qr.py +0 -0
  303. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/shadow.py +0 -0
  304. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev/tools/sqlrepl.py +0 -0
  305. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev.egg-info/dependency_links.txt +0 -0
  306. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev.egg-info/entry_points.txt +0 -0
  307. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/omdev.egg-info/top_level.txt +0 -0
  308. {omdev-0.0.0.dev312 → omdev-0.0.0.dev314}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev312
3
+ Version: 0.0.0.dev314
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.dev312
15
+ Requires-Dist: omlish==0.0.0.dev314
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -11,16 +11,20 @@ Development utilities and support code.
11
11
  - **[amalg](amalg)** - The [amalgamator](#amalgamation).
12
12
 
13
13
  - **[pyproject](pyproject)** ([amalg](scripts/pyproject.py)) - python project management tool. wrangles but does not
14
- replace tools like venv, pip, setuptools, and uv. this should grow to eat more and more of the Makefile. as it is
15
- amalgamated it requires no installation and can just be dropped into other projects / repos.
16
-
17
- - **[ci](ci)** ([amalg](scripts/ci.py)) - ci runner. given a [compose.yml](https://github.com/wrmsr/omlish/blob/master/docker/compose.yml)
18
- and requirements.txt files, takes care of building and caching of containers and venvs and execution of required ci
19
- commands. detects and [natively uses](ci/github/api/v2) github-action's caching system. unifies ci execution between
20
- local dev and github runners.
21
-
22
- - **[tools.json](tools/json)** (cli: `om j`) - a tool for json-like data, obviously in the vein of [jq](https://github.com/jqlang/jq)
23
- but using the internal [jmespath](https://github.com/wrmsr/omlish/tree/master/omlish/specs/jmespath) engine. supports
14
+ replace tools like venv, pip, setuptools, and uv. does things like sets up venvs, generates
15
+ [`.pkg`](https://github.com/wrmsr/omlish/blob/master/.pkg) directories and their `pyproject.toml`'s (from their
16
+ `__about__.py`'s), and packages them. this should grow to eat more and more of the Makefile. as it is amalgamated it
17
+ requires no installation and can just be dropped into other projects / repos.
18
+
19
+ - **[ci](ci)** ([amalg](scripts/ci.py)) - ci runner. given a
20
+ [`compose.yml`](https://github.com/wrmsr/omlish/blob/master/docker/compose.yml) and requirements.txt files, takes care
21
+ of building and caching of containers and venvs and execution of required ci commands. detects and
22
+ [natively uses](ci/github/api/v2) github-action's caching system. unifies ci execution between local dev and github
23
+ runners.
24
+
25
+ - **[tools.json](tools/json)** (cli: `om j`) - a tool for json-like data, obviously in the vein of
26
+ [jq](https://github.com/jqlang/jq) but using the internal
27
+ [jmespath](https://github.com/wrmsr/omlish/tree/master/omlish/specs/jmespath) engine. supports
24
28
  [true streaming](https://github.com/wrmsr/omlish/blob/master/omlish/formats/json/stream) json input and output, as
25
29
  well as [various other](tools/json/formats.py) non-streaming input formats.
26
30
 
@@ -342,7 +342,7 @@
342
342
  "module": ".tools.docker",
343
343
  "attr": "_CLI_MODULE",
344
344
  "file": "omdev/tools/docker.py",
345
- "line": 251,
345
+ "line": 256,
346
346
  "value": {
347
347
  "$.cli.types.CliModule": {
348
348
  "cmd_name": "docker",
@@ -20,14 +20,21 @@ class MagicStyle:
20
20
 
21
21
  PY_MAGIC_STYLE = MagicStyle(
22
22
  name='py',
23
- exts=frozenset(['py']),
23
+ exts=frozenset([
24
+ 'py',
25
+ ]),
24
26
  line_prefix='# ',
25
27
  )
26
28
 
27
29
 
28
30
  C_MAGIC_STYLE = MagicStyle(
29
31
  name='c',
30
- exts=frozenset(['c', 'cc', 'cpp', 'cu']),
32
+ exts=frozenset([
33
+ 'c',
34
+ 'cc',
35
+ 'cpp',
36
+ 'cu',
37
+ ]),
31
38
  line_prefix='// ',
32
39
  block_prefix_suffix=('/* ', '*/'),
33
40
  )
@@ -0,0 +1,16 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Marcin Kurczewski
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6
+ documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
7
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
8
+ persons to whom the Software is furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
11
+ Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
14
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,19 @@
1
+ """Parse docstrings as per Sphinx notation."""
2
+ # https://github.com/rr-/docstring_parser/tree/4951137875e79b438d52a18ac971ec0c28ef269c
3
+
4
+ from .common import ( # noqa
5
+ Docstring,
6
+ DocstringDeprecated,
7
+ DocstringMeta,
8
+ DocstringParam,
9
+ DocstringRaises,
10
+ DocstringReturns,
11
+ DocstringStyle,
12
+ ParseError,
13
+ RenderingStyle,
14
+ )
15
+
16
+ from .parser import ( # noqa
17
+ parse,
18
+ parse_from_object,
19
+ )
@@ -0,0 +1,151 @@
1
+ """
2
+ Attribute docstrings parsing.
3
+
4
+ .. seealso:: https://peps.python.org/pep-0257/#what-is-a-docstring
5
+ """
6
+ import ast
7
+ import inspect
8
+ import textwrap
9
+ import types
10
+ import typing as ta
11
+
12
+ from .common import Docstring
13
+ from .common import DocstringParam
14
+
15
+
16
+ ##
17
+
18
+
19
+ _AST_CONSTANT_ATTR: ta.Mapping[type, str] = {
20
+ ast.Constant: 'value',
21
+ }
22
+
23
+
24
+ def ast_get_constant_value(node: ast.AST) -> ta.Any:
25
+ """Return the constant's value if the given node is a constant."""
26
+
27
+ return getattr(node, _AST_CONSTANT_ATTR[type(node)])
28
+
29
+
30
+ def ast_unparse(node: ast.AST) -> str | None:
31
+ """Convert the AST node to source code as a string."""
32
+
33
+ if hasattr(ast, 'unparse'):
34
+ return ast.unparse(node)
35
+ # Support simple cases in Python < 3.9
36
+ if isinstance(node, (ast.Num, ast.NameConstant, ast.Constant)):
37
+ return str(ast_get_constant_value(node))
38
+ if isinstance(node, ast.Name):
39
+ return node.id
40
+ return None
41
+
42
+
43
+ def ast_is_literal_str(node: ast.AST) -> bool:
44
+ """Return True if the given node is a literal string."""
45
+
46
+ return (
47
+ isinstance(node, ast.Expr)
48
+ and isinstance(node.value, ast.Constant)
49
+ and isinstance(ast_get_constant_value(node.value), str)
50
+ )
51
+
52
+
53
+ def ast_get_attribute(
54
+ node: ast.AST,
55
+ ) -> tuple[str, str | None, str | None] | None:
56
+ """Return name, type and default if the given node is an attribute."""
57
+
58
+ if isinstance(node, (ast.Assign, ast.AnnAssign)):
59
+ target = node.targets[0] if isinstance(node, ast.Assign) else node.target
60
+
61
+ if isinstance(target, ast.Name):
62
+ type_str = None
63
+ if isinstance(node, ast.AnnAssign):
64
+ type_str = ast_unparse(node.annotation)
65
+
66
+ default = None
67
+ if node.value:
68
+ default = ast_unparse(node.value)
69
+
70
+ return target.id, type_str, default
71
+
72
+ return None
73
+
74
+
75
+ class AttributeDocstrings(ast.NodeVisitor):
76
+ """An ast.NodeVisitor that collects attribute docstrings."""
77
+
78
+ attr_docs: ta.Any = None
79
+ prev_attr: ta.Any = None
80
+
81
+ def visit(self, node: ast.AST) -> None:
82
+ if self.prev_attr and ast_is_literal_str(node):
83
+ attr_name, attr_type, attr_default = self.prev_attr
84
+
85
+ self.attr_docs[attr_name] = (
86
+ ast_get_constant_value(node.value), # type: ignore[attr-defined]
87
+ attr_type,
88
+ attr_default,
89
+ )
90
+
91
+ self.prev_attr = ast_get_attribute(node)
92
+
93
+ if isinstance(node, (ast.ClassDef, ast.Module)):
94
+ self.generic_visit(node)
95
+
96
+ def get_attr_docs(
97
+ self,
98
+ component: ta.Any,
99
+ ) -> dict[str, tuple[str, str | None, str | None]]:
100
+ """
101
+ Get attribute docstrings from the given component.
102
+
103
+ :param component: component to process (class or module)
104
+ :returns: for each attribute docstring, a tuple with (description, type, default)
105
+ """
106
+
107
+ self.attr_docs = {}
108
+ self.prev_attr = None
109
+
110
+ try:
111
+ source = textwrap.dedent(inspect.getsource(component))
112
+
113
+ except OSError:
114
+ pass
115
+
116
+ else:
117
+ tree = ast.parse(source)
118
+
119
+ if inspect.ismodule(component):
120
+ self.visit(tree)
121
+
122
+ elif isinstance(tree, ast.Module) and isinstance(tree.body[0], ast.ClassDef):
123
+ self.visit(tree.body[0])
124
+
125
+ return self.attr_docs
126
+
127
+
128
+ def add_attribute_docstrings(
129
+ obj: type | types.ModuleType,
130
+ docstring: Docstring,
131
+ ) -> None:
132
+ """
133
+ Add attribute docstrings found in the object's source code.
134
+
135
+ :param obj: object from which to parse attribute docstrings
136
+ :param docstring: Docstring object where found attributes are added
137
+ :returns: list with names of added attributes
138
+ """
139
+
140
+ params = {p.arg_name for p in docstring.params}
141
+ for arg_name, (description, type_name, default) in AttributeDocstrings().get_attr_docs(obj).items():
142
+ if arg_name not in params:
143
+ param = DocstringParam(
144
+ args=['attribute', arg_name],
145
+ description=description,
146
+ arg_name=arg_name,
147
+ type_name=type_name,
148
+ is_optional=default is not None,
149
+ default=default,
150
+ )
151
+ docstring.meta.append(param)
@@ -0,0 +1,285 @@
1
+ """Common methods for parsing."""
2
+ import enum
3
+
4
+
5
+ ##
6
+
7
+
8
+ PARAM_KEYWORDS = {
9
+ 'arg',
10
+ 'argument',
11
+ 'attribute',
12
+ 'key',
13
+ 'keyword',
14
+ 'param',
15
+ 'parameter',
16
+ }
17
+
18
+ RAISES_KEYWORDS = {
19
+ 'except',
20
+ 'exception',
21
+ 'raise',
22
+ 'raises',
23
+ }
24
+
25
+ DEPRECATION_KEYWORDS = {
26
+ 'deprecated',
27
+ 'deprecation',
28
+ }
29
+
30
+ RETURNS_KEYWORDS = {
31
+ 'return',
32
+ 'returns',
33
+ }
34
+
35
+ YIELDS_KEYWORDS = {
36
+ 'yield',
37
+ 'yields',
38
+ }
39
+
40
+ EXAMPLES_KEYWORDS = {
41
+ 'example',
42
+ 'examples',
43
+ }
44
+
45
+
46
+ ##
47
+
48
+
49
+ class ParseError(RuntimeError):
50
+ """Base class for all parsing related errors."""
51
+
52
+
53
+ ##
54
+
55
+
56
+ class DocstringStyle(enum.Enum):
57
+ """Docstring style."""
58
+
59
+ REST = 1
60
+ GOOGLE = 2
61
+ NUMPYDOC = 3
62
+ EPYDOC = 4
63
+ AUTO = 255
64
+
65
+
66
+ class RenderingStyle(enum.Enum):
67
+ """Rendering style when unparsing parsed docstrings."""
68
+
69
+ COMPACT = 1
70
+ CLEAN = 2
71
+ EXPANDED = 3
72
+
73
+
74
+ ##
75
+
76
+
77
+ class DocstringMeta:
78
+ """
79
+ Docstring meta information.
80
+
81
+ Symbolizes lines in form of
82
+
83
+ :param arg: description
84
+ :raises ValueError: if something happens
85
+ """
86
+
87
+ def __init__(
88
+ self,
89
+ args: list[str],
90
+ description: str | None,
91
+ ) -> None:
92
+ """
93
+ Initialize self.
94
+
95
+ :param args: list of arguments. The exact content of this variable is dependent on the kind of docstring; it's
96
+ used to distinguish between custom docstring meta information items.
97
+ :param description: associated docstring description.
98
+ """
99
+
100
+ super().__init__()
101
+
102
+ self.args = args
103
+ self.description = description
104
+
105
+
106
+ class DocstringParam(DocstringMeta):
107
+ """DocstringMeta symbolizing :param metadata."""
108
+
109
+ def __init__(
110
+ self,
111
+ args: list[str],
112
+ description: str | None,
113
+ arg_name: str,
114
+ type_name: str | None,
115
+ is_optional: bool | None,
116
+ default: str | None,
117
+ ) -> None:
118
+ """Initialize self."""
119
+
120
+ super().__init__(args, description)
121
+
122
+ self.arg_name = arg_name
123
+ self.type_name = type_name
124
+ self.is_optional = is_optional
125
+ self.default = default
126
+
127
+
128
+ class DocstringReturns(DocstringMeta):
129
+ """DocstringMeta symbolizing :returns or :yields metadata."""
130
+
131
+ def __init__(
132
+ self,
133
+ args: list[str],
134
+ description: str | None,
135
+ type_name: str | None,
136
+ is_generator: bool,
137
+ return_name: str | None = None,
138
+ ) -> None:
139
+ """Initialize self."""
140
+
141
+ super().__init__(args, description)
142
+
143
+ self.type_name = type_name
144
+ self.is_generator = is_generator
145
+ self.return_name = return_name
146
+
147
+
148
+ class DocstringRaises(DocstringMeta):
149
+ """DocstringMeta symbolizing :raises metadata."""
150
+
151
+ def __init__(
152
+ self,
153
+ args: list[str],
154
+ description: str | None,
155
+ type_name: str | None,
156
+ ) -> None:
157
+ """Initialize self."""
158
+
159
+ super().__init__(args, description)
160
+
161
+ self.type_name = type_name
162
+ self.description = description
163
+
164
+
165
+ class DocstringDeprecated(DocstringMeta):
166
+ """DocstringMeta symbolizing deprecation metadata."""
167
+
168
+ def __init__(
169
+ self,
170
+ args: list[str],
171
+ description: str | None,
172
+ version: str | None,
173
+ ) -> None:
174
+ """Initialize self."""
175
+
176
+ super().__init__(args, description)
177
+
178
+ self.version = version
179
+ self.description = description
180
+
181
+
182
+ class DocstringExample(DocstringMeta):
183
+ """DocstringMeta symbolizing example metadata."""
184
+
185
+ def __init__(
186
+ self,
187
+ args: list[str],
188
+ snippet: str | None,
189
+ description: str | None,
190
+ ) -> None:
191
+ """Initialize self."""
192
+
193
+ super().__init__(args, description)
194
+
195
+ self.snippet = snippet
196
+ self.description = description
197
+
198
+
199
+ ##
200
+
201
+
202
+ class Docstring:
203
+ """Docstring object representation."""
204
+
205
+ def __init__(
206
+ self,
207
+ style: DocstringStyle | None = None,
208
+ ) -> None:
209
+ """Initialize self."""
210
+
211
+ super().__init__()
212
+
213
+ self.short_description: str | None = None
214
+ self.long_description: str | None = None
215
+ self.blank_after_short_description = False
216
+ self.blank_after_long_description = False
217
+ self.meta: list[DocstringMeta] = []
218
+ self.style: DocstringStyle | None = style
219
+
220
+ @property
221
+ def description(self) -> str | None:
222
+ """
223
+ Return the full description of the function
224
+
225
+ Returns None if the docstring did not include any description
226
+ """
227
+
228
+ ret = []
229
+ if self.short_description:
230
+ ret.append(self.short_description)
231
+ if self.blank_after_short_description:
232
+ ret.append('')
233
+ if self.long_description:
234
+ ret.append(self.long_description)
235
+
236
+ if not ret:
237
+ return None
238
+
239
+ return '\n'.join(ret)
240
+
241
+ @property
242
+ def params(self) -> list[DocstringParam]:
243
+ """Return a list of information on function params."""
244
+
245
+ return [item for item in self.meta if isinstance(item, DocstringParam)]
246
+
247
+ @property
248
+ def raises(self) -> list[DocstringRaises]:
249
+ """Return a list of information on the exceptions that the function may raise."""
250
+
251
+ return [item for item in self.meta if isinstance(item, DocstringRaises)]
252
+
253
+ @property
254
+ def returns(self) -> DocstringReturns | None:
255
+ """
256
+ Return a single information on function return.
257
+
258
+ Takes the first return information.
259
+ """
260
+
261
+ for item in self.meta:
262
+ if isinstance(item, DocstringReturns):
263
+ return item
264
+ return None
265
+
266
+ @property
267
+ def many_returns(self) -> list[DocstringReturns]:
268
+ """Return a list of information on function return."""
269
+
270
+ return [item for item in self.meta if isinstance(item, DocstringReturns)]
271
+
272
+ @property
273
+ def deprecation(self) -> DocstringDeprecated | None:
274
+ """Return a single information on function deprecation notes."""
275
+
276
+ for item in self.meta:
277
+ if isinstance(item, DocstringDeprecated):
278
+ return item
279
+ return None
280
+
281
+ @property
282
+ def examples(self) -> list[DocstringExample]:
283
+ """Return a list of information on function examples."""
284
+
285
+ return [item for item in self.meta if isinstance(item, DocstringExample)]