nextmv 1.0.0__tar.gz → 1.0.0.dev1__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 (235) hide show
  1. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/PKG-INFO +4 -5
  2. nextmv-1.0.0.dev1/nextmv/__about__.py +1 -0
  3. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/__entrypoint__.py +2 -1
  4. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/__init__.py +4 -0
  5. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/CONTRIBUTING.md +40 -112
  6. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/__init__.py +0 -4
  7. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/acceptance/create.py +22 -20
  8. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/acceptance/delete.py +12 -8
  9. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/acceptance/get.py +10 -9
  10. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/acceptance/list.py +3 -3
  11. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/acceptance/update.py +6 -6
  12. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/account/__init__.py +3 -3
  13. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/account/create.py +11 -11
  14. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/account/delete.py +8 -7
  15. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/account/get.py +3 -3
  16. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/account/update.py +5 -5
  17. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/app/create.py +26 -25
  18. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/app/delete.py +7 -6
  19. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/app/exists.py +2 -2
  20. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/app/get.py +2 -2
  21. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/app/list.py +3 -3
  22. nextmv-1.0.0.dev1/nextmv/cli/cloud/app/push.py +137 -0
  23. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/app/update.py +12 -12
  24. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/batch/create.py +28 -26
  25. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/batch/delete.py +10 -6
  26. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/batch/get.py +9 -9
  27. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/batch/list.py +3 -3
  28. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/batch/metadata.py +4 -4
  29. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/batch/update.py +6 -6
  30. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/data/__init__.py +1 -1
  31. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/data/upload.py +15 -15
  32. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/ensemble/__init__.py +0 -2
  33. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/ensemble/create.py +22 -21
  34. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/ensemble/delete.py +10 -6
  35. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/ensemble/get.py +4 -4
  36. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/ensemble/update.py +9 -9
  37. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/input_set/__init__.py +0 -2
  38. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/input_set/create.py +22 -22
  39. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/input_set/get.py +3 -3
  40. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/input_set/list.py +3 -3
  41. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/input_set/update.py +24 -24
  42. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/instance/create.py +15 -14
  43. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/instance/delete.py +7 -6
  44. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/instance/exists.py +2 -2
  45. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/instance/get.py +2 -2
  46. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/instance/list.py +3 -3
  47. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/instance/update.py +14 -14
  48. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/managed_input/create.py +16 -14
  49. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/managed_input/delete.py +8 -7
  50. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/managed_input/get.py +3 -3
  51. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/managed_input/list.py +3 -3
  52. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/managed_input/update.py +9 -9
  53. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/run/cancel.py +2 -2
  54. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/run/create.py +40 -34
  55. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/run/get.py +8 -8
  56. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/run/input.py +4 -4
  57. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/run/list.py +6 -6
  58. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/run/logs.py +10 -9
  59. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/run/metadata.py +4 -4
  60. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/run/track.py +33 -32
  61. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/scenario/create.py +21 -21
  62. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/scenario/delete.py +10 -6
  63. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/scenario/get.py +9 -9
  64. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/scenario/list.py +3 -3
  65. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/scenario/metadata.py +4 -4
  66. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/scenario/update.py +6 -6
  67. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/secrets/create.py +17 -17
  68. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/secrets/delete.py +10 -6
  69. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/secrets/get.py +4 -4
  70. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/secrets/list.py +3 -3
  71. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/secrets/update.py +20 -17
  72. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/upload/create.py +2 -2
  73. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/version/create.py +10 -9
  74. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/version/delete.py +7 -6
  75. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/version/exists.py +2 -2
  76. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/version/get.py +2 -2
  77. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/version/list.py +3 -3
  78. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/version/update.py +8 -8
  79. nextmv-1.0.0.dev1/nextmv/cli/community/clone.py +270 -0
  80. nextmv-1.0.0.dev1/nextmv/cli/community/list.py +265 -0
  81. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/configuration/config.py +10 -43
  82. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/configuration/create.py +7 -7
  83. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/configuration/delete.py +8 -8
  84. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/configuration/list.py +3 -3
  85. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/main.py +36 -26
  86. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/message.py +54 -71
  87. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/options.py +0 -28
  88. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/version.py +1 -1
  89. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/__init__.py +38 -14
  90. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/acceptance_test.py +65 -1
  91. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/account.py +6 -1
  92. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/__init__.py +75 -18
  93. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/_acceptance.py +8 -13
  94. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/_batch_scenario.py +19 -4
  95. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/_input_set.py +6 -42
  96. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/_instance.py +3 -3
  97. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/_managed_input.py +2 -2
  98. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/_version.py +3 -4
  99. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/batch_experiment.py +1 -3
  100. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/integration.py +4 -7
  101. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/deprecated.py +3 -5
  102. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/input.py +52 -0
  103. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/local/runner.py +1 -1
  104. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/model.py +11 -50
  105. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/options.py +256 -11
  106. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/output.py +62 -0
  107. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/run.py +10 -1
  108. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/status.py +51 -1
  109. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/pyproject.toml +6 -4
  110. nextmv-1.0.0.dev1/tests/cli/test_community.py +665 -0
  111. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/cli/test_configuration.py +37 -8
  112. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/cli/test_main.py +31 -0
  113. nextmv-1.0.0.dev1/tests/scripts/options_deprecated.py +8 -0
  114. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_entrypoint/test_entrypoint.py +13 -15
  115. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_options.py +252 -1
  116. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_run.py +13 -2
  117. nextmv-1.0.0/nextmv/__about__.py +0 -1
  118. nextmv-1.0.0/nextmv/cli/cloud/app/push.py +0 -432
  119. nextmv-1.0.0/nextmv/cli/cloud/ensemble/list.py +0 -63
  120. nextmv-1.0.0/nextmv/cli/cloud/input_set/delete.py +0 -64
  121. nextmv-1.0.0/nextmv/cli/cloud/shadow/__init__.py +0 -33
  122. nextmv-1.0.0/nextmv/cli/cloud/shadow/create.py +0 -184
  123. nextmv-1.0.0/nextmv/cli/cloud/shadow/delete.py +0 -64
  124. nextmv-1.0.0/nextmv/cli/cloud/shadow/get.py +0 -61
  125. nextmv-1.0.0/nextmv/cli/cloud/shadow/list.py +0 -63
  126. nextmv-1.0.0/nextmv/cli/cloud/shadow/metadata.py +0 -66
  127. nextmv-1.0.0/nextmv/cli/cloud/shadow/start.py +0 -43
  128. nextmv-1.0.0/nextmv/cli/cloud/shadow/stop.py +0 -53
  129. nextmv-1.0.0/nextmv/cli/cloud/shadow/update.py +0 -96
  130. nextmv-1.0.0/nextmv/cli/cloud/switchback/__init__.py +0 -33
  131. nextmv-1.0.0/nextmv/cli/cloud/switchback/create.py +0 -151
  132. nextmv-1.0.0/nextmv/cli/cloud/switchback/delete.py +0 -64
  133. nextmv-1.0.0/nextmv/cli/cloud/switchback/get.py +0 -62
  134. nextmv-1.0.0/nextmv/cli/cloud/switchback/list.py +0 -63
  135. nextmv-1.0.0/nextmv/cli/cloud/switchback/metadata.py +0 -68
  136. nextmv-1.0.0/nextmv/cli/cloud/switchback/start.py +0 -43
  137. nextmv-1.0.0/nextmv/cli/cloud/switchback/stop.py +0 -53
  138. nextmv-1.0.0/nextmv/cli/cloud/switchback/update.py +0 -96
  139. nextmv-1.0.0/nextmv/cli/community/clone.py +0 -86
  140. nextmv-1.0.0/nextmv/cli/community/list.py +0 -200
  141. nextmv-1.0.0/nextmv/cli/confirm.py +0 -34
  142. nextmv-1.0.0/nextmv/cloud/application/_shadow.py +0 -320
  143. nextmv-1.0.0/nextmv/cloud/application/_switchback.py +0 -332
  144. nextmv-1.0.0/nextmv/cloud/community.py +0 -446
  145. nextmv-1.0.0/nextmv/cloud/shadow.py +0 -254
  146. nextmv-1.0.0/nextmv/cloud/switchback.py +0 -228
  147. nextmv-1.0.0/tests/README.md +0 -91
  148. nextmv-1.0.0/tests/integration/cloud/test_integration_cloud.py +0 -790
  149. nextmv-1.0.0/tests/scripts/__init__.py +0 -0
  150. nextmv-1.0.0/tests/test_entrypoint/__init__.py +0 -0
  151. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/.gitignore +0 -0
  152. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/LICENSE +0 -0
  153. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/README.md +0 -0
  154. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/_serialization.py +0 -0
  155. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/base_model.py +0 -0
  156. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/__init__.py +0 -0
  157. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
  158. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/app/__init__.py +0 -0
  159. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/batch/__init__.py +0 -0
  160. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/instance/__init__.py +0 -0
  161. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
  162. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/run/__init__.py +0 -0
  163. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/scenario/__init__.py +0 -0
  164. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/secrets/__init__.py +0 -0
  165. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/upload/__init__.py +0 -0
  166. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/cloud/version/__init__.py +0 -0
  167. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/community/__init__.py +1 -1
  168. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cli/configuration/__init__.py +0 -0
  169. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/_ensemble.py +0 -0
  170. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/_run.py +0 -0
  171. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/_secrets.py +0 -0
  172. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/application/_utils.py +0 -0
  173. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/assets.py +0 -0
  174. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/client.py +0 -0
  175. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/ensemble.py +0 -0
  176. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/input_set.py +0 -0
  177. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/instance.py +0 -0
  178. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/package.py +0 -0
  179. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/scenario.py +0 -0
  180. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/secrets.py +0 -0
  181. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/url.py +0 -0
  182. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/cloud/version.py +0 -0
  183. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/default_app/.gitignore +0 -0
  184. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/default_app/README.md +0 -0
  185. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/default_app/app.yaml +0 -0
  186. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/default_app/input.json +0 -0
  187. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/default_app/main.py +0 -0
  188. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/default_app/requirements.txt +0 -0
  189. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/default_app/src/__init__.py +0 -0
  190. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/default_app/src/visuals.py +0 -0
  191. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/local/__init__.py +0 -0
  192. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/local/application.py +0 -0
  193. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/local/executor.py +0 -0
  194. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/local/geojson_handler.py +0 -0
  195. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/local/local.py +0 -0
  196. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/local/plotly_handler.py +0 -0
  197. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/logger.py +0 -0
  198. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/manifest.py +0 -0
  199. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/polling.py +0 -0
  200. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/nextmv/safe.py +0 -0
  201. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/__init__.py +0 -0
  202. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/cli/__init__.py +0 -0
  203. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/cli/test_version.py +0 -0
  204. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/cloud/__init__.py +0 -0
  205. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/cloud/app.yaml +0 -0
  206. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/cloud/test_client.py +0 -0
  207. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/cloud/test_instance.py +0 -0
  208. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/cloud/test_package.py +0 -0
  209. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/cloud/test_scenario.py +0 -0
  210. {nextmv-1.0.0/tests/integration → nextmv-1.0.0.dev1/tests/local}/__init__.py +0 -0
  211. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/local/test_application.py +0 -0
  212. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/local/test_executor.py +0 -0
  213. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/local/test_runner.py +0 -0
  214. {nextmv-1.0.0/tests/integration/cloud → nextmv-1.0.0.dev1/tests/scripts}/__init__.py +0 -0
  215. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/scripts/options1.py +0 -0
  216. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/scripts/options2.py +0 -0
  217. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/scripts/options3.py +0 -0
  218. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/scripts/options4.py +0 -0
  219. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/scripts/options5.py +0 -0
  220. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/scripts/options6.py +0 -0
  221. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/scripts/options7.py +0 -0
  222. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_base_model.py +0 -0
  223. {nextmv-1.0.0/tests/local → nextmv-1.0.0.dev1/tests/test_entrypoint}/__init__.py +0 -0
  224. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_input.py +0 -0
  225. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_inputs/test_data.csv +0 -0
  226. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_inputs/test_data.json +0 -0
  227. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_inputs/test_data.txt +0 -0
  228. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_logger.py +0 -0
  229. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_manifest.py +0 -0
  230. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_model.py +0 -0
  231. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_output.py +0 -0
  232. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_polling.py +0 -0
  233. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_safe.py +0 -0
  234. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_serialization.py +0 -0
  235. {nextmv-1.0.0 → nextmv-1.0.0.dev1}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextmv
3
- Version: 1.0.0
3
+ Version: 1.0.0.dev1
4
4
  Summary: The all-purpose Python SDK for Nextmv
5
5
  Project-URL: Homepage, https://www.nextmv.io
6
6
  Project-URL: Documentation, https://nextmv-py.docs.nextmv.io/en/latest/nextmv/
@@ -229,20 +229,19 @@ Requires-Dist: plotly>=6.0.1; extra == 'all'
229
229
  Provides-Extra: dev
230
230
  Requires-Dist: build>=1.0.3; extra == 'dev'
231
231
  Requires-Dist: folium>=0.20.0; extra == 'dev'
232
- Requires-Dist: mlflow>=3.9.0; extra == 'dev'
233
- Requires-Dist: nextpipe>=0.6.0; extra == 'dev'
232
+ Requires-Dist: mlflow>=2.19.0; extra == 'dev'
233
+ Requires-Dist: nextroute>=1.11.1; extra == 'dev'
234
234
  Requires-Dist: openpyxl>=3.1.5; extra == 'dev'
235
235
  Requires-Dist: pandas>=2.2.3; extra == 'dev'
236
236
  Requires-Dist: plotly>=6.0.1; extra == 'dev'
237
237
  Requires-Dist: pydantic>=2.5.2; extra == 'dev'
238
- Requires-Dist: pytest>=9.0.2; extra == 'dev'
239
238
  Requires-Dist: pyyaml>=6.0.1; extra == 'dev'
240
239
  Requires-Dist: requests>=2.31.0; extra == 'dev'
241
240
  Requires-Dist: ruff>=0.1.7; extra == 'dev'
242
241
  Requires-Dist: twine>=4.0.2; extra == 'dev'
243
242
  Requires-Dist: urllib3>=2.1.0; extra == 'dev'
244
243
  Provides-Extra: notebook
245
- Requires-Dist: mlflow>=3.9.0; extra == 'notebook'
244
+ Requires-Dist: mlflow>=2.19.0; extra == 'notebook'
246
245
  Description-Content-Type: text/markdown
247
246
 
248
247
  # Nextmv Python SDK
@@ -0,0 +1 @@
1
+ __version__ = "v1.0.0.dev1"
@@ -10,12 +10,13 @@ human to use it during local development. It is the standard way in which a
10
10
  from mlflow.pyfunc import load_model
11
11
 
12
12
  import nextmv
13
+ from nextmv import cloud
13
14
 
14
15
 
15
16
  def main() -> None:
16
17
  """Entry point for the program."""
17
18
 
18
- manifest = nextmv.Manifest.from_yaml(".")
19
+ manifest = cloud.Manifest.from_yaml(".")
19
20
 
20
21
  # Load the options from the manifest.
21
22
  options = manifest.extract_options()
@@ -11,6 +11,7 @@ from .input import LocalInputLoader as LocalInputLoader
11
11
  from .input import csv_data_file as csv_data_file
12
12
  from .input import json_data_file as json_data_file
13
13
  from .input import load as load
14
+ from .input import load_local as load_local
14
15
  from .input import text_data_file as text_data_file
15
16
  from .logger import log as log
16
17
  from .logger import redirect_stdout as redirect_stdout
@@ -30,6 +31,7 @@ from .model import Model as Model
30
31
  from .model import ModelConfiguration as ModelConfiguration
31
32
  from .options import Option as Option
32
33
  from .options import Options as Options
34
+ from .options import Parameter as Parameter
33
35
  from .output import Asset as Asset
34
36
  from .output import DataPoint as DataPoint
35
37
  from .output import LocalOutputWriter as LocalOutputWriter
@@ -48,6 +50,7 @@ from .output import csv_solution_file as csv_solution_file
48
50
  from .output import json_solution_file as json_solution_file
49
51
  from .output import text_solution_file as text_solution_file
50
52
  from .output import write as write
53
+ from .output import write_local as write_local
51
54
  from .polling import DEFAULT_POLLING_OPTIONS as DEFAULT_POLLING_OPTIONS
52
55
  from .polling import PollingOptions as PollingOptions
53
56
  from .polling import default_polling_options as default_polling_options
@@ -76,6 +79,7 @@ from .run import TrackedRunStatus as TrackedRunStatus
76
79
  from .run import run_duration as run_duration
77
80
  from .safe import safe_id as safe_id
78
81
  from .safe import safe_name_and_id as safe_name_and_id
82
+ from .status import Status as Status
79
83
  from .status import StatusV2 as StatusV2
80
84
 
81
85
  VERSION = __version__
@@ -152,16 +152,14 @@ guidelines:
152
152
  - We embrace the use of emojis. They make the CLI friendlier and more
153
153
  approachable.
154
154
  - The `message.py` file contains helper functions for printing messages, like:
155
- - `message`: prints a message. You can give it an emoji for the message. The
156
- other commands have fixed emojis.
157
- - `info`: prints an informational message. Use for neutral messages.
158
- - `in_progress`: prints an in-progress message. Use before executing an action.
159
- - `success`: prints a success message. Use after successfully completing an action.
160
- - `warning`: prints a warning message. Use for non-critical issues.
161
- - `error`: prints an error and raises an exception. Use for critical issues
162
- and to return early from commands.
155
+ - `error`: prints an error and raises an exception.
156
+ - `success`: prints a success message.
157
+ - `warning`: prints a warning message.
158
+ - `in_progress`: prints an in-progress message.
159
+ - `info`: prints an informational message. You can give it an emoji for the
160
+ message. The other commands have fixed emojis.
163
161
  - For printing `JSON` information, use the `print_json` function in the
164
- `message.py` file to print JSON output. This ensures consistent formatting
162
+ `messages.py` file to print JSON output. This ensures consistent formatting
165
163
  across the CLI.
166
164
  - Emojis should be formatted according to [Rich's emoji guide][rich-emoji].
167
165
  They are strings enclosed in colons, e.g. `:rocket:`, `:boom:`,
@@ -173,110 +171,40 @@ guidelines:
173
171
  success(f"Application [magenta]{app_id}[/magenta] deleted successfully.")
174
172
  ```
175
173
 
176
- - When showing the values of an `Enum`, use the `enum_values` function in the
177
- `message.py` file which will give a nicely colored, comma-separated list of
178
- the enum values. Consider the following example, where we get the allowed
179
- values for the `InputFormat` class.
180
-
181
- ```python
182
- content_format: Annotated[
183
- InputFormat | None,
184
- typer.Option(
185
- "--content-format",
186
- "-c",
187
- help=f"The content format for the instance. Allowed values are: {enum_values(InputFormat)}.",
188
- metavar="CONTENT_FORMAT",
189
- rich_help_panel="Instance configuration",
190
- ),
191
- ] = None,
192
- ```
193
-
194
174
  ## Confirmation prompts
195
175
 
196
- For destructive actions (like deletions), use the `get_confirmation()` method
197
- to ask for user confirmation before proceeding. The method is available from
198
- the `cli/confirm.py` file. This method already handles sensible values used for
199
- getting a confirmation from a user. Additionally, it handles non-interactive
200
- sessions by defaulting to `False` if no input can be provided.
176
+ For destructive actions (like deletions), use `rich.prompt.Confirm.ask()` to
177
+ ask for user confirmation before proceeding. Follow these guidelines:
201
178
 
202
- When using confirmation prompts, follow these guidelines:
203
-
204
- - The confirmation message should use `[magenta]` for the variable/s being
179
+ - The confirmation message should use `[magenta]` for the variable being
205
180
  affected.
206
- - Provide a `--yes` / `-y` flag to skip the confirmation prompt where possible,
207
- useful for non-interactive sessions.
208
- - If the user declines, call `info()` and return early.
181
+ - Set `default=False` for safety, so the user must explicitly confirm.
182
+ - Provide a `--yes` / `-y` flag to skip the confirmation prompt, useful for
183
+ non-interactive sessions.
184
+ - If the user declines, call `info()` with the `:bulb:` emoji and return early.
209
185
 
210
186
  Consider the `nextmv cloud app delete` command:
211
187
 
212
188
  ```python
213
189
  if not yes:
214
- confirm = get_confirmation(
215
- f"Are you sure you want to delete application [magenta]{app_id}[/magenta]? This action cannot be undone.",
190
+ confirm = Confirm.ask(
191
+ f"Are you sure you want to delete application [magenta]{app_id}[/magenta]? This action cannot be undone",
192
+ default=False,
216
193
  )
217
194
 
218
195
  if not confirm:
219
- info(f"Application [magenta]{app_id}[/magenta] will not be deleted.")
196
+ info(msg=f"Application [magenta]{app_id}[/magenta] will not be deleted.", emoji=":bulb:")
220
197
  return
221
198
  ```
222
199
 
223
- ## Formatting, colors, and styles
224
-
225
- Use these Rich markup colors/styles when formatting help text and messages.
226
- These are the main colors/styles that can be used for highlighting/contrast (we
227
- limit colors to keep coloring consistent):
228
-
229
- - `[code]`: commands. CLI related variables. - technical things that are CLI
230
- commands.
231
- - `[magenta]`: variable names, values, literals, etc. - mainly short technical things.
232
- - `[dim]`: examples. - longer technical things.
233
- - `[yellow]`: emphasis, highlight of special items, type contrast to
234
- `[magenta]`. Use sparingly only.
200
+ ## Formatting
235
201
 
236
- In any case, the best advice is to follow existing examples in the codebase to
237
- maintain consistency.
202
+ Use these Rich markup guidelines when formatting help text and messages.
238
203
 
239
- Here are some guidelines for when to use each formatting style.
240
-
241
- - When talking about a command use the `[code]` `[/code]` tags. Consider the
242
- help message of the `cloud/shadow/stop.py` file. We tell the user they can
243
- delete an experiment with the `nextmv cloud shadow delete` command. The
244
- formatting of that command is done using the `[code]` `[/code]` tags:
245
-
246
- ```python
247
- @app.command()
248
- def stop(
249
- app_id: AppIDOption,
250
- shadow_test_id: ShadowTestIDOption,
251
- profile: ProfileOption = None,
252
- ) -> None:
253
- """
254
- Stops a Nextmv Cloud shadow test.
255
-
256
- Before stopping a shadow test, it must be in a started state. Experiments
257
- in a [magenta]draft[/magenta] state, that haven't started, can be deleted
258
- with the [code]nextmv cloud shadow delete[/code] command.
259
-
260
- [bold][underline]Examples[/underline][/bold]
261
-
262
- - Stop the shadow test with the ID [magenta]hop-analysis[/magenta] from application
263
- [magenta]hare-app[/magenta].
264
- $ [dim]nextmv cloud shadow stop --app-id hare-app --shadow-test-id hop-analysis[/dim]
265
- """
266
-
267
- in_progress(msg="Stopping shadow test...")
268
- cloud_app = build_app(app_id=app_id, profile=profile)
269
- cloud_app.stop_shadow_test(shadow_test_id=shadow_test_id)
270
- success(
271
- f"Shadow test [magenta]{shadow_test_id}[/magenta] stopped successfully "
272
- f"in application [magenta]{app_id}[/magenta]."
273
- )
274
- ```
275
-
276
- - When talking about a command option, there is no formatting needed. Typer
277
- automatically adds coloring to options in the help menu. Take this example
278
- from the help menu of the `cloud/app/delete.py` file. In the command help,
279
- when referring to the `--yes` option:
204
+ - When talking about a command, or a command option, use the `[code]` `[/code]`
205
+ tags. Take this example from the help menu of the `cloud/app/delete.py` file.
206
+ In the command help, when referring to the `--yes` option, we use
207
+ `[code]--yes[/code]` to format it as code.
280
208
 
281
209
  ```python
282
210
  @app.command()
@@ -295,16 +223,16 @@ Here are some guidelines for when to use each formatting style.
295
223
  """
296
224
  Deletes a Nextmv Cloud application.
297
225
 
298
- This action is permanent and cannot be undone. Use the --yes
226
+ This action is permanent and cannot be undone. Use the [code]--yes[/code]
299
227
  flag to skip the confirmation prompt.
300
228
 
301
229
  [bold][underline]Examples[/underline][/bold]
302
230
 
303
231
  - Delete the application with the ID [magenta]hare-app[/magenta].
304
- $ [dim]nextmv cloud app delete --app-id hare-app[/dim]
232
+ $ [green]nextmv cloud app delete --app-id hare-app[/green]
305
233
 
306
234
  - Delete the application with the ID [magenta]hare-app[/magenta] without confirmation prompt.
307
- $ [dim]nextmv cloud app delete --app-id hare-app --yes[/dim]
235
+ $ [green]nextmv cloud app delete --app-id hare-app --yes[/green]
308
236
  """
309
237
  ```
310
238
 
@@ -318,12 +246,6 @@ Here are some guidelines for when to use each formatting style.
318
246
  error(f"Input path [magenta]{input}[/magenta] does not exist.")
319
247
  ```
320
248
 
321
- - When talking about longer technical things, like examples for a command
322
- usage, or examples of a JSON object, use the `[dim]` `[/dim]` tags. Consider
323
- the examples section of the `cloud/app/delete.py` file above. The example
324
- commands are formatted using the `[dim]` `[/dim]` tags. The `[dim]` tag is
325
- discussed in more detail in the command documentation section below.
326
-
327
249
  - Links to URLs should be formatted using the `[link=URL_LINK][bold]
328
250
  [/bold][/link]` tags. Consider the main help message of the `nextmv
329
251
  community` command, in the `community/__init__.py` file:
@@ -343,6 +265,11 @@ Here are some guidelines for when to use each formatting style.
343
265
  The link provided is <https://github.com/nextmv-io/community-apps>, and it will
344
266
  be applied to the text `nextmv-io/community-apps`.
345
267
 
268
+ - Colors that can be used for highlighting (we limit colors to keep coloring consistent):
269
+ - `[magenta]`: variable, literals, etc. - mainly short technical things (see above).
270
+ - `[green]`: commands, etc. - longer technical things, or, as a type-contrast to magenta.
271
+ - `[yellow]`: emphasis, highlight of special items, etc. (use sparingly only).
272
+
346
273
  ## Command documentation
347
274
 
348
275
  Every command should have good-enough documentation that guides the user on how
@@ -389,15 +316,15 @@ to use it.
389
316
  [bold][underline]Examples[/underline][/bold]
390
317
 
391
318
  - Get the application with the ID [magenta]hare-app[/magenta].
392
- $ [dim]nextmv cloud app get --app-id hare-app[/dim]
319
+ $ [green]nextmv cloud app get --app-id hare-app[/green]
393
320
 
394
321
  - Get the application with the ID [magenta]hare-app[/magenta] and save the information to an
395
322
  [magenta]app.json[/magenta] file.
396
- $ [dim]nextmv cloud app get --app-id hare-app --output app.json[/dim]
323
+ $ [green]nextmv cloud app get --app-id hare-app --output app.json[/green]
397
324
  """
398
325
 
399
326
  client = build_client(profile)
400
- in_progress("Getting application...")
327
+ info(msg="Getting application...", emoji=":hourglass_flowing_sand:")
401
328
 
402
329
  cloud_app = Application.get(
403
330
  client=client,
@@ -409,7 +336,7 @@ to use it.
409
336
  with open(output, "w") as f:
410
337
  json.dump(cloud_app_dict, f, indent=2)
411
338
 
412
- success(f"Application information saved to [magenta]{output}[/magenta].")
339
+ success(msg=f"Application information saved to [magenta]{output}[/magenta].")
413
340
 
414
341
  return
415
342
 
@@ -426,10 +353,11 @@ to use it.
426
353
 
427
354
  - The examples section is fenced with the `[bold][underline]
428
355
  [/underline][/bold]` tags.
356
+
429
357
  - Each example is listed as a bullet, using a hyphen (`-`).
430
358
  - Each example has a short description, followed by the command itself in a
431
359
  new line, with 4 spaces of indentation in comparison to where the hyphen is.
432
- - The command itself should be formatted using the `[dim]` `[/dim]` tags.
360
+ - The command itself should be formatted using the `[green]` `[/green]` tags.
433
361
  - The command should start with a dollar sign (`$`), followed by a space, and
434
362
  then the actual command.
435
363
  - When an example command is too long, use a double backslash (`\\`) for line
@@ -438,8 +366,8 @@ to use it.
438
366
 
439
367
  ```text
440
368
  - Create an application with an ID and description.
441
- $ [dim]nextmv cloud app create --name "Hare App" --app-id hare-app \\
442
- --description "An application for routing hares"[/dim]
369
+ $ [green]nextmv cloud app create --name "Hare App" --app-id hare-app \\
370
+ --description "An application for routing hares"[/green]
443
371
  ```
444
372
 
445
373
  ## Command options
@@ -16,8 +16,6 @@ from nextmv.cli.cloud.managed_input import app as managed_input_app
16
16
  from nextmv.cli.cloud.run import app as run_app
17
17
  from nextmv.cli.cloud.scenario import app as scenario_app
18
18
  from nextmv.cli.cloud.secrets import app as secrets_app
19
- from nextmv.cli.cloud.shadow import app as shadow_app
20
- from nextmv.cli.cloud.switchback import app as switchback_app
21
19
  from nextmv.cli.cloud.upload import app as upload_app
22
20
  from nextmv.cli.cloud.version import app as version_app
23
21
 
@@ -35,8 +33,6 @@ app.add_typer(managed_input_app, name="managed-input")
35
33
  app.add_typer(run_app, name="run")
36
34
  app.add_typer(scenario_app, name="scenario")
37
35
  app.add_typer(secrets_app, name="secrets")
38
- app.add_typer(shadow_app, name="shadow")
39
- app.add_typer(switchback_app, name="switchback")
40
36
  app.add_typer(upload_app, name="upload")
41
37
  app.add_typer(version_app, name="version")
42
38
 
@@ -27,22 +27,24 @@ app = typer.Typer()
27
27
 
28
28
  The acceptance test is based on a batch experiment. If the batch experiment
29
29
  with the same ID already exists, it will be reused. Otherwise, you must
30
- provide the --input-set-id option to create a new batch experiment.
30
+ provide the [code]--input-set-id[/code] option to create a new batch
31
+ experiment.
31
32
 
32
- Use the --wait flag to wait for the acceptance test to complete, polling
33
- for results. Using the --output flag will also activate waiting, and allows
34
- you to specify a destination file for the results.
33
+ Use the [code]--wait[/code] flag to wait for the acceptance test to
34
+ complete, polling for results. Using the [code]--output[/code] flag will
35
+ also activate waiting, and allows you to specify a destination file for the
36
+ results.
35
37
 
36
38
  [bold][underline]Metrics[/underline][/bold]
37
39
 
38
40
  Metrics are provided as [magenta]json[/magenta] objects using the
39
- --metrics flag. Each metric defines how to compare the
41
+ [code]--metrics[/code] flag. Each metric defines how to compare the
40
42
  candidate and baseline instances.
41
43
 
42
44
  You can provide metrics in three ways:
43
45
  - A single metric as a [magenta]json[/magenta] object.
44
- - Multiple metrics by repeating the --metrics flag.
45
- - Multiple metrics as a [magenta]json[/magenta] array in a single --metrics flag.
46
+ - Multiple metrics by repeating the [code]--metrics[/code] flag.
47
+ - Multiple metrics as a [magenta]json[/magenta] array in a single [code]--metrics[/code] flag.
46
48
 
47
49
  Each metric must have the following fields:
48
50
  - [magenta]field[/magenta]: Field of the metric to measure (e.g., "solution.objective").
@@ -55,7 +57,7 @@ app = typer.Typer()
55
57
  - [magenta]statistic[/magenta]: Statistical method. Allowed values: {enum_values(StatisticType)}.
56
58
 
57
59
  Object format:
58
- [dim]{{
60
+ [green]{{
59
61
  "field": "field",
60
62
  "metric_type": "type",
61
63
  "params": {{
@@ -66,12 +68,12 @@ app = typer.Typer()
66
68
  }}
67
69
  }},
68
70
  "statistic": "statistic"
69
- }}[/dim]
71
+ }}[/green]
70
72
 
71
73
  [bold][underline]Examples[/underline][/bold]
72
74
 
73
75
  - Create an acceptance test with a single metric.
74
- $ [dim]METRIC='{{
76
+ $ [green]METRIC='{{
75
77
  "field": "solution.objective",
76
78
  "metric_type": "direct-comparison",
77
79
  "params": {{
@@ -82,10 +84,10 @@ app = typer.Typer()
82
84
  }}'
83
85
  nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
84
86
  --candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
85
- --metrics "$METRIC" --input-set-id input-set-123[/dim]
87
+ --metrics "$METRIC" --input-set-id input-set-123[/green]
86
88
 
87
89
  - Create with multiple metrics by repeating the flag.
88
- $ [dim]METRIC1='{{
90
+ $ [green]METRIC1='{{
89
91
  "field": "solution.objective",
90
92
  "metric_type": "direct-comparison",
91
93
  "params": {{
@@ -105,10 +107,10 @@ app = typer.Typer()
105
107
  }}'
106
108
  nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
107
109
  --candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
108
- --metrics "$METRIC1" --metrics "$METRIC2" --input-set-id input-set-123[/dim]
110
+ --metrics "$METRIC1" --metrics "$METRIC2" --input-set-id input-set-123[/green]
109
111
 
110
112
  - Create with multiple metrics in a single [magenta]json[/magenta] array.
111
- $ [dim]METRICS='[
113
+ $ [green]METRICS='[
112
114
  {{
113
115
  "field": "solution.objective",
114
116
  "metric_type": "direct-comparison",
@@ -130,10 +132,10 @@ app = typer.Typer()
130
132
  ]'
131
133
  nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
132
134
  --candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
133
- --metrics "$METRICS" --input-set-id input-set-123[/dim]
135
+ --metrics "$METRICS" --input-set-id input-set-123[/green]
134
136
 
135
137
  - Create an acceptance test and wait for it to complete.
136
- $ [dim]METRIC='{{
138
+ $ [green]METRIC='{{
137
139
  "field": "solution.objective",
138
140
  "metric_type": "direct-comparison",
139
141
  "params": {{
@@ -144,10 +146,10 @@ app = typer.Typer()
144
146
  }}'
145
147
  nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
146
148
  --candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
147
- --metrics "$METRIC" --input-set-id input-set-123 --wait[/dim]
149
+ --metrics "$METRIC" --input-set-id input-set-123 --wait[/green]
148
150
 
149
151
  - Create an acceptance test and save the results to a file, waiting for completion.
150
- $ [dim]METRIC='{{
152
+ $ [green]METRIC='{{
151
153
  "field": "solution.objective",
152
154
  "metric_type": "direct-comparison",
153
155
  "params": {{
@@ -158,7 +160,7 @@ app = typer.Typer()
158
160
  }}'
159
161
  nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
160
162
  --candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
161
- --metrics "$METRIC" --input-set-id input-set-123 --output results.json[/dim]
163
+ --metrics "$METRIC" --input-set-id input-set-123 --output results.json[/green]
162
164
  """
163
165
  )
164
166
  def create(
@@ -263,7 +265,7 @@ def create(
263
265
  "--wait",
264
266
  "-w",
265
267
  help="Wait for the acceptance test to complete. Results are printed to [magenta]stdout[/magenta]. "
266
- "Specify output location with --output.",
268
+ "Specify output location with [code]--output[/code].",
267
269
  rich_help_panel="Output control",
268
270
  ),
269
271
  ] = False,
@@ -5,9 +5,9 @@ This module defines the cloud acceptance delete command for the Nextmv CLI.
5
5
  from typing import Annotated
6
6
 
7
7
  import typer
8
+ from rich.prompt import Confirm
8
9
 
9
10
  from nextmv.cli.configuration.config import build_app
10
- from nextmv.cli.confirm import get_confirmation
11
11
  from nextmv.cli.message import info, success
12
12
  from nextmv.cli.options import AcceptanceTestIDOption, AppIDOption, ProfileOption
13
13
 
@@ -32,28 +32,32 @@ def delete(
32
32
  """
33
33
  Deletes a Nextmv Cloud acceptance test.
34
34
 
35
- This action is permanent and cannot be undone. The underlying batch
36
- experiment and associated data will also be deleted. Use the --yes flag to
37
- skip the confirmation prompt.
35
+ This action is permanent and cannot be undone. The underlying batch experiment
36
+ and associated data will also be deleted. Use the [code]--yes[/code] flag to skip
37
+ the confirmation prompt.
38
38
 
39
39
  [bold][underline]Examples[/underline][/bold]
40
40
 
41
41
  - Delete the acceptance test with the ID [magenta]test-cotton-tail[/magenta] from application
42
42
  [magenta]hare-app[/magenta].
43
- $ [dim]nextmv cloud acceptance delete --app-id hare-app --acceptance-test-id test-cotton-tail[/dim]
43
+ $ [green]nextmv cloud acceptance delete --app-id hare-app --acceptance-test-id test-cotton-tail[/green]
44
44
 
45
45
  - Delete the acceptance test without confirmation prompt.
46
- $ [dim]nextmv cloud acceptance delete --app-id hare-app --acceptance-test-id test-cotton-tail --yes[/dim]
46
+ $ [green]nextmv cloud acceptance delete --app-id hare-app --acceptance-test-id test-cotton-tail --yes[/green]
47
47
  """
48
48
 
49
49
  if not yes:
50
- confirm = get_confirmation(
50
+ confirm = Confirm.ask(
51
51
  f"Are you sure you want to delete acceptance test [magenta]{acceptance_test_id}[/magenta] "
52
52
  f"from application [magenta]{app_id}[/magenta]? This action cannot be undone.",
53
+ default=False,
53
54
  )
54
55
 
55
56
  if not confirm:
56
- info(f"Acceptance test [magenta]{acceptance_test_id}[/magenta] will not be deleted.")
57
+ info(
58
+ msg=f"Acceptance test [magenta]{acceptance_test_id}[/magenta] will not be deleted.",
59
+ emoji=":bulb:",
60
+ )
57
61
  return
58
62
 
59
63
  cloud_app = build_app(app_id=app_id, profile=profile)
@@ -42,7 +42,7 @@ def get(
42
42
  "--wait",
43
43
  "-w",
44
44
  help="Wait for the acceptance test to complete. Results are printed to [magenta]stdout[/magenta]. "
45
- "Specify output location with --output.",
45
+ "Specify output location with [code]--output[/code].",
46
46
  ),
47
47
  ] = False,
48
48
  profile: ProfileOption = None,
@@ -50,25 +50,26 @@ def get(
50
50
  """
51
51
  Get a Nextmv Cloud acceptance test.
52
52
 
53
- Use the --wait flag to wait for the acceptance test to complete, polling
54
- for results. Using the --output flag will also activate waiting, and allows
55
- you to specify a destination file for the results.
53
+ Use the [code]--wait[/code] flag to wait for the acceptance test to
54
+ complete, polling for results. Using the [code]--output[/code] flag will
55
+ also activate waiting, and allows you to specify a destination file for the
56
+ results.
56
57
 
57
58
  [bold][underline]Examples[/underline][/bold]
58
59
 
59
60
  - Get the acceptance test with ID [magenta]test-123[/magenta] from application
60
61
  [magenta]hare-app[/magenta].
61
- $ [dim]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123[/dim]
62
+ $ [green]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123[/green]
62
63
 
63
64
  - Get the acceptance test and wait for it to complete if necessary.
64
- $ [dim]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123 --wait[/dim]
65
+ $ [green]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123 --wait[/green]
65
66
 
66
67
  - Get the acceptance test and save the results to a file.
67
- $ [dim]nextmv cloud acceptance get --app-id hare-app \\
68
- --acceptance-test-id test-123 --output results.json[/dim]
68
+ $ [green]nextmv cloud acceptance get --app-id hare-app \\
69
+ --acceptance-test-id test-123 --output results.json[/green]
69
70
 
70
71
  - Get the acceptance test using a specific profile.
71
- $ [dim]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123 --profile prod[/dim]
72
+ $ [green]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123 --profile prod[/green]
72
73
  """
73
74
 
74
75
  cloud_app = build_app(app_id=app_id, profile=profile)
@@ -38,13 +38,13 @@ def list(
38
38
  [bold][underline]Examples[/underline][/bold]
39
39
 
40
40
  - List all acceptance tests for application [magenta]hare-app[/magenta].
41
- $ [dim]nextmv cloud acceptance list --app-id hare-app[/dim]
41
+ $ [green]nextmv cloud acceptance list --app-id hare-app[/green]
42
42
 
43
43
  - List all acceptance tests and save to a file.
44
- $ [dim]nextmv cloud acceptance list --app-id hare-app --output tests.json[/dim]
44
+ $ [green]nextmv cloud acceptance list --app-id hare-app --output tests.json[/green]
45
45
 
46
46
  - List all acceptance tests using a specific profile.
47
- $ [dim]nextmv cloud acceptance list --app-id hare-app --profile prod[/dim]
47
+ $ [green]nextmv cloud acceptance list --app-id hare-app --profile prod[/green]
48
48
  """
49
49
 
50
50
  cloud_app = build_app(app_id=app_id, profile=profile)
@@ -57,17 +57,17 @@ def update(
57
57
  [bold][underline]Examples[/underline][/bold]
58
58
 
59
59
  - Update the name of an acceptance test.
60
- $ [dim]nextmv cloud acceptance update --app-id hare-app \\
61
- --acceptance-test-id test-123 --name "Updated Test Name"[/dim]
60
+ $ [green]nextmv cloud acceptance update --app-id hare-app \\
61
+ --acceptance-test-id test-123 --name "Updated Test Name"[/green]
62
62
 
63
63
  - Update the description of an acceptance test.
64
- $ [dim]nextmv cloud acceptance update --app-id hare-app \\
65
- --acceptance-test-id test-123 --description "Updated description"[/dim]
64
+ $ [green]nextmv cloud acceptance update --app-id hare-app \\
65
+ --acceptance-test-id test-123 --description "Updated description"[/green]
66
66
 
67
67
  - Update both name and description and save the result.
68
- $ [dim]nextmv cloud acceptance update --app-id hare-app \\
68
+ $ [green]nextmv cloud acceptance update --app-id hare-app \\
69
69
  --acceptance-test-id test-123 --name "New Name" \\
70
- --description "New description" --output updated-test.json[/dim]
70
+ --description "New description" --output updated-test.json[/green]
71
71
  """
72
72
 
73
73
  cloud_app = build_app(app_id=app_id, profile=profile)
@@ -20,9 +20,9 @@ app.add_typer(update_app)
20
20
  @app.callback()
21
21
  def callback() -> None:
22
22
  """
23
- Manage SSO for your Nextmv Cloud account (organization).
23
+ Manage your Nextmv Cloud account (organization).
24
24
 
25
- Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link]
26
- for assistance configuring SSO for your organization.
25
+ Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link] for assistance
26
+ configuring SSO for your organization.
27
27
  """
28
28
  pass