ominfra 0.0.0.dev471__tar.gz → 0.0.0.dev472__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.dev472}/PKG-INFO +3 -3
  2. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/scripts/journald2aws.py +52 -25
  3. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/scripts/manage.py +52 -25
  4. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/scripts/supervisor.py +52 -25
  5. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472/ominfra.egg-info}/PKG-INFO +3 -3
  6. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra.egg-info/requires.txt +2 -2
  7. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/pyproject.toml +3 -3
  8. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/LICENSE +0 -0
  9. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/MANIFEST.in +0 -0
  10. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/README.md +0 -0
  11. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/.omlish-manifests.json +0 -0
  12. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/__about__.py +0 -0
  13. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/__init__.py +0 -0
  14. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/__init__.py +0 -0
  15. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/__init__.py +0 -0
  16. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/__main__.py +0 -0
  17. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/auth.py +0 -0
  18. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/cli.py +0 -0
  19. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/dataclasses.py +0 -0
  20. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/instancetypes/__init__.py +0 -0
  21. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/instancetypes/__main__.py +0 -0
  22. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
  23. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/instancetypes/cache.py +0 -0
  24. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/instancetypes/cli.py +0 -0
  25. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
  26. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
  27. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
  28. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
  29. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/journald2aws/main.py +0 -0
  30. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
  31. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/logs.py +0 -0
  32. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/metadata.py +0 -0
  33. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/__init__.py +0 -0
  34. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/base.py +0 -0
  35. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/gen/__init__.py +0 -0
  36. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/gen/__main__.py +0 -0
  37. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/gen/cli.py +0 -0
  38. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/gen/gen.py +0 -0
  39. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/services/__init__.py +0 -0
  40. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/services/ec2.py +0 -0
  41. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/services/lambda_.py +0 -0
  42. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/services/rds.py +0 -0
  43. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/services/s3.py +0 -0
  44. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/aws/models/services/services.toml +0 -0
  45. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/gcp/__init__.py +0 -0
  46. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/gcp/api.py +0 -0
  47. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/clouds/gcp/auth.py +0 -0
  48. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/commands/__init__.py +0 -0
  49. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/commands/runners.py +0 -0
  50. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/commands/ssh.py +0 -0
  51. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/journald/__init__.py +0 -0
  52. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/journald/fields.py +0 -0
  53. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/journald/genmessages.py +0 -0
  54. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/journald/messages.py +0 -0
  55. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/journald/tailer.py +0 -0
  56. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/__init__.py +0 -0
  57. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/__main__.py +0 -0
  58. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/bootstrap.py +0 -0
  59. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/bootstrap_.py +0 -0
  60. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/commands/__init__.py +0 -0
  61. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/commands/base.py +0 -0
  62. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/commands/inject.py +0 -0
  63. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/commands/injection.py +0 -0
  64. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/commands/local.py +0 -0
  65. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/commands/marshal.py +0 -0
  66. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/commands/ping.py +0 -0
  67. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/commands/subprocess.py +0 -0
  68. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/commands/types.py +0 -0
  69. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/config.py +0 -0
  70. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/__init__.py +0 -0
  71. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/apps.py +0 -0
  72. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/commands.py +0 -0
  73. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/conf/__init__.py +0 -0
  74. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/conf/inject.py +0 -0
  75. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/conf/manager.py +0 -0
  76. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/conf/specs.py +0 -0
  77. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/config.py +0 -0
  78. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/deploy.py +0 -0
  79. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/git.py +0 -0
  80. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/inject.py +0 -0
  81. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/injection.py +0 -0
  82. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/interp.py +0 -0
  83. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/nginx.py +0 -0
  84. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/paths/__init__.py +0 -0
  85. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/paths/inject.py +0 -0
  86. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/paths/manager.py +0 -0
  87. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/paths/owners.py +0 -0
  88. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/paths/paths.py +0 -0
  89. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/paths/specs.py +0 -0
  90. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/paths/types.py +0 -0
  91. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/specs.py +0 -0
  92. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/systemd.py +0 -0
  93. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/tags.py +0 -0
  94. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/tmp.py +0 -0
  95. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/types.py +0 -0
  96. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/deploy/venvs.py +0 -0
  97. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/inject.py +0 -0
  98. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/main.py +0 -0
  99. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/marshal.py +0 -0
  100. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/remote/__init__.py +0 -0
  101. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/remote/_main.py +0 -0
  102. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/remote/channel.py +0 -0
  103. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/remote/config.py +0 -0
  104. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/remote/connection.py +0 -0
  105. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/remote/execution.py +0 -0
  106. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/remote/inject.py +0 -0
  107. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/remote/payload.py +0 -0
  108. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/remote/spawning.py +0 -0
  109. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/system/__init__.py +0 -0
  110. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/system/commands.py +0 -0
  111. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/system/config.py +0 -0
  112. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/system/inject.py +0 -0
  113. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/system/packages.py +0 -0
  114. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/system/platforms.py +0 -0
  115. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/targets/__init__.py +0 -0
  116. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/targets/bestpython.py +0 -0
  117. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/targets/bestpython.sh +0 -0
  118. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/targets/connection.py +0 -0
  119. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/targets/inject.py +0 -0
  120. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/manage/targets/targets.py +0 -0
  121. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/pyremote.py +0 -0
  122. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/scripts/__init__.py +0 -0
  123. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/LICENSE.txt +0 -0
  124. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/__init__.py +0 -0
  125. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/__main__.py +0 -0
  126. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/configs.py +0 -0
  127. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/dispatchers.py +0 -0
  128. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/dispatchersimpl.py +0 -0
  129. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/errors.py +0 -0
  130. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/events.py +0 -0
  131. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/groups.py +0 -0
  132. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/groupsimpl.py +0 -0
  133. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/http.py +0 -0
  134. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/inject.py +0 -0
  135. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/io.py +0 -0
  136. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/main.py +0 -0
  137. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/pipes.py +0 -0
  138. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/privileges.py +0 -0
  139. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/process.py +0 -0
  140. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/processimpl.py +0 -0
  141. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/setup.py +0 -0
  142. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/setupimpl.py +0 -0
  143. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/signals.py +0 -0
  144. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/spawning.py +0 -0
  145. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/spawningimpl.py +0 -0
  146. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/states.py +0 -0
  147. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/supervisor.py +0 -0
  148. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/types.py +0 -0
  149. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/utils/__init__.py +0 -0
  150. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/utils/collections.py +0 -0
  151. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/utils/diag.py +0 -0
  152. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/utils/fds.py +0 -0
  153. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/utils/fs.py +0 -0
  154. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/utils/os.py +0 -0
  155. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/utils/ostypes.py +0 -0
  156. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/utils/signals.py +0 -0
  157. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/utils/strings.py +0 -0
  158. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/supervisor/utils/users.py +0 -0
  159. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/systemd.py +0 -0
  160. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/tailscale/__init__.py +0 -0
  161. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/tailscale/api.py +0 -0
  162. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/tailscale/cli.py +0 -0
  163. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/threadworkers.py +0 -0
  164. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/tools/__init__.py +0 -0
  165. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra/tools/listresources.py +0 -0
  166. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra.egg-info/SOURCES.txt +0 -0
  167. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra.egg-info/dependency_links.txt +0 -0
  168. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra.egg-info/entry_points.txt +0 -0
  169. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/ominfra.egg-info/top_level.txt +0 -0
  170. {ominfra-0.0.0.dev471 → ominfra-0.0.0.dev472}/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.dev472
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.dev472
18
+ Requires-Dist: omlish==0.0.0.dev472
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
@@ -1215,25 +1215,49 @@ def is_abstract_method(obj: ta.Any) -> bool:
1215
1215
  return bool(getattr(obj, _IS_ABSTRACT_METHOD_ATTR, False))
1216
1216
 
1217
1217
 
1218
- def update_abstracts(cls, *, force=False):
1218
+ def compute_abstract_methods(cls: type) -> ta.FrozenSet[str]:
1219
+ # ~> https://github.com/python/cpython/blob/f3476c6507381ca860eec0989f53647b13517423/Modules/_abc.c#L358
1220
+
1221
+ # Stage 1: direct abstract methods
1222
+
1223
+ abstracts = {
1224
+ a
1225
+ # Get items as a list to avoid mutation issues during iteration
1226
+ for a, v in list(cls.__dict__.items())
1227
+ if is_abstract_method(v)
1228
+ }
1229
+
1230
+ # Stage 2: inherited abstract methods
1231
+
1232
+ for base in cls.__bases__:
1233
+ # Get __abstractmethods__ from base if it exists
1234
+ if (base_abstracts := getattr(base, _ABSTRACT_METHODS_ATTR, None)) is None:
1235
+ continue
1236
+
1237
+ # Iterate over abstract methods in base
1238
+ for key in base_abstracts:
1239
+ # Check if this class has an attribute with this name
1240
+ try:
1241
+ value = getattr(cls, key)
1242
+ except AttributeError:
1243
+ # Attribute not found in this class, skip
1244
+ continue
1245
+
1246
+ # Check if it's still abstract
1247
+ if is_abstract_method(value):
1248
+ abstracts.add(key)
1249
+
1250
+ return frozenset(abstracts)
1251
+
1252
+
1253
+ def update_abstracts(cls: ta.Type[T], *, force: bool = False) -> ta.Type[T]:
1219
1254
  if not force and not hasattr(cls, _ABSTRACT_METHODS_ATTR):
1220
1255
  # Per stdlib: We check for __abstractmethods__ here because cls might by a C implementation or a python
1221
1256
  # implementation (especially during testing), and we want to handle both cases.
1222
1257
  return cls
1223
1258
 
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))
1259
+ abstracts = compute_abstract_methods(cls)
1260
+ setattr(cls, _ABSTRACT_METHODS_ATTR, abstracts)
1237
1261
  return cls
1238
1262
 
1239
1263
 
@@ -1287,23 +1311,26 @@ class Abstract:
1287
1311
  super().__init_subclass__(**kwargs)
1288
1312
 
1289
1313
  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)}
1291
-
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))
1314
+ if ams := compute_abstract_methods(cls):
1315
+ amd = {
1316
+ a: mcls
1317
+ for mcls in cls.__mro__[::-1]
1318
+ for a in ams
1319
+ if a in mcls.__dict__
1320
+ }
1296
1321
 
1297
- if ams:
1298
1322
  raise AbstractTypeError(
1299
1323
  f'Cannot subclass abstract class {cls.__name__} with abstract methods: ' +
1300
1324
  ', '.join(sorted([
1301
1325
  '.'.join([
1302
- *([m] if (m := getattr(c, '__module__')) else []),
1303
- getattr(c, '__qualname__', getattr(c, '__name__')),
1326
+ *([
1327
+ *([m] if (m := getattr(c, '__module__')) else []),
1328
+ getattr(c, '__qualname__', getattr(c, '__name__')),
1329
+ ] if c is not None else '?'),
1304
1330
  a,
1305
1331
  ])
1306
- for a, c in ams.items()
1332
+ for a in ams
1333
+ for c in [amd.get(a)]
1307
1334
  ])),
1308
1335
  )
1309
1336
 
@@ -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)}
2471
-
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))
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
+ }
2476
2501
 
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
 
@@ -113,7 +113,7 @@ TomlParseFloat = ta.Callable[[str], ta.Any] # ta.TypeAlias
113
113
  TomlKey = ta.Tuple[str, ...] # ta.TypeAlias
114
114
  TomlPos = int # ta.TypeAlias
115
115
 
116
- # ../../omlish/lite/attrops.py
116
+ # ../../omlish/lite/abstract.py
117
117
  T = ta.TypeVar('T')
118
118
 
119
119
  # ../../omlish/lite/cached.py
@@ -1741,25 +1741,49 @@ def is_abstract_method(obj: ta.Any) -> bool:
1741
1741
  return bool(getattr(obj, _IS_ABSTRACT_METHOD_ATTR, False))
1742
1742
 
1743
1743
 
1744
- def update_abstracts(cls, *, force=False):
1744
+ def compute_abstract_methods(cls: type) -> ta.FrozenSet[str]:
1745
+ # ~> https://github.com/python/cpython/blob/f3476c6507381ca860eec0989f53647b13517423/Modules/_abc.c#L358
1746
+
1747
+ # Stage 1: direct abstract methods
1748
+
1749
+ abstracts = {
1750
+ a
1751
+ # Get items as a list to avoid mutation issues during iteration
1752
+ for a, v in list(cls.__dict__.items())
1753
+ if is_abstract_method(v)
1754
+ }
1755
+
1756
+ # Stage 2: inherited abstract methods
1757
+
1758
+ for base in cls.__bases__:
1759
+ # Get __abstractmethods__ from base if it exists
1760
+ if (base_abstracts := getattr(base, _ABSTRACT_METHODS_ATTR, None)) is None:
1761
+ continue
1762
+
1763
+ # Iterate over abstract methods in base
1764
+ for key in base_abstracts:
1765
+ # Check if this class has an attribute with this name
1766
+ try:
1767
+ value = getattr(cls, key)
1768
+ except AttributeError:
1769
+ # Attribute not found in this class, skip
1770
+ continue
1771
+
1772
+ # Check if it's still abstract
1773
+ if is_abstract_method(value):
1774
+ abstracts.add(key)
1775
+
1776
+ return frozenset(abstracts)
1777
+
1778
+
1779
+ def update_abstracts(cls: ta.Type[T], *, force: bool = False) -> ta.Type[T]:
1745
1780
  if not force and not hasattr(cls, _ABSTRACT_METHODS_ATTR):
1746
1781
  # Per stdlib: We check for __abstractmethods__ here because cls might by a C implementation or a python
1747
1782
  # implementation (especially during testing), and we want to handle both cases.
1748
1783
  return cls
1749
1784
 
1750
- abstracts: ta.Set[str] = set()
1751
-
1752
- for scls in cls.__bases__:
1753
- for name in getattr(scls, _ABSTRACT_METHODS_ATTR, ()):
1754
- value = getattr(cls, name, None)
1755
- if getattr(value, _IS_ABSTRACT_METHOD_ATTR, False):
1756
- abstracts.add(name)
1757
-
1758
- for name, value in cls.__dict__.items():
1759
- if getattr(value, _IS_ABSTRACT_METHOD_ATTR, False):
1760
- abstracts.add(name)
1761
-
1762
- setattr(cls, _ABSTRACT_METHODS_ATTR, frozenset(abstracts))
1785
+ abstracts = compute_abstract_methods(cls)
1786
+ setattr(cls, _ABSTRACT_METHODS_ATTR, abstracts)
1763
1787
  return cls
1764
1788
 
1765
1789
 
@@ -1813,23 +1837,26 @@ class Abstract:
1813
1837
  super().__init_subclass__(**kwargs)
1814
1838
 
1815
1839
  if not (Abstract in cls.__bases__ or abc.ABC in cls.__bases__):
1816
- ams = {a: cls for a, o in cls.__dict__.items() if is_abstract_method(o)}
1817
-
1818
- seen = set(cls.__dict__)
1819
- for b in cls.__bases__:
1820
- ams.update({a: b for a in set(getattr(b, _ABSTRACT_METHODS_ATTR, [])) - seen}) # noqa
1821
- seen.update(dir(b))
1840
+ if ams := compute_abstract_methods(cls):
1841
+ amd = {
1842
+ a: mcls
1843
+ for mcls in cls.__mro__[::-1]
1844
+ for a in ams
1845
+ if a in mcls.__dict__
1846
+ }
1822
1847
 
1823
- if ams:
1824
1848
  raise AbstractTypeError(
1825
1849
  f'Cannot subclass abstract class {cls.__name__} with abstract methods: ' +
1826
1850
  ', '.join(sorted([
1827
1851
  '.'.join([
1828
- *([m] if (m := getattr(c, '__module__')) else []),
1829
- getattr(c, '__qualname__', getattr(c, '__name__')),
1852
+ *([
1853
+ *([m] if (m := getattr(c, '__module__')) else []),
1854
+ getattr(c, '__qualname__', getattr(c, '__name__')),
1855
+ ] if c is not None else '?'),
1830
1856
  a,
1831
1857
  ])
1832
- for a, c in ams.items()
1858
+ for a in ams
1859
+ for c in [amd.get(a)]
1833
1860
  ])),
1834
1861
  )
1835
1862
 
@@ -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.dev472
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.dev472
18
+ Requires-Dist: omlish==0.0.0.dev472
19
19
  Provides-Extra: all
20
20
  Requires-Dist: paramiko~=4.0; extra == "all"
21
21
  Requires-Dist: asyncssh~=2.21; extra == "all"
@@ -1,5 +1,5 @@
1
- omdev==0.0.0.dev471
2
- omlish==0.0.0.dev471
1
+ omdev==0.0.0.dev472
2
+ omlish==0.0.0.dev472
3
3
 
4
4
  [all]
5
5
  paramiko~=4.0
@@ -13,7 +13,7 @@ urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = 'BSD-3-Clause'
14
14
  readme = 'README.md'
15
15
  requires-python = '>=3.13'
16
- version = '0.0.0.dev471'
16
+ version = '0.0.0.dev472'
17
17
  classifiers = [
18
18
  'Development Status :: 2 - Pre-Alpha',
19
19
  'Intended Audience :: Developers',
@@ -24,8 +24,8 @@ classifiers = [
24
24
  ]
25
25
  description = 'ominfra'
26
26
  dependencies = [
27
- 'omdev == 0.0.0.dev471',
28
- 'omlish == 0.0.0.dev471',
27
+ 'omdev == 0.0.0.dev472',
28
+ 'omlish == 0.0.0.dev472',
29
29
  ]
30
30
 
31
31
  [project.optional-dependencies]
File without changes
File without changes
File without changes