ominfra 0.0.0.dev222__tar.gz → 0.0.0.dev223__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 (170) hide show
  1. {ominfra-0.0.0.dev222/ominfra.egg-info → ominfra-0.0.0.dev223}/PKG-INFO +3 -3
  2. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/scripts/journald2aws.py +109 -6
  3. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/scripts/manage.py +122 -28
  4. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/scripts/supervisor.py +56 -14
  5. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/http.py +3 -2
  6. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/inject.py +1 -1
  7. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/utils/strings.py +1 -1
  8. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223/ominfra.egg-info}/PKG-INFO +3 -3
  9. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra.egg-info/requires.txt +2 -2
  10. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/pyproject.toml +3 -3
  11. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/LICENSE +0 -0
  12. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/MANIFEST.in +0 -0
  13. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/README.rst +0 -0
  14. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/.manifests.json +0 -0
  15. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/__about__.py +0 -0
  16. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/__init__.py +0 -0
  17. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/__init__.py +0 -0
  18. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/__init__.py +0 -0
  19. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/__main__.py +0 -0
  20. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/auth.py +0 -0
  21. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/cli.py +0 -0
  22. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/dataclasses.py +0 -0
  23. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/instancetypes/__init__.py +0 -0
  24. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/instancetypes/__main__.py +0 -0
  25. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
  26. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/instancetypes/cache.py +0 -0
  27. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/instancetypes/cli.py +0 -0
  28. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
  29. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
  30. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
  31. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
  32. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/journald2aws/main.py +0 -0
  33. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
  34. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/logs.py +0 -0
  35. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/metadata.py +0 -0
  36. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/__init__.py +0 -0
  37. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/base.py +0 -0
  38. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/gen/__init__.py +0 -0
  39. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/gen/__main__.py +0 -0
  40. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/gen/cli.py +0 -0
  41. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/gen/gen.py +0 -0
  42. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/services/__init__.py +0 -0
  43. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/services/ec2.py +0 -0
  44. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/services/lambda_.py +0 -0
  45. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/services/rds.py +0 -0
  46. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/services/s3.py +0 -0
  47. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/aws/models/services/services.toml +0 -0
  48. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/gcp/__init__.py +0 -0
  49. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/gcp/api.py +0 -0
  50. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/clouds/gcp/auth.py +0 -0
  51. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/commands/__init__.py +0 -0
  52. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/commands/runners.py +0 -0
  53. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/commands/ssh.py +0 -0
  54. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/journald/__init__.py +0 -0
  55. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/journald/fields.py +0 -0
  56. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/journald/genmessages.py +0 -0
  57. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/journald/messages.py +0 -0
  58. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/journald/tailer.py +0 -0
  59. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/__init__.py +0 -0
  60. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/__main__.py +0 -0
  61. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/bootstrap.py +0 -0
  62. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/bootstrap_.py +0 -0
  63. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/commands/__init__.py +0 -0
  64. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/commands/base.py +0 -0
  65. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/commands/inject.py +0 -0
  66. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/commands/injection.py +0 -0
  67. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/commands/local.py +0 -0
  68. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/commands/marshal.py +0 -0
  69. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/commands/ping.py +0 -0
  70. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/commands/subprocess.py +0 -0
  71. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/commands/types.py +0 -0
  72. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/config.py +0 -0
  73. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/__init__.py +0 -0
  74. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/apps.py +0 -0
  75. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/commands.py +0 -0
  76. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/conf/__init__.py +0 -0
  77. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/conf/inject.py +0 -0
  78. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/conf/manager.py +0 -0
  79. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/conf/specs.py +0 -0
  80. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/config.py +0 -0
  81. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/deploy.py +0 -0
  82. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/git.py +0 -0
  83. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/inject.py +0 -0
  84. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/injection.py +0 -0
  85. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/interp.py +0 -0
  86. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/nginx.py +0 -0
  87. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/paths/__init__.py +0 -0
  88. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/paths/inject.py +0 -0
  89. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/paths/manager.py +0 -0
  90. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/paths/owners.py +0 -0
  91. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/paths/paths.py +0 -0
  92. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/paths/specs.py +0 -0
  93. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/paths/types.py +0 -0
  94. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/specs.py +0 -0
  95. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/systemd.py +0 -0
  96. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/tags.py +0 -0
  97. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/tmp.py +0 -0
  98. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/types.py +0 -0
  99. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/deploy/venvs.py +0 -0
  100. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/inject.py +0 -0
  101. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/main.py +0 -0
  102. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/marshal.py +0 -0
  103. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/remote/__init__.py +0 -0
  104. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/remote/_main.py +0 -0
  105. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/remote/channel.py +0 -0
  106. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/remote/config.py +0 -0
  107. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/remote/connection.py +0 -0
  108. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/remote/execution.py +0 -0
  109. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/remote/inject.py +0 -0
  110. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/remote/payload.py +0 -0
  111. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/remote/spawning.py +0 -0
  112. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/system/__init__.py +0 -0
  113. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/system/commands.py +0 -0
  114. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/system/config.py +0 -0
  115. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/system/inject.py +0 -0
  116. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/system/packages.py +0 -0
  117. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/system/platforms.py +0 -0
  118. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/targets/__init__.py +0 -0
  119. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/targets/bestpython.py +0 -0
  120. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/targets/bestpython.sh +0 -0
  121. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/targets/connection.py +0 -0
  122. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/targets/inject.py +0 -0
  123. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/manage/targets/targets.py +0 -0
  124. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/pyremote.py +0 -0
  125. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/scripts/__init__.py +0 -0
  126. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/LICENSE.txt +0 -0
  127. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/__init__.py +0 -0
  128. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/__main__.py +0 -0
  129. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/configs.py +0 -0
  130. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/dispatchers.py +0 -0
  131. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/dispatchersimpl.py +0 -0
  132. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/events.py +0 -0
  133. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/exceptions.py +0 -0
  134. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/groups.py +0 -0
  135. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/groupsimpl.py +0 -0
  136. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/io.py +0 -0
  137. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/main.py +0 -0
  138. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/pipes.py +0 -0
  139. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/privileges.py +0 -0
  140. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/process.py +0 -0
  141. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/processimpl.py +0 -0
  142. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/setup.py +0 -0
  143. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/setupimpl.py +0 -0
  144. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/signals.py +0 -0
  145. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/spawning.py +0 -0
  146. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/spawningimpl.py +0 -0
  147. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/states.py +0 -0
  148. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/supervisor.py +0 -0
  149. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/types.py +0 -0
  150. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/utils/__init__.py +0 -0
  151. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/utils/collections.py +0 -0
  152. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/utils/diag.py +0 -0
  153. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/utils/fds.py +0 -0
  154. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/utils/fs.py +0 -0
  155. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/utils/os.py +0 -0
  156. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/utils/ostypes.py +0 -0
  157. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/utils/signals.py +0 -0
  158. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/supervisor/utils/users.py +0 -0
  159. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/systemd.py +0 -0
  160. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/tailscale/__init__.py +0 -0
  161. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/tailscale/api.py +0 -0
  162. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/tailscale/cli.py +0 -0
  163. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/threadworkers.py +0 -0
  164. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/tools/__init__.py +0 -0
  165. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra/tools/listresources.py +0 -0
  166. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra.egg-info/SOURCES.txt +0 -0
  167. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra.egg-info/dependency_links.txt +0 -0
  168. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra.egg-info/entry_points.txt +0 -0
  169. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/ominfra.egg-info/top_level.txt +0 -0
  170. {ominfra-0.0.0.dev222 → ominfra-0.0.0.dev223}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ominfra
3
- Version: 0.0.0.dev222
3
+ Version: 0.0.0.dev223
4
4
  Summary: ominfra
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omdev==0.0.0.dev222
16
- Requires-Dist: omlish==0.0.0.dev222
15
+ Requires-Dist: omdev==0.0.0.dev223
16
+ Requires-Dist: omlish==0.0.0.dev223
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.18; extra == "all"
@@ -3388,18 +3388,34 @@ class ObjMarshalerManager:
3388
3388
  return reg
3389
3389
 
3390
3390
  if abc.ABC in ty.__bases__:
3391
- impls = [ity for ity in deep_subclasses(ty) if abc.ABC not in ity.__bases__] # type: ignore
3392
- if all(ity.__qualname__.endswith(ty.__name__) for ity in impls):
3393
- ins = {ity: snake_case(ity.__qualname__[:-len(ty.__name__)]) for ity in impls}
3394
- else:
3395
- ins = {ity: ity.__qualname__ for ity in impls}
3391
+ tn = ty.__name__
3392
+ impls: ta.List[ta.Tuple[type, str]] = [ # type: ignore[var-annotated]
3393
+ (ity, ity.__name__)
3394
+ for ity in deep_subclasses(ty)
3395
+ if abc.ABC not in ity.__bases__
3396
+ ]
3397
+
3398
+ if all(itn.endswith(tn) for _, itn in impls):
3399
+ impls = [
3400
+ (ity, snake_case(itn[:-len(tn)]))
3401
+ for ity, itn in impls
3402
+ ]
3403
+
3404
+ dupe_tns = sorted(
3405
+ dn
3406
+ for dn, dc in collections.Counter(itn for _, itn in impls).items()
3407
+ if dc > 1
3408
+ )
3409
+ if dupe_tns:
3410
+ raise KeyError(f'Duplicate impl names for {ty}: {dupe_tns}')
3411
+
3396
3412
  return PolymorphicObjMarshaler.of([
3397
3413
  PolymorphicObjMarshaler.Impl(
3398
3414
  ity,
3399
3415
  itn,
3400
3416
  rec(ity),
3401
3417
  )
3402
- for ity, itn in ins.items()
3418
+ for ity, itn in impls
3403
3419
  ])
3404
3420
 
3405
3421
  if issubclass(ty, enum.Enum):
@@ -4470,7 +4486,51 @@ class BaseSubprocesses(abc.ABC): # noqa
4470
4486
  ##
4471
4487
 
4472
4488
 
4489
+ @dc.dataclass(frozen=True)
4490
+ class SubprocessRun:
4491
+ cmd: ta.Sequence[str]
4492
+ input: ta.Any = None
4493
+ timeout: ta.Optional[float] = None
4494
+ check: bool = False
4495
+ capture_output: ta.Optional[bool] = None
4496
+ kwargs: ta.Optional[ta.Mapping[str, ta.Any]] = None
4497
+
4498
+
4499
+ @dc.dataclass(frozen=True)
4500
+ class SubprocessRunOutput(ta.Generic[T]):
4501
+ proc: T
4502
+
4503
+ returncode: int # noqa
4504
+
4505
+ stdout: ta.Optional[bytes] = None
4506
+ stderr: ta.Optional[bytes] = None
4507
+
4508
+
4473
4509
  class AbstractSubprocesses(BaseSubprocesses, abc.ABC):
4510
+ @abc.abstractmethod
4511
+ def run_(self, run: SubprocessRun) -> SubprocessRunOutput:
4512
+ raise NotImplementedError
4513
+
4514
+ def run(
4515
+ self,
4516
+ *cmd: str,
4517
+ input: ta.Any = None, # noqa
4518
+ timeout: ta.Optional[float] = None,
4519
+ check: bool = False,
4520
+ capture_output: ta.Optional[bool] = None,
4521
+ **kwargs: ta.Any,
4522
+ ) -> SubprocessRunOutput:
4523
+ return self.run_(SubprocessRun(
4524
+ cmd=cmd,
4525
+ input=input,
4526
+ timeout=timeout,
4527
+ check=check,
4528
+ capture_output=capture_output,
4529
+ kwargs=kwargs,
4530
+ ))
4531
+
4532
+ #
4533
+
4474
4534
  @abc.abstractmethod
4475
4535
  def check_call(
4476
4536
  self,
@@ -4534,6 +4594,25 @@ class AbstractSubprocesses(BaseSubprocesses, abc.ABC):
4534
4594
 
4535
4595
 
4536
4596
  class Subprocesses(AbstractSubprocesses):
4597
+ def run_(self, run: SubprocessRun) -> SubprocessRunOutput[subprocess.CompletedProcess]:
4598
+ proc = subprocess.run(
4599
+ run.cmd,
4600
+ input=run.input,
4601
+ timeout=run.timeout,
4602
+ check=run.check,
4603
+ capture_output=run.capture_output or False,
4604
+ **(run.kwargs or {}),
4605
+ )
4606
+
4607
+ return SubprocessRunOutput(
4608
+ proc=proc,
4609
+
4610
+ returncode=proc.returncode,
4611
+
4612
+ stdout=proc.stdout, # noqa
4613
+ stderr=proc.stderr, # noqa
4614
+ )
4615
+
4537
4616
  def check_call(
4538
4617
  self,
4539
4618
  *cmd: str,
@@ -4559,6 +4638,30 @@ subprocesses = Subprocesses()
4559
4638
 
4560
4639
 
4561
4640
  class AbstractAsyncSubprocesses(BaseSubprocesses):
4641
+ @abc.abstractmethod
4642
+ async def run_(self, run: SubprocessRun) -> SubprocessRunOutput:
4643
+ raise NotImplementedError
4644
+
4645
+ def run(
4646
+ self,
4647
+ *cmd: str,
4648
+ input: ta.Any = None, # noqa
4649
+ timeout: ta.Optional[float] = None,
4650
+ check: bool = False,
4651
+ capture_output: ta.Optional[bool] = None,
4652
+ **kwargs: ta.Any,
4653
+ ) -> ta.Awaitable[SubprocessRunOutput]:
4654
+ return self.run_(SubprocessRun(
4655
+ cmd=cmd,
4656
+ input=input,
4657
+ timeout=timeout,
4658
+ check=check,
4659
+ capture_output=capture_output,
4660
+ kwargs=kwargs,
4661
+ ))
4662
+
4663
+ #
4664
+
4562
4665
  @abc.abstractmethod
4563
4666
  async def check_call(
4564
4667
  self,
@@ -6826,18 +6826,34 @@ class ObjMarshalerManager:
6826
6826
  return reg
6827
6827
 
6828
6828
  if abc.ABC in ty.__bases__:
6829
- impls = [ity for ity in deep_subclasses(ty) if abc.ABC not in ity.__bases__] # type: ignore
6830
- if all(ity.__qualname__.endswith(ty.__name__) for ity in impls):
6831
- ins = {ity: snake_case(ity.__qualname__[:-len(ty.__name__)]) for ity in impls}
6832
- else:
6833
- ins = {ity: ity.__qualname__ for ity in impls}
6829
+ tn = ty.__name__
6830
+ impls: ta.List[ta.Tuple[type, str]] = [ # type: ignore[var-annotated]
6831
+ (ity, ity.__name__)
6832
+ for ity in deep_subclasses(ty)
6833
+ if abc.ABC not in ity.__bases__
6834
+ ]
6835
+
6836
+ if all(itn.endswith(tn) for _, itn in impls):
6837
+ impls = [
6838
+ (ity, snake_case(itn[:-len(tn)]))
6839
+ for ity, itn in impls
6840
+ ]
6841
+
6842
+ dupe_tns = sorted(
6843
+ dn
6844
+ for dn, dc in collections.Counter(itn for _, itn in impls).items()
6845
+ if dc > 1
6846
+ )
6847
+ if dupe_tns:
6848
+ raise KeyError(f'Duplicate impl names for {ty}: {dupe_tns}')
6849
+
6834
6850
  return PolymorphicObjMarshaler.of([
6835
6851
  PolymorphicObjMarshaler.Impl(
6836
6852
  ity,
6837
6853
  itn,
6838
6854
  rec(ity),
6839
6855
  )
6840
- for ity, itn in ins.items()
6856
+ for ity, itn in impls
6841
6857
  ])
6842
6858
 
6843
6859
  if issubclass(ty, enum.Enum):
@@ -8407,7 +8423,51 @@ class BaseSubprocesses(abc.ABC): # noqa
8407
8423
  ##
8408
8424
 
8409
8425
 
8426
+ @dc.dataclass(frozen=True)
8427
+ class SubprocessRun:
8428
+ cmd: ta.Sequence[str]
8429
+ input: ta.Any = None
8430
+ timeout: ta.Optional[float] = None
8431
+ check: bool = False
8432
+ capture_output: ta.Optional[bool] = None
8433
+ kwargs: ta.Optional[ta.Mapping[str, ta.Any]] = None
8434
+
8435
+
8436
+ @dc.dataclass(frozen=True)
8437
+ class SubprocessRunOutput(ta.Generic[T]):
8438
+ proc: T
8439
+
8440
+ returncode: int # noqa
8441
+
8442
+ stdout: ta.Optional[bytes] = None
8443
+ stderr: ta.Optional[bytes] = None
8444
+
8445
+
8410
8446
  class AbstractSubprocesses(BaseSubprocesses, abc.ABC):
8447
+ @abc.abstractmethod
8448
+ def run_(self, run: SubprocessRun) -> SubprocessRunOutput:
8449
+ raise NotImplementedError
8450
+
8451
+ def run(
8452
+ self,
8453
+ *cmd: str,
8454
+ input: ta.Any = None, # noqa
8455
+ timeout: ta.Optional[float] = None,
8456
+ check: bool = False,
8457
+ capture_output: ta.Optional[bool] = None,
8458
+ **kwargs: ta.Any,
8459
+ ) -> SubprocessRunOutput:
8460
+ return self.run_(SubprocessRun(
8461
+ cmd=cmd,
8462
+ input=input,
8463
+ timeout=timeout,
8464
+ check=check,
8465
+ capture_output=capture_output,
8466
+ kwargs=kwargs,
8467
+ ))
8468
+
8469
+ #
8470
+
8411
8471
  @abc.abstractmethod
8412
8472
  def check_call(
8413
8473
  self,
@@ -8471,6 +8531,25 @@ class AbstractSubprocesses(BaseSubprocesses, abc.ABC):
8471
8531
 
8472
8532
 
8473
8533
  class Subprocesses(AbstractSubprocesses):
8534
+ def run_(self, run: SubprocessRun) -> SubprocessRunOutput[subprocess.CompletedProcess]:
8535
+ proc = subprocess.run(
8536
+ run.cmd,
8537
+ input=run.input,
8538
+ timeout=run.timeout,
8539
+ check=run.check,
8540
+ capture_output=run.capture_output or False,
8541
+ **(run.kwargs or {}),
8542
+ )
8543
+
8544
+ return SubprocessRunOutput(
8545
+ proc=proc,
8546
+
8547
+ returncode=proc.returncode,
8548
+
8549
+ stdout=proc.stdout, # noqa
8550
+ stderr=proc.stderr, # noqa
8551
+ )
8552
+
8474
8553
  def check_call(
8475
8554
  self,
8476
8555
  *cmd: str,
@@ -8496,6 +8575,30 @@ subprocesses = Subprocesses()
8496
8575
 
8497
8576
 
8498
8577
  class AbstractAsyncSubprocesses(BaseSubprocesses):
8578
+ @abc.abstractmethod
8579
+ async def run_(self, run: SubprocessRun) -> SubprocessRunOutput:
8580
+ raise NotImplementedError
8581
+
8582
+ def run(
8583
+ self,
8584
+ *cmd: str,
8585
+ input: ta.Any = None, # noqa
8586
+ timeout: ta.Optional[float] = None,
8587
+ check: bool = False,
8588
+ capture_output: ta.Optional[bool] = None,
8589
+ **kwargs: ta.Any,
8590
+ ) -> ta.Awaitable[SubprocessRunOutput]:
8591
+ return self.run_(SubprocessRun(
8592
+ cmd=cmd,
8593
+ input=input,
8594
+ timeout=timeout,
8595
+ check=check,
8596
+ capture_output=capture_output,
8597
+ kwargs=kwargs,
8598
+ ))
8599
+
8600
+ #
8601
+
8499
8602
  @abc.abstractmethod
8500
8603
  async def check_call(
8501
8604
  self,
@@ -9617,41 +9720,32 @@ class AsyncioSubprocesses(AbstractAsyncSubprocesses):
9617
9720
 
9618
9721
  #
9619
9722
 
9620
- @dc.dataclass(frozen=True)
9621
- class RunOutput:
9622
- proc: asyncio.subprocess.Process
9623
- stdout: ta.Optional[bytes]
9624
- stderr: ta.Optional[bytes]
9723
+ async def run_(self, run: SubprocessRun) -> SubprocessRunOutput[asyncio.subprocess.Process]:
9724
+ kwargs = dict(run.kwargs or {})
9625
9725
 
9626
- async def run(
9627
- self,
9628
- *cmd: str,
9629
- input: ta.Any = None, # noqa
9630
- timeout: ta.Optional[float] = None,
9631
- check: bool = False, # noqa
9632
- capture_output: ta.Optional[bool] = None,
9633
- **kwargs: ta.Any,
9634
- ) -> RunOutput:
9635
- if capture_output:
9726
+ if run.capture_output:
9636
9727
  kwargs.setdefault('stdout', subprocess.PIPE)
9637
9728
  kwargs.setdefault('stderr', subprocess.PIPE)
9638
9729
 
9639
9730
  proc: asyncio.subprocess.Process
9640
- async with self.popen(*cmd, **kwargs) as proc:
9641
- stdout, stderr = await self.communicate(proc, input, timeout)
9731
+ async with self.popen(*run.cmd, **kwargs) as proc:
9732
+ stdout, stderr = await self.communicate(proc, run.input, run.timeout)
9642
9733
 
9643
9734
  if check and proc.returncode:
9644
9735
  raise subprocess.CalledProcessError(
9645
9736
  proc.returncode,
9646
- cmd,
9737
+ run.cmd,
9647
9738
  output=stdout,
9648
9739
  stderr=stderr,
9649
9740
  )
9650
9741
 
9651
- return self.RunOutput(
9652
- proc,
9653
- stdout,
9654
- stderr,
9742
+ return SubprocessRunOutput(
9743
+ proc=proc,
9744
+
9745
+ returncode=check.isinstance(proc.returncode, int),
9746
+
9747
+ stdout=stdout,
9748
+ stderr=stderr,
9655
9749
  )
9656
9750
 
9657
9751
  #
@@ -599,7 +599,7 @@ class SuffixMultiplier:
599
599
  for k in d:
600
600
  if self._keysz is None:
601
601
  self._keysz = len(k)
602
- elif self._keysz != len(k): # type: ignore
602
+ elif self._keysz != len(k):
603
603
  raise ValueError(k)
604
604
 
605
605
  def __call__(self, v: ta.Union[str, int]) -> int:
@@ -3929,6 +3929,8 @@ class HttpRequestParser:
3929
3929
 
3930
3930
  #
3931
3931
 
3932
+ _TLS_HANDSHAKE_PREFIX = b'\x16'
3933
+
3932
3934
  def coro_parse(self) -> ta.Generator[int, bytes, ParseHttpRequestResult]:
3933
3935
  raw_request_line = yield self._max_line + 1
3934
3936
 
@@ -3967,6 +3969,17 @@ class HttpRequestParser:
3967
3969
  if not raw_request_line:
3968
3970
  return EmptyParsedHttpResult(**result_kwargs())
3969
3971
 
3972
+ # Detect TLS
3973
+
3974
+ if raw_request_line.startswith(self._TLS_HANDSHAKE_PREFIX):
3975
+ return ParseHttpRequestError(
3976
+ code=http.HTTPStatus.BAD_REQUEST,
3977
+ message='Bad request version (probable TLS handshake)',
3978
+ **result_kwargs(),
3979
+ )
3980
+
3981
+ # Decode line
3982
+
3970
3983
  request_line = raw_request_line.decode('iso-8859-1').rstrip('\r\n')
3971
3984
 
3972
3985
  # Split words
@@ -5984,18 +5997,34 @@ class ObjMarshalerManager:
5984
5997
  return reg
5985
5998
 
5986
5999
  if abc.ABC in ty.__bases__:
5987
- impls = [ity for ity in deep_subclasses(ty) if abc.ABC not in ity.__bases__] # type: ignore
5988
- if all(ity.__qualname__.endswith(ty.__name__) for ity in impls):
5989
- ins = {ity: snake_case(ity.__qualname__[:-len(ty.__name__)]) for ity in impls}
5990
- else:
5991
- ins = {ity: ity.__qualname__ for ity in impls}
6000
+ tn = ty.__name__
6001
+ impls: ta.List[ta.Tuple[type, str]] = [ # type: ignore[var-annotated]
6002
+ (ity, ity.__name__)
6003
+ for ity in deep_subclasses(ty)
6004
+ if abc.ABC not in ity.__bases__
6005
+ ]
6006
+
6007
+ if all(itn.endswith(tn) for _, itn in impls):
6008
+ impls = [
6009
+ (ity, snake_case(itn[:-len(tn)]))
6010
+ for ity, itn in impls
6011
+ ]
6012
+
6013
+ dupe_tns = sorted(
6014
+ dn
6015
+ for dn, dc in collections.Counter(itn for _, itn in impls).items()
6016
+ if dc > 1
6017
+ )
6018
+ if dupe_tns:
6019
+ raise KeyError(f'Duplicate impl names for {ty}: {dupe_tns}')
6020
+
5992
6021
  return PolymorphicObjMarshaler.of([
5993
6022
  PolymorphicObjMarshaler.Impl(
5994
6023
  ity,
5995
6024
  itn,
5996
6025
  rec(ity),
5997
6026
  )
5998
- for ity, itn in ins.items()
6027
+ for ity, itn in impls
5999
6028
  ])
6000
6029
 
6001
6030
  if issubclass(ty, enum.Enum):
@@ -6879,6 +6908,19 @@ class HttpHandler_(abc.ABC): # noqa
6879
6908
  raise NotImplementedError
6880
6909
 
6881
6910
 
6911
+ @dc.dataclass(frozen=True)
6912
+ class LoggingHttpHandler(HttpHandler_):
6913
+ handler: HttpHandler
6914
+ log: logging.Logger
6915
+ level: int = logging.INFO
6916
+
6917
+ def __call__(self, req: HttpHandlerRequest) -> HttpHandlerResponse:
6918
+ self.log.log(self.level, '%r', req)
6919
+ resp = self.handler(req)
6920
+ self.log.log(self.level, '%r', resp)
6921
+ return resp
6922
+
6923
+
6882
6924
  ########################################
6883
6925
  # ../../../omlish/lite/configs.py
6884
6926
 
@@ -7682,7 +7724,7 @@ class CoroHttpServer:
7682
7724
  if isinstance(parsed, ParseHttpRequestError):
7683
7725
  err = self._build_error(
7684
7726
  parsed.code,
7685
- *parsed.message,
7727
+ *([parsed.message] if isinstance(parsed.message, str) else parsed.message),
7686
7728
  version=parsed.version,
7687
7729
  )
7688
7730
  yield self.ErrorLogIo(err)
@@ -8544,7 +8586,7 @@ class CoroHttpServerConnectionFdioHandler(SocketFdioHandler):
8544
8586
  self._log_handler = log_handler
8545
8587
 
8546
8588
  self._read_buf = ReadableListBuffer()
8547
- self._write_buf: IncrementalWriteBuffer | None = None
8589
+ self._write_buf: ta.Optional[IncrementalWriteBuffer] = None
8548
8590
 
8549
8591
  self._coro_srv = CoroHttpServer(
8550
8592
  addr,
@@ -8552,7 +8594,7 @@ class CoroHttpServerConnectionFdioHandler(SocketFdioHandler):
8552
8594
  )
8553
8595
  self._srv_coro: ta.Optional[ta.Generator[CoroHttpServer.Io, ta.Optional[bytes], None]] = self._coro_srv.coro_handle() # noqa
8554
8596
 
8555
- self._cur_io: CoroHttpServer.Io | None = None
8597
+ self._cur_io: ta.Optional[CoroHttpServer.Io] = None
8556
8598
  self._next_io()
8557
8599
 
8558
8600
  #
@@ -8560,7 +8602,7 @@ class CoroHttpServerConnectionFdioHandler(SocketFdioHandler):
8560
8602
  def _next_io(self) -> None: # noqa
8561
8603
  coro = check.not_none(self._srv_coro)
8562
8604
 
8563
- d: bytes | None = None
8605
+ d: ta.Optional[bytes] = None
8564
8606
  o = self._cur_io
8565
8607
  while True:
8566
8608
  if o is None:
@@ -8937,7 +8979,7 @@ class HttpServer(HasDispatchers):
8937
8979
  ##
8938
8980
 
8939
8981
 
8940
- class SupervisorHttpHandler:
8982
+ class SupervisorHttpHandler(HttpHandler_):
8941
8983
  def __init__(
8942
8984
  self,
8943
8985
  *,
@@ -8947,7 +8989,7 @@ class SupervisorHttpHandler:
8947
8989
 
8948
8990
  self._groups = groups
8949
8991
 
8950
- def handle(self, req: HttpHandlerRequest) -> HttpHandlerResponse:
8992
+ def __call__(self, req: HttpHandlerRequest) -> HttpHandlerResponse:
8951
8993
  dct = {
8952
8994
  'method': req.method,
8953
8995
  'path': req.path,
@@ -10163,7 +10205,7 @@ def bind_server(
10163
10205
 
10164
10206
  if config.http_port is not None:
10165
10207
  def _provide_http_handler(s: SupervisorHttpHandler) -> HttpServer.Handler:
10166
- return HttpServer.Handler(s.handle)
10208
+ return HttpServer.Handler(s)
10167
10209
 
10168
10210
  lst.extend([
10169
10211
  inj.bind(HttpServer, singleton=True, eager=True),
@@ -6,6 +6,7 @@ import typing as ta
6
6
 
7
7
  from omlish.http.coro.fdio import CoroHttpServerConnectionFdioHandler
8
8
  from omlish.http.handlers import HttpHandler
9
+ from omlish.http.handlers import HttpHandler_
9
10
  from omlish.http.handlers import HttpHandlerRequest
10
11
  from omlish.http.handlers import HttpHandlerResponse
11
12
  from omlish.io.fdio.handlers import SocketFdioHandler
@@ -98,7 +99,7 @@ class HttpServer(HasDispatchers):
98
99
  ##
99
100
 
100
101
 
101
- class SupervisorHttpHandler:
102
+ class SupervisorHttpHandler(HttpHandler_):
102
103
  def __init__(
103
104
  self,
104
105
  *,
@@ -108,7 +109,7 @@ class SupervisorHttpHandler:
108
109
 
109
110
  self._groups = groups
110
111
 
111
- def handle(self, req: HttpHandlerRequest) -> HttpHandlerResponse:
112
+ def __call__(self, req: HttpHandlerRequest) -> HttpHandlerResponse:
112
113
  dct = {
113
114
  'method': req.method,
114
115
  'path': req.path,
@@ -133,7 +133,7 @@ def bind_server(
133
133
 
134
134
  if config.http_port is not None:
135
135
  def _provide_http_handler(s: SupervisorHttpHandler) -> HttpServer.Handler:
136
- return HttpServer.Handler(s.handle)
136
+ return HttpServer.Handler(s)
137
137
 
138
138
  lst.extend([
139
139
  inj.bind(HttpServer, singleton=True, eager=True),
@@ -73,7 +73,7 @@ class SuffixMultiplier:
73
73
  for k in d:
74
74
  if self._keysz is None:
75
75
  self._keysz = len(k)
76
- elif self._keysz != len(k): # type: ignore
76
+ elif self._keysz != len(k):
77
77
  raise ValueError(k)
78
78
 
79
79
  def __call__(self, v: ta.Union[str, int]) -> int:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ominfra
3
- Version: 0.0.0.dev222
3
+ Version: 0.0.0.dev223
4
4
  Summary: ominfra
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omdev==0.0.0.dev222
16
- Requires-Dist: omlish==0.0.0.dev222
15
+ Requires-Dist: omdev==0.0.0.dev223
16
+ Requires-Dist: omlish==0.0.0.dev223
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.18; extra == "all"
@@ -1,5 +1,5 @@
1
- omdev==0.0.0.dev222
2
- omlish==0.0.0.dev222
1
+ omdev==0.0.0.dev223
2
+ omlish==0.0.0.dev223
3
3
 
4
4
  [all]
5
5
  paramiko~=3.5
@@ -12,7 +12,7 @@ authors = [
12
12
  urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = {text = 'BSD-3-Clause'}
14
14
  requires-python = '>=3.12'
15
- version = '0.0.0.dev222'
15
+ version = '0.0.0.dev223'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
@@ -22,8 +22,8 @@ classifiers = [
22
22
  ]
23
23
  description = 'ominfra'
24
24
  dependencies = [
25
- 'omdev == 0.0.0.dev222',
26
- 'omlish == 0.0.0.dev222',
25
+ 'omdev == 0.0.0.dev223',
26
+ 'omlish == 0.0.0.dev223',
27
27
  ]
28
28
 
29
29
  [project.optional-dependencies]
File without changes