ominfra 0.0.0.dev471__tar.gz → 0.0.0.dev473__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.dev471/ominfra.egg-info → ominfra-0.0.0.dev473}/PKG-INFO +3 -3
  2. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/scripts/journald2aws.py +197 -29
  3. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/scripts/manage.py +56 -29
  4. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/scripts/supervisor.py +193 -25
  5. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473/ominfra.egg-info}/PKG-INFO +3 -3
  6. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra.egg-info/requires.txt +2 -2
  7. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/pyproject.toml +3 -3
  8. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/LICENSE +0 -0
  9. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/MANIFEST.in +0 -0
  10. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/README.md +0 -0
  11. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/.omlish-manifests.json +0 -0
  12. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/__about__.py +0 -0
  13. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/__init__.py +0 -0
  14. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/__init__.py +0 -0
  15. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/__init__.py +0 -0
  16. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/__main__.py +0 -0
  17. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/auth.py +0 -0
  18. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/cli.py +0 -0
  19. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/dataclasses.py +0 -0
  20. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/instancetypes/__init__.py +0 -0
  21. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/instancetypes/__main__.py +0 -0
  22. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
  23. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/instancetypes/cache.py +0 -0
  24. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/instancetypes/cli.py +0 -0
  25. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
  26. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
  27. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
  28. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
  29. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/journald2aws/main.py +0 -0
  30. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
  31. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/logs.py +0 -0
  32. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/metadata.py +0 -0
  33. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/__init__.py +0 -0
  34. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/base.py +0 -0
  35. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/gen/__init__.py +0 -0
  36. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/gen/__main__.py +0 -0
  37. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/gen/cli.py +0 -0
  38. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/gen/gen.py +0 -0
  39. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/services/__init__.py +0 -0
  40. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/services/ec2.py +0 -0
  41. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/services/lambda_.py +0 -0
  42. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/services/rds.py +0 -0
  43. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/services/s3.py +0 -0
  44. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/aws/models/services/services.toml +0 -0
  45. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/gcp/__init__.py +0 -0
  46. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/gcp/api.py +0 -0
  47. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/clouds/gcp/auth.py +0 -0
  48. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/commands/__init__.py +0 -0
  49. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/commands/runners.py +0 -0
  50. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/commands/ssh.py +0 -0
  51. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/journald/__init__.py +0 -0
  52. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/journald/fields.py +0 -0
  53. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/journald/genmessages.py +0 -0
  54. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/journald/messages.py +0 -0
  55. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/journald/tailer.py +0 -0
  56. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/__init__.py +0 -0
  57. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/__main__.py +0 -0
  58. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/bootstrap.py +0 -0
  59. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/bootstrap_.py +0 -0
  60. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/commands/__init__.py +0 -0
  61. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/commands/base.py +0 -0
  62. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/commands/inject.py +0 -0
  63. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/commands/injection.py +0 -0
  64. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/commands/local.py +0 -0
  65. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/commands/marshal.py +0 -0
  66. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/commands/ping.py +0 -0
  67. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/commands/subprocess.py +0 -0
  68. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/commands/types.py +0 -0
  69. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/config.py +0 -0
  70. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/__init__.py +0 -0
  71. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/apps.py +0 -0
  72. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/commands.py +0 -0
  73. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/conf/__init__.py +0 -0
  74. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/conf/inject.py +0 -0
  75. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/conf/manager.py +0 -0
  76. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/conf/specs.py +0 -0
  77. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/config.py +0 -0
  78. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/deploy.py +0 -0
  79. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/git.py +0 -0
  80. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/inject.py +0 -0
  81. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/injection.py +0 -0
  82. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/interp.py +0 -0
  83. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/nginx.py +0 -0
  84. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/paths/__init__.py +0 -0
  85. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/paths/inject.py +0 -0
  86. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/paths/manager.py +0 -0
  87. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/paths/owners.py +0 -0
  88. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/paths/paths.py +0 -0
  89. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/paths/specs.py +0 -0
  90. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/paths/types.py +0 -0
  91. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/specs.py +0 -0
  92. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/systemd.py +0 -0
  93. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/tags.py +0 -0
  94. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/tmp.py +0 -0
  95. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/types.py +0 -0
  96. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/deploy/venvs.py +0 -0
  97. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/inject.py +0 -0
  98. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/main.py +0 -0
  99. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/marshal.py +0 -0
  100. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/remote/__init__.py +0 -0
  101. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/remote/_main.py +0 -0
  102. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/remote/channel.py +0 -0
  103. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/remote/config.py +0 -0
  104. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/remote/connection.py +0 -0
  105. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/remote/execution.py +0 -0
  106. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/remote/inject.py +0 -0
  107. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/remote/payload.py +0 -0
  108. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/remote/spawning.py +0 -0
  109. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/system/__init__.py +0 -0
  110. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/system/commands.py +0 -0
  111. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/system/config.py +0 -0
  112. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/system/inject.py +0 -0
  113. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/system/packages.py +0 -0
  114. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/system/platforms.py +0 -0
  115. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/targets/__init__.py +0 -0
  116. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/targets/bestpython.py +0 -0
  117. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/targets/bestpython.sh +0 -0
  118. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/targets/connection.py +0 -0
  119. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/targets/inject.py +0 -0
  120. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/manage/targets/targets.py +0 -0
  121. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/pyremote.py +0 -0
  122. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/scripts/__init__.py +0 -0
  123. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/LICENSE.txt +0 -0
  124. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/__init__.py +0 -0
  125. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/__main__.py +0 -0
  126. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/configs.py +0 -0
  127. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/dispatchers.py +0 -0
  128. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/dispatchersimpl.py +0 -0
  129. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/errors.py +0 -0
  130. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/events.py +0 -0
  131. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/groups.py +0 -0
  132. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/groupsimpl.py +0 -0
  133. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/http.py +0 -0
  134. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/inject.py +0 -0
  135. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/io.py +0 -0
  136. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/main.py +0 -0
  137. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/pipes.py +0 -0
  138. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/privileges.py +0 -0
  139. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/process.py +0 -0
  140. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/processimpl.py +0 -0
  141. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/setup.py +0 -0
  142. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/setupimpl.py +0 -0
  143. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/signals.py +0 -0
  144. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/spawning.py +0 -0
  145. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/spawningimpl.py +0 -0
  146. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/states.py +0 -0
  147. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/supervisor.py +0 -0
  148. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/types.py +0 -0
  149. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/utils/__init__.py +0 -0
  150. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/utils/collections.py +0 -0
  151. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/utils/diag.py +0 -0
  152. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/utils/fds.py +0 -0
  153. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/utils/fs.py +0 -0
  154. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/utils/os.py +0 -0
  155. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/utils/ostypes.py +0 -0
  156. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/utils/signals.py +0 -0
  157. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/utils/strings.py +0 -0
  158. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/supervisor/utils/users.py +0 -0
  159. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/systemd.py +0 -0
  160. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/tailscale/__init__.py +0 -0
  161. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/tailscale/api.py +0 -0
  162. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/tailscale/cli.py +0 -0
  163. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/threadworkers.py +0 -0
  164. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/tools/__init__.py +0 -0
  165. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra/tools/listresources.py +0 -0
  166. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra.egg-info/SOURCES.txt +0 -0
  167. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra.egg-info/dependency_links.txt +0 -0
  168. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra.egg-info/entry_points.txt +0 -0
  169. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/ominfra.egg-info/top_level.txt +0 -0
  170. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev473}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ominfra
3
- Version: 0.0.0.dev471
3
+ Version: 0.0.0.dev473
4
4
  Summary: ominfra
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,8 +14,8 @@ 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: omdev==0.0.0.dev471
18
- Requires-Dist: omlish==0.0.0.dev471
17
+ Requires-Dist: omdev==0.0.0.dev473
18
+ Requires-Dist: omlish==0.0.0.dev473
19
19
  Provides-Extra: all
20
20
  Requires-Dist: paramiko~=4.0; extra == "all"
21
21
  Requires-Dist: asyncssh~=2.21; extra == "all"
@@ -68,7 +68,7 @@ TomlParseFloat = ta.Callable[[str], ta.Any] # ta.TypeAlias
68
68
  TomlKey = ta.Tuple[str, ...] # ta.TypeAlias
69
69
  TomlPos = int # ta.TypeAlias
70
70
 
71
- # ../../../../omlish/lite/attrops.py
71
+ # ../../../../omlish/lite/abstract.py
72
72
  T = ta.TypeVar('T')
73
73
 
74
74
  # ../../../../omlish/lite/cached.py
@@ -1200,6 +1200,36 @@ class TomlWriter:
1200
1200
  return out.getvalue()
1201
1201
 
1202
1202
 
1203
+ ########################################
1204
+ # ../../../../../omlish/io/readers.py
1205
+
1206
+
1207
+ ##
1208
+
1209
+
1210
+ class RawBytesReader(ta.Protocol):
1211
+ def read1(self, /, n: int = -1) -> bytes: ...
1212
+
1213
+
1214
+ class BufferedBytesReader(RawBytesReader, ta.Protocol):
1215
+ def read(self, /, n: int = -1) -> bytes: ...
1216
+
1217
+ def readall(self) -> bytes: ...
1218
+
1219
+
1220
+ #
1221
+
1222
+
1223
+ class AsyncRawBytesReader(ta.Protocol):
1224
+ def read1(self, /, n: int = -1) -> ta.Awaitable[bytes]: ...
1225
+
1226
+
1227
+ class AsyncBufferedBytesReader(AsyncRawBytesReader, ta.Protocol):
1228
+ def read(self, /, n: int = -1) -> ta.Awaitable[bytes]: ...
1229
+
1230
+ def readall(self) -> ta.Awaitable[bytes]: ...
1231
+
1232
+
1203
1233
  ########################################
1204
1234
  # ../../../../../omlish/lite/abstract.py
1205
1235
 
@@ -1215,25 +1245,49 @@ def is_abstract_method(obj: ta.Any) -> bool:
1215
1245
  return bool(getattr(obj, _IS_ABSTRACT_METHOD_ATTR, False))
1216
1246
 
1217
1247
 
1218
- def update_abstracts(cls, *, force=False):
1248
+ def compute_abstract_methods(cls: type) -> ta.FrozenSet[str]:
1249
+ # ~> https://github.com/python/cpython/blob/f3476c6507381ca860eec0989f53647b13517423/Modules/_abc.c#L358
1250
+
1251
+ # Stage 1: direct abstract methods
1252
+
1253
+ abstracts = {
1254
+ a
1255
+ # Get items as a list to avoid mutation issues during iteration
1256
+ for a, v in list(cls.__dict__.items())
1257
+ if is_abstract_method(v)
1258
+ }
1259
+
1260
+ # Stage 2: inherited abstract methods
1261
+
1262
+ for base in cls.__bases__:
1263
+ # Get __abstractmethods__ from base if it exists
1264
+ if (base_abstracts := getattr(base, _ABSTRACT_METHODS_ATTR, None)) is None:
1265
+ continue
1266
+
1267
+ # Iterate over abstract methods in base
1268
+ for key in base_abstracts:
1269
+ # Check if this class has an attribute with this name
1270
+ try:
1271
+ value = getattr(cls, key)
1272
+ except AttributeError:
1273
+ # Attribute not found in this class, skip
1274
+ continue
1275
+
1276
+ # Check if it's still abstract
1277
+ if is_abstract_method(value):
1278
+ abstracts.add(key)
1279
+
1280
+ return frozenset(abstracts)
1281
+
1282
+
1283
+ def update_abstracts(cls: ta.Type[T], *, force: bool = False) -> ta.Type[T]:
1219
1284
  if not force and not hasattr(cls, _ABSTRACT_METHODS_ATTR):
1220
1285
  # Per stdlib: We check for __abstractmethods__ here because cls might by a C implementation or a python
1221
1286
  # implementation (especially during testing), and we want to handle both cases.
1222
1287
  return cls
1223
1288
 
1224
- abstracts: ta.Set[str] = set()
1225
-
1226
- for scls in cls.__bases__:
1227
- for name in getattr(scls, _ABSTRACT_METHODS_ATTR, ()):
1228
- value = getattr(cls, name, None)
1229
- if getattr(value, _IS_ABSTRACT_METHOD_ATTR, False):
1230
- abstracts.add(name)
1231
-
1232
- for name, value in cls.__dict__.items():
1233
- if getattr(value, _IS_ABSTRACT_METHOD_ATTR, False):
1234
- abstracts.add(name)
1235
-
1236
- setattr(cls, _ABSTRACT_METHODS_ATTR, frozenset(abstracts))
1289
+ abstracts = compute_abstract_methods(cls)
1290
+ setattr(cls, _ABSTRACT_METHODS_ATTR, abstracts)
1237
1291
  return cls
1238
1292
 
1239
1293
 
@@ -1287,23 +1341,26 @@ class Abstract:
1287
1341
  super().__init_subclass__(**kwargs)
1288
1342
 
1289
1343
  if not (Abstract in cls.__bases__ or abc.ABC in cls.__bases__):
1290
- ams = {a: cls for a, o in cls.__dict__.items() if is_abstract_method(o)}
1344
+ if ams := compute_abstract_methods(cls):
1345
+ amd = {
1346
+ a: mcls
1347
+ for mcls in cls.__mro__[::-1]
1348
+ for a in ams
1349
+ if a in mcls.__dict__
1350
+ }
1291
1351
 
1292
- seen = set(cls.__dict__)
1293
- for b in cls.__bases__:
1294
- ams.update({a: b for a in set(getattr(b, _ABSTRACT_METHODS_ATTR, [])) - seen}) # noqa
1295
- seen.update(dir(b))
1296
-
1297
- if ams:
1298
1352
  raise AbstractTypeError(
1299
1353
  f'Cannot subclass abstract class {cls.__name__} with abstract methods: ' +
1300
1354
  ', '.join(sorted([
1301
1355
  '.'.join([
1302
- *([m] if (m := getattr(c, '__module__')) else []),
1303
- getattr(c, '__qualname__', getattr(c, '__name__')),
1356
+ *([
1357
+ *([m] if (m := getattr(c, '__module__')) else []),
1358
+ getattr(c, '__qualname__', getattr(c, '__name__')),
1359
+ ] if c is not None else '?'),
1304
1360
  a,
1305
1361
  ])
1306
- for a, c in ams.items()
1362
+ for a in ams
1363
+ for c in [amd.get(a)]
1307
1364
  ])),
1308
1365
  )
1309
1366
 
@@ -2384,7 +2441,7 @@ class ExitStacked:
2384
2441
  es.__enter__()
2385
2442
  try:
2386
2443
  self._enter_contexts()
2387
- except Exception: # noqa
2444
+ except BaseException: # noqa
2388
2445
  es.__exit__(*sys.exc_info())
2389
2446
  raise
2390
2447
  return self
@@ -2395,7 +2452,7 @@ class ExitStacked:
2395
2452
  return None
2396
2453
  try:
2397
2454
  self._exit_contexts()
2398
- except Exception: # noqa
2455
+ except BaseException: # noqa
2399
2456
  es.__exit__(*sys.exc_info())
2400
2457
  raise
2401
2458
  return es.__exit__(exc_type, exc_val, exc_tb)
@@ -2443,7 +2500,7 @@ class AsyncExitStacked:
2443
2500
  await es.__aenter__()
2444
2501
  try:
2445
2502
  await self._async_enter_contexts()
2446
- except Exception: # noqa
2503
+ except BaseException: # noqa
2447
2504
  await es.__aexit__(*sys.exc_info())
2448
2505
  raise
2449
2506
  return self
@@ -2454,7 +2511,7 @@ class AsyncExitStacked:
2454
2511
  return None
2455
2512
  try:
2456
2513
  await self._async_exit_contexts()
2457
- except Exception: # noqa
2514
+ except BaseException: # noqa
2458
2515
  await es.__aexit__(*sys.exc_info())
2459
2516
  raise
2460
2517
  return await es.__aexit__(exc_type, exc_val, exc_tb)
@@ -3881,6 +3938,10 @@ DEFAULT_CONFIG_RENDERER = SwitchedConfigRenderer(DEFAULT_CONFIG_RENDERERS)
3881
3938
 
3882
3939
  ########################################
3883
3940
  # ../../../../../omlish/io/buffers.py
3941
+ """
3942
+ TODO:
3943
+ - overhaul and just coro-ify pyio?
3944
+ """
3884
3945
 
3885
3946
 
3886
3947
  ##
@@ -4059,6 +4120,9 @@ class ReadableListBuffer:
4059
4120
 
4060
4121
  self._lst: list[bytes] = []
4061
4122
 
4123
+ def __bool__(self) -> ta.NoReturn:
4124
+ raise TypeError("Use 'buf is not None' or 'len(buf)'.")
4125
+
4062
4126
  def __len__(self) -> int:
4063
4127
  return sum(map(len, self._lst))
4064
4128
 
@@ -4125,6 +4189,110 @@ class ReadableListBuffer:
4125
4189
  r = self.read_until_(delim)
4126
4190
  return r if isinstance(r, bytes) else None
4127
4191
 
4192
+ #
4193
+
4194
+ DEFAULT_BUFFERED_READER_CHUNK_SIZE: ta.ClassVar[int] = -1
4195
+
4196
+ @ta.final
4197
+ class _BufferedBytesReader(BufferedBytesReader):
4198
+ def __init__(
4199
+ self,
4200
+ raw: RawBytesReader,
4201
+ buf: 'ReadableListBuffer',
4202
+ *,
4203
+ chunk_size: ta.Optional[int] = None,
4204
+ ) -> None:
4205
+ self._raw = raw
4206
+ self._buf = buf
4207
+ self._chunk_size = chunk_size or ReadableListBuffer.DEFAULT_BUFFERED_READER_CHUNK_SIZE
4208
+
4209
+ def read1(self, /, n: int = -1) -> bytes:
4210
+ if n < 0:
4211
+ n = self._chunk_size
4212
+ if not n:
4213
+ return b''
4214
+ if 0 < n <= len(self._buf):
4215
+ return self._buf.read(n) or b''
4216
+ return self._raw.read1(n)
4217
+
4218
+ def read(self, /, n: int = -1) -> bytes:
4219
+ if n < 0:
4220
+ return self.readall()
4221
+ while len(self._buf) < n:
4222
+ if not (b := self._raw.read1(n)):
4223
+ break
4224
+ self._buf.feed(b)
4225
+ return self._buf.read(n) or b''
4226
+
4227
+ def readall(self) -> bytes:
4228
+ buf = io.BytesIO()
4229
+ buf.write(self._buf.read() or b'')
4230
+ while (b := self._raw.read1(self._chunk_size)):
4231
+ buf.write(b)
4232
+ return buf.getvalue()
4233
+
4234
+ def new_buffered_reader(
4235
+ self,
4236
+ raw: RawBytesReader,
4237
+ *,
4238
+ chunk_size: ta.Optional[int] = None,
4239
+ ) -> BufferedBytesReader:
4240
+ return self._BufferedBytesReader(
4241
+ raw,
4242
+ self,
4243
+ chunk_size=chunk_size,
4244
+ )
4245
+
4246
+ @ta.final
4247
+ class _AsyncBufferedBytesReader(AsyncBufferedBytesReader):
4248
+ def __init__(
4249
+ self,
4250
+ raw: AsyncRawBytesReader,
4251
+ buf: 'ReadableListBuffer',
4252
+ *,
4253
+ chunk_size: ta.Optional[int] = None,
4254
+ ) -> None:
4255
+ self._raw = raw
4256
+ self._buf = buf
4257
+ self._chunk_size = chunk_size or ReadableListBuffer.DEFAULT_BUFFERED_READER_CHUNK_SIZE
4258
+
4259
+ async def read1(self, /, n: int = -1) -> bytes:
4260
+ if n < 0:
4261
+ n = self._chunk_size
4262
+ if not n:
4263
+ return b''
4264
+ if 0 < n <= len(self._buf):
4265
+ return self._buf.read(n) or b''
4266
+ return await self._raw.read1(n)
4267
+
4268
+ async def read(self, /, n: int = -1) -> bytes:
4269
+ if n < 0:
4270
+ return await self.readall()
4271
+ while len(self._buf) < n:
4272
+ if not (b := await self._raw.read1(n)):
4273
+ break
4274
+ self._buf.feed(b)
4275
+ return self._buf.read(n) or b''
4276
+
4277
+ async def readall(self) -> bytes:
4278
+ buf = io.BytesIO()
4279
+ buf.write(self._buf.read() or b'')
4280
+ while b := await self._raw.read1(self._chunk_size):
4281
+ buf.write(b)
4282
+ return buf.getvalue()
4283
+
4284
+ def new_async_buffered_reader(
4285
+ self,
4286
+ raw: AsyncRawBytesReader,
4287
+ *,
4288
+ chunk_size: ta.Optional[int] = None,
4289
+ ) -> AsyncBufferedBytesReader:
4290
+ return self._AsyncBufferedBytesReader(
4291
+ raw,
4292
+ self,
4293
+ chunk_size=chunk_size,
4294
+ )
4295
+
4128
4296
 
4129
4297
  ##
4130
4298
 
@@ -91,7 +91,7 @@ TomlParseFloat = ta.Callable[[str], ta.Any] # ta.TypeAlias
91
91
  TomlKey = ta.Tuple[str, ...] # ta.TypeAlias
92
92
  TomlPos = int # ta.TypeAlias
93
93
 
94
- # ../../omlish/lite/attrops.py
94
+ # ../../omlish/lite/abstract.py
95
95
  T = ta.TypeVar('T')
96
96
 
97
97
  # ../../omlish/lite/cached.py
@@ -2395,25 +2395,49 @@ def is_abstract_method(obj: ta.Any) -> bool:
2395
2395
  return bool(getattr(obj, _IS_ABSTRACT_METHOD_ATTR, False))
2396
2396
 
2397
2397
 
2398
- def update_abstracts(cls, *, force=False):
2398
+ def compute_abstract_methods(cls: type) -> ta.FrozenSet[str]:
2399
+ # ~> https://github.com/python/cpython/blob/f3476c6507381ca860eec0989f53647b13517423/Modules/_abc.c#L358
2400
+
2401
+ # Stage 1: direct abstract methods
2402
+
2403
+ abstracts = {
2404
+ a
2405
+ # Get items as a list to avoid mutation issues during iteration
2406
+ for a, v in list(cls.__dict__.items())
2407
+ if is_abstract_method(v)
2408
+ }
2409
+
2410
+ # Stage 2: inherited abstract methods
2411
+
2412
+ for base in cls.__bases__:
2413
+ # Get __abstractmethods__ from base if it exists
2414
+ if (base_abstracts := getattr(base, _ABSTRACT_METHODS_ATTR, None)) is None:
2415
+ continue
2416
+
2417
+ # Iterate over abstract methods in base
2418
+ for key in base_abstracts:
2419
+ # Check if this class has an attribute with this name
2420
+ try:
2421
+ value = getattr(cls, key)
2422
+ except AttributeError:
2423
+ # Attribute not found in this class, skip
2424
+ continue
2425
+
2426
+ # Check if it's still abstract
2427
+ if is_abstract_method(value):
2428
+ abstracts.add(key)
2429
+
2430
+ return frozenset(abstracts)
2431
+
2432
+
2433
+ def update_abstracts(cls: ta.Type[T], *, force: bool = False) -> ta.Type[T]:
2399
2434
  if not force and not hasattr(cls, _ABSTRACT_METHODS_ATTR):
2400
2435
  # Per stdlib: We check for __abstractmethods__ here because cls might by a C implementation or a python
2401
2436
  # implementation (especially during testing), and we want to handle both cases.
2402
2437
  return cls
2403
2438
 
2404
- abstracts: ta.Set[str] = set()
2405
-
2406
- for scls in cls.__bases__:
2407
- for name in getattr(scls, _ABSTRACT_METHODS_ATTR, ()):
2408
- value = getattr(cls, name, None)
2409
- if getattr(value, _IS_ABSTRACT_METHOD_ATTR, False):
2410
- abstracts.add(name)
2411
-
2412
- for name, value in cls.__dict__.items():
2413
- if getattr(value, _IS_ABSTRACT_METHOD_ATTR, False):
2414
- abstracts.add(name)
2415
-
2416
- setattr(cls, _ABSTRACT_METHODS_ATTR, frozenset(abstracts))
2439
+ abstracts = compute_abstract_methods(cls)
2440
+ setattr(cls, _ABSTRACT_METHODS_ATTR, abstracts)
2417
2441
  return cls
2418
2442
 
2419
2443
 
@@ -2467,23 +2491,26 @@ class Abstract:
2467
2491
  super().__init_subclass__(**kwargs)
2468
2492
 
2469
2493
  if not (Abstract in cls.__bases__ or abc.ABC in cls.__bases__):
2470
- ams = {a: cls for a, o in cls.__dict__.items() if is_abstract_method(o)}
2494
+ if ams := compute_abstract_methods(cls):
2495
+ amd = {
2496
+ a: mcls
2497
+ for mcls in cls.__mro__[::-1]
2498
+ for a in ams
2499
+ if a in mcls.__dict__
2500
+ }
2471
2501
 
2472
- seen = set(cls.__dict__)
2473
- for b in cls.__bases__:
2474
- ams.update({a: b for a in set(getattr(b, _ABSTRACT_METHODS_ATTR, [])) - seen}) # noqa
2475
- seen.update(dir(b))
2476
-
2477
- if ams:
2478
2502
  raise AbstractTypeError(
2479
2503
  f'Cannot subclass abstract class {cls.__name__} with abstract methods: ' +
2480
2504
  ', '.join(sorted([
2481
2505
  '.'.join([
2482
- *([m] if (m := getattr(c, '__module__')) else []),
2483
- getattr(c, '__qualname__', getattr(c, '__name__')),
2506
+ *([
2507
+ *([m] if (m := getattr(c, '__module__')) else []),
2508
+ getattr(c, '__qualname__', getattr(c, '__name__')),
2509
+ ] if c is not None else '?'),
2484
2510
  a,
2485
2511
  ])
2486
- for a, c in ams.items()
2512
+ for a in ams
2513
+ for c in [amd.get(a)]
2487
2514
  ])),
2488
2515
  )
2489
2516
 
@@ -3564,7 +3591,7 @@ class ExitStacked:
3564
3591
  es.__enter__()
3565
3592
  try:
3566
3593
  self._enter_contexts()
3567
- except Exception: # noqa
3594
+ except BaseException: # noqa
3568
3595
  es.__exit__(*sys.exc_info())
3569
3596
  raise
3570
3597
  return self
@@ -3575,7 +3602,7 @@ class ExitStacked:
3575
3602
  return None
3576
3603
  try:
3577
3604
  self._exit_contexts()
3578
- except Exception: # noqa
3605
+ except BaseException: # noqa
3579
3606
  es.__exit__(*sys.exc_info())
3580
3607
  raise
3581
3608
  return es.__exit__(exc_type, exc_val, exc_tb)
@@ -3623,7 +3650,7 @@ class AsyncExitStacked:
3623
3650
  await es.__aenter__()
3624
3651
  try:
3625
3652
  await self._async_enter_contexts()
3626
- except Exception: # noqa
3653
+ except BaseException: # noqa
3627
3654
  await es.__aexit__(*sys.exc_info())
3628
3655
  raise
3629
3656
  return self
@@ -3634,7 +3661,7 @@ class AsyncExitStacked:
3634
3661
  return None
3635
3662
  try:
3636
3663
  await self._async_exit_contexts()
3637
- except Exception: # noqa
3664
+ except BaseException: # noqa
3638
3665
  await es.__aexit__(*sys.exc_info())
3639
3666
  raise
3640
3667
  return await es.__aexit__(exc_type, exc_val, exc_tb)