ominfra 0.0.0.dev295__tar.gz → 0.0.0.dev297__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.dev295/ominfra.egg-info → ominfra-0.0.0.dev297}/PKG-INFO +3 -3
  2. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/gen/gen.py +20 -1
  3. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/ec2.py +4 -4
  4. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/pyremote.py +59 -67
  5. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/scripts/manage.py +65 -69
  6. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297/ominfra.egg-info}/PKG-INFO +3 -3
  7. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra.egg-info/requires.txt +2 -2
  8. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/pyproject.toml +3 -3
  9. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/LICENSE +0 -0
  10. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/MANIFEST.in +0 -0
  11. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/README.md +0 -0
  12. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/.manifests.json +0 -0
  13. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/__about__.py +0 -0
  14. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/__init__.py +0 -0
  15. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/__init__.py +0 -0
  16. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/__init__.py +0 -0
  17. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/__main__.py +0 -0
  18. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/auth.py +0 -0
  19. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/cli.py +0 -0
  20. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/dataclasses.py +0 -0
  21. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/instancetypes/__init__.py +0 -0
  22. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/instancetypes/__main__.py +0 -0
  23. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
  24. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/instancetypes/cache.py +0 -0
  25. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/instancetypes/cli.py +0 -0
  26. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
  27. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
  28. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
  29. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
  30. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/main.py +0 -0
  31. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
  32. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/logs.py +0 -0
  33. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/metadata.py +0 -0
  34. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/__init__.py +0 -0
  35. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/base.py +0 -0
  36. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/gen/__init__.py +0 -0
  37. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/gen/__main__.py +0 -0
  38. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/gen/cli.py +0 -0
  39. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/__init__.py +0 -0
  40. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/lambda_.py +0 -0
  41. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/rds.py +0 -0
  42. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/s3.py +0 -0
  43. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/services.toml +0 -0
  44. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/gcp/__init__.py +0 -0
  45. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/gcp/api.py +0 -0
  46. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/gcp/auth.py +0 -0
  47. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/commands/__init__.py +0 -0
  48. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/commands/runners.py +0 -0
  49. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/commands/ssh.py +0 -0
  50. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/journald/__init__.py +0 -0
  51. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/journald/fields.py +0 -0
  52. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/journald/genmessages.py +0 -0
  53. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/journald/messages.py +0 -0
  54. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/journald/tailer.py +0 -0
  55. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/__init__.py +0 -0
  56. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/__main__.py +0 -0
  57. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/bootstrap.py +0 -0
  58. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/bootstrap_.py +0 -0
  59. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/__init__.py +0 -0
  60. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/base.py +0 -0
  61. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/inject.py +0 -0
  62. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/injection.py +0 -0
  63. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/local.py +0 -0
  64. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/marshal.py +0 -0
  65. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/ping.py +0 -0
  66. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/subprocess.py +0 -0
  67. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/types.py +0 -0
  68. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/config.py +0 -0
  69. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/__init__.py +0 -0
  70. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/apps.py +0 -0
  71. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/commands.py +0 -0
  72. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/conf/__init__.py +0 -0
  73. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/conf/inject.py +0 -0
  74. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/conf/manager.py +0 -0
  75. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/conf/specs.py +0 -0
  76. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/config.py +0 -0
  77. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/deploy.py +0 -0
  78. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/git.py +0 -0
  79. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/inject.py +0 -0
  80. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/injection.py +0 -0
  81. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/interp.py +0 -0
  82. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/nginx.py +0 -0
  83. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/__init__.py +0 -0
  84. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/inject.py +0 -0
  85. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/manager.py +0 -0
  86. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/owners.py +0 -0
  87. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/paths.py +0 -0
  88. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/specs.py +0 -0
  89. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/types.py +0 -0
  90. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/specs.py +0 -0
  91. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/systemd.py +0 -0
  92. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/tags.py +0 -0
  93. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/tmp.py +0 -0
  94. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/types.py +0 -0
  95. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/venvs.py +0 -0
  96. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/inject.py +0 -0
  97. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/main.py +0 -0
  98. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/marshal.py +0 -0
  99. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/__init__.py +0 -0
  100. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/_main.py +0 -0
  101. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/channel.py +0 -0
  102. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/config.py +0 -0
  103. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/connection.py +0 -0
  104. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/execution.py +0 -0
  105. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/inject.py +0 -0
  106. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/payload.py +0 -0
  107. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/spawning.py +0 -0
  108. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/__init__.py +0 -0
  109. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/commands.py +0 -0
  110. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/config.py +0 -0
  111. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/inject.py +0 -0
  112. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/packages.py +0 -0
  113. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/platforms.py +0 -0
  114. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/__init__.py +0 -0
  115. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/bestpython.py +0 -0
  116. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/bestpython.sh +0 -0
  117. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/connection.py +0 -0
  118. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/inject.py +0 -0
  119. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/targets.py +0 -0
  120. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/scripts/__init__.py +0 -0
  121. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/scripts/journald2aws.py +0 -0
  122. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/scripts/supervisor.py +0 -0
  123. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/LICENSE.txt +0 -0
  124. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/__init__.py +0 -0
  125. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/__main__.py +0 -0
  126. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/configs.py +0 -0
  127. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/dispatchers.py +0 -0
  128. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/dispatchersimpl.py +0 -0
  129. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/errors.py +0 -0
  130. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/events.py +0 -0
  131. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/groups.py +0 -0
  132. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/groupsimpl.py +0 -0
  133. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/http.py +0 -0
  134. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/inject.py +0 -0
  135. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/io.py +0 -0
  136. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/main.py +0 -0
  137. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/pipes.py +0 -0
  138. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/privileges.py +0 -0
  139. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/process.py +0 -0
  140. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/processimpl.py +0 -0
  141. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/setup.py +0 -0
  142. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/setupimpl.py +0 -0
  143. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/signals.py +0 -0
  144. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/spawning.py +0 -0
  145. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/spawningimpl.py +0 -0
  146. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/states.py +0 -0
  147. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/supervisor.py +0 -0
  148. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/types.py +0 -0
  149. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/__init__.py +0 -0
  150. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/collections.py +0 -0
  151. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/diag.py +0 -0
  152. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/fds.py +0 -0
  153. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/fs.py +0 -0
  154. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/os.py +0 -0
  155. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/ostypes.py +0 -0
  156. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/signals.py +0 -0
  157. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/strings.py +0 -0
  158. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/users.py +0 -0
  159. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/systemd.py +0 -0
  160. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/tailscale/__init__.py +0 -0
  161. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/tailscale/api.py +0 -0
  162. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/tailscale/cli.py +0 -0
  163. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/threadworkers.py +0 -0
  164. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/tools/__init__.py +0 -0
  165. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/tools/listresources.py +0 -0
  166. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra.egg-info/SOURCES.txt +0 -0
  167. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra.egg-info/dependency_links.txt +0 -0
  168. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra.egg-info/entry_points.txt +0 -0
  169. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra.egg-info/top_level.txt +0 -0
  170. {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ominfra
3
- Version: 0.0.0.dev295
3
+ Version: 0.0.0.dev297
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.dev295
16
- Requires-Dist: omlish==0.0.0.dev295
15
+ Requires-Dist: omdev==0.0.0.dev297
16
+ Requires-Dist: omlish==0.0.0.dev297
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.20; extra == "all"
@@ -194,6 +194,19 @@ class ModelGen:
194
194
 
195
195
  #
196
196
 
197
+ NAME_REPLACEMENTS: ta.ClassVar[ta.Sequence[tuple[str, str]]] = [
198
+ *[
199
+ (p + l, p + r)
200
+ for p in 'KMGTP '
201
+ for l, r in [
202
+ ('bps', 'bips'),
203
+ ('Bps', 'bps'),
204
+ ('ibps', 'ibips'),
205
+ ('iBps', 'ibps'),
206
+ ]
207
+ ],
208
+ ]
209
+
197
210
  DEMANGLE_PREFIXES: ta.ClassVar[ta.Sequence[str]] = [
198
211
 
199
212
  'AAAA',
@@ -217,7 +230,6 @@ class ModelGen:
217
230
  'IP',
218
231
  'JSON',
219
232
  'KMS',
220
- 'MBps',
221
233
  'MD5',
222
234
  'MFA',
223
235
  'NVME',
@@ -230,6 +242,9 @@ class ModelGen:
230
242
  ]
231
243
 
232
244
  def demangle_name(self, n: str) -> str:
245
+ for l, r in self.NAME_REPLACEMENTS:
246
+ n = n.replace(l, r)
247
+
233
248
  ps: list[str] = []
234
249
  while n:
235
250
  ms: list[tuple[str, int]] = []
@@ -334,6 +349,8 @@ class ModelGen:
334
349
  lines.append(' pass')
335
350
 
336
351
  ms: botocore.model.Shape
352
+ seen_fns: set[str] = set()
353
+
337
354
  for i, (mn, ms) in enumerate(shape.members.items()):
338
355
  mds = [
339
356
  f'member_name={mn!r}',
@@ -381,6 +398,8 @@ class ModelGen:
381
398
  fd = 'default=None, '
382
399
 
383
400
  fn = self.sanitize_local_name(self.demangle_name(mn))
401
+ check.not_in(fn, seen_fns)
402
+ seen_fns.add(fn)
384
403
 
385
404
  fls = [
386
405
  f'{fn}: {fa} = _dc.field({fd}metadata=_base.field_metadata(',
@@ -2274,7 +2274,7 @@ class EbsOptimizedInfo(
2274
2274
  _base.Shape,
2275
2275
  shape_name='EbsOptimizedInfo',
2276
2276
  ):
2277
- baseline_bandwidth_in_mbps: BaselineBandwidthInMbps | None = _dc.field(default=None, metadata=_base.field_metadata(
2277
+ baseline_bandwidth_in_mbips: BaselineBandwidthInMbps | None = _dc.field(default=None, metadata=_base.field_metadata(
2278
2278
  member_name='BaselineBandwidthInMbps',
2279
2279
  serialization_name='baselineBandwidthInMbps',
2280
2280
  shape_name='BaselineBandwidthInMbps',
@@ -2292,7 +2292,7 @@ class EbsOptimizedInfo(
2292
2292
  shape_name='BaselineIops',
2293
2293
  ))
2294
2294
 
2295
- maximum_bandwidth_in_mbps: MaximumBandwidthInMbps | None = _dc.field(default=None, metadata=_base.field_metadata(
2295
+ maximum_bandwidth_in_mbips: MaximumBandwidthInMbps | None = _dc.field(default=None, metadata=_base.field_metadata(
2296
2296
  member_name='MaximumBandwidthInMbps',
2297
2297
  serialization_name='maximumBandwidthInMbps',
2298
2298
  shape_name='MaximumBandwidthInMbps',
@@ -3059,13 +3059,13 @@ class NetworkCardInfo(
3059
3059
  shape_name='MaxNetworkInterfaces',
3060
3060
  ))
3061
3061
 
3062
- baseline_bandwidth_in_gbps: BaselineBandwidthInGbps | None = _dc.field(default=None, metadata=_base.field_metadata(
3062
+ baseline_bandwidth_in_gbips: BaselineBandwidthInGbps | None = _dc.field(default=None, metadata=_base.field_metadata(
3063
3063
  member_name='BaselineBandwidthInGbps',
3064
3064
  serialization_name='baselineBandwidthInGbps',
3065
3065
  shape_name='BaselineBandwidthInGbps',
3066
3066
  ))
3067
3067
 
3068
- peak_bandwidth_in_gbps: PeakBandwidthInGbps | None = _dc.field(default=None, metadata=_base.field_metadata(
3068
+ peak_bandwidth_in_gbips: PeakBandwidthInGbps | None = _dc.field(default=None, metadata=_base.field_metadata(
3069
3069
  member_name='PeakBandwidthInGbps',
3070
3070
  serialization_name='peakBandwidthInGbps',
3071
3071
  shape_name='PeakBandwidthInGbps',
@@ -185,29 +185,33 @@ def _get_pyremote_env_info() -> PyremoteEnvInfo:
185
185
  ##
186
186
 
187
187
 
188
- _PYREMOTE_BOOTSTRAP_INPUT_FD = 100
189
- _PYREMOTE_BOOTSTRAP_SRC_FD = 101
190
-
191
- _PYREMOTE_BOOTSTRAP_CHILD_PID_VAR = '_OPYR_CHILD_PID'
192
- _PYREMOTE_BOOTSTRAP_ARGV0_VAR = '_OPYR_ARGV0'
193
- _PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR = '_OPYR_CONTEXT_NAME'
194
- _PYREMOTE_BOOTSTRAP_SRC_FILE_VAR = '_OPYR_SRC_FILE'
195
- _PYREMOTE_BOOTSTRAP_OPTIONS_JSON_VAR = '_OPYR_OPTIONS_JSON'
196
-
197
- _PYREMOTE_BOOTSTRAP_ACK0 = b'OPYR000\n'
198
- _PYREMOTE_BOOTSTRAP_ACK1 = b'OPYR001\n'
199
- _PYREMOTE_BOOTSTRAP_ACK2 = b'OPYR002\n'
200
- _PYREMOTE_BOOTSTRAP_ACK3 = b'OPYR003\n'
201
-
202
- _PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT = '(pyremote:%s)'
203
-
204
- _PYREMOTE_BOOTSTRAP_IMPORTS = [
205
- 'base64',
206
- 'os',
207
- 'struct',
208
- 'sys',
209
- 'zlib',
210
- ]
188
+ class _PyremoteBootstrapConsts:
189
+ def __new__(cls, *args, **kwargs): # noqa
190
+ raise TypeError
191
+
192
+ INPUT_FD = 100
193
+ SRC_FD = 101
194
+
195
+ CHILD_PID_VAR = '_OPYR_CHILD_PID'
196
+ ARGV0_VAR = '_OPYR_ARGV0'
197
+ CONTEXT_NAME_VAR = '_OPYR_CONTEXT_NAME'
198
+ SRC_FILE_VAR = '_OPYR_SRC_FILE'
199
+ OPTIONS_JSON_VAR = '_OPYR_OPTIONS_JSON'
200
+
201
+ ACK0 = b'OPYR000\n'
202
+ ACK1 = b'OPYR001\n'
203
+ ACK2 = b'OPYR002\n'
204
+ ACK3 = b'OPYR003\n'
205
+
206
+ PROC_TITLE_FMT = '(pyremote:%s)'
207
+
208
+ IMPORTS = (
209
+ 'base64',
210
+ 'os',
211
+ 'struct',
212
+ 'sys',
213
+ 'zlib',
214
+ )
211
215
 
212
216
 
213
217
  def _pyremote_bootstrap_main(context_name: str) -> None:
@@ -222,13 +226,13 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
222
226
  # Parent process
223
227
 
224
228
  # Dup original stdin to comm_fd for use as comm channel
225
- os.dup2(0, _PYREMOTE_BOOTSTRAP_INPUT_FD)
229
+ os.dup2(0, _PyremoteBootstrapConsts.INPUT_FD)
226
230
 
227
231
  # Overwrite stdin (fed to python repl) with first copy of src
228
232
  os.dup2(r0, 0)
229
233
 
230
234
  # Dup second copy of src to src_fd to recover after launch
231
- os.dup2(r1, _PYREMOTE_BOOTSTRAP_SRC_FD)
235
+ os.dup2(r1, _PyremoteBootstrapConsts.SRC_FD)
232
236
 
233
237
  # Close remaining fd's
234
238
  for f in [r0, w0, r1, w1]:
@@ -237,18 +241,18 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
237
241
  # Save vars
238
242
  env = os.environ
239
243
  exe = sys.executable
240
- env[_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR] = str(cp)
241
- env[_PYREMOTE_BOOTSTRAP_ARGV0_VAR] = exe
242
- env[_PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR] = context_name
244
+ env[_PyremoteBootstrapConsts.CHILD_PID_VAR] = str(cp)
245
+ env[_PyremoteBootstrapConsts.ARGV0_VAR] = exe
246
+ env[_PyremoteBootstrapConsts.CONTEXT_NAME_VAR] = context_name
243
247
 
244
248
  # Start repl reading stdin from r0
245
- os.execl(exe, exe + (_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT % (context_name,)))
249
+ os.execl(exe, exe + (_PyremoteBootstrapConsts.PROC_TITLE_FMT % (context_name,)))
246
250
 
247
251
  else:
248
252
  # Child process
249
253
 
250
254
  # Write first ack
251
- os.write(1, _PYREMOTE_BOOTSTRAP_ACK0)
255
+ os.write(1, _PyremoteBootstrapConsts.ACK0)
252
256
 
253
257
  # Write pid
254
258
  os.write(1, struct.pack('<Q', pid))
@@ -267,7 +271,7 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
267
271
  fp.close()
268
272
 
269
273
  # Write second ack
270
- os.write(1, _PYREMOTE_BOOTSTRAP_ACK1)
274
+ os.write(1, _PyremoteBootstrapConsts.ACK1)
271
275
 
272
276
  # Exit child
273
277
  sys.exit(0)
@@ -284,20 +288,8 @@ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
284
288
  import textwrap
285
289
  bs_src = textwrap.dedent(inspect.getsource(_pyremote_bootstrap_main))
286
290
 
287
- for gl in [
288
- '_PYREMOTE_BOOTSTRAP_INPUT_FD',
289
- '_PYREMOTE_BOOTSTRAP_SRC_FD',
290
-
291
- '_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR',
292
- '_PYREMOTE_BOOTSTRAP_ARGV0_VAR',
293
- '_PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR',
294
-
295
- '_PYREMOTE_BOOTSTRAP_ACK0',
296
- '_PYREMOTE_BOOTSTRAP_ACK1',
297
-
298
- '_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT',
299
- ]:
300
- bs_src = bs_src.replace(gl, repr(globals()[gl]))
291
+ for an, av in sorted(_PyremoteBootstrapConsts.__dict__.items(), key=lambda kv: -len(kv[0])):
292
+ bs_src = bs_src.replace(f'_PyremoteBootstrapConsts.{an}', repr(av))
301
293
 
302
294
  bs_src = '\n'.join(
303
295
  cl
@@ -312,7 +304,7 @@ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
312
304
  raise ValueError(bs_z85)
313
305
 
314
306
  stmts = [
315
- f'import {", ".join(_PYREMOTE_BOOTSTRAP_IMPORTS)}',
307
+ f'import {", ".join(_PyremoteBootstrapConsts.IMPORTS)}',
316
308
  f'exec(zlib.decompress(base64.b85decode(b"{bs_z85.decode("ascii")}")))',
317
309
  f'_pyremote_bootstrap_main("{context_name}")',
318
310
  ]
@@ -336,19 +328,19 @@ class PyremotePayloadRuntime:
336
328
 
337
329
  def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
338
330
  # If src file var is not present we need to do initial finalization
339
- if _PYREMOTE_BOOTSTRAP_SRC_FILE_VAR not in os.environ:
331
+ if _PyremoteBootstrapConsts.SRC_FILE_VAR not in os.environ:
340
332
  # Read second copy of payload src
341
- r1 = os.fdopen(_PYREMOTE_BOOTSTRAP_SRC_FD, 'rb', 0)
333
+ r1 = os.fdopen(_PyremoteBootstrapConsts.SRC_FD, 'rb', 0)
342
334
  payload_src = r1.read().decode('utf-8')
343
335
  r1.close()
344
336
 
345
337
  # Reap boostrap child. Must be done after reading second copy of source because source may be too big to fit in
346
338
  # a pipe at once.
347
- os.waitpid(int(os.environ.pop(_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR)), 0)
339
+ os.waitpid(int(os.environ.pop(_PyremoteBootstrapConsts.CHILD_PID_VAR)), 0)
348
340
 
349
341
  # Read options
350
- options_json_len = struct.unpack('<I', os.read(_PYREMOTE_BOOTSTRAP_INPUT_FD, 4))[0]
351
- if len(options_json := os.read(_PYREMOTE_BOOTSTRAP_INPUT_FD, options_json_len)) != options_json_len:
342
+ options_json_len = struct.unpack('<I', os.read(_PyremoteBootstrapConsts.INPUT_FD, 4))[0]
343
+ if len(options_json := os.read(_PyremoteBootstrapConsts.INPUT_FD, options_json_len)) != options_json_len:
352
344
  raise EOFError
353
345
  options = PyremoteBootstrapOptions(**json.loads(options_json.decode('utf-8')))
354
346
 
@@ -361,29 +353,29 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
361
353
  os.close(tfd)
362
354
 
363
355
  # Set vars
364
- os.environ[_PYREMOTE_BOOTSTRAP_SRC_FILE_VAR] = tfn
365
- os.environ[_PYREMOTE_BOOTSTRAP_OPTIONS_JSON_VAR] = options_json.decode('utf-8')
356
+ os.environ[_PyremoteBootstrapConsts.SRC_FILE_VAR] = tfn
357
+ os.environ[_PyremoteBootstrapConsts.OPTIONS_JSON_VAR] = options_json.decode('utf-8')
366
358
 
367
359
  # Re-exec temp file
368
- exe = os.environ[_PYREMOTE_BOOTSTRAP_ARGV0_VAR]
369
- context_name = os.environ[_PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR]
370
- os.execl(exe, exe + (_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT % (context_name,)), tfn)
360
+ exe = os.environ[_PyremoteBootstrapConsts.ARGV0_VAR]
361
+ context_name = os.environ[_PyremoteBootstrapConsts.CONTEXT_NAME_VAR]
362
+ os.execl(exe, exe + (_PyremoteBootstrapConsts.PROC_TITLE_FMT % (context_name,)), tfn)
371
363
 
372
364
  else:
373
365
  # Load options json var
374
- options_json_str = os.environ.pop(_PYREMOTE_BOOTSTRAP_OPTIONS_JSON_VAR)
366
+ options_json_str = os.environ.pop(_PyremoteBootstrapConsts.OPTIONS_JSON_VAR)
375
367
  options = PyremoteBootstrapOptions(**json.loads(options_json_str))
376
368
 
377
369
  # Read temp source file
378
- with open(os.environ.pop(_PYREMOTE_BOOTSTRAP_SRC_FILE_VAR)) as sf:
370
+ with open(os.environ.pop(_PyremoteBootstrapConsts.SRC_FILE_VAR)) as sf:
379
371
  payload_src = sf.read()
380
372
 
381
373
  # Restore vars
382
- sys.executable = os.environ.pop(_PYREMOTE_BOOTSTRAP_ARGV0_VAR)
383
- context_name = os.environ.pop(_PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR)
374
+ sys.executable = os.environ.pop(_PyremoteBootstrapConsts.ARGV0_VAR)
375
+ context_name = os.environ.pop(_PyremoteBootstrapConsts.CONTEXT_NAME_VAR)
384
376
 
385
377
  # Write third ack
386
- os.write(1, _PYREMOTE_BOOTSTRAP_ACK2)
378
+ os.write(1, _PyremoteBootstrapConsts.ACK2)
387
379
 
388
380
  # Write env info
389
381
  env_info = _get_pyremote_env_info()
@@ -392,7 +384,7 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
392
384
  os.write(1, env_info_json.encode('utf-8'))
393
385
 
394
386
  # Setup IO
395
- input = os.fdopen(_PYREMOTE_BOOTSTRAP_INPUT_FD, 'rb', 0) # noqa
387
+ input = os.fdopen(_PyremoteBootstrapConsts.INPUT_FD, 'rb', 0) # noqa
396
388
  output = os.fdopen(os.dup(1), 'wb', 0) # noqa
397
389
  os.dup2(nfd := os.open('/dev/null', os.O_WRONLY), 1)
398
390
  os.close(nfd)
@@ -402,7 +394,7 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
402
394
  sys.modules[mn] = sys.modules['__main__']
403
395
 
404
396
  # Write fourth ack
405
- output.write(_PYREMOTE_BOOTSTRAP_ACK3)
397
+ output.write(_PyremoteBootstrapConsts.ACK3)
406
398
 
407
399
  # Return
408
400
  return PyremotePayloadRuntime(
@@ -476,7 +468,7 @@ class PyremoteBootstrapDriver:
476
468
 
477
469
  def gen(self) -> ta.Generator[ta.Union[Read, Write], ta.Optional[bytes], Result]:
478
470
  # Read first ack (after fork)
479
- yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK0)
471
+ yield from self._expect(_PyremoteBootstrapConsts.ACK0)
480
472
 
481
473
  # Read pid
482
474
  d = yield from self._read(8)
@@ -487,14 +479,14 @@ class PyremoteBootstrapDriver:
487
479
  yield from self._write(self._payload_z)
488
480
 
489
481
  # Read second ack (after writing src copies)
490
- yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK1)
482
+ yield from self._expect(_PyremoteBootstrapConsts.ACK1)
491
483
 
492
484
  # Write options
493
485
  yield from self._write(struct.pack('<I', len(self._options_json)))
494
486
  yield from self._write(self._options_json)
495
487
 
496
488
  # Read third ack (after reaping child process)
497
- yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK2)
489
+ yield from self._expect(_PyremoteBootstrapConsts.ACK2)
498
490
 
499
491
  # Read env info
500
492
  d = yield from self._read(4)
@@ -504,7 +496,7 @@ class PyremoteBootstrapDriver:
504
496
  env_info = PyremoteEnvInfo.from_dict(json.loads(env_info_json))
505
497
 
506
498
  # Read fourth ack (after finalization completed)
507
- yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK3)
499
+ yield from self._expect(_PyremoteBootstrapConsts.ACK3)
508
500
 
509
501
  # Return
510
502
  return self.Result(
@@ -848,29 +848,33 @@ def _get_pyremote_env_info() -> PyremoteEnvInfo:
848
848
  ##
849
849
 
850
850
 
851
- _PYREMOTE_BOOTSTRAP_INPUT_FD = 100
852
- _PYREMOTE_BOOTSTRAP_SRC_FD = 101
853
-
854
- _PYREMOTE_BOOTSTRAP_CHILD_PID_VAR = '_OPYR_CHILD_PID'
855
- _PYREMOTE_BOOTSTRAP_ARGV0_VAR = '_OPYR_ARGV0'
856
- _PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR = '_OPYR_CONTEXT_NAME'
857
- _PYREMOTE_BOOTSTRAP_SRC_FILE_VAR = '_OPYR_SRC_FILE'
858
- _PYREMOTE_BOOTSTRAP_OPTIONS_JSON_VAR = '_OPYR_OPTIONS_JSON'
859
-
860
- _PYREMOTE_BOOTSTRAP_ACK0 = b'OPYR000\n'
861
- _PYREMOTE_BOOTSTRAP_ACK1 = b'OPYR001\n'
862
- _PYREMOTE_BOOTSTRAP_ACK2 = b'OPYR002\n'
863
- _PYREMOTE_BOOTSTRAP_ACK3 = b'OPYR003\n'
864
-
865
- _PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT = '(pyremote:%s)'
866
-
867
- _PYREMOTE_BOOTSTRAP_IMPORTS = [
868
- 'base64',
869
- 'os',
870
- 'struct',
871
- 'sys',
872
- 'zlib',
873
- ]
851
+ class _PyremoteBootstrapConsts:
852
+ def __new__(cls, *args, **kwargs): # noqa
853
+ raise TypeError
854
+
855
+ INPUT_FD = 100
856
+ SRC_FD = 101
857
+
858
+ CHILD_PID_VAR = '_OPYR_CHILD_PID'
859
+ ARGV0_VAR = '_OPYR_ARGV0'
860
+ CONTEXT_NAME_VAR = '_OPYR_CONTEXT_NAME'
861
+ SRC_FILE_VAR = '_OPYR_SRC_FILE'
862
+ OPTIONS_JSON_VAR = '_OPYR_OPTIONS_JSON'
863
+
864
+ ACK0 = b'OPYR000\n'
865
+ ACK1 = b'OPYR001\n'
866
+ ACK2 = b'OPYR002\n'
867
+ ACK3 = b'OPYR003\n'
868
+
869
+ PROC_TITLE_FMT = '(pyremote:%s)'
870
+
871
+ IMPORTS = (
872
+ 'base64',
873
+ 'os',
874
+ 'struct',
875
+ 'sys',
876
+ 'zlib',
877
+ )
874
878
 
875
879
 
876
880
  def _pyremote_bootstrap_main(context_name: str) -> None:
@@ -885,13 +889,13 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
885
889
  # Parent process
886
890
 
887
891
  # Dup original stdin to comm_fd for use as comm channel
888
- os.dup2(0, _PYREMOTE_BOOTSTRAP_INPUT_FD)
892
+ os.dup2(0, _PyremoteBootstrapConsts.INPUT_FD)
889
893
 
890
894
  # Overwrite stdin (fed to python repl) with first copy of src
891
895
  os.dup2(r0, 0)
892
896
 
893
897
  # Dup second copy of src to src_fd to recover after launch
894
- os.dup2(r1, _PYREMOTE_BOOTSTRAP_SRC_FD)
898
+ os.dup2(r1, _PyremoteBootstrapConsts.SRC_FD)
895
899
 
896
900
  # Close remaining fd's
897
901
  for f in [r0, w0, r1, w1]:
@@ -900,18 +904,18 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
900
904
  # Save vars
901
905
  env = os.environ
902
906
  exe = sys.executable
903
- env[_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR] = str(cp)
904
- env[_PYREMOTE_BOOTSTRAP_ARGV0_VAR] = exe
905
- env[_PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR] = context_name
907
+ env[_PyremoteBootstrapConsts.CHILD_PID_VAR] = str(cp)
908
+ env[_PyremoteBootstrapConsts.ARGV0_VAR] = exe
909
+ env[_PyremoteBootstrapConsts.CONTEXT_NAME_VAR] = context_name
906
910
 
907
911
  # Start repl reading stdin from r0
908
- os.execl(exe, exe + (_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT % (context_name,)))
912
+ os.execl(exe, exe + (_PyremoteBootstrapConsts.PROC_TITLE_FMT % (context_name,)))
909
913
 
910
914
  else:
911
915
  # Child process
912
916
 
913
917
  # Write first ack
914
- os.write(1, _PYREMOTE_BOOTSTRAP_ACK0)
918
+ os.write(1, _PyremoteBootstrapConsts.ACK0)
915
919
 
916
920
  # Write pid
917
921
  os.write(1, struct.pack('<Q', pid))
@@ -930,7 +934,7 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
930
934
  fp.close()
931
935
 
932
936
  # Write second ack
933
- os.write(1, _PYREMOTE_BOOTSTRAP_ACK1)
937
+ os.write(1, _PyremoteBootstrapConsts.ACK1)
934
938
 
935
939
  # Exit child
936
940
  sys.exit(0)
@@ -947,20 +951,8 @@ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
947
951
  import textwrap
948
952
  bs_src = textwrap.dedent(inspect.getsource(_pyremote_bootstrap_main))
949
953
 
950
- for gl in [
951
- '_PYREMOTE_BOOTSTRAP_INPUT_FD',
952
- '_PYREMOTE_BOOTSTRAP_SRC_FD',
953
-
954
- '_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR',
955
- '_PYREMOTE_BOOTSTRAP_ARGV0_VAR',
956
- '_PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR',
957
-
958
- '_PYREMOTE_BOOTSTRAP_ACK0',
959
- '_PYREMOTE_BOOTSTRAP_ACK1',
960
-
961
- '_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT',
962
- ]:
963
- bs_src = bs_src.replace(gl, repr(globals()[gl]))
954
+ for an, av in sorted(_PyremoteBootstrapConsts.__dict__.items(), key=lambda kv: -len(kv[0])):
955
+ bs_src = bs_src.replace(f'_PyremoteBootstrapConsts.{an}', repr(av))
964
956
 
965
957
  bs_src = '\n'.join(
966
958
  cl
@@ -975,7 +967,7 @@ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
975
967
  raise ValueError(bs_z85)
976
968
 
977
969
  stmts = [
978
- f'import {", ".join(_PYREMOTE_BOOTSTRAP_IMPORTS)}',
970
+ f'import {", ".join(_PyremoteBootstrapConsts.IMPORTS)}',
979
971
  f'exec(zlib.decompress(base64.b85decode(b"{bs_z85.decode("ascii")}")))',
980
972
  f'_pyremote_bootstrap_main("{context_name}")',
981
973
  ]
@@ -999,19 +991,19 @@ class PyremotePayloadRuntime:
999
991
 
1000
992
  def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
1001
993
  # If src file var is not present we need to do initial finalization
1002
- if _PYREMOTE_BOOTSTRAP_SRC_FILE_VAR not in os.environ:
994
+ if _PyremoteBootstrapConsts.SRC_FILE_VAR not in os.environ:
1003
995
  # Read second copy of payload src
1004
- r1 = os.fdopen(_PYREMOTE_BOOTSTRAP_SRC_FD, 'rb', 0)
996
+ r1 = os.fdopen(_PyremoteBootstrapConsts.SRC_FD, 'rb', 0)
1005
997
  payload_src = r1.read().decode('utf-8')
1006
998
  r1.close()
1007
999
 
1008
1000
  # Reap boostrap child. Must be done after reading second copy of source because source may be too big to fit in
1009
1001
  # a pipe at once.
1010
- os.waitpid(int(os.environ.pop(_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR)), 0)
1002
+ os.waitpid(int(os.environ.pop(_PyremoteBootstrapConsts.CHILD_PID_VAR)), 0)
1011
1003
 
1012
1004
  # Read options
1013
- options_json_len = struct.unpack('<I', os.read(_PYREMOTE_BOOTSTRAP_INPUT_FD, 4))[0]
1014
- if len(options_json := os.read(_PYREMOTE_BOOTSTRAP_INPUT_FD, options_json_len)) != options_json_len:
1005
+ options_json_len = struct.unpack('<I', os.read(_PyremoteBootstrapConsts.INPUT_FD, 4))[0]
1006
+ if len(options_json := os.read(_PyremoteBootstrapConsts.INPUT_FD, options_json_len)) != options_json_len:
1015
1007
  raise EOFError
1016
1008
  options = PyremoteBootstrapOptions(**json.loads(options_json.decode('utf-8')))
1017
1009
 
@@ -1024,29 +1016,29 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
1024
1016
  os.close(tfd)
1025
1017
 
1026
1018
  # Set vars
1027
- os.environ[_PYREMOTE_BOOTSTRAP_SRC_FILE_VAR] = tfn
1028
- os.environ[_PYREMOTE_BOOTSTRAP_OPTIONS_JSON_VAR] = options_json.decode('utf-8')
1019
+ os.environ[_PyremoteBootstrapConsts.SRC_FILE_VAR] = tfn
1020
+ os.environ[_PyremoteBootstrapConsts.OPTIONS_JSON_VAR] = options_json.decode('utf-8')
1029
1021
 
1030
1022
  # Re-exec temp file
1031
- exe = os.environ[_PYREMOTE_BOOTSTRAP_ARGV0_VAR]
1032
- context_name = os.environ[_PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR]
1033
- os.execl(exe, exe + (_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT % (context_name,)), tfn)
1023
+ exe = os.environ[_PyremoteBootstrapConsts.ARGV0_VAR]
1024
+ context_name = os.environ[_PyremoteBootstrapConsts.CONTEXT_NAME_VAR]
1025
+ os.execl(exe, exe + (_PyremoteBootstrapConsts.PROC_TITLE_FMT % (context_name,)), tfn)
1034
1026
 
1035
1027
  else:
1036
1028
  # Load options json var
1037
- options_json_str = os.environ.pop(_PYREMOTE_BOOTSTRAP_OPTIONS_JSON_VAR)
1029
+ options_json_str = os.environ.pop(_PyremoteBootstrapConsts.OPTIONS_JSON_VAR)
1038
1030
  options = PyremoteBootstrapOptions(**json.loads(options_json_str))
1039
1031
 
1040
1032
  # Read temp source file
1041
- with open(os.environ.pop(_PYREMOTE_BOOTSTRAP_SRC_FILE_VAR)) as sf:
1033
+ with open(os.environ.pop(_PyremoteBootstrapConsts.SRC_FILE_VAR)) as sf:
1042
1034
  payload_src = sf.read()
1043
1035
 
1044
1036
  # Restore vars
1045
- sys.executable = os.environ.pop(_PYREMOTE_BOOTSTRAP_ARGV0_VAR)
1046
- context_name = os.environ.pop(_PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR)
1037
+ sys.executable = os.environ.pop(_PyremoteBootstrapConsts.ARGV0_VAR)
1038
+ context_name = os.environ.pop(_PyremoteBootstrapConsts.CONTEXT_NAME_VAR)
1047
1039
 
1048
1040
  # Write third ack
1049
- os.write(1, _PYREMOTE_BOOTSTRAP_ACK2)
1041
+ os.write(1, _PyremoteBootstrapConsts.ACK2)
1050
1042
 
1051
1043
  # Write env info
1052
1044
  env_info = _get_pyremote_env_info()
@@ -1055,7 +1047,7 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
1055
1047
  os.write(1, env_info_json.encode('utf-8'))
1056
1048
 
1057
1049
  # Setup IO
1058
- input = os.fdopen(_PYREMOTE_BOOTSTRAP_INPUT_FD, 'rb', 0) # noqa
1050
+ input = os.fdopen(_PyremoteBootstrapConsts.INPUT_FD, 'rb', 0) # noqa
1059
1051
  output = os.fdopen(os.dup(1), 'wb', 0) # noqa
1060
1052
  os.dup2(nfd := os.open('/dev/null', os.O_WRONLY), 1)
1061
1053
  os.close(nfd)
@@ -1065,7 +1057,7 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
1065
1057
  sys.modules[mn] = sys.modules['__main__']
1066
1058
 
1067
1059
  # Write fourth ack
1068
- output.write(_PYREMOTE_BOOTSTRAP_ACK3)
1060
+ output.write(_PyremoteBootstrapConsts.ACK3)
1069
1061
 
1070
1062
  # Return
1071
1063
  return PyremotePayloadRuntime(
@@ -1139,7 +1131,7 @@ class PyremoteBootstrapDriver:
1139
1131
 
1140
1132
  def gen(self) -> ta.Generator[ta.Union[Read, Write], ta.Optional[bytes], Result]:
1141
1133
  # Read first ack (after fork)
1142
- yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK0)
1134
+ yield from self._expect(_PyremoteBootstrapConsts.ACK0)
1143
1135
 
1144
1136
  # Read pid
1145
1137
  d = yield from self._read(8)
@@ -1150,14 +1142,14 @@ class PyremoteBootstrapDriver:
1150
1142
  yield from self._write(self._payload_z)
1151
1143
 
1152
1144
  # Read second ack (after writing src copies)
1153
- yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK1)
1145
+ yield from self._expect(_PyremoteBootstrapConsts.ACK1)
1154
1146
 
1155
1147
  # Write options
1156
1148
  yield from self._write(struct.pack('<I', len(self._options_json)))
1157
1149
  yield from self._write(self._options_json)
1158
1150
 
1159
1151
  # Read third ack (after reaping child process)
1160
- yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK2)
1152
+ yield from self._expect(_PyremoteBootstrapConsts.ACK2)
1161
1153
 
1162
1154
  # Read env info
1163
1155
  d = yield from self._read(4)
@@ -1167,7 +1159,7 @@ class PyremoteBootstrapDriver:
1167
1159
  env_info = PyremoteEnvInfo.from_dict(json.loads(env_info_json))
1168
1160
 
1169
1161
  # Read fourth ack (after finalization completed)
1170
- yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK3)
1162
+ yield from self._expect(_PyremoteBootstrapConsts.ACK3)
1171
1163
 
1172
1164
  # Return
1173
1165
  return self.Result(
@@ -7887,7 +7879,7 @@ class SubprocessRunnable(abc.ABC, ta.Generic[T]):
7887
7879
 
7888
7880
 
7889
7881
  class IndentWriter:
7890
- DEFAULT_INDENT = ' ' * 4
7882
+ DEFAULT_INDENT: ta.ClassVar[str] = ' ' * 4
7891
7883
 
7892
7884
  def __init__(
7893
7885
  self,
@@ -7900,6 +7892,7 @@ class IndentWriter:
7900
7892
  self._buf = buf if buf is not None else io.StringIO()
7901
7893
  self._indent = check.isinstance(indent, str) if indent is not None else self.DEFAULT_INDENT
7902
7894
  self._level = 0
7895
+ self._cache: ta.Dict[int, str] = {}
7903
7896
  self._has_indented = False
7904
7897
 
7905
7898
  @contextlib.contextmanager
@@ -7911,7 +7904,10 @@ class IndentWriter:
7911
7904
  self._level -= num
7912
7905
 
7913
7906
  def write(self, s: str) -> None:
7914
- indent = self._indent * self._level
7907
+ try:
7908
+ indent = self._cache[self._level]
7909
+ except KeyError:
7910
+ indent = self._cache[self._level] = self._indent * self._level
7915
7911
  i = 0
7916
7912
  while i < len(s):
7917
7913
  if not self._has_indented:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ominfra
3
- Version: 0.0.0.dev295
3
+ Version: 0.0.0.dev297
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.dev295
16
- Requires-Dist: omlish==0.0.0.dev295
15
+ Requires-Dist: omdev==0.0.0.dev297
16
+ Requires-Dist: omlish==0.0.0.dev297
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.20; extra == "all"
@@ -1,5 +1,5 @@
1
- omdev==0.0.0.dev295
2
- omlish==0.0.0.dev295
1
+ omdev==0.0.0.dev297
2
+ omlish==0.0.0.dev297
3
3
 
4
4
  [all]
5
5
  paramiko~=3.5