omdev 0.0.0.dev489__tar.gz → 0.0.0.dev491__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 (390) hide show
  1. {omdev-0.0.0.dev489/omdev.egg-info → omdev-0.0.0.dev491}/PKG-INFO +4 -4
  2. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/.omlish-manifests.json +1 -1
  3. omdev-0.0.0.dev491/omdev/README.md +51 -0
  4. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/__about__.py +1 -1
  5. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/clicli.py +23 -11
  6. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tools/pipdepup.py +144 -84
  7. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/cli.py +19 -61
  8. omdev-0.0.0.dev491/omdev/tools/jsonview/resources/jsonview.html.j2 +43 -0
  9. omdev-0.0.0.dev491/omdev/tools/pawk/README.md +195 -0
  10. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/rich/__init__.py +9 -0
  11. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/__init__.py +7 -0
  12. omdev-0.0.0.dev491/omdev/tui/textual/debug/__init__.py +0 -0
  13. omdev-0.0.0.dev491/omdev/tui/textual/debug/dominfo.py +151 -0
  14. omdev-0.0.0.dev491/omdev/tui/textual/debug/screen.py +24 -0
  15. omdev-0.0.0.dev491/omdev/tui/textual/types.py +45 -0
  16. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491/omdev.egg-info}/PKG-INFO +4 -4
  17. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev.egg-info/SOURCES.txt +8 -1
  18. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev.egg-info/requires.txt +3 -3
  19. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/pyproject.toml +9 -4
  20. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/LICENSE +0 -0
  21. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/MANIFEST.in +0 -0
  22. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/README.md +0 -0
  23. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/__init__.py +0 -0
  24. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/__init__.py +0 -0
  25. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/__main__.py +0 -0
  26. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/cli/__init__.py +0 -0
  27. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/cli/main.py +0 -0
  28. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/__init__.py +0 -0
  29. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/gen.py +0 -0
  30. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/imports.py +0 -0
  31. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/manifests.py +0 -0
  32. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/resources.py +0 -0
  33. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/srcfiles.py +0 -0
  34. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/strip.py +0 -0
  35. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/types.py +0 -0
  36. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/typing.py +0 -0
  37. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/info.py +0 -0
  38. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/sources.py +0 -0
  39. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/__init__.py +0 -0
  40. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/__init__.py +0 -0
  41. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/cache.py +0 -0
  42. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/contexts.py +0 -0
  43. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/currents.py +0 -0
  44. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/fns.py +0 -0
  45. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/resolvers.py +0 -0
  46. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/storage.py +0 -0
  47. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/types.py +0 -0
  48. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/__init__.py +0 -0
  49. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/actions.py +0 -0
  50. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/cache.py +0 -0
  51. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/consts.py +0 -0
  52. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/defaults.py +0 -0
  53. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/manifests.py +0 -0
  54. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/specs.py +0 -0
  55. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/__init__.py +0 -0
  56. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/darwin/__init__.py +0 -0
  57. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/darwin/aps.py +0 -0
  58. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/darwin/ax.py +0 -0
  59. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/darwin/cf.py +0 -0
  60. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/darwin/cg.py +0 -0
  61. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/linux/__init__.py +0 -0
  62. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/linux/x11.py +0 -0
  63. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/__init__.py +0 -0
  64. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/__main__.py +0 -0
  65. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/cdeps.py +0 -0
  66. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/cdeps.toml +0 -0
  67. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/cli.py +0 -0
  68. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/srclangs.py +0 -0
  69. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/__init__.py +0 -0
  70. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_boilerplate.cc +0 -0
  71. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/LICENSE +0 -0
  72. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/__init__.py +0 -0
  73. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/build_ext.py +0 -0
  74. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  75. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  76. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/compilers/options.py +0 -0
  77. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  78. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/dir_util.py +0 -0
  79. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/errors.py +0 -0
  80. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/extension.py +0 -0
  81. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/file_util.py +0 -0
  82. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/modified.py +0 -0
  83. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/spawn.py +0 -0
  84. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/sysconfig.py +0 -0
  85. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/util.py +0 -0
  86. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/version.py +0 -0
  87. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/build.py +0 -0
  88. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/cmake.py +0 -0
  89. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/importhook.py +0 -0
  90. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/magic.py +0 -0
  91. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/scan.py +0 -0
  92. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/__init__.py +0 -0
  93. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/__main__.py +0 -0
  94. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/cache.py +0 -0
  95. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/ci.py +0 -0
  96. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/cli.py +0 -0
  97. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/compose.py +0 -0
  98. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/consts.py +0 -0
  99. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/__init__.py +0 -0
  100. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/buildcaching.py +0 -0
  101. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/cache.py +0 -0
  102. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  103. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/cacheserved/cache.py +0 -0
  104. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  105. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/cmds.py +0 -0
  106. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/dataserver.py +0 -0
  107. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/imagepulling.py +0 -0
  108. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/inject.py +0 -0
  109. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/packing.py +0 -0
  110. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/repositories.py +0 -0
  111. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/utils.py +0 -0
  112. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/__init__.py +0 -0
  113. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/__init__.py +0 -0
  114. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/clients.py +0 -0
  115. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v1/__init__.py +0 -0
  116. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v1/api.py +0 -0
  117. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v1/client.py +0 -0
  118. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v2/__init__.py +0 -0
  119. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v2/api.py +0 -0
  120. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v2/azure.py +0 -0
  121. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v2/client.py +0 -0
  122. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/bootstrap.py +0 -0
  123. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/cache.py +0 -0
  124. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/cli.py +0 -0
  125. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/env.py +0 -0
  126. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/inject.py +0 -0
  127. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/inject.py +0 -0
  128. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/requirements.py +0 -0
  129. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/shell.py +0 -0
  130. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/utils.py +0 -0
  131. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/__init__.py +0 -0
  132. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/__main__.py +0 -0
  133. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/_pathhack.py +0 -0
  134. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/install.py +0 -0
  135. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/main.py +0 -0
  136. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/managers.py +0 -0
  137. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/types.py +0 -0
  138. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/clipboard/__init__.py +0 -0
  139. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/clipboard/clipboard.py +0 -0
  140. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/clipboard/darwin_cf.py +0 -0
  141. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/clipboard/linux_x11.py +0 -0
  142. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmake.py +0 -0
  143. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmdlog/__init__.py +0 -0
  144. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmdlog/__main__.py +0 -0
  145. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmdlog/_cmdlog.py +0 -0
  146. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmdlog/cli.py +0 -0
  147. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmdlog/cmdlog.py +0 -0
  148. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/__init__.py +0 -0
  149. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/__main__.py +0 -0
  150. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/_dumping.py +0 -0
  151. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/_template.py +0 -0
  152. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/cli.py +0 -0
  153. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/codegen.py +0 -0
  154. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/dumping.py +0 -0
  155. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/__init__.py +0 -0
  156. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/handlers.py +0 -0
  157. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/http.py +0 -0
  158. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/routes.py +0 -0
  159. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/server.py +0 -0
  160. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/targets.py +0 -0
  161. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/git/__init__.py +0 -0
  162. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/git/magic.py +0 -0
  163. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/git/revisions.py +0 -0
  164. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/git/shallow.py +0 -0
  165. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/git/status.py +0 -0
  166. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/home/__init__.py +0 -0
  167. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/home/paths.py +0 -0
  168. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/home/secrets.py +0 -0
  169. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/home/shadow.py +0 -0
  170. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/imgur.py +0 -0
  171. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/intellij/__init__.py +0 -0
  172. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/intellij/cli.py +0 -0
  173. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/intellij/ides.py +0 -0
  174. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/intellij/open.py +0 -0
  175. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/__init__.py +0 -0
  176. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/__main__.py +0 -0
  177. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/cli.py +0 -0
  178. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/default.py +0 -0
  179. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/inject.py +0 -0
  180. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/inspect.py +0 -0
  181. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/__init__.py +0 -0
  182. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/base.py +0 -0
  183. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/inject.py +0 -0
  184. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/running.py +0 -0
  185. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/standalone.py +0 -0
  186. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/system.py +0 -0
  187. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/pyenv/__init__.py +0 -0
  188. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/pyenv/inject.py +0 -0
  189. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/pyenv/install.py +0 -0
  190. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/pyenv/provider.py +0 -0
  191. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/pyenv/pyenv.py +0 -0
  192. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/resolvers.py +0 -0
  193. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/types.py +0 -0
  194. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/uv/__init__.py +0 -0
  195. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/uv/inject.py +0 -0
  196. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/uv/provider.py +0 -0
  197. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/uv/uv.py +0 -0
  198. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/venvs.py +0 -0
  199. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/__init__.py +0 -0
  200. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/messages/__init__.py +0 -0
  201. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/messages/base.py +0 -0
  202. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/messages/formats.py +0 -0
  203. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/messages/messages.py +0 -0
  204. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/messages/parsing.py +0 -0
  205. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/numerics/__init__.py +0 -0
  206. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/numerics/formats.py +0 -0
  207. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/numerics/numerics.py +0 -0
  208. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/numerics/types.py +0 -0
  209. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/LICENSE +0 -0
  210. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/__init__.py +0 -0
  211. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/consts.py +0 -0
  212. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/errors.py +0 -0
  213. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/message.py +0 -0
  214. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/nuh.py +0 -0
  215. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/parsing.py +0 -0
  216. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/rendering.py +0 -0
  217. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/tags.py +0 -0
  218. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/utils.py +0 -0
  219. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/__init__.py +0 -0
  220. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/__main__.py +0 -0
  221. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/cli.py +0 -0
  222. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/find.py +0 -0
  223. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/magic.py +0 -0
  224. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/prepare.py +0 -0
  225. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/styles.py +0 -0
  226. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/__init__.py +0 -0
  227. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/__main__.py +0 -0
  228. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/_dumping.py +0 -0
  229. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/building.py +0 -0
  230. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/dumping.py +0 -0
  231. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/main.py +0 -0
  232. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/markdown/__init__.py +0 -0
  233. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/markdown/incparse.py +0 -0
  234. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/markdown/tokens.py +0 -0
  235. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/mypy/__init__.py +0 -0
  236. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/mypy/debug.py +0 -0
  237. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/mypy/report.py +0 -0
  238. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/__init__.py +0 -0
  239. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/building.py +0 -0
  240. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/compression.py +0 -0
  241. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/data.py +0 -0
  242. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/datarefs.py +0 -0
  243. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/dataserver.py +0 -0
  244. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/loading.py +0 -0
  245. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/media.py +0 -0
  246. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/pack/__init__.py +0 -0
  247. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/pack/packing.py +0 -0
  248. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/pack/repositories.py +0 -0
  249. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/pack/unpacking.py +0 -0
  250. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/repositories.py +0 -0
  251. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/tars.py +0 -0
  252. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/__init__.py +0 -0
  253. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/marshal.py +0 -0
  254. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/names.py +0 -0
  255. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/requires.py +0 -0
  256. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/revisions.py +0 -0
  257. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/specifiers.py +0 -0
  258. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/versions.py +0 -0
  259. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/wheelfile.py +0 -0
  260. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pip.py +0 -0
  261. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/__init__.py +0 -0
  262. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/__main__.py +0 -0
  263. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/base.py +0 -0
  264. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/blanklines.py +0 -0
  265. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/caches.py +0 -0
  266. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/git.py +0 -0
  267. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/imports.py +0 -0
  268. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/lite.py +0 -0
  269. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/main.py +0 -0
  270. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/manifests.py +0 -0
  271. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/scripts.py +0 -0
  272. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/unicode.py +0 -0
  273. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/__init__.py +0 -0
  274. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/asts/__init__.py +0 -0
  275. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/asts/parents.py +0 -0
  276. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/asts/toplevel.py +0 -0
  277. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/asts/visitors.py +0 -0
  278. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/attrdocs.py +0 -0
  279. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/bracepy.py +0 -0
  280. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/classdot.py +0 -0
  281. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/LICENSE +0 -0
  282. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/__init__.py +0 -0
  283. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/attrdoc.py +0 -0
  284. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/common.py +0 -0
  285. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/epydoc.py +0 -0
  286. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/google.py +0 -0
  287. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/numpydoc.py +0 -0
  288. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/parser.py +0 -0
  289. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/rest.py +0 -0
  290. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/findimports.py +0 -0
  291. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/reprs.py +0 -0
  292. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/scripts/__init__.py +0 -0
  293. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/scripts/bumpversion.py +0 -0
  294. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/scripts/execstat.py +0 -0
  295. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/scripts/importtrace.py +0 -0
  296. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/srcheaders.py +0 -0
  297. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tokens/__init__.py +0 -0
  298. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tokens/all.py +0 -0
  299. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tokens/tokenizert.py +0 -0
  300. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tokens/utils.py +0 -0
  301. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tools/__init__.py +0 -0
  302. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tools/importscan.py +0 -0
  303. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tools/mkrelimp.py +0 -0
  304. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/__init__.py +0 -0
  305. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/__main__.py +0 -0
  306. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/cli.py +0 -0
  307. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/configs.py +0 -0
  308. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/inject.py +0 -0
  309. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/pkg.py +0 -0
  310. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/reqs.py +0 -0
  311. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/resources/__init__.py +0 -0
  312. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/resources/docker-dev.sh +0 -0
  313. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/resources/python.sh +0 -0
  314. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/tools/__init__.py +0 -0
  315. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/tools/aboutdeps.py +0 -0
  316. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/venvs.py +0 -0
  317. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/rs/__init__.py +0 -0
  318. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/__init__.py +0 -0
  319. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/ci.py +0 -0
  320. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/interp.py +0 -0
  321. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/lib/__init__.py +0 -0
  322. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/lib/inject.py +0 -0
  323. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/lib/logs.py +0 -0
  324. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/lib/marshal.py +0 -0
  325. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/pyproject.py +0 -0
  326. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/slowcat.py +0 -0
  327. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/tmpexec.py +0 -0
  328. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tagstrings.py +0 -0
  329. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/__init__.py +0 -0
  330. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/cloc.py +0 -0
  331. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/diff.py +0 -0
  332. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/doc.py +0 -0
  333. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/docker.py +0 -0
  334. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/__init__.py +0 -0
  335. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/__main__.py +0 -0
  336. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/cli.py +0 -0
  337. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/cloning.py +0 -0
  338. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/consts.py +0 -0
  339. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/messages.py +0 -0
  340. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/__init__.py +0 -0
  341. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/__main__.py +0 -0
  342. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/cli.py +0 -0
  343. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/formats.py +0 -0
  344. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/io.py +0 -0
  345. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/parsing.py +0 -0
  346. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/processing.py +0 -0
  347. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/rendering.py +0 -0
  348. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/__init__.py +0 -0
  349. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/__main__.py +0 -0
  350. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/resources/__init__.py +0 -0
  351. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  352. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  353. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/linehisto.py +0 -0
  354. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/mkenv.py +0 -0
  355. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/notebook.py +0 -0
  356. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/pawk/__init__.py +0 -0
  357. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/pawk/__main__.py +0 -0
  358. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/pawk/pawk.py +0 -0
  359. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/pip.py +0 -0
  360. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/prof.py +0 -0
  361. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/qr.py +0 -0
  362. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/shadow.py +0 -0
  363. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/shell.py +0 -0
  364. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/sqlrepl.py +0 -0
  365. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/__init__.py +0 -0
  366. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/__init__.py +0 -0
  367. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/edit/__init__.py +0 -0
  368. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/edit/main.py +0 -0
  369. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/__init__.py +0 -0
  370. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/__main__.py +0 -0
  371. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/app.py +0 -0
  372. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/client.py +0 -0
  373. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/commands.py +0 -0
  374. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/main.py +0 -0
  375. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/markdown/__init__.py +0 -0
  376. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/markdown/__main__.py +0 -0
  377. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/markdown/cli.py +0 -0
  378. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/rich/console2.py +0 -0
  379. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/rich/markdown2.py +0 -0
  380. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/app2.py +0 -0
  381. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/autocomplete/LICENSE +0 -0
  382. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/autocomplete/__init__.py +0 -0
  383. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/autocomplete/matching.py +0 -0
  384. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/autocomplete/paths.py +0 -0
  385. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/autocomplete/widget.py +0 -0
  386. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/drivers2.py +0 -0
  387. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev.egg-info/dependency_links.txt +0 -0
  388. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev.egg-info/entry_points.txt +0 -0
  389. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev.egg-info/top_level.txt +0 -0
  390. {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev489
3
+ Version: 0.0.0.dev491
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.dev489
17
+ Requires-Dist: omlish==0.0.0.dev491
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.12; extra == "all"
20
20
  Requires-Dist: pycparser~=2.23; extra == "all"
@@ -27,7 +27,7 @@ Requires-Dist: mypy~=1.19; extra == "all"
27
27
  Requires-Dist: gprof2dot~=2025.4; extra == "all"
28
28
  Requires-Dist: segno~=1.6; extra == "all"
29
29
  Requires-Dist: rich~=14.2; extra == "all"
30
- Requires-Dist: textual~=6.9; extra == "all"
30
+ Requires-Dist: textual~=6.10; extra == "all"
31
31
  Provides-Extra: black
32
32
  Requires-Dist: black~=25.12; extra == "black"
33
33
  Provides-Extra: c
@@ -46,7 +46,7 @@ Provides-Extra: qr
46
46
  Requires-Dist: segno~=1.6; extra == "qr"
47
47
  Provides-Extra: tui
48
48
  Requires-Dist: rich~=14.2; extra == "tui"
49
- Requires-Dist: textual~=6.9; extra == "tui"
49
+ Requires-Dist: textual~=6.10; extra == "tui"
50
50
  Dynamic: license-file
51
51
 
52
52
  # Overview
@@ -39,7 +39,7 @@
39
39
  "module": ".cli.clicli",
40
40
  "attr": "_CLI_MODULE",
41
41
  "file": "omdev/cli/clicli.py",
42
- "line": 251,
42
+ "line": 263,
43
43
  "value": {
44
44
  "!.cli.types.CliModule": {
45
45
  "name": "cli",
@@ -0,0 +1,51 @@
1
+ # Overview
2
+
3
+ Development utilities and support code.
4
+
5
+ # Notable packages
6
+
7
+ - **[cli](https://github.com/wrmsr/omlish/blob/master/omdev/cli)** - The codebase's all-in-one CLI. This is not
8
+ installed as an entrypoint / command when this package is itself installed - that is separated into the `omdev-cli`
9
+ installable package so as to not pollute users' bin/ directories when depping this lib for its utility code.
10
+
11
+ - **[amalg](https://github.com/wrmsr/omlish/blob/master/omdev/amalg)** - The [amalgamator](#amalgamation).
12
+
13
+ - **[pyproject](https://github.com/wrmsr/omlish/blob/master/omdev/pyproject)**
14
+ ([amalg](https://github.com/wrmsr/omlish/blob/master/omdev/scripts/pyproject.py)) - python project management tool.
15
+ wrangles but does not replace tools like venv, pip, setuptools, and uv. does things like sets up venvs, generates
16
+ [`.pkg`](https://github.com/wrmsr/omlish/blob/master/.pkg) directories and their `pyproject.toml`'s (from their
17
+ `__about__.py`'s), and packages them. this should grow to eat more and more of the Makefile. as it is amalgamated it
18
+ requires no installation and can just be dropped into other projects / repos.
19
+
20
+ - **[ci](https://github.com/wrmsr/omlish/blob/master/omdev/ci)**
21
+ ([amalg](https://github.com/wrmsr/omlish/blob/master/omdev/scripts/ci.py)) - ci runner. given a
22
+ [`compose.yml`](https://github.com/wrmsr/omlish/blob/master/docker/compose.yml)
23
+ and requirements.txt files, takes care of building and caching of containers and venvs and execution of required ci
24
+ commands. detects and [natively uses](https://github.com/wrmsr/omlish/blob/master/omdev/ci/github/api/v2)
25
+ github-action's caching system. unifies ci execution between local dev and github runners.
26
+
27
+ - **[tools.json](https://github.com/wrmsr/omlish/blob/master/omdev/tools/json)** (cli: `om j`) - a tool for json-like
28
+ data, obviously in the vein of [jq](https://github.com/jqlang/jq) but using the internal
29
+ [jmespath](https://github.com/wrmsr/omlish/blob/master/omlish/specs/jmespath) engine. supports
30
+ [true streaming](https://github.com/wrmsr/omlish/blob/master/omlish/formats/json/stream) json input and output, as
31
+ well as [various other](https://github.com/wrmsr/omlish/blob/master/omdev/tools/json/formats.py) non-streaming input
32
+ formats.
33
+
34
+ - **[tools.git](https://github.com/wrmsr/omlish/blob/master/omdev/tools/git)** (cli: `om git`) - a tool for various lazy
35
+ git operations, including the one that (poorly) writes all of these commit messages.
36
+
37
+ # Amalgamation
38
+
39
+ Amalgamation is the process of stitching together multiple python source files into a single self-contained python
40
+ script. ['lite'](https://github.com/wrmsr/omlish/blob/master/omlish#lite-code) code is written in a style conducive to
41
+ this.
42
+
43
+ # Local storage
44
+
45
+ Some of this code, when asked, will store things on the local filesystem. The only directories used (outside of ones
46
+ explicitly specified as command or function arguments) are managed in
47
+ [home.paths](https://github.com/wrmsr/omlish/blob/master/omdev/home/paths.py), and are the following:
48
+
49
+ - `$OMLISH_HOME`, default of `~/.omlish` - persistent things like config and state.
50
+ - `$OMLISH_CACHE`, default of `~/.cache/omlish` - used for things like the local ci cache and
51
+ [various other](https://github.com/search?q=repo%3Awrmsr%2Fomlish+%22dcache.%22&type=code) cached data.
@@ -44,7 +44,7 @@ class Project(ProjectBase):
44
44
 
45
45
  'tui': [
46
46
  'rich ~= 14.2',
47
- 'textual ~= 6.9',
47
+ 'textual ~= 6.10',
48
48
  ],
49
49
  }
50
50
 
@@ -5,6 +5,7 @@ import re
5
5
  import shlex
6
6
  import subprocess
7
7
  import sys
8
+ import time
8
9
  import typing as ta
9
10
  import urllib.parse
10
11
  import urllib.request
@@ -104,23 +105,34 @@ class CliCli(ap.Cli):
104
105
  ap.arg('--no-uv', action='store_true'),
105
106
  ap.arg('--dry-run', action='store_true'),
106
107
  ap.arg('--must-upgrade', action='store_true'),
108
+ ap.arg('--must-upgrade-loop', action='store_true'),
107
109
  ap.arg('--version'),
108
110
  ap.arg('extra_deps', nargs='*'),
109
111
  )
110
112
  def reinstall(self) -> None:
111
113
  current_version = __about__.__version__
112
- latest_version = _parse_latest_version_str(lookup_latest_package_version(__package__.split('.')[0]))
113
114
 
114
- if self.args.version is not None:
115
- target_version: str = self.args.version
116
- else:
117
- target_version = latest_version
118
-
119
- if self.args.must_upgrade:
120
- current_vo = Version(current_version)
121
- target_vo = Version(target_version)
122
- if not (target_vo > current_vo):
123
- raise CliCli.ReinstallWouldNotUpgradeError(current_version, target_version)
115
+ while True:
116
+ latest_version = _parse_latest_version_str(lookup_latest_package_version(__package__.split('.')[0]))
117
+
118
+ if self.args.version is not None:
119
+ target_version: str = self.args.version
120
+ else:
121
+ target_version = latest_version
122
+
123
+ if self.args.must_upgrade or self.args.must_upgrade_loop:
124
+ current_vo = Version(current_version)
125
+ target_vo = Version(target_version)
126
+ if not (target_vo > current_vo):
127
+ ex = CliCli.ReinstallWouldNotUpgradeError(current_version, target_version)
128
+ if self.args.must_upgrade_loop:
129
+ print(ex)
130
+ time.sleep(1)
131
+ continue
132
+ else:
133
+ raise ex
134
+
135
+ break
124
136
 
125
137
  #
126
138
 
@@ -1,5 +1,6 @@
1
1
  """
2
2
  TODO:
3
+ - output 2 tables lol
3
4
  - min_time_since_prev_version
4
5
  - without this the min age is moot lol, can still catch a bad release at the same time of day just n days later
5
6
  - * at least show 'suggested', 'suggested age', 'latest', 'latest age', 'number of releases between the 2' *
@@ -30,7 +31,7 @@ https://news.ycombinator.com/item?id=46005111
30
31
  # ~> https://github.com/pypa/pip/blob/a52069365063ea813fe3a3f8bac90397c9426d35/src/pip/_internal/commands/list.py (25.3)
31
32
  import dataclasses as dc
32
33
  import datetime
33
- import email.parser
34
+ import itertools
34
35
  import os.path
35
36
  import ssl
36
37
  import typing as ta
@@ -312,16 +313,42 @@ class Package:
312
313
 
313
314
  return datetime.datetime.fromisoformat(check.isinstance(ut, str)) # noqa
314
315
 
316
+ @cached.property
317
+ def version(self) -> Version:
318
+ return self.install.version
319
+
320
+ @cached.property
321
+ def filetype(self) -> ta.Literal['wheel', 'sdist']:
322
+ if self.install.link.is_wheel:
323
+ return 'wheel'
324
+ else:
325
+ return 'sdist'
326
+
327
+ unfiltered_candidates: ta.Sequence[Candidate] | None = None
315
328
  candidates: ta.Sequence[Candidate] | None = None
316
329
 
317
- @dc.dataclass(frozen=True, kw_only=True)
318
- class LatestInfo:
319
- candidate: 'Package.Candidate'
330
+ latest_candidate: Candidate | None = None
331
+ suggested_candidate: Candidate | None = None
332
+
333
+
334
+ def get_best_candidate(
335
+ pkg: Package,
336
+ finder: MyPackageFinder,
337
+ candidates: ta.Sequence[Package.Candidate],
338
+ ) -> Package.Candidate | None:
339
+ candidates_by_install: ta.Mapping[InstallationCandidate, Package.Candidate] = col.make_map((
340
+ (c.install, c)
341
+ for c in candidates
342
+ ), strict=True, identity=True)
320
343
 
321
- version: Version
322
- filetype: str
344
+ evaluator = finder.make_candidate_evaluator(
345
+ project_name=pkg.dist.canonical_name,
346
+ )
347
+ best_install = evaluator.sort_best_candidate([c.install for c in candidates])
348
+ if best_install is None:
349
+ return None
323
350
 
324
- latest_info: LatestInfo | None = None
351
+ return candidates_by_install[best_install]
325
352
 
326
353
 
327
354
  def set_package_finder_info(
@@ -332,17 +359,18 @@ def set_package_finder_info(
332
359
  max_uploaded_at: datetime.datetime | None = None,
333
360
  min_time_since_prev_version: datetime.timedelta | None = None,
334
361
  ) -> None:
335
- candidates = [
362
+ pkg.unfiltered_candidates = [
336
363
  Package.Candidate(
337
364
  c,
338
365
  finder.get_link_pypi_dict(c.link),
339
366
  )
340
367
  for c in finder.find_all_candidates(pkg.dist.canonical_name)
341
368
  ]
342
- pkg.candidates = candidates
343
369
 
344
370
  #
345
371
 
372
+ candidates = pkg.unfiltered_candidates
373
+
346
374
  if not pre:
347
375
  # Remove prereleases
348
376
  candidates = [
@@ -351,8 +379,16 @@ def set_package_finder_info(
351
379
  if not c.install.version.is_prerelease
352
380
  ]
353
381
 
382
+ pkg.candidates = candidates
383
+
354
384
  #
355
385
 
386
+ pkg.latest_candidate = get_best_candidate(pkg, finder, pkg.candidates)
387
+
388
+ #
389
+
390
+ suggested_candidates = candidates
391
+
356
392
  if min_time_since_prev_version is not None:
357
393
  # candidates_by_version = col.multi_map((c.install.version, c) for c in candidates)
358
394
  # uploaded_at_by_version = {
@@ -361,46 +397,17 @@ def set_package_finder_info(
361
397
  # }
362
398
  raise NotImplementedError
363
399
 
364
- #
365
-
366
400
  if max_uploaded_at is not None:
367
- candidates = [
401
+ suggested_candidates = [
368
402
  c
369
- for c in candidates
403
+ for c in suggested_candidates
370
404
  if not (
371
405
  (c_dt := c.upload_time()) is not None and
372
406
  c_dt > max_uploaded_at
373
407
  )
374
408
  ]
375
409
 
376
- #
377
-
378
- candidates_by_install: ta.Mapping[InstallationCandidate, Package.Candidate] = col.make_map((
379
- (c.install, c)
380
- for c in candidates
381
- ), strict=True, identity=True)
382
-
383
- evaluator = finder.make_candidate_evaluator(
384
- project_name=pkg.dist.canonical_name,
385
- )
386
- best_install = evaluator.sort_best_candidate([c.install for c in candidates])
387
- if best_install is None:
388
- return
389
- best_candidate = candidates_by_install[best_install]
390
-
391
- #
392
-
393
- remote_version = best_candidate.install.version
394
- if best_candidate.install.link.is_wheel:
395
- typ = 'wheel'
396
- else:
397
- typ = 'sdist'
398
-
399
- pkg.latest_info = Package.LatestInfo(
400
- candidate=best_candidate,
401
- version=remote_version,
402
- filetype=typ,
403
- )
410
+ pkg.suggested_candidate = get_best_candidate(pkg, finder, suggested_candidates)
404
411
 
405
412
 
406
413
  ##
@@ -474,20 +481,20 @@ def format_for_json(
474
481
  infos: list[dict[str, ta.Any]] = []
475
482
 
476
483
  for pkg in pkgs:
477
- latest_info = check.not_none(pkg.latest_info)
484
+ latest = check.not_none(pkg.latest_candidate)
485
+ suggested = check.not_none(pkg.suggested_candidate)
478
486
 
479
487
  info = {
480
488
  'name': pkg.dist.raw_name,
481
489
  'version': pkg.version(),
482
490
  'location': pkg.dist.location or '',
483
491
  'installer': pkg.dist.installer,
484
- 'latest_version': str(latest_info.version),
485
- 'latest_filetype': latest_info.filetype,
492
+ 'latest_version': str(latest.install.version),
493
+ 'latest_upload_time': lut.isoformat() if (lut := latest.upload_time()) is not None else None,
494
+ 'suggested_version': str(suggested.install.version),
495
+ 'suggested_upload_time': sut.isoformat() if (sut := suggested.upload_time()) is not None else None,
486
496
  }
487
497
 
488
- if (l_ut := latest_info.candidate.upload_time()) is not None:
489
- info['latest_age'] = human_round_td(now_utc() - l_ut)
490
-
491
498
  if editable_project_location := pkg.dist.editable_project_location:
492
499
  info['editable_project_location'] = editable_project_location
493
500
 
@@ -502,59 +509,106 @@ def format_for_json(
502
509
  def format_for_columns(pkgs: ta.Sequence[Package]) -> tuple[list[list[str]], list[str]]:
503
510
  """Convert the package data into something usable by output_package_listing_columns."""
504
511
 
505
- header = ['Package', 'Version', 'Latest', 'Age', 'Type']
512
+ header = [
513
+ ' ',
506
514
 
507
- def wheel_build_tag(dist: BaseDistribution) -> str | None:
508
- try:
509
- wheel_file = dist.read_text('WHEEL')
510
- except FileNotFoundError:
511
- return None
512
- return email.parser.Parser().parsestr(wheel_file).get('Build')
515
+ 'Package',
516
+ 'Current',
517
+
518
+ ' ',
519
+
520
+ 'Suggested',
521
+ 'Age',
522
+
523
+ ' ',
524
+
525
+ 'Latest',
526
+ 'Age',
527
+ ]
528
+
529
+ # def wheel_build_tag(dist: BaseDistribution) -> str | None:
530
+ # try:
531
+ # wheel_file = dist.read_text('WHEEL')
532
+ # except FileNotFoundError:
533
+ # return None
534
+ # return email.parser.Parser().parsestr(wheel_file).get('Build')
513
535
 
514
- build_tags = [wheel_build_tag(p.dist) for p in pkgs]
515
- has_build_tags = any(build_tags)
516
- if has_build_tags:
517
- header.append('Build')
536
+ # build_tags = [wheel_build_tag(p.dist) for p in pkgs]
537
+ # has_build_tags = any(build_tags)
538
+ # if has_build_tags:
539
+ # header.append('Build')
518
540
 
519
- has_editables = any(x.dist.editable for x in pkgs)
520
- if has_editables:
521
- header.append('Editable project location')
541
+ # has_editables = any(x.dist.editable for x in pkgs)
542
+ # if has_editables:
543
+ # header.append('Editable project location')
522
544
 
523
545
  data = []
524
- for i, proj in enumerate(pkgs):
525
- # if we're working on the 'outdated' list, separate out the latest_version and type
526
- row = [proj.dist.raw_name, proj.dist.raw_version]
527
-
528
- latest_info = check.not_none(proj.latest_info)
529
- row.append(str(latest_info.version))
530
- if (l_ut := latest_info.candidate.upload_time()) is not None:
531
- row.append(human_round_td(now_utc() - l_ut))
532
- else:
533
- row.append('')
534
- row.append(latest_info.filetype)
546
+ for proj in pkgs:
547
+ sc = check.not_none(proj.suggested_candidate)
548
+ lc = check.not_none(proj.latest_candidate)
549
+
550
+ row = [
551
+ '*' if lc is not sc else '',
552
+
553
+ proj.dist.raw_name,
554
+ proj.dist.raw_version,
555
+ ]
556
+
557
+ for c in [sc, lc]:
558
+ row.extend([
559
+ '|',
560
+
561
+ str(c.version),
562
+ ])
563
+
564
+ if (l_ut := c.upload_time()) is not None:
565
+ row.append(human_round_td(now_utc() - l_ut))
566
+ else:
567
+ row.append('')
568
+
569
+ # row.append(c.filetype)
535
570
 
536
- if has_build_tags:
537
- row.append(build_tags[i] or '')
571
+ # if has_build_tags:
572
+ # row.append(build_tags[i] or '')
538
573
 
539
- if has_editables:
540
- row.append(proj.dist.editable_project_location or '')
574
+ # if has_editables:
575
+ # row.append(proj.dist.editable_project_location or '')
541
576
 
542
577
  data.append(row)
543
578
 
544
579
  return data, header
545
580
 
546
581
 
582
+ def _tabulate(
583
+ rows: ta.Iterable[ta.Iterable[ta.Any]],
584
+ *,
585
+ sep: str = ' ',
586
+ ) -> tuple[list[str], list[int]]:
587
+ """
588
+ Return a list of formatted rows and a list of column sizes.
589
+
590
+ For example::
591
+
592
+ >>> tabulate([['foobar', 2000], [0xdeadbeef]])
593
+ (['foobar 2000', '3735928559'], [10, 4])
594
+ """
595
+
596
+ rows = [tuple(map(str, row)) for row in rows]
597
+ sizes = [max(map(len, col)) for col in itertools.zip_longest(*rows, fillvalue='')]
598
+ table = [sep.join(map(str.ljust, row, sizes)).rstrip() for row in rows]
599
+ return table, sizes
600
+
601
+
547
602
  def render_package_listing_columns(data: list[list[str]], header: list[str]) -> list[str]:
548
603
  # insert the header first: we need to know the size of column names
549
604
  if len(data) > 0:
550
605
  data.insert(0, header)
551
606
 
552
- from pip._internal.utils.misc import tabulate # noqa
553
- pkg_strings, sizes = tabulate(data)
607
+ pkg_strings, sizes = _tabulate(data, sep=' ')
554
608
 
555
609
  # Create and add a separator.
556
610
  if len(data) > 0:
557
- pkg_strings.insert(1, ' '.join('-' * x for x in sizes))
611
+ pkg_strings.insert(1, ' '.join('-' * x for x in sizes))
558
612
 
559
613
  return pkg_strings
560
614
 
@@ -612,21 +666,27 @@ def _main() -> None:
612
666
 
613
667
  #
614
668
 
615
- pkgs = [
669
+ outdated_pkgs = [
616
670
  pkg
617
671
  for pkg in pkgs
618
- if (li := pkg.latest_info) is not None
672
+ if (li := pkg.latest_candidate) is not None
619
673
  and li.version > pkg.dist.version
620
674
  ]
621
675
 
622
- pkgs.sort(key=lambda x: x.dist.raw_name)
676
+ outdated_pkgs.sort(key=lambda x: x.dist.raw_name)
623
677
 
624
678
  #
625
679
 
626
680
  if args.json:
627
- print(json.dumps_pretty(format_for_json(pkgs)))
681
+ print(json.dumps_pretty(format_for_json(outdated_pkgs)))
682
+
628
683
  else:
629
- print('\n'.join(render_package_listing_columns(*format_for_columns(pkgs))))
684
+ # stable_pkgs, unstable_pkgs = col.partition(
685
+ # outdated_pkgs,
686
+ # lambda pkg: pkg.latest_candidate is pkg.suggested_candidate,
687
+ # )
688
+
689
+ print('\n'.join(render_package_listing_columns(*format_for_columns(outdated_pkgs))))
630
690
 
631
691
 
632
692
  if __name__ == '__main__':
@@ -3,7 +3,7 @@ TODO:
3
3
  - read from stdin
4
4
  - evaluate jmespath on server using extended engine
5
5
  - integrate with json tool
6
- - use omlish server and templates
6
+ - use omlish server
7
7
  - vendor deps, serve local
8
8
  - update to https://github.com/josdejong/svelte-jsoneditor
9
9
  """
@@ -19,61 +19,22 @@ import webbrowser
19
19
 
20
20
  from omlish import check
21
21
  from omlish import lang
22
+ from omlish.sockets.ports import get_available_port
23
+ from omlish.text import minja
22
24
 
23
25
 
24
26
  ##
25
27
 
26
28
 
27
- HTML_TEMPLATE = """
28
- <!DOCTYPE html>
29
- <html lang="en">
30
-
31
- <head>
32
- <meta charset="UTF-8">
33
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
34
- <title>JSON Viewer</title>
35
- <link
36
- href="https://cdn.jsdelivr.net/npm/jsoneditor/dist/jsoneditor.min.css"
37
- rel="stylesheet"
38
- type="text/css"
39
- >
40
- <style>
41
- {css_src}
42
- </style>
43
- </head>
44
-
45
- <body>
46
- <div class="input-area">
47
- <label for="jmespath-input">JMESPath:</label>
48
- <input
49
- type="text"
50
- id="jmespath-input"
51
- list="jmespath-history"
52
- placeholder="Enter JMESPath expression..."
53
- autocomplete="off"
54
- >
55
- <datalist id="jmespath-history"></datalist>
56
- <span id="error-message"></span>
57
- </div>
58
- <div id="jsoneditor"></div>
59
-
60
- <script src="https://cdn.jsdelivr.net/npm/jsoneditor@10.2.0/dist/jsoneditor.min.js"></script>
61
- <script src="https://cdn.jsdelivr.net/npm/jmespath@0.16.0/jmespath.min.js"></script>
62
- <script>
63
- const originalJsonData = {json_data};
64
- </script>
65
- <script>
66
- {js_src}
67
- </script>
68
- </body>
69
-
70
- </html>
71
- """
29
+ @lang.cached_function
30
+ def html_template() -> minja.MinjaTemplate:
31
+ src = lang.get_relative_resources('resources', globals=globals())['jsonview.html.j2'].read_text()
32
+ return minja.compile_minja_template(src, ['ctx'])
72
33
 
73
34
 
74
35
  def view_json(
75
36
  filepath: str,
76
- port: int,
37
+ port: int | None,
77
38
  *,
78
39
  mode: ta.Literal['jsonl', 'json5', 'json', None] = None,
79
40
  ) -> None:
@@ -120,15 +81,18 @@ def view_json(
120
81
  self.send_response(200)
121
82
  self.send_header('Content-type', 'text/html')
122
83
  self.end_headers()
123
- html_content = HTML_TEMPLATE.format(
124
- css_src=css_src,
125
- js_src=js_src,
84
+ html_content = html_template()(ctx=dict(
85
+ css_src=css_src.strip(),
86
+ js_src=js_src.strip(),
126
87
  json_data=json_string,
127
- )
88
+ ))
128
89
  self.wfile.write(html_content.encode('utf-8'))
129
90
  else:
130
91
  super().do_GET()
131
92
 
93
+ if port is None:
94
+ port = get_available_port()
95
+
132
96
  handler_cls = JsonViewerHttpRequestHandler
133
97
  with socketserver.TCPServer(('127.0.0.1', port), handler_cls) as httpd:
134
98
  url = f'http://127.0.0.1:{port}'
@@ -150,18 +114,12 @@ def _main() -> None:
150
114
  description='Launch a web-based JSON viewer with JMESPath transformations.',
151
115
  formatter_class=argparse.RawTextHelpFormatter,
152
116
  )
153
- parser.add_argument(
154
- 'filepath',
155
- help='The path to the JSON file you want to view.',
156
- )
157
- parser.add_argument(
158
- '-p', '--port',
159
- type=int,
160
- default=(default_port := 8999),
161
- help=f'The port to run the web server on. Defaults to {default_port}.',
162
- )
117
+
118
+ parser.add_argument('filepath')
119
+ parser.add_argument('-p', '--port', type=int)
163
120
  parser.add_argument('-l', '--lines', action='store_true')
164
121
  parser.add_argument('-5', '--five', action='store_true')
122
+
165
123
  args = parser.parse_args()
166
124
 
167
125
  check.state(not (args.lines and args.five))
@@ -0,0 +1,43 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>JSON Viewer</title>
8
+ <link
9
+ href="https://cdn.jsdelivr.net/npm/jsoneditor/dist/jsoneditor.min.css"
10
+ rel="stylesheet"
11
+ type="text/css"
12
+ >
13
+ <style>
14
+ {{ ctx['css_src'] }}
15
+ </style>
16
+ </head>
17
+
18
+ <body>
19
+ <div class="input-area">
20
+ <label for="jmespath-input">JMESPath:</label>
21
+ <input
22
+ type="text"
23
+ id="jmespath-input"
24
+ list="jmespath-history"
25
+ placeholder="Enter JMESPath expression..."
26
+ autocomplete="off"
27
+ >
28
+ <datalist id="jmespath-history"></datalist>
29
+ <span id="error-message"></span>
30
+ </div>
31
+ <div id="jsoneditor"></div>
32
+
33
+ <script src="https://cdn.jsdelivr.net/npm/jsoneditor@10.2.0/dist/jsoneditor.min.js"></script>
34
+ <script src="https://cdn.jsdelivr.net/npm/jmespath@0.16.0/jmespath.min.js"></script>
35
+ <script>
36
+ const originalJsonData = {{ ctx['json_data'] }};
37
+ </script>
38
+ <script>
39
+ {{ ctx['js_src'] }}
40
+ </script>
41
+ </body>
42
+
43
+ </html>