nextmv 1.0.0.dev3__tar.gz → 1.0.0.dev5__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 (227) hide show
  1. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/PKG-INFO +1 -1
  2. nextmv-1.0.0.dev5/nextmv/__about__.py +1 -0
  3. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/__entrypoint__.py +1 -2
  4. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/__init__.py +0 -4
  5. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/_serialization.py +1 -1
  6. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/CONTRIBUTING.md +81 -29
  7. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/acceptance/create.py +24 -26
  8. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/acceptance/delete.py +7 -8
  9. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/acceptance/get.py +9 -10
  10. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/acceptance/list.py +3 -3
  11. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/acceptance/update.py +6 -6
  12. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/account/__init__.py +3 -3
  13. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/account/create.py +11 -11
  14. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/account/delete.py +6 -7
  15. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/account/get.py +3 -3
  16. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/account/update.py +5 -5
  17. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/app/create.py +25 -26
  18. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/app/delete.py +5 -6
  19. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/app/exists.py +2 -2
  20. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/app/get.py +2 -2
  21. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/app/list.py +3 -3
  22. nextmv-1.0.0.dev5/nextmv/cli/cloud/app/push.py +451 -0
  23. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/app/update.py +12 -12
  24. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/batch/create.py +26 -28
  25. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/batch/delete.py +5 -6
  26. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/batch/get.py +8 -8
  27. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/batch/list.py +3 -3
  28. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/batch/metadata.py +4 -4
  29. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/batch/update.py +6 -6
  30. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/data/__init__.py +1 -1
  31. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/data/upload.py +15 -15
  32. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/ensemble/__init__.py +2 -0
  33. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/ensemble/create.py +21 -22
  34. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/ensemble/delete.py +5 -6
  35. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/ensemble/get.py +4 -4
  36. nextmv-1.0.0.dev5/nextmv/cli/cloud/ensemble/list.py +63 -0
  37. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/ensemble/update.py +9 -9
  38. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/input_set/create.py +20 -22
  39. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/input_set/get.py +3 -3
  40. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/input_set/list.py +3 -3
  41. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/input_set/update.py +24 -24
  42. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/instance/create.py +14 -15
  43. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/instance/delete.py +5 -6
  44. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/instance/exists.py +2 -2
  45. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/instance/get.py +2 -2
  46. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/instance/list.py +3 -3
  47. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/instance/update.py +14 -14
  48. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/managed_input/create.py +14 -16
  49. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/managed_input/delete.py +6 -7
  50. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/managed_input/get.py +3 -3
  51. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/managed_input/list.py +3 -3
  52. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/managed_input/update.py +9 -9
  53. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/run/cancel.py +2 -2
  54. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/run/create.py +32 -33
  55. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/run/get.py +8 -8
  56. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/run/input.py +4 -4
  57. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/run/list.py +6 -6
  58. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/run/logs.py +9 -10
  59. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/run/metadata.py +4 -4
  60. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/run/track.py +32 -33
  61. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/scenario/create.py +21 -21
  62. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/scenario/delete.py +5 -6
  63. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/scenario/get.py +8 -8
  64. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/scenario/list.py +3 -3
  65. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/scenario/metadata.py +4 -4
  66. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/scenario/update.py +6 -6
  67. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/secrets/create.py +17 -17
  68. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/secrets/delete.py +5 -6
  69. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/secrets/get.py +4 -4
  70. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/secrets/list.py +3 -3
  71. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/secrets/update.py +17 -20
  72. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/shadow/create.py +31 -31
  73. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/shadow/delete.py +5 -6
  74. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/shadow/get.py +2 -2
  75. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/shadow/list.py +3 -3
  76. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/shadow/metadata.py +4 -4
  77. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/shadow/start.py +3 -3
  78. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/shadow/stop.py +4 -6
  79. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/shadow/update.py +6 -6
  80. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/switchback/create.py +19 -15
  81. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/switchback/delete.py +5 -6
  82. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/switchback/get.py +3 -3
  83. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/switchback/list.py +3 -3
  84. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/switchback/metadata.py +6 -6
  85. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/switchback/start.py +4 -4
  86. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/switchback/stop.py +4 -6
  87. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/switchback/update.py +6 -6
  88. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/upload/create.py +2 -2
  89. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/version/create.py +9 -10
  90. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/version/delete.py +5 -6
  91. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/version/exists.py +2 -2
  92. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/version/get.py +2 -2
  93. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/version/list.py +3 -3
  94. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/version/update.py +8 -8
  95. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/community/clone.py +12 -10
  96. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/community/list.py +9 -9
  97. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/configuration/config.py +43 -10
  98. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/configuration/create.py +3 -3
  99. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/configuration/delete.py +7 -7
  100. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/configuration/list.py +3 -3
  101. nextmv-1.0.0.dev5/nextmv/cli/confirm.py +34 -0
  102. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/main.py +27 -36
  103. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/message.py +2 -2
  104. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/version.py +1 -1
  105. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/__init__.py +0 -38
  106. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/acceptance_test.py +1 -65
  107. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/account.py +1 -6
  108. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/__init__.py +192 -54
  109. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_batch_scenario.py +4 -19
  110. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_instance.py +3 -3
  111. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_managed_input.py +2 -2
  112. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_run.py +8 -1
  113. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_shadow.py +2 -2
  114. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_switchback.py +12 -4
  115. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_version.py +4 -3
  116. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/client.py +1 -1
  117. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/shadow.py +43 -4
  118. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/switchback.py +46 -9
  119. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/default_app/main.py +4 -6
  120. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/deprecated.py +5 -3
  121. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/input.py +0 -52
  122. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/local/executor.py +83 -3
  123. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/local/geojson_handler.py +1 -1
  124. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/local/runner.py +1 -1
  125. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/manifest.py +11 -7
  126. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/model.py +2 -2
  127. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/options.py +10 -255
  128. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/output.py +57 -83
  129. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/run.py +13 -13
  130. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/status.py +1 -51
  131. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cli/test_community.py +2 -1
  132. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cli/test_configuration.py +8 -37
  133. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cli/test_main.py +0 -31
  134. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cloud/app.yaml +1 -0
  135. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_entrypoint/test_entrypoint.py +1 -1
  136. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_manifest.py +1 -0
  137. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_options.py +1 -252
  138. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_run.py +2 -13
  139. nextmv-1.0.0.dev3/nextmv/__about__.py +0 -1
  140. nextmv-1.0.0.dev3/nextmv/cli/cloud/app/push.py +0 -137
  141. nextmv-1.0.0.dev3/tests/scripts/options_deprecated.py +0 -8
  142. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/.gitignore +0 -0
  143. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/LICENSE +0 -0
  144. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/README.md +0 -0
  145. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/base_model.py +0 -0
  146. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/__init__.py +0 -0
  147. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/__init__.py +0 -0
  148. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
  149. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/app/__init__.py +0 -0
  150. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/batch/__init__.py +0 -0
  151. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/input_set/__init__.py +0 -0
  152. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/instance/__init__.py +0 -0
  153. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
  154. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/run/__init__.py +0 -0
  155. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/scenario/__init__.py +0 -0
  156. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/secrets/__init__.py +0 -0
  157. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/shadow/__init__.py +0 -0
  158. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/switchback/__init__.py +0 -0
  159. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/upload/__init__.py +0 -0
  160. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/cloud/version/__init__.py +0 -0
  161. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/community/__init__.py +0 -0
  162. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/configuration/__init__.py +0 -0
  163. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cli/options.py +0 -0
  164. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_acceptance.py +0 -0
  165. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_ensemble.py +0 -0
  166. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_input_set.py +0 -0
  167. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_secrets.py +0 -0
  168. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/application/_utils.py +0 -0
  169. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/assets.py +0 -0
  170. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/batch_experiment.py +0 -0
  171. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/ensemble.py +0 -0
  172. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/input_set.py +0 -0
  173. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/instance.py +0 -0
  174. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/integration.py +0 -0
  175. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/package.py +0 -0
  176. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/scenario.py +0 -0
  177. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/secrets.py +0 -0
  178. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/url.py +0 -0
  179. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/cloud/version.py +0 -0
  180. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/default_app/.gitignore +0 -0
  181. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/default_app/README.md +0 -0
  182. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/default_app/app.yaml +0 -0
  183. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/default_app/input.json +0 -0
  184. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/default_app/requirements.txt +0 -0
  185. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/default_app/src/__init__.py +0 -0
  186. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/default_app/src/visuals.py +0 -0
  187. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/local/__init__.py +0 -0
  188. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/local/application.py +0 -0
  189. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/local/local.py +0 -0
  190. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/local/plotly_handler.py +0 -0
  191. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/logger.py +0 -0
  192. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/polling.py +0 -0
  193. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/nextmv/safe.py +0 -0
  194. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/pyproject.toml +0 -0
  195. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/__init__.py +0 -0
  196. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cli/__init__.py +0 -0
  197. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cli/test_version.py +0 -0
  198. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cloud/__init__.py +0 -0
  199. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cloud/test_client.py +0 -0
  200. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cloud/test_instance.py +0 -0
  201. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cloud/test_package.py +0 -0
  202. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/cloud/test_scenario.py +0 -0
  203. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/local/__init__.py +0 -0
  204. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/local/test_application.py +0 -0
  205. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/local/test_executor.py +0 -0
  206. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/local/test_runner.py +0 -0
  207. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/scripts/__init__.py +0 -0
  208. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/scripts/options1.py +0 -0
  209. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/scripts/options2.py +0 -0
  210. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/scripts/options3.py +0 -0
  211. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/scripts/options4.py +0 -0
  212. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/scripts/options5.py +0 -0
  213. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/scripts/options6.py +0 -0
  214. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/scripts/options7.py +0 -0
  215. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_base_model.py +0 -0
  216. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_entrypoint/__init__.py +0 -0
  217. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_input.py +0 -0
  218. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_inputs/test_data.csv +0 -0
  219. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_inputs/test_data.json +0 -0
  220. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_inputs/test_data.txt +0 -0
  221. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_logger.py +0 -0
  222. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_model.py +0 -0
  223. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_output.py +0 -0
  224. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_polling.py +0 -0
  225. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_safe.py +0 -0
  226. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/tests/test_serialization.py +0 -0
  227. {nextmv-1.0.0.dev3 → nextmv-1.0.0.dev5}/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.dev3
3
+ Version: 1.0.0.dev5
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/
@@ -0,0 +1 @@
1
+ __version__ = "v1.0.0.dev5"
@@ -10,13 +10,12 @@ 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
14
13
 
15
14
 
16
15
  def main() -> None:
17
16
  """Entry point for the program."""
18
17
 
19
- manifest = cloud.Manifest.from_yaml(".")
18
+ manifest = nextmv.Manifest.from_yaml(".")
20
19
 
21
20
  # Load the options from the manifest.
22
21
  options = manifest.extract_options()
@@ -11,7 +11,6 @@ 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
15
14
  from .input import text_data_file as text_data_file
16
15
  from .logger import log as log
17
16
  from .logger import redirect_stdout as redirect_stdout
@@ -31,7 +30,6 @@ from .model import Model as Model
31
30
  from .model import ModelConfiguration as ModelConfiguration
32
31
  from .options import Option as Option
33
32
  from .options import Options as Options
34
- from .options import Parameter as Parameter
35
33
  from .output import Asset as Asset
36
34
  from .output import DataPoint as DataPoint
37
35
  from .output import LocalOutputWriter as LocalOutputWriter
@@ -50,7 +48,6 @@ from .output import csv_solution_file as csv_solution_file
50
48
  from .output import json_solution_file as json_solution_file
51
49
  from .output import text_solution_file as text_solution_file
52
50
  from .output import write as write
53
- from .output import write_local as write_local
54
51
  from .polling import DEFAULT_POLLING_OPTIONS as DEFAULT_POLLING_OPTIONS
55
52
  from .polling import PollingOptions as PollingOptions
56
53
  from .polling import default_polling_options as default_polling_options
@@ -79,7 +76,6 @@ from .run import TrackedRunStatus as TrackedRunStatus
79
76
  from .run import run_duration as run_duration
80
77
  from .safe import safe_id as safe_id
81
78
  from .safe import safe_name_and_id as safe_name_and_id
82
- from .status import Status as Status
83
79
  from .status import StatusV2 as StatusV2
84
80
 
85
81
  VERSION = __version__
@@ -90,7 +90,7 @@ def _custom_serial(obj: Any) -> str:
90
90
  If the object type is not supported for serialization.
91
91
  """
92
92
 
93
- if isinstance(obj, (datetime.datetime, datetime.date)):
93
+ if isinstance(obj, datetime.datetime | datetime.date):
94
94
  return obj.isoformat()
95
95
 
96
96
  raise TypeError(f"Type {type(obj)} not serializable")
@@ -173,23 +173,26 @@ guidelines:
173
173
 
174
174
  ## Confirmation prompts
175
175
 
176
- For destructive actions (like deletions), use `rich.prompt.Confirm.ask()` to
177
- ask for user confirmation before proceeding. Follow these guidelines:
176
+ For destructive actions (like deletions), use the `get_confirmation()` method
177
+ to ask for user confirmation before proceeding. The method is available from
178
+ the `cli/confirm.py` file. This method already handles sensible values used for
179
+ getting a confirmation from a user. Additionally, it handles non-interactive
180
+ sessions by defaulting to `False` if no input can be provided.
178
181
 
179
- - The confirmation message should use `[magenta]` for the variable being
182
+ When using confirmation prompts, follow these guidelines:
183
+
184
+ - The confirmation message should use `[magenta]` for the variable/s being
180
185
  affected.
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.
186
+ - Provide a `--yes` / `-y` flag to skip the confirmation prompt where possible,
187
+ useful for non-interactive sessions.
184
188
  - If the user declines, call `info()` with the `:bulb:` emoji and return early.
185
189
 
186
190
  Consider the `nextmv cloud app delete` command:
187
191
 
188
192
  ```python
189
193
  if not yes:
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,
194
+ confirm = get_confirmation(
195
+ f"Are you sure you want to delete application [magenta]{app_id}[/magenta]? This action cannot be undone.",
193
196
  )
194
197
 
195
198
  if not confirm:
@@ -197,14 +200,63 @@ if not yes:
197
200
  return
198
201
  ```
199
202
 
200
- ## Formatting
203
+ ## Formatting, colors, and styles
204
+
205
+ Use these Rich markup colors/styles when formatting help text and messages.
206
+ These are the main colors/styles that can be used for highlighting/contrast (we
207
+ limit colors to keep coloring consistent):
208
+
209
+ - `[code]`: commands. CLI related variables. - technical things that are CLI
210
+ commands.
211
+ - `[magenta]`: variable names, values, literals, etc. - mainly short technical things.
212
+ - `[dim]`: examples. - longer technical things.
213
+ - `[yellow]`: emphasis, highlight of special items, type contrast to
214
+ `[magenta]`. Use sparingly only.
201
215
 
202
- Use these Rich markup guidelines when formatting help text and messages.
216
+ In any case, the best advice is to follow existing examples in the codebase to
217
+ maintain consistency.
203
218
 
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.
219
+ Here are some guidelines for when to use each formatting style.
220
+
221
+ - When talking about a command use the `[code]` `[/code]` tags. Consider the
222
+ help message of the `cloud/shadow/stop.py` file. We tell the user they can
223
+ delete an experiment with the `nextmv cloud shadow delete` command. The
224
+ formatting of that command is done using the `[code]` `[/code]` tags:
225
+
226
+ ```python
227
+ @app.command()
228
+ def stop(
229
+ app_id: AppIDOption,
230
+ shadow_test_id: ShadowTestIDOption,
231
+ profile: ProfileOption = None,
232
+ ) -> None:
233
+ """
234
+ Stops a Nextmv Cloud shadow test.
235
+
236
+ Before stopping a shadow test, it must be in a started state. Experiments
237
+ in a [magenta]draft[/magenta] state, that haven't started, can be deleted
238
+ with the [code]nextmv cloud shadow delete[/code] command.
239
+
240
+ [bold][underline]Examples[/underline][/bold]
241
+
242
+ - Stop the shadow test with the ID [magenta]hop-analysis[/magenta] from application
243
+ [magenta]hare-app[/magenta].
244
+ $ [dim]nextmv cloud shadow stop --app-id hare-app --shadow-test-id hop-analysis[/dim]
245
+ """
246
+
247
+ in_progress(msg="Stopping shadow test...")
248
+ cloud_app = build_app(app_id=app_id, profile=profile)
249
+ cloud_app.stop_shadow_test(shadow_test_id=shadow_test_id)
250
+ success(
251
+ f"Shadow test [magenta]{shadow_test_id}[/magenta] stopped successfully "
252
+ f"in application [magenta]{app_id}[/magenta]."
253
+ )
254
+ ```
255
+
256
+ - When talking about a command option, there is no formatting needed. Typer
257
+ automatically adds coloring to options in the help menu. Take this example
258
+ from the help menu of the `cloud/app/delete.py` file. In the command help,
259
+ when referring to the `--yes` option:
208
260
 
209
261
  ```python
210
262
  @app.command()
@@ -223,16 +275,16 @@ Use these Rich markup guidelines when formatting help text and messages.
223
275
  """
224
276
  Deletes a Nextmv Cloud application.
225
277
 
226
- This action is permanent and cannot be undone. Use the [code]--yes[/code]
278
+ This action is permanent and cannot be undone. Use the --yes
227
279
  flag to skip the confirmation prompt.
228
280
 
229
281
  [bold][underline]Examples[/underline][/bold]
230
282
 
231
283
  - Delete the application with the ID [magenta]hare-app[/magenta].
232
- $ [green]nextmv cloud app delete --app-id hare-app[/green]
284
+ $ [dim]nextmv cloud app delete --app-id hare-app[/dim]
233
285
 
234
286
  - Delete the application with the ID [magenta]hare-app[/magenta] without confirmation prompt.
235
- $ [green]nextmv cloud app delete --app-id hare-app --yes[/green]
287
+ $ [dim]nextmv cloud app delete --app-id hare-app --yes[/dim]
236
288
  """
237
289
  ```
238
290
 
@@ -246,6 +298,12 @@ Use these Rich markup guidelines when formatting help text and messages.
246
298
  error(f"Input path [magenta]{input}[/magenta] does not exist.")
247
299
  ```
248
300
 
301
+ - When talking about longer technical things, like examples for a command
302
+ usage, or examples of a JSON object, use the `[dim]` `[/dim]` tags. Consider
303
+ the examples section of the `cloud/app/delete.py` file above. The example
304
+ commands are formatted using the `[dim]` `[/dim]` tags. The `[dim]` tag is
305
+ discussed in more detail in the command documentation section below.
306
+
249
307
  - Links to URLs should be formatted using the `[link=URL_LINK][bold]
250
308
  [/bold][/link]` tags. Consider the main help message of the `nextmv
251
309
  community` command, in the `community/__init__.py` file:
@@ -265,11 +323,6 @@ Use these Rich markup guidelines when formatting help text and messages.
265
323
  The link provided is <https://github.com/nextmv-io/community-apps>, and it will
266
324
  be applied to the text `nextmv-io/community-apps`.
267
325
 
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
-
273
326
  ## Command documentation
274
327
 
275
328
  Every command should have good-enough documentation that guides the user on how
@@ -316,11 +369,11 @@ to use it.
316
369
  [bold][underline]Examples[/underline][/bold]
317
370
 
318
371
  - Get the application with the ID [magenta]hare-app[/magenta].
319
- $ [green]nextmv cloud app get --app-id hare-app[/green]
372
+ $ [dim]nextmv cloud app get --app-id hare-app[/dim]
320
373
 
321
374
  - Get the application with the ID [magenta]hare-app[/magenta] and save the information to an
322
375
  [magenta]app.json[/magenta] file.
323
- $ [green]nextmv cloud app get --app-id hare-app --output app.json[/green]
376
+ $ [dim]nextmv cloud app get --app-id hare-app --output app.json[/dim]
324
377
  """
325
378
 
326
379
  client = build_client(profile)
@@ -353,11 +406,10 @@ to use it.
353
406
 
354
407
  - The examples section is fenced with the `[bold][underline]
355
408
  [/underline][/bold]` tags.
356
-
357
409
  - Each example is listed as a bullet, using a hyphen (`-`).
358
410
  - Each example has a short description, followed by the command itself in a
359
411
  new line, with 4 spaces of indentation in comparison to where the hyphen is.
360
- - The command itself should be formatted using the `[green]` `[/green]` tags.
412
+ - The command itself should be formatted using the `[dim]` `[/dim]` tags.
361
413
  - The command should start with a dollar sign (`$`), followed by a space, and
362
414
  then the actual command.
363
415
  - When an example command is too long, use a double backslash (`\\`) for line
@@ -366,8 +418,8 @@ to use it.
366
418
 
367
419
  ```text
368
420
  - Create an application with an ID and description.
369
- $ [green]nextmv cloud app create --name "Hare App" --app-id hare-app \\
370
- --description "An application for routing hares"[/green]
421
+ $ [dim]nextmv cloud app create --name "Hare App" --app-id hare-app \\
422
+ --description "An application for routing hares"[/dim]
371
423
  ```
372
424
 
373
425
  ## Command options
@@ -27,27 +27,25 @@ 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 [code]--input-set-id[/code] option to create a new batch
31
- experiment.
30
+ provide the --input-set-id option to create a new batch experiment.
32
31
 
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.
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.
37
35
 
38
36
  [bold][underline]Metrics[/underline][/bold]
39
37
 
40
38
  Metrics are provided as [magenta]json[/magenta] objects using the
41
- [code]--metrics[/code] flag. Each metric defines how to compare the
39
+ --metrics flag. Each metric defines how to compare the
42
40
  candidate and baseline instances.
43
41
 
44
42
  You can provide metrics in three ways:
45
43
  - A single metric as a [magenta]json[/magenta] object.
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.
44
+ - Multiple metrics by repeating the --metrics flag.
45
+ - Multiple metrics as a [magenta]json[/magenta] array in a single --metrics flag.
48
46
 
49
47
  Each metric must have the following fields:
50
- - [magenta]field[/magenta]: Field of the metric to measure (e.g., "solution.objective").
48
+ - [magenta]field[/magenta]: Field of the metric to measure (e.g., "result.custom.unassigned").
51
49
  - [magenta]metric_type[/magenta]: Type of metric comparison. Allowed values: {enum_values(MetricType)}.
52
50
  - [magenta]params[/magenta]: Parameters of the metric comparison.
53
51
  - [magenta]operator[/magenta]: Comparison operator. Allowed values: {enum_values(Comparison)}.
@@ -57,7 +55,7 @@ app = typer.Typer()
57
55
  - [magenta]statistic[/magenta]: Statistical method. Allowed values: {enum_values(StatisticType)}.
58
56
 
59
57
  Object format:
60
- [green]{{
58
+ [dim]{{
61
59
  "field": "field",
62
60
  "metric_type": "type",
63
61
  "params": {{
@@ -68,13 +66,13 @@ app = typer.Typer()
68
66
  }}
69
67
  }},
70
68
  "statistic": "statistic"
71
- }}[/green]
69
+ }}[/dim]
72
70
 
73
71
  [bold][underline]Examples[/underline][/bold]
74
72
 
75
73
  - Create an acceptance test with a single metric.
76
74
  $ [green]METRIC='{{
77
- "field": "solution.objective",
75
+ "field": "result.custom.unassigned",
78
76
  "metric_type": "direct-comparison",
79
77
  "params": {{
80
78
  "operator": "lt",
@@ -84,11 +82,11 @@ app = typer.Typer()
84
82
  }}'
85
83
  nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
86
84
  --candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
87
- --metrics "$METRIC" --input-set-id input-set-123[/green]
85
+ --metrics "$METRIC" --input-set-id input-set-123[/dim]
88
86
 
89
87
  - Create with multiple metrics by repeating the flag.
90
88
  $ [green]METRIC1='{{
91
- "field": "solution.objective",
89
+ "field": "result.custom.unassigned",
92
90
  "metric_type": "direct-comparison",
93
91
  "params": {{
94
92
  "operator": "lt",
@@ -97,7 +95,7 @@ app = typer.Typer()
97
95
  "statistic": "mean"
98
96
  }}'
99
97
  METRIC2='{{
100
- "field": "statistics.run.duration",
98
+ "field": "run.duration",
101
99
  "metric_type": "direct-comparison",
102
100
  "params": {{
103
101
  "operator": "le",
@@ -107,12 +105,12 @@ app = typer.Typer()
107
105
  }}'
108
106
  nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
109
107
  --candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
110
- --metrics "$METRIC1" --metrics "$METRIC2" --input-set-id input-set-123[/green]
108
+ --metrics "$METRIC1" --metrics "$METRIC2" --input-set-id input-set-123[/dim]
111
109
 
112
110
  - Create with multiple metrics in a single [magenta]json[/magenta] array.
113
- $ [green]METRICS='[
111
+ $ [dim]METRICS='[
114
112
  {{
115
- "field": "solution.objective",
113
+ "field": "result.custom.unassigned",
116
114
  "metric_type": "direct-comparison",
117
115
  "params": {{
118
116
  "operator": "lt",
@@ -121,7 +119,7 @@ app = typer.Typer()
121
119
  "statistic": "mean"
122
120
  }},
123
121
  {{
124
- "field": "statistics.run.duration",
122
+ "field": "run.duration",
125
123
  "metric_type": "direct-comparison",
126
124
  "params": {{
127
125
  "operator": "le",
@@ -132,11 +130,11 @@ app = typer.Typer()
132
130
  ]'
133
131
  nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
134
132
  --candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
135
- --metrics "$METRICS" --input-set-id input-set-123[/green]
133
+ --metrics "$METRICS" --input-set-id input-set-123[/dim]
136
134
 
137
135
  - Create an acceptance test and wait for it to complete.
138
136
  $ [green]METRIC='{{
139
- "field": "solution.objective",
137
+ "field": "result.custom.unassigned",
140
138
  "metric_type": "direct-comparison",
141
139
  "params": {{
142
140
  "operator": "lt",
@@ -146,11 +144,11 @@ app = typer.Typer()
146
144
  }}'
147
145
  nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
148
146
  --candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
149
- --metrics "$METRIC" --input-set-id input-set-123 --wait[/green]
147
+ --metrics "$METRIC" --input-set-id input-set-123 --wait[/dim]
150
148
 
151
149
  - Create an acceptance test and save the results to a file, waiting for completion.
152
150
  $ [green]METRIC='{{
153
- "field": "solution.objective",
151
+ "field": "result.custom.unassigned",
154
152
  "metric_type": "direct-comparison",
155
153
  "params": {{
156
154
  "operator": "lt",
@@ -160,7 +158,7 @@ app = typer.Typer()
160
158
  }}'
161
159
  nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
162
160
  --candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
163
- --metrics "$METRIC" --input-set-id input-set-123 --output results.json[/green]
161
+ --metrics "$METRIC" --input-set-id input-set-123 --output results.json[/dim]
164
162
  """
165
163
  )
166
164
  def create(
@@ -265,7 +263,7 @@ def create(
265
263
  "--wait",
266
264
  "-w",
267
265
  help="Wait for the acceptance test to complete. Results are printed to [magenta]stdout[/magenta]. "
268
- "Specify output location with [code]--output[/code].",
266
+ "Specify output location with --output.",
269
267
  rich_help_panel="Output control",
270
268
  ),
271
269
  ] = 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
9
8
 
10
9
  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,25 +32,24 @@ 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 experiment
36
- and associated data will also be deleted. Use the [code]--yes[/code] flag to skip
37
- the confirmation prompt.
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.
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
- $ [green]nextmv cloud acceptance delete --app-id hare-app --acceptance-test-id test-cotton-tail[/green]
43
+ $ [dim]nextmv cloud acceptance delete --app-id hare-app --acceptance-test-id test-cotton-tail[/dim]
44
44
 
45
45
  - Delete the acceptance test without confirmation prompt.
46
- $ [green]nextmv cloud acceptance delete --app-id hare-app --acceptance-test-id test-cotton-tail --yes[/green]
46
+ $ [dim]nextmv cloud acceptance delete --app-id hare-app --acceptance-test-id test-cotton-tail --yes[/dim]
47
47
  """
48
48
 
49
49
  if not yes:
50
- confirm = Confirm.ask(
50
+ confirm = get_confirmation(
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,
54
53
  )
55
54
 
56
55
  if not confirm:
@@ -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 [code]--output[/code].",
45
+ "Specify output location with --output.",
46
46
  ),
47
47
  ] = False,
48
48
  profile: ProfileOption = None,
@@ -50,26 +50,25 @@ def get(
50
50
  """
51
51
  Get a Nextmv Cloud acceptance test.
52
52
 
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.
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.
57
56
 
58
57
  [bold][underline]Examples[/underline][/bold]
59
58
 
60
59
  - Get the acceptance test with ID [magenta]test-123[/magenta] from application
61
60
  [magenta]hare-app[/magenta].
62
- $ [green]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123[/green]
61
+ $ [dim]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123[/dim]
63
62
 
64
63
  - Get the acceptance test and wait for it to complete if necessary.
65
- $ [green]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123 --wait[/green]
64
+ $ [dim]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123 --wait[/dim]
66
65
 
67
66
  - Get the acceptance test and save the results to a file.
68
- $ [green]nextmv cloud acceptance get --app-id hare-app \\
69
- --acceptance-test-id test-123 --output results.json[/green]
67
+ $ [dim]nextmv cloud acceptance get --app-id hare-app \\
68
+ --acceptance-test-id test-123 --output results.json[/dim]
70
69
 
71
70
  - Get the acceptance test using a specific profile.
72
- $ [green]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123 --profile prod[/green]
71
+ $ [dim]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123 --profile prod[/dim]
73
72
  """
74
73
 
75
74
  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
- $ [green]nextmv cloud acceptance list --app-id hare-app[/green]
41
+ $ [dim]nextmv cloud acceptance list --app-id hare-app[/dim]
42
42
 
43
43
  - List all acceptance tests and save to a file.
44
- $ [green]nextmv cloud acceptance list --app-id hare-app --output tests.json[/green]
44
+ $ [dim]nextmv cloud acceptance list --app-id hare-app --output tests.json[/dim]
45
45
 
46
46
  - List all acceptance tests using a specific profile.
47
- $ [green]nextmv cloud acceptance list --app-id hare-app --profile prod[/green]
47
+ $ [dim]nextmv cloud acceptance list --app-id hare-app --profile prod[/dim]
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
- $ [green]nextmv cloud acceptance update --app-id hare-app \\
61
- --acceptance-test-id test-123 --name "Updated Test Name"[/green]
60
+ $ [dim]nextmv cloud acceptance update --app-id hare-app \\
61
+ --acceptance-test-id test-123 --name "Updated Test Name"[/dim]
62
62
 
63
63
  - Update the description of an acceptance test.
64
- $ [green]nextmv cloud acceptance update --app-id hare-app \\
65
- --acceptance-test-id test-123 --description "Updated description"[/green]
64
+ $ [dim]nextmv cloud acceptance update --app-id hare-app \\
65
+ --acceptance-test-id test-123 --description "Updated description"[/dim]
66
66
 
67
67
  - Update both name and description and save the result.
68
- $ [green]nextmv cloud acceptance update --app-id hare-app \\
68
+ $ [dim]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[/green]
70
+ --description "New description" --output updated-test.json[/dim]
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 your Nextmv Cloud account (organization).
23
+ Manage SSO for your Nextmv Cloud account (organization).
24
24
 
25
- Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link] for assistance
26
- configuring SSO for your organization.
25
+ Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link]
26
+ for assistance configuring SSO for your organization.
27
27
  """
28
28
  pass
@@ -39,32 +39,32 @@ def create(
39
39
  profile: ProfileOption = None,
40
40
  ) -> None:
41
41
  """
42
- Create a new Nextmv Cloud account.
42
+ Create a new Nextmv Cloud account in your organization.
43
43
 
44
44
  To create managed accounts, SSO must be configured for your organization.
45
45
  Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link] for assistance.
46
46
 
47
47
  At least one administrator email address must be provided. Multiple
48
- administrators can be specified by repeating the [code]--admins[/code] flag
49
- or by separating email addresses with commas.
48
+ administrators can be specified by repeating the --admins flag or by
49
+ separating email addresses with commas.
50
50
 
51
51
  [bold][underline]Examples[/underline][/bold]
52
52
 
53
53
  - Create an account named [magenta]Bunny Logistics[/magenta] with a single administrator.
54
- $ [green]nextmv cloud account create --name "Bunny Logistics" \\
55
- --admins peter.rabbit@carrotexpress.com[/green]
54
+ $ [dim]nextmv cloud account create --name "Bunny Logistics" \\
55
+ --admins peter.rabbit@carrotexpress.com[/dim]
56
56
 
57
57
  - Create an account named [magenta]Hare Delivery Co[/magenta] with multiple administrators.
58
- $ [green]nextmv cloud account create --name "Hare Delivery Co" \\
59
- --admins bugs@acme.com --admins roger@toontown.com[/green]
58
+ $ [dim]nextmv cloud account create --name "Hare Delivery Co" \\
59
+ --admins bugs@acme.com --admins roger@toontown.com[/dim]
60
60
 
61
61
  - Create an account using the profile named [magenta]hare[/magenta].
62
- $ [green]nextmv cloud account create --name "Cottontail Couriers" \\
63
- --admins fluffy@hopmail.com --profile hare[/green]
62
+ $ [dim]nextmv cloud account create --name "Cottontail Couriers" \\
63
+ --admins fluffy@hopmail.com --profile hare[/dim]
64
64
 
65
65
  - Create an account with comma-separated administrators.
66
- $ [green]nextmv cloud account create --name "Whiskers Warehouse" \\
67
- --admins "thumper@forestmail.com,flopsy@warren.io"[/green]
66
+ $ [dim]nextmv cloud account create --name "Whiskers Warehouse" \\
67
+ --admins "thumper@forestmail.com,flopsy@warren.io"[/dim]
68
68
  """
69
69
 
70
70
  cloud_client = build_client(profile)
@@ -5,9 +5,9 @@ This module defines the cloud account delete command for the Nextmv CLI.
5
5
  from typing import Annotated
6
6
 
7
7
  import typer
8
- from rich.prompt import Confirm
9
8
 
10
9
  from nextmv.cli.configuration.config import build_account
10
+ from nextmv.cli.confirm import get_confirmation
11
11
  from nextmv.cli.message import info, success
12
12
  from nextmv.cli.options import AccountIDOption, ProfileOption
13
13
 
@@ -29,26 +29,25 @@ def delete(
29
29
  profile: ProfileOption = None,
30
30
  ) -> None:
31
31
  """
32
- Deletes an account within your organization.
32
+ Deletes an account within your SSO-enabled organization.
33
33
 
34
34
  You must have the [magenta]administrator[/magenta] role on that account in order to delete it.
35
35
 
36
- This action is permanent and cannot be undone. Use the [code]--yes[/code]
36
+ This action is permanent and cannot be undone. Use the --yes
37
37
  flag to skip the confirmation prompt.
38
38
 
39
39
  [bold][underline]Examples[/underline][/bold]
40
40
 
41
41
  - Delete the account with the ID [magenta]bunnies-account[/magenta].
42
- $ [green]nextmv cloud account delete --account-id bunnies-account[/green]
42
+ $ [dim]nextmv cloud account delete --account-id bunnies-account[/dim]
43
43
 
44
44
  - Delete the account without confirmation prompt.
45
- $ [green]nextmv cloud account delete --account-id bunnies-account --yes[/green]
45
+ $ [dim]nextmv cloud account delete --account-id bunnies-account --yes[/dim]
46
46
  """
47
47
 
48
48
  if not yes:
49
- confirm = Confirm.ask(
49
+ confirm = get_confirmation(
50
50
  f"Are you sure you want to delete account [magenta]{account_id}[/magenta]? This action cannot be undone.",
51
- default=False,
52
51
  )
53
52
 
54
53
  if not confirm: