omdev 0.0.0.dev473__tar.gz → 0.0.0.dev475__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 (371) hide show
  1. {omdev-0.0.0.dev473/omdev.egg-info → omdev-0.0.0.dev475}/PKG-INFO +4 -4
  2. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/__about__.py +1 -1
  3. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/cli.py +1 -2
  4. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmdlog/cli.py +1 -2
  5. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataclasses/codegen.py +1 -1
  6. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/main.py +1 -2
  7. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/pkg.py +1 -1
  8. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/ci.py +18 -5
  9. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/interp.py +16 -3
  10. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/pyproject.py +17 -4
  11. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/pawk/pawk.py +2 -2
  12. omdev-0.0.0.dev475/omdev/tui/apps/edit/main.py +163 -0
  13. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/irc/app.py +15 -15
  14. omdev-0.0.0.dev475/omdev/tui/apps/markdown/__init__.py +0 -0
  15. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/__init__.py +1 -0
  16. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475/omdev.egg-info}/PKG-INFO +4 -4
  17. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev.egg-info/SOURCES.txt +2 -0
  18. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev.egg-info/requires.txt +3 -3
  19. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/pyproject.toml +4 -4
  20. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/LICENSE +0 -0
  21. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/MANIFEST.in +0 -0
  22. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/README.md +0 -0
  23. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/.omlish-manifests.json +0 -0
  24. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/__init__.py +0 -0
  25. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/__init__.py +0 -0
  26. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/__main__.py +0 -0
  27. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/cli/__init__.py +0 -0
  28. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/cli/main.py +0 -0
  29. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/__init__.py +0 -0
  30. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/gen.py +0 -0
  31. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/imports.py +0 -0
  32. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/manifests.py +0 -0
  33. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/resources.py +0 -0
  34. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/srcfiles.py +0 -0
  35. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/strip.py +0 -0
  36. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/types.py +0 -0
  37. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/typing.py +0 -0
  38. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/sources.py +0 -0
  39. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/__init__.py +0 -0
  40. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/__init__.py +0 -0
  41. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/cache.py +0 -0
  42. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/contexts.py +0 -0
  43. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/currents.py +0 -0
  44. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/fns.py +0 -0
  45. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/resolvers.py +0 -0
  46. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/storage.py +0 -0
  47. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/types.py +0 -0
  48. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/__init__.py +0 -0
  49. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/actions.py +0 -0
  50. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/cache.py +0 -0
  51. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/consts.py +0 -0
  52. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/defaults.py +0 -0
  53. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/manifests.py +0 -0
  54. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/specs.py +0 -0
  55. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/__init__.py +0 -0
  56. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/darwin/__init__.py +0 -0
  57. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/darwin/aps.py +0 -0
  58. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/darwin/ax.py +0 -0
  59. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/darwin/cf.py +0 -0
  60. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/darwin/cg.py +0 -0
  61. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/linux/__init__.py +0 -0
  62. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/linux/x11.py +0 -0
  63. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/__init__.py +0 -0
  64. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/__main__.py +0 -0
  65. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/cdeps.py +0 -0
  66. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/cdeps.toml +0 -0
  67. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/cli.py +0 -0
  68. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/srclangs.py +0 -0
  69. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/__init__.py +0 -0
  70. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_boilerplate.cc +0 -0
  71. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/LICENSE +0 -0
  72. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/__init__.py +0 -0
  73. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/build_ext.py +0 -0
  74. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  75. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  76. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/compilers/options.py +0 -0
  77. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  78. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/dir_util.py +0 -0
  79. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/errors.py +0 -0
  80. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/extension.py +0 -0
  81. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/file_util.py +0 -0
  82. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/modified.py +0 -0
  83. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/spawn.py +0 -0
  84. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/sysconfig.py +0 -0
  85. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/util.py +0 -0
  86. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/version.py +0 -0
  87. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/build.py +0 -0
  88. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/cmake.py +0 -0
  89. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/importhook.py +0 -0
  90. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/magic.py +0 -0
  91. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/scan.py +0 -0
  92. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/__init__.py +0 -0
  93. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/__main__.py +0 -0
  94. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/cache.py +0 -0
  95. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/ci.py +0 -0
  96. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/compose.py +0 -0
  97. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/consts.py +0 -0
  98. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/__init__.py +0 -0
  99. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/buildcaching.py +0 -0
  100. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/cache.py +0 -0
  101. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  102. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/cacheserved/cache.py +0 -0
  103. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  104. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/cmds.py +0 -0
  105. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/dataserver.py +0 -0
  106. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/imagepulling.py +0 -0
  107. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/inject.py +0 -0
  108. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/packing.py +0 -0
  109. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/repositories.py +0 -0
  110. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/utils.py +0 -0
  111. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/__init__.py +0 -0
  112. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/__init__.py +0 -0
  113. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/clients.py +0 -0
  114. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v1/__init__.py +0 -0
  115. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v1/api.py +0 -0
  116. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v1/client.py +0 -0
  117. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v2/__init__.py +0 -0
  118. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v2/api.py +0 -0
  119. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v2/azure.py +0 -0
  120. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v2/client.py +0 -0
  121. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/bootstrap.py +0 -0
  122. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/cache.py +0 -0
  123. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/cli.py +0 -0
  124. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/env.py +0 -0
  125. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/inject.py +0 -0
  126. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/inject.py +0 -0
  127. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/requirements.py +0 -0
  128. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/shell.py +0 -0
  129. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/utils.py +0 -0
  130. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/__init__.py +0 -0
  131. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/__main__.py +0 -0
  132. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/_pathhack.py +0 -0
  133. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/clicli.py +0 -0
  134. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/install.py +0 -0
  135. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/main.py +0 -0
  136. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/managers.py +0 -0
  137. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/types.py +0 -0
  138. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/clipboard/__init__.py +0 -0
  139. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/clipboard/clipboard.py +0 -0
  140. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/clipboard/darwin_cf.py +0 -0
  141. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/clipboard/linux_x11.py +0 -0
  142. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmake.py +0 -0
  143. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmdlog/__init__.py +0 -0
  144. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmdlog/__main__.py +0 -0
  145. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmdlog/_cmdlog.py +0 -0
  146. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmdlog/cmdlog.py +0 -0
  147. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataclasses/__init__.py +0 -0
  148. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataclasses/__main__.py +0 -0
  149. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataclasses/cli.py +0 -0
  150. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/__init__.py +0 -0
  151. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/handlers.py +0 -0
  152. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/http.py +0 -0
  153. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/routes.py +0 -0
  154. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/server.py +0 -0
  155. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/targets.py +0 -0
  156. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/git/__init__.py +0 -0
  157. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/git/magic.py +0 -0
  158. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/git/revisions.py +0 -0
  159. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/git/shallow.py +0 -0
  160. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/git/status.py +0 -0
  161. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/home/__init__.py +0 -0
  162. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/home/paths.py +0 -0
  163. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/home/secrets.py +0 -0
  164. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/home/shadow.py +0 -0
  165. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/imgur.py +0 -0
  166. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/intellij/__init__.py +0 -0
  167. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/intellij/cli.py +0 -0
  168. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/intellij/ides.py +0 -0
  169. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/intellij/open.py +0 -0
  170. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/__init__.py +0 -0
  171. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/__main__.py +0 -0
  172. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/cli.py +0 -0
  173. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/default.py +0 -0
  174. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/inject.py +0 -0
  175. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/inspect.py +0 -0
  176. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/__init__.py +0 -0
  177. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/base.py +0 -0
  178. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/inject.py +0 -0
  179. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/running.py +0 -0
  180. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/standalone.py +0 -0
  181. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/system.py +0 -0
  182. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/pyenv/__init__.py +0 -0
  183. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/pyenv/inject.py +0 -0
  184. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/pyenv/install.py +0 -0
  185. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/pyenv/provider.py +0 -0
  186. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/pyenv/pyenv.py +0 -0
  187. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/resolvers.py +0 -0
  188. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/types.py +0 -0
  189. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/uv/__init__.py +0 -0
  190. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/uv/inject.py +0 -0
  191. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/uv/provider.py +0 -0
  192. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/uv/uv.py +0 -0
  193. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/venvs.py +0 -0
  194. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/__init__.py +0 -0
  195. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/messages/__init__.py +0 -0
  196. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/messages/base.py +0 -0
  197. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/messages/formats.py +0 -0
  198. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/messages/messages.py +0 -0
  199. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/messages/parsing.py +0 -0
  200. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/numerics/__init__.py +0 -0
  201. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/numerics/formats.py +0 -0
  202. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/numerics/numerics.py +0 -0
  203. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/numerics/types.py +0 -0
  204. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/LICENSE +0 -0
  205. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/__init__.py +0 -0
  206. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/consts.py +0 -0
  207. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/errors.py +0 -0
  208. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/message.py +0 -0
  209. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/nuh.py +0 -0
  210. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/parsing.py +0 -0
  211. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/rendering.py +0 -0
  212. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/tags.py +0 -0
  213. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/utils.py +0 -0
  214. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/__init__.py +0 -0
  215. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/__main__.py +0 -0
  216. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/cli.py +0 -0
  217. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/find.py +0 -0
  218. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/magic.py +0 -0
  219. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/prepare.py +0 -0
  220. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/styles.py +0 -0
  221. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/__init__.py +0 -0
  222. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/__main__.py +0 -0
  223. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/_dumping.py +0 -0
  224. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/building.py +0 -0
  225. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/dumping.py +0 -0
  226. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/main.py +0 -0
  227. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/markdown/__init__.py +0 -0
  228. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/markdown/incparse.py +0 -0
  229. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/markdown/tokens.py +0 -0
  230. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/mypy/__init__.py +0 -0
  231. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/mypy/debug.py +0 -0
  232. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/mypy/report.py +0 -0
  233. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/__init__.py +0 -0
  234. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/building.py +0 -0
  235. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/compression.py +0 -0
  236. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/data.py +0 -0
  237. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/datarefs.py +0 -0
  238. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/dataserver.py +0 -0
  239. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/loading.py +0 -0
  240. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/media.py +0 -0
  241. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/pack/__init__.py +0 -0
  242. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/pack/packing.py +0 -0
  243. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/pack/repositories.py +0 -0
  244. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/pack/unpacking.py +0 -0
  245. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/repositories.py +0 -0
  246. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/tars.py +0 -0
  247. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/__init__.py +0 -0
  248. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/marshal.py +0 -0
  249. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/names.py +0 -0
  250. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/requires.py +0 -0
  251. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/revisions.py +0 -0
  252. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/specifiers.py +0 -0
  253. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/versions.py +0 -0
  254. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/wheelfile.py +0 -0
  255. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pip.py +0 -0
  256. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/__init__.py +0 -0
  257. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/__main__.py +0 -0
  258. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/base.py +0 -0
  259. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/blanklines.py +0 -0
  260. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/caches.py +0 -0
  261. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/git.py +0 -0
  262. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/imports.py +0 -0
  263. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/lite.py +0 -0
  264. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/manifests.py +0 -0
  265. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/scripts.py +0 -0
  266. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/unicode.py +0 -0
  267. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/__init__.py +0 -0
  268. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/attrdocs.py +0 -0
  269. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/bracepy.py +0 -0
  270. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/classdot.py +0 -0
  271. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/LICENSE +0 -0
  272. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/__init__.py +0 -0
  273. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/attrdoc.py +0 -0
  274. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/common.py +0 -0
  275. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/epydoc.py +0 -0
  276. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/google.py +0 -0
  277. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/numpydoc.py +0 -0
  278. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/parser.py +0 -0
  279. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/rest.py +0 -0
  280. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/findimports.py +0 -0
  281. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/scripts/__init__.py +0 -0
  282. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/scripts/bumpversion.py +0 -0
  283. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/scripts/execstat.py +0 -0
  284. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/scripts/importtrace.py +0 -0
  285. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/srcheaders.py +0 -0
  286. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/tools/__init__.py +0 -0
  287. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/tools/importscan.py +0 -0
  288. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/tools/mkrelimp.py +0 -0
  289. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/__init__.py +0 -0
  290. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/__main__.py +0 -0
  291. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/cli.py +0 -0
  292. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/configs.py +0 -0
  293. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/inject.py +0 -0
  294. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/reqs.py +0 -0
  295. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/resources/__init__.py +0 -0
  296. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/resources/docker-dev.sh +0 -0
  297. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/resources/python.sh +0 -0
  298. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/venvs.py +0 -0
  299. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/rs/__init__.py +0 -0
  300. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/__init__.py +0 -0
  301. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/lib/__init__.py +0 -0
  302. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/lib/inject.py +0 -0
  303. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/lib/logs.py +0 -0
  304. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/lib/marshal.py +0 -0
  305. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/slowcat.py +0 -0
  306. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/tmpexec.py +0 -0
  307. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tagstrings.py +0 -0
  308. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tokens/__init__.py +0 -0
  309. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tokens/all.py +0 -0
  310. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tokens/tokenizert.py +0 -0
  311. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tokens/utils.py +0 -0
  312. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/__init__.py +0 -0
  313. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/cloc.py +0 -0
  314. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/diff.py +0 -0
  315. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/doc.py +0 -0
  316. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/docker.py +0 -0
  317. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/__init__.py +0 -0
  318. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/__main__.py +0 -0
  319. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/cli.py +0 -0
  320. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/cloning.py +0 -0
  321. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/consts.py +0 -0
  322. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/messages.py +0 -0
  323. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/__init__.py +0 -0
  324. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/__main__.py +0 -0
  325. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/cli.py +0 -0
  326. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/formats.py +0 -0
  327. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/io.py +0 -0
  328. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/parsing.py +0 -0
  329. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/processing.py +0 -0
  330. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/rendering.py +0 -0
  331. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/__init__.py +0 -0
  332. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/__main__.py +0 -0
  333. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/cli.py +0 -0
  334. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/resources/__init__.py +0 -0
  335. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  336. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  337. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/linehisto.py +0 -0
  338. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/mkenv.py +0 -0
  339. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/notebook.py +0 -0
  340. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/pawk/__init__.py +0 -0
  341. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/pawk/__main__.py +0 -0
  342. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/pip.py +0 -0
  343. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/prof.py +0 -0
  344. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/qr.py +0 -0
  345. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/shadow.py +0 -0
  346. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/shell.py +0 -0
  347. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/sqlrepl.py +0 -0
  348. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/__init__.py +0 -0
  349. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/__init__.py +0 -0
  350. {omdev-0.0.0.dev473/omdev/tui/apps/irc → omdev-0.0.0.dev475/omdev/tui/apps/edit}/__init__.py +0 -0
  351. {omdev-0.0.0.dev473/omdev/tui/apps/markdown → omdev-0.0.0.dev475/omdev/tui/apps/irc}/__init__.py +0 -0
  352. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/irc/__main__.py +0 -0
  353. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/irc/client.py +0 -0
  354. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/irc/commands.py +0 -0
  355. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/irc/main.py +0 -0
  356. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/markdown/__main__.py +0 -0
  357. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/markdown/cli.py +0 -0
  358. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/rich/__init__.py +0 -0
  359. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/rich/console2.py +0 -0
  360. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/rich/markdown2.py +0 -0
  361. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/app2.py +0 -0
  362. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/autocomplete/LICENSE +0 -0
  363. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/autocomplete/__init__.py +0 -0
  364. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/autocomplete/matching.py +0 -0
  365. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/autocomplete/paths.py +0 -0
  366. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/autocomplete/widget.py +0 -0
  367. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/drivers2.py +0 -0
  368. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev.egg-info/dependency_links.txt +0 -0
  369. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev.egg-info/entry_points.txt +0 -0
  370. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev.egg-info/top_level.txt +0 -0
  371. {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev473
3
+ Version: 0.0.0.dev475
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.dev473
17
+ Requires-Dist: omlish==0.0.0.dev475
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.9; extra == "all"
20
20
  Requires-Dist: pycparser~=2.23; extra == "all"
@@ -27,7 +27,7 @@ Requires-Dist: mypy~=1.18; 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.4; extra == "all"
30
+ Requires-Dist: textual~=6.5; extra == "all"
31
31
  Provides-Extra: black
32
32
  Requires-Dist: black~=25.9; 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.4; extra == "tui"
49
+ Requires-Dist: textual~=6.5; extra == "tui"
50
50
  Dynamic: license-file
51
51
 
52
52
  # Overview
@@ -44,7 +44,7 @@ class Project(ProjectBase):
44
44
 
45
45
  'tui': [
46
46
  'rich ~= 14.2',
47
- 'textual ~= 6.4',
47
+ 'textual ~= 6.5',
48
48
  ],
49
49
  }
50
50
 
@@ -14,7 +14,6 @@ import argparse
14
14
  import asyncio
15
15
  import itertools
16
16
  import os.path
17
- import sys
18
17
  import typing as ta
19
18
 
20
19
  from omlish.argparse.cli import ArgparseCli
@@ -260,7 +259,7 @@ async def _async_main() -> ta.Optional[int]:
260
259
  def _main() -> None:
261
260
  configure_standard_logging('DEBUG')
262
261
 
263
- sys.exit(rc if isinstance(rc := asyncio.run(_async_main()), int) else 0)
262
+ raise SystemExit(rc if isinstance(rc := asyncio.run(_async_main()), int) else 0)
264
263
 
265
264
 
266
265
  if __name__ == '__main__':
@@ -1,7 +1,6 @@
1
1
  import argparse
2
2
  import os.path
3
3
  import subprocess
4
- import sys
5
4
  import typing as ta
6
5
 
7
6
  from omlish.formats import json
@@ -60,7 +59,7 @@ def _main() -> None:
60
59
  entry_dcts = [json.loads(sl) for l in log_lines if (sl := l.strip())]
61
60
  print(json.dumps_compact(entry_dcts))
62
61
 
63
- sys.exit(rc)
62
+ raise SystemExit(rc)
64
63
 
65
64
 
66
65
  if __name__ == '__main__':
@@ -41,7 +41,7 @@ class DataclassCodeGen:
41
41
  if not config.codegen:
42
42
  return
43
43
 
44
- log.info('Running codegen on package: %s', pkg_root)
44
+ log.info(lambda: f'Running codegen on package: {pkg_root}')
45
45
 
46
46
  sub_pkgs = sorted(lang.yield_importable(
47
47
  pkg_root,
@@ -21,7 +21,6 @@ TODO:
21
21
  import argparse
22
22
  import asyncio
23
23
  import os.path
24
- import sys
25
24
  import typing as ta
26
25
 
27
26
  from omlish import inject as inj
@@ -126,7 +125,7 @@ def _check_cmd(args) -> None:
126
125
 
127
126
  if vs:
128
127
  print(f'{len(vs)} violations found')
129
- sys.exit(1)
128
+ raise SystemExit(1)
130
129
 
131
130
 
132
131
  ##
@@ -93,7 +93,7 @@ class BasePyprojectPackageGenerator(Abstract):
93
93
 
94
94
  def _write_git_ignore(self) -> None:
95
95
  with open(os.path.join(self._pkg_dir(), '.gitignore'), 'w') as f:
96
- f.write('\n'.join(self._GIT_IGNORE))
96
+ f.write('\n'.join([*self._GIT_IGNORE, '']))
97
97
 
98
98
  #
99
99
 
@@ -3107,6 +3107,7 @@ TODO:
3107
3107
  - pre-run, post-run hooks
3108
3108
  - exitstack?
3109
3109
  - suggestion - difflib.get_close_matches
3110
+ - add_argument_group - group kw on ArgparseKwarg?
3110
3111
  """
3111
3112
 
3112
3113
 
@@ -3117,6 +3118,7 @@ TODO:
3117
3118
  class ArgparseArg:
3118
3119
  args: ta.Sequence[ta.Any]
3119
3120
  kwargs: ta.Mapping[str, ta.Any]
3121
+ group: ta.Optional[str] = None
3120
3122
  dest: ta.Optional[str] = None
3121
3123
 
3122
3124
  def __get__(self, instance, owner=None):
@@ -3126,7 +3128,11 @@ class ArgparseArg:
3126
3128
 
3127
3129
 
3128
3130
  def argparse_arg(*args, **kwargs) -> ArgparseArg:
3129
- return ArgparseArg(args, kwargs)
3131
+ return ArgparseArg(
3132
+ args=args,
3133
+ group=kwargs.pop('group', None),
3134
+ kwargs=kwargs,
3135
+ )
3130
3136
 
3131
3137
 
3132
3138
  def argparse_arg_(*args, **kwargs) -> ta.Any:
@@ -3296,6 +3302,10 @@ class ArgparseCli:
3296
3302
  subparser.set_defaults(_cmd=obj)
3297
3303
 
3298
3304
  elif isinstance(obj, ArgparseArg):
3305
+ if obj.group is not None:
3306
+ # FIXME: add_argument_group
3307
+ raise NotImplementedError
3308
+
3299
3309
  if att in anns:
3300
3310
  ann_kwargs = _get_argparse_arg_ann_kwargs(anns[att])
3301
3311
  obj.kwargs = {**ann_kwargs, **obj.kwargs}
@@ -3341,7 +3351,7 @@ class ArgparseCli:
3341
3351
 
3342
3352
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
3343
3353
  msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
3344
- if (parser := self.get_parser()).exit_on_error:
3354
+ if (parser := self.get_parser()).exit_on_error: # noqa
3345
3355
  parser.error(msg)
3346
3356
  else:
3347
3357
  raise argparse.ArgumentError(None, msg)
@@ -3361,7 +3371,10 @@ class ArgparseCli:
3361
3371
  return fn()
3362
3372
 
3363
3373
  def cli_run_and_exit(self) -> ta.NoReturn:
3364
- sys.exit(rc if isinstance(rc := self.cli_run(), int) else 0)
3374
+ rc = self.cli_run()
3375
+ if not isinstance(rc, int):
3376
+ rc = 0
3377
+ raise SystemExit(rc)
3365
3378
 
3366
3379
  def __call__(self, *, exit: bool = False) -> ta.Optional[int]: # noqa
3367
3380
  if exit:
@@ -8137,7 +8150,7 @@ def configure_standard_logging(
8137
8150
  ##
8138
8151
 
8139
8152
 
8140
- def error_logging(log): # noqa
8153
+ def exception_logging(log): # noqa
8141
8154
  def outer(fn):
8142
8155
  @functools.wraps(fn)
8143
8156
  def inner(*args, **kwargs):
@@ -15559,7 +15572,7 @@ async def _async_main() -> ta.Optional[int]:
15559
15572
  def _main() -> None:
15560
15573
  configure_standard_logging('DEBUG')
15561
15574
 
15562
- sys.exit(rc if isinstance(rc := asyncio.run(_async_main()), int) else 0)
15575
+ raise SystemExit(rc if isinstance(rc := asyncio.run(_async_main()), int) else 0)
15563
15576
 
15564
15577
 
15565
15578
  if __name__ == '__main__':
@@ -2227,6 +2227,7 @@ TODO:
2227
2227
  - pre-run, post-run hooks
2228
2228
  - exitstack?
2229
2229
  - suggestion - difflib.get_close_matches
2230
+ - add_argument_group - group kw on ArgparseKwarg?
2230
2231
  """
2231
2232
 
2232
2233
 
@@ -2237,6 +2238,7 @@ TODO:
2237
2238
  class ArgparseArg:
2238
2239
  args: ta.Sequence[ta.Any]
2239
2240
  kwargs: ta.Mapping[str, ta.Any]
2241
+ group: ta.Optional[str] = None
2240
2242
  dest: ta.Optional[str] = None
2241
2243
 
2242
2244
  def __get__(self, instance, owner=None):
@@ -2246,7 +2248,11 @@ class ArgparseArg:
2246
2248
 
2247
2249
 
2248
2250
  def argparse_arg(*args, **kwargs) -> ArgparseArg:
2249
- return ArgparseArg(args, kwargs)
2251
+ return ArgparseArg(
2252
+ args=args,
2253
+ group=kwargs.pop('group', None),
2254
+ kwargs=kwargs,
2255
+ )
2250
2256
 
2251
2257
 
2252
2258
  def argparse_arg_(*args, **kwargs) -> ta.Any:
@@ -2416,6 +2422,10 @@ class ArgparseCli:
2416
2422
  subparser.set_defaults(_cmd=obj)
2417
2423
 
2418
2424
  elif isinstance(obj, ArgparseArg):
2425
+ if obj.group is not None:
2426
+ # FIXME: add_argument_group
2427
+ raise NotImplementedError
2428
+
2419
2429
  if att in anns:
2420
2430
  ann_kwargs = _get_argparse_arg_ann_kwargs(anns[att])
2421
2431
  obj.kwargs = {**ann_kwargs, **obj.kwargs}
@@ -2461,7 +2471,7 @@ class ArgparseCli:
2461
2471
 
2462
2472
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
2463
2473
  msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
2464
- if (parser := self.get_parser()).exit_on_error:
2474
+ if (parser := self.get_parser()).exit_on_error: # noqa
2465
2475
  parser.error(msg)
2466
2476
  else:
2467
2477
  raise argparse.ArgumentError(None, msg)
@@ -2481,7 +2491,10 @@ class ArgparseCli:
2481
2491
  return fn()
2482
2492
 
2483
2493
  def cli_run_and_exit(self) -> ta.NoReturn:
2484
- sys.exit(rc if isinstance(rc := self.cli_run(), int) else 0)
2494
+ rc = self.cli_run()
2495
+ if not isinstance(rc, int):
2496
+ rc = 0
2497
+ raise SystemExit(rc)
2485
2498
 
2486
2499
  def __call__(self, *, exit: bool = False) -> ta.Optional[int]: # noqa
2487
2500
  if exit:
@@ -4058,6 +4058,7 @@ TODO:
4058
4058
  - pre-run, post-run hooks
4059
4059
  - exitstack?
4060
4060
  - suggestion - difflib.get_close_matches
4061
+ - add_argument_group - group kw on ArgparseKwarg?
4061
4062
  """
4062
4063
 
4063
4064
 
@@ -4068,6 +4069,7 @@ TODO:
4068
4069
  class ArgparseArg:
4069
4070
  args: ta.Sequence[ta.Any]
4070
4071
  kwargs: ta.Mapping[str, ta.Any]
4072
+ group: ta.Optional[str] = None
4071
4073
  dest: ta.Optional[str] = None
4072
4074
 
4073
4075
  def __get__(self, instance, owner=None):
@@ -4077,7 +4079,11 @@ class ArgparseArg:
4077
4079
 
4078
4080
 
4079
4081
  def argparse_arg(*args, **kwargs) -> ArgparseArg:
4080
- return ArgparseArg(args, kwargs)
4082
+ return ArgparseArg(
4083
+ args=args,
4084
+ group=kwargs.pop('group', None),
4085
+ kwargs=kwargs,
4086
+ )
4081
4087
 
4082
4088
 
4083
4089
  def argparse_arg_(*args, **kwargs) -> ta.Any:
@@ -4247,6 +4253,10 @@ class ArgparseCli:
4247
4253
  subparser.set_defaults(_cmd=obj)
4248
4254
 
4249
4255
  elif isinstance(obj, ArgparseArg):
4256
+ if obj.group is not None:
4257
+ # FIXME: add_argument_group
4258
+ raise NotImplementedError
4259
+
4250
4260
  if att in anns:
4251
4261
  ann_kwargs = _get_argparse_arg_ann_kwargs(anns[att])
4252
4262
  obj.kwargs = {**ann_kwargs, **obj.kwargs}
@@ -4292,7 +4302,7 @@ class ArgparseCli:
4292
4302
 
4293
4303
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
4294
4304
  msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
4295
- if (parser := self.get_parser()).exit_on_error:
4305
+ if (parser := self.get_parser()).exit_on_error: # noqa
4296
4306
  parser.error(msg)
4297
4307
  else:
4298
4308
  raise argparse.ArgumentError(None, msg)
@@ -4312,7 +4322,10 @@ class ArgparseCli:
4312
4322
  return fn()
4313
4323
 
4314
4324
  def cli_run_and_exit(self) -> ta.NoReturn:
4315
- sys.exit(rc if isinstance(rc := self.cli_run(), int) else 0)
4325
+ rc = self.cli_run()
4326
+ if not isinstance(rc, int):
4327
+ rc = 0
4328
+ raise SystemExit(rc)
4316
4329
 
4317
4330
  def __call__(self, *, exit: bool = False) -> ta.Optional[int]: # noqa
4318
4331
  if exit:
@@ -10877,7 +10890,7 @@ class BasePyprojectPackageGenerator(Abstract):
10877
10890
 
10878
10891
  def _write_git_ignore(self) -> None:
10879
10892
  with open(os.path.join(self._pkg_dir(), '.gitignore'), 'w') as f:
10880
- f.write('\n'.join(self._GIT_IGNORE))
10893
+ f.write('\n'.join([*self._GIT_IGNORE, '']))
10881
10894
 
10882
10895
  #
10883
10896
 
@@ -384,9 +384,9 @@ def main() -> None:
384
384
  # Workaround for close failed in file object destructor: sys.excepthook is missing lost sys.stderr
385
385
  # http://stackoverflow.com/questions/7955138/addressing-sys-excepthook-error-in-bash-script
386
386
  sys.stderr.write(str(e) + '\n')
387
- sys.exit(1)
387
+ raise SystemExit(1) from None
388
388
  except KeyboardInterrupt:
389
- sys.exit(1)
389
+ raise SystemExit(1) from None
390
390
 
391
391
 
392
392
  # @omlish-manifest
@@ -0,0 +1,163 @@
1
+ import argparse
2
+ import pathlib
3
+ import typing as ta
4
+
5
+ from ... import textual as tx
6
+
7
+
8
+ ##
9
+
10
+
11
+ class QuitConfirmScreen(tx.ModalScreen[bool]):
12
+ """Screen with a dialog to confirm quit without saving."""
13
+
14
+ CSS = """
15
+ QuitConfirmScreen {
16
+ align: center middle;
17
+ }
18
+
19
+ #dialog {
20
+ width: 60;
21
+ height: 11;
22
+ border: thick $background 80%;
23
+ background: $surface;
24
+ padding: 1 2;
25
+ }
26
+
27
+ #question {
28
+ height: 3;
29
+ content-align: center middle;
30
+ }
31
+
32
+ Button {
33
+ width: 1fr;
34
+ }
35
+ """
36
+
37
+ def compose(self) -> tx.ComposeResult:
38
+ yield tx.Vertical(
39
+ tx.Label('You have unsaved changes. Do you want to save before quitting?', id='question'),
40
+ tx.Button('Save and Quit', variant='success', id='save'),
41
+ tx.Button('Quit Without Saving', variant='warning', id='quit'),
42
+ tx.Button('Cancel', variant='primary', id='cancel'),
43
+ id='dialog',
44
+ )
45
+
46
+ def on_button_pressed(self, event: tx.Button.Pressed) -> None:
47
+ if event.button.id == 'save':
48
+ self.dismiss(True)
49
+ elif event.button.id == 'quit':
50
+ self.dismiss(False)
51
+ else:
52
+ self.dismiss(None)
53
+
54
+
55
+ class TextEditor(tx.App):
56
+ """A simple text editor using Textual."""
57
+
58
+ CSS = """
59
+ TextArea {
60
+ height: 1fr;
61
+ }
62
+
63
+ Container {
64
+ height: 100%;
65
+ }
66
+ """
67
+
68
+ BINDINGS: ta.ClassVar[ta.Sequence[tx.Binding]] = [
69
+ tx.Binding('ctrl+s', 'save', 'Save', show=True),
70
+ tx.Binding('ctrl+q', 'quit', 'Quit', show=True),
71
+ ]
72
+
73
+ def __init__(self, filepath: pathlib.Path):
74
+ super().__init__()
75
+
76
+ self.filepath = filepath
77
+ self.text_area: tx.TextArea | None = None
78
+ self.modified = False
79
+ self.original_content = ''
80
+
81
+ def compose(self) -> tx.ComposeResult:
82
+ """Create child widgets for the app."""
83
+
84
+ yield tx.Header()
85
+ yield tx.Container(tx.TextArea(id='editor'))
86
+ yield tx.Footer()
87
+
88
+ def on_mount(self) -> None:
89
+ """Load the file content when the app starts."""
90
+
91
+ self.text_area = self.query_one('#editor', tx.TextArea)
92
+
93
+ # Load existing file or create new
94
+ if self.filepath.exists():
95
+ content = self.filepath.read_text()
96
+ self.text_area.load_text(content)
97
+ self.original_content = content
98
+ else:
99
+ self.original_content = ''
100
+
101
+ self.title = f'Text Editor - {self.filepath.name}'
102
+ self.sub_title = str(self.filepath)
103
+
104
+ def on_text_area_changed(self, event: tx.TextArea.Changed) -> None:
105
+ """Track if the document has been modified."""
106
+
107
+ if self.text_area:
108
+ current_content = self.text_area.text
109
+ self.modified = current_content != self.original_content
110
+
111
+ # Update title to show modified status
112
+ status = ' *' if self.modified else ''
113
+ self.title = f'Text Editor - {self.filepath.name}{status}'
114
+
115
+ def action_save(self) -> None:
116
+ """Save the current content to file."""
117
+
118
+ if self.text_area:
119
+ content = self.text_area.text
120
+ self.filepath.write_text(content)
121
+ self.original_content = content
122
+ self.modified = False
123
+ self.title = f'Text Editor - {self.filepath.name}'
124
+ self.notify(f'Saved to {self.filepath.name}')
125
+
126
+ async def action_quit(self) -> None:
127
+ """Quit the editor, prompting to save if modified."""
128
+
129
+ if self.modified:
130
+ def check_quit(should_save: bool | None) -> None:
131
+ if should_save is None:
132
+ # User cancelled
133
+ return
134
+
135
+ if should_save:
136
+ self.action_save()
137
+
138
+ self.exit()
139
+
140
+ await self.push_screen(QuitConfirmScreen(), callback=check_quit)
141
+
142
+ else:
143
+ self.exit()
144
+
145
+
146
+ def main() -> None:
147
+ """Parse arguments and run the editor."""
148
+
149
+ parser = argparse.ArgumentParser(description='Simple text editor')
150
+ parser.add_argument('filename', help='File to edit')
151
+ args = parser.parse_args()
152
+
153
+ filepath = pathlib.Path(args.filename).resolve()
154
+
155
+ # Create parent directories if needed
156
+ filepath.parent.mkdir(parents=True, exist_ok=True)
157
+
158
+ app = TextEditor(filepath)
159
+ app.run()
160
+
161
+
162
+ if __name__ == '__main__':
163
+ main()
@@ -12,7 +12,7 @@ import typing as ta
12
12
 
13
13
  from omlish import lang
14
14
 
15
- from ... import textual
15
+ from ... import textual as tx
16
16
  from .client import IrcClient
17
17
  from .commands import ALL_COMMANDS
18
18
  from .commands import IrcCommand
@@ -37,7 +37,7 @@ class IrcWindow:
37
37
  self.unread += 1
38
38
 
39
39
 
40
- class IrcApp(textual.App):
40
+ class IrcApp(tx.App):
41
41
  """IRC client application."""
42
42
 
43
43
  _commands: ta.ClassVar[ta.Mapping[str, IrcCommand]] = ALL_COMMANDS
@@ -65,9 +65,9 @@ class IrcApp(textual.App):
65
65
  }
66
66
  """
67
67
 
68
- BINDINGS: ta.ClassVar[ta.Sequence[textual.Binding]] = [
69
- textual.Binding('ctrl+n', 'next_window', 'Next Window', show=False),
70
- textual.Binding('ctrl+p', 'prev_window', 'Previous Window', show=False),
68
+ BINDINGS: ta.ClassVar[ta.Sequence[tx.Binding]] = [
69
+ tx.Binding('ctrl+n', 'next_window', 'Next Window', show=False),
70
+ tx.Binding('ctrl+p', 'prev_window', 'Previous Window', show=False),
71
71
  ]
72
72
 
73
73
  def __init__(
@@ -94,12 +94,12 @@ class IrcApp(textual.App):
94
94
 
95
95
  #
96
96
 
97
- def compose(self) -> textual.ComposeResult:
98
- text_area = textual.TextArea(id='messages', read_only=True, show_line_numbers=False)
97
+ def compose(self) -> tx.ComposeResult:
98
+ text_area = tx.TextArea(id='messages', read_only=True, show_line_numbers=False)
99
99
  text_area.cursor_blink = False
100
100
  yield text_area
101
- yield textual.Static('', id='status')
102
- yield textual.Input(placeholder='Enter command or message', id='input', select_on_focus=False)
101
+ yield tx.Static('', id='status')
102
+ yield tx.Input(placeholder='Enter command or message', id='input', select_on_focus=False)
103
103
 
104
104
  async def on_mount(self) -> None:
105
105
  """Initialize on mount."""
@@ -120,21 +120,21 @@ class IrcApp(textual.App):
120
120
  await self.add_message('system', f'Executing: {cmd}')
121
121
  await self.handle_command(cmd)
122
122
 
123
- async def on_key(self, event: textual.Key) -> None:
123
+ async def on_key(self, event: tx.Key) -> None:
124
124
  """Handle key events - redirect typing to input when messages area is focused."""
125
125
 
126
126
  focused = self.focused
127
127
  if focused and focused.id == 'messages':
128
128
  # If a printable character or common input key is pressed, focus the input and forward event
129
129
  if event.is_printable or event.key in ('space', 'backspace', 'delete'):
130
- input_widget = self.query_one('#input', textual.Input)
130
+ input_widget = self.query_one('#input', tx.Input)
131
131
  input_widget.focus()
132
132
  # Post the key event to the input widget so it handles it naturally
133
- input_widget.post_message(textual.Key(event.key, event.character))
133
+ input_widget.post_message(tx.Key(event.key, event.character))
134
134
  # Stop the event from being processed by the messages widget
135
135
  event.stop()
136
136
 
137
- async def on_input_submitted(self, event: textual.Input.Submitted) -> None:
137
+ async def on_input_submitted(self, event: tx.Input.Submitted) -> None:
138
138
  """Handle user input."""
139
139
 
140
140
  text = event.value.strip()
@@ -232,7 +232,7 @@ class IrcApp(textual.App):
232
232
  current_window.unread = 0
233
233
 
234
234
  # Update messages display
235
- messages_widget = self.query_one('#messages', textual.TextArea)
235
+ messages_widget = self.query_one('#messages', tx.TextArea)
236
236
 
237
237
  # Check if we switched windows or need full reload
238
238
  window_changed = self._last_window != current_window_name
@@ -271,7 +271,7 @@ class IrcApp(textual.App):
271
271
  window_list.append(indicator)
272
272
 
273
273
  status_text = ' '.join(window_list)
274
- self.query_one('#status', textual.Static).update(status_text)
274
+ self.query_one('#status', tx.Static).update(status_text)
275
275
 
276
276
  async def on_unmount(self) -> None:
277
277
  if (cl := self._client) is not None:
File without changes
@@ -27,6 +27,7 @@ with _lang.auto_proxy_init(globals()):
27
27
  from textual import timer # noqa
28
28
  from textual import widget # noqa
29
29
  from textual import widgets # noqa
30
+ from textual import work # noqa
30
31
  from textual.app import ActionError # noqa
31
32
  from textual.app import ActiveModeError # noqa
32
33
  from textual.app import App as App_ # noqa
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev473
3
+ Version: 0.0.0.dev475
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.dev473
17
+ Requires-Dist: omlish==0.0.0.dev475
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.9; extra == "all"
20
20
  Requires-Dist: pycparser~=2.23; extra == "all"
@@ -27,7 +27,7 @@ Requires-Dist: mypy~=1.18; 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.4; extra == "all"
30
+ Requires-Dist: textual~=6.5; extra == "all"
31
31
  Provides-Extra: black
32
32
  Requires-Dist: black~=25.9; 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.4; extra == "tui"
49
+ Requires-Dist: textual~=6.5; extra == "tui"
50
50
  Dynamic: license-file
51
51
 
52
52
  # Overview
@@ -345,6 +345,8 @@ omdev/tools/pawk/__main__.py
345
345
  omdev/tools/pawk/pawk.py
346
346
  omdev/tui/__init__.py
347
347
  omdev/tui/apps/__init__.py
348
+ omdev/tui/apps/edit/__init__.py
349
+ omdev/tui/apps/edit/main.py
348
350
  omdev/tui/apps/irc/__init__.py
349
351
  omdev/tui/apps/irc/__main__.py
350
352
  omdev/tui/apps/irc/app.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev473
1
+ omlish==0.0.0.dev475
2
2
 
3
3
  [all]
4
4
  black~=25.9
@@ -12,7 +12,7 @@ mypy~=1.18
12
12
  gprof2dot~=2025.4
13
13
  segno~=1.6
14
14
  rich~=14.2
15
- textual~=6.4
15
+ textual~=6.5
16
16
 
17
17
  [black]
18
18
  black~=25.9
@@ -38,4 +38,4 @@ segno~=1.6
38
38
 
39
39
  [tui]
40
40
  rich~=14.2
41
- textual~=6.4
41
+ textual~=6.5