nextmv 1.1.0.dev0__tar.gz → 1.1.0.dev2__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 (240) hide show
  1. nextmv-1.1.0.dev2/.python-version +1 -0
  2. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/PKG-INFO +2 -16
  3. nextmv-1.1.0.dev2/nextmv/__about__.py +1 -0
  4. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/_serialization.py +1 -1
  5. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/acceptance/create.py +12 -12
  6. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/run/track.py +31 -9
  7. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/sso/create.py +21 -6
  8. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/sso/delete.py +6 -6
  9. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/sso/update.py +6 -27
  10. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/account.py +9 -0
  11. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/__init__.py +2 -0
  12. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_run.py +150 -92
  13. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/client.py +1 -1
  14. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/sso.py +53 -24
  15. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/default_app/main.py +4 -6
  16. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/local/application.py +13 -48
  17. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/local/executor.py +84 -4
  18. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/local/geojson_handler.py +1 -1
  19. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/manifest.py +11 -7
  20. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/model.py +2 -2
  21. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/output.py +74 -25
  22. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/run.py +39 -13
  23. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/pyproject.toml +7 -0
  24. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/cloud/app.yaml +1 -0
  25. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_entrypoint/test_entrypoint.py +1 -0
  26. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_manifest.py +1 -0
  27. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_options.py +36 -35
  28. nextmv-1.1.0.dev2/uv.lock +3091 -0
  29. nextmv-1.1.0.dev0/nextmv/__about__.py +0 -1
  30. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/.gitignore +0 -0
  31. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/LICENSE +0 -0
  32. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/README.md +0 -0
  33. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/__entrypoint__.py +0 -0
  34. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/__init__.py +0 -0
  35. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/base_model.py +0 -0
  36. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/CONTRIBUTING.md +0 -0
  37. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/__init__.py +0 -0
  38. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/__init__.py +0 -0
  39. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
  40. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/acceptance/delete.py +0 -0
  41. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/acceptance/get.py +0 -0
  42. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/acceptance/list.py +0 -0
  43. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/acceptance/update.py +0 -0
  44. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/account/__init__.py +0 -0
  45. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/account/create.py +0 -0
  46. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/account/delete.py +0 -0
  47. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/account/get.py +0 -0
  48. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/account/update.py +0 -0
  49. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/app/__init__.py +0 -0
  50. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/app/create.py +0 -0
  51. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/app/delete.py +0 -0
  52. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/app/exists.py +0 -0
  53. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/app/get.py +0 -0
  54. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/app/list.py +0 -0
  55. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/app/push.py +0 -0
  56. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/app/update.py +0 -0
  57. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/batch/__init__.py +0 -0
  58. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/batch/create.py +0 -0
  59. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/batch/delete.py +0 -0
  60. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/batch/get.py +0 -0
  61. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/batch/list.py +0 -0
  62. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/batch/metadata.py +0 -0
  63. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/batch/update.py +0 -0
  64. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/data/__init__.py +0 -0
  65. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/data/upload.py +0 -0
  66. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/ensemble/__init__.py +0 -0
  67. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/ensemble/create.py +0 -0
  68. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/ensemble/delete.py +0 -0
  69. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/ensemble/get.py +0 -0
  70. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/ensemble/list.py +0 -0
  71. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/ensemble/update.py +0 -0
  72. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/input_set/__init__.py +0 -0
  73. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/input_set/create.py +0 -0
  74. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/input_set/delete.py +0 -0
  75. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/input_set/get.py +0 -0
  76. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/input_set/list.py +0 -0
  77. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/input_set/update.py +0 -0
  78. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/instance/__init__.py +0 -0
  79. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/instance/create.py +0 -0
  80. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/instance/delete.py +0 -0
  81. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/instance/exists.py +0 -0
  82. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/instance/get.py +0 -0
  83. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/instance/list.py +0 -0
  84. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/instance/update.py +0 -0
  85. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
  86. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/managed_input/create.py +0 -0
  87. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/managed_input/delete.py +0 -0
  88. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/managed_input/get.py +0 -0
  89. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/managed_input/list.py +0 -0
  90. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/managed_input/update.py +0 -0
  91. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/run/__init__.py +0 -0
  92. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/run/cancel.py +0 -0
  93. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/run/create.py +0 -0
  94. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/run/get.py +0 -0
  95. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/run/input.py +0 -0
  96. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/run/list.py +0 -0
  97. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/run/logs.py +0 -0
  98. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/run/metadata.py +0 -0
  99. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/scenario/__init__.py +0 -0
  100. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/scenario/create.py +0 -0
  101. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/scenario/delete.py +0 -0
  102. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/scenario/get.py +0 -0
  103. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/scenario/list.py +0 -0
  104. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/scenario/metadata.py +0 -0
  105. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/scenario/update.py +0 -0
  106. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/secrets/__init__.py +0 -0
  107. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/secrets/create.py +0 -0
  108. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/secrets/delete.py +0 -0
  109. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/secrets/get.py +0 -0
  110. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/secrets/list.py +0 -0
  111. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/secrets/update.py +0 -0
  112. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/shadow/__init__.py +0 -0
  113. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/shadow/create.py +0 -0
  114. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/shadow/delete.py +0 -0
  115. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/shadow/get.py +0 -0
  116. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/shadow/list.py +0 -0
  117. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/shadow/metadata.py +0 -0
  118. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/shadow/start.py +0 -0
  119. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/shadow/stop.py +0 -0
  120. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/shadow/update.py +0 -0
  121. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/sso/__init__.py +0 -0
  122. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/sso/disable.py +0 -0
  123. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/sso/enable.py +0 -0
  124. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/sso/get.py +0 -0
  125. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/switchback/__init__.py +0 -0
  126. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/switchback/create.py +0 -0
  127. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/switchback/delete.py +0 -0
  128. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/switchback/get.py +0 -0
  129. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/switchback/list.py +0 -0
  130. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/switchback/metadata.py +0 -0
  131. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/switchback/start.py +0 -0
  132. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/switchback/stop.py +0 -0
  133. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/switchback/update.py +0 -0
  134. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/upload/__init__.py +0 -0
  135. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/upload/create.py +0 -0
  136. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/version/__init__.py +0 -0
  137. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/version/create.py +0 -0
  138. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/version/delete.py +0 -0
  139. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/version/exists.py +0 -0
  140. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/version/get.py +0 -0
  141. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/version/list.py +0 -0
  142. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/cloud/version/update.py +0 -0
  143. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/community/__init__.py +0 -0
  144. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/community/clone.py +0 -0
  145. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/community/list.py +0 -0
  146. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/configuration/__init__.py +0 -0
  147. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/configuration/config.py +0 -0
  148. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/configuration/create.py +0 -0
  149. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/configuration/delete.py +0 -0
  150. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/configuration/list.py +0 -0
  151. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/confirm.py +0 -0
  152. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/main.py +0 -0
  153. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/message.py +0 -0
  154. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/options.py +0 -0
  155. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cli/version.py +0 -0
  156. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/__init__.py +0 -0
  157. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/acceptance_test.py +0 -0
  158. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_acceptance.py +0 -0
  159. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_batch_scenario.py +0 -0
  160. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_ensemble.py +0 -0
  161. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_input_set.py +0 -0
  162. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_instance.py +0 -0
  163. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_managed_input.py +0 -0
  164. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_secrets.py +0 -0
  165. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_shadow.py +0 -0
  166. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_switchback.py +0 -0
  167. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_utils.py +0 -0
  168. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/application/_version.py +0 -0
  169. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/assets.py +0 -0
  170. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/batch_experiment.py +0 -0
  171. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/community.py +0 -0
  172. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/ensemble.py +0 -0
  173. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/input_set.py +0 -0
  174. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/instance.py +0 -0
  175. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/integration.py +0 -0
  176. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/package.py +0 -0
  177. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/scenario.py +0 -0
  178. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/secrets.py +0 -0
  179. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/shadow.py +0 -0
  180. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/switchback.py +0 -0
  181. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/url.py +0 -0
  182. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/cloud/version.py +0 -0
  183. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/default_app/.gitignore +0 -0
  184. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/default_app/README.md +0 -0
  185. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/default_app/app.yaml +0 -0
  186. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/default_app/input.json +0 -0
  187. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/default_app/requirements.txt +0 -0
  188. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/default_app/src/__init__.py +0 -0
  189. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/default_app/src/visuals.py +0 -0
  190. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/deprecated.py +0 -0
  191. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/input.py +0 -0
  192. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/local/__init__.py +0 -0
  193. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/local/local.py +0 -0
  194. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/local/plotly_handler.py +0 -0
  195. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/local/runner.py +0 -0
  196. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/logger.py +0 -0
  197. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/options.py +0 -0
  198. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/polling.py +0 -0
  199. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/safe.py +0 -0
  200. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/nextmv/status.py +0 -0
  201. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/README.md +0 -0
  202. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/__init__.py +0 -0
  203. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/cli/__init__.py +0 -0
  204. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/cli/test_configuration.py +0 -0
  205. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/cli/test_main.py +0 -0
  206. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/cli/test_version.py +0 -0
  207. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/cloud/__init__.py +0 -0
  208. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/cloud/test_client.py +0 -0
  209. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/cloud/test_instance.py +0 -0
  210. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/cloud/test_package.py +0 -0
  211. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/cloud/test_scenario.py +0 -0
  212. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/integration/__init__.py +0 -0
  213. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/integration/cloud/__init__.py +0 -0
  214. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/integration/cloud/test_integration_cloud.py +0 -0
  215. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/local/__init__.py +0 -0
  216. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/local/test_application.py +0 -0
  217. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/local/test_executor.py +0 -0
  218. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/local/test_runner.py +0 -0
  219. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/scripts/__init__.py +0 -0
  220. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/scripts/options1.py +0 -0
  221. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/scripts/options2.py +0 -0
  222. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/scripts/options3.py +0 -0
  223. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/scripts/options4.py +0 -0
  224. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/scripts/options5.py +0 -0
  225. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/scripts/options6.py +0 -0
  226. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/scripts/options7.py +0 -0
  227. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_base_model.py +0 -0
  228. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_entrypoint/__init__.py +0 -0
  229. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_input.py +0 -0
  230. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_inputs/test_data.csv +0 -0
  231. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_inputs/test_data.json +0 -0
  232. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_inputs/test_data.txt +0 -0
  233. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_logger.py +0 -0
  234. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_model.py +0 -0
  235. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_output.py +0 -0
  236. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_polling.py +0 -0
  237. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_run.py +0 -0
  238. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_safe.py +0 -0
  239. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_serialization.py +0 -0
  240. {nextmv-1.1.0.dev0 → nextmv-1.1.0.dev2}/tests/test_version.py +0 -0
@@ -0,0 +1 @@
1
+ 3.13
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextmv
3
- Version: 1.1.0.dev0
3
+ Version: 1.1.0.dev2
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/
@@ -218,6 +218,7 @@ Classifier: Programming Language :: Python :: 3.11
218
218
  Classifier: Programming Language :: Python :: 3.12
219
219
  Classifier: Programming Language :: Python :: 3.13
220
220
  Requires-Python: >=3.10
221
+ Requires-Dist: pip>=26.0
221
222
  Requires-Dist: pydantic>=2.5.2
222
223
  Requires-Dist: pyyaml>=6.0.1
223
224
  Requires-Dist: requests>=2.31.0
@@ -226,21 +227,6 @@ Requires-Dist: urllib3>=2.1.0
226
227
  Provides-Extra: all
227
228
  Requires-Dist: folium>=0.20.0; extra == 'all'
228
229
  Requires-Dist: plotly>=6.0.1; extra == 'all'
229
- Provides-Extra: dev
230
- Requires-Dist: build>=1.0.3; extra == 'dev'
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'
234
- Requires-Dist: openpyxl>=3.1.5; extra == 'dev'
235
- Requires-Dist: pandas>=2.2.3; extra == 'dev'
236
- Requires-Dist: plotly>=6.0.1; extra == 'dev'
237
- Requires-Dist: pydantic>=2.5.2; extra == 'dev'
238
- Requires-Dist: pytest>=9.0.2; extra == 'dev'
239
- Requires-Dist: pyyaml>=6.0.1; extra == 'dev'
240
- Requires-Dist: requests>=2.31.0; extra == 'dev'
241
- Requires-Dist: ruff>=0.1.7; extra == 'dev'
242
- Requires-Dist: twine>=4.0.2; extra == 'dev'
243
- Requires-Dist: urllib3>=2.1.0; extra == 'dev'
244
230
  Provides-Extra: notebook
245
231
  Requires-Dist: mlflow>=3.9.0; extra == 'notebook'
246
232
  Description-Content-Type: text/markdown
@@ -0,0 +1 @@
1
+ __version__ = "v1.1.0.dev2"
@@ -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")
@@ -45,7 +45,7 @@ app = typer.Typer()
45
45
  - Multiple metrics as a [magenta]json[/magenta] array in a single --metrics flag.
46
46
 
47
47
  Each metric must have the following fields:
48
- - [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").
49
49
  - [magenta]metric_type[/magenta]: Type of metric comparison. Allowed values: {enum_values(MetricType)}.
50
50
  - [magenta]params[/magenta]: Parameters of the metric comparison.
51
51
  - [magenta]operator[/magenta]: Comparison operator. Allowed values: {enum_values(Comparison)}.
@@ -71,8 +71,8 @@ app = typer.Typer()
71
71
  [bold][underline]Examples[/underline][/bold]
72
72
 
73
73
  - Create an acceptance test with a single metric.
74
- $ [dim]METRIC='{{
75
- "field": "solution.objective",
74
+ $ [green]METRIC='{{
75
+ "field": "result.custom.unassigned",
76
76
  "metric_type": "direct-comparison",
77
77
  "params": {{
78
78
  "operator": "lt",
@@ -85,8 +85,8 @@ app = typer.Typer()
85
85
  --metrics "$METRIC" --input-set-id input-set-123[/dim]
86
86
 
87
87
  - Create with multiple metrics by repeating the flag.
88
- $ [dim]METRIC1='{{
89
- "field": "solution.objective",
88
+ $ [green]METRIC1='{{
89
+ "field": "result.custom.unassigned",
90
90
  "metric_type": "direct-comparison",
91
91
  "params": {{
92
92
  "operator": "lt",
@@ -95,7 +95,7 @@ app = typer.Typer()
95
95
  "statistic": "mean"
96
96
  }}'
97
97
  METRIC2='{{
98
- "field": "statistics.run.duration",
98
+ "field": "run.duration",
99
99
  "metric_type": "direct-comparison",
100
100
  "params": {{
101
101
  "operator": "le",
@@ -110,7 +110,7 @@ app = typer.Typer()
110
110
  - Create with multiple metrics in a single [magenta]json[/magenta] array.
111
111
  $ [dim]METRICS='[
112
112
  {{
113
- "field": "solution.objective",
113
+ "field": "result.custom.unassigned",
114
114
  "metric_type": "direct-comparison",
115
115
  "params": {{
116
116
  "operator": "lt",
@@ -119,7 +119,7 @@ app = typer.Typer()
119
119
  "statistic": "mean"
120
120
  }},
121
121
  {{
122
- "field": "statistics.run.duration",
122
+ "field": "run.duration",
123
123
  "metric_type": "direct-comparison",
124
124
  "params": {{
125
125
  "operator": "le",
@@ -133,8 +133,8 @@ app = typer.Typer()
133
133
  --metrics "$METRICS" --input-set-id input-set-123[/dim]
134
134
 
135
135
  - Create an acceptance test and wait for it to complete.
136
- $ [dim]METRIC='{{
137
- "field": "solution.objective",
136
+ $ [green]METRIC='{{
137
+ "field": "result.custom.unassigned",
138
138
  "metric_type": "direct-comparison",
139
139
  "params": {{
140
140
  "operator": "lt",
@@ -147,8 +147,8 @@ app = typer.Typer()
147
147
  --metrics "$METRIC" --input-set-id input-set-123 --wait[/dim]
148
148
 
149
149
  - Create an acceptance test and save the results to a file, waiting for completion.
150
- $ [dim]METRIC='{{
151
- "field": "solution.objective",
150
+ $ [green]METRIC='{{
151
+ "field": "result.custom.unassigned",
152
152
  "metric_type": "direct-comparison",
153
153
  "params": {{
154
154
  "operator": "lt",
@@ -124,11 +124,21 @@ def track(
124
124
  statistics: Annotated[
125
125
  str | None,
126
126
  typer.Option(
127
- help="The statistics of the run being tracked. A [magenta]json[/magenta] file to read the statistics from.",
127
+ help="Deprecated: Use 'metrics' instead. The statistics of the run" \
128
+ " being tracked. A [magenta]json[/magenta] file to read the statistics from.",
128
129
  metavar="STATISTICS_PATH",
129
130
  rich_help_panel="Tracked run configuration",
130
131
  ),
131
132
  ] = None,
133
+ metrics: Annotated[
134
+ str | None,
135
+ typer.Option(
136
+ help="The metrics of the run being tracked. A [magenta]json[/magenta]"\
137
+ " file to read the metrics from.",
138
+ metavar="METRICS_PATH",
139
+ rich_help_panel="Tracked run configuration",
140
+ ),
141
+ ] = None,
132
142
  # Options for run configuration.
133
143
  instance_id: Annotated[
134
144
  str | None,
@@ -159,9 +169,9 @@ def track(
159
169
  path must be provided. If the content type is
160
170
  [magenta]multi-file[/magenta], then a directory path must be provided.
161
171
 
162
- Run logs, assets, and statistics can be provided via files using the
163
- --logs, --assets, and --statistics options, respectively. Assets and
164
- statistics must be provided as [magenta]json[/magenta] files, while logs
172
+ Run logs, assets, and metrics can be provided via files using the
173
+ --logs, --assets, and --metrics options, respectively. Assets and
174
+ metrics must be provided as [magenta]json[/magenta] files, while logs
165
175
  must be provided as a utf-8 encoded text file.
166
176
 
167
177
  [bold][underline]Examples[/underline][/bold]
@@ -183,11 +193,11 @@ def track(
183
193
  $ [dim]nextmv cloud run track --app-id hare-app --status succeeded --input input.json \\
184
194
  --output output.json --logs logs.log[/dim]
185
195
 
186
- - Track a [magenta]successful[/magenta] [magenta]json[/magenta] run with assets and statistics
196
+ - Track a [magenta]successful[/magenta] [magenta]json[/magenta] run with assets and metrics
187
197
  from [magenta]json[/magenta] files, for an app with ID
188
198
  [magenta]hare-app[/magenta].
189
199
  $ [dim]nextmv cloud run track --app-id hare-app --status succeeded --input input.json \\
190
- --output output.json --assets assets.json --statistics statistics.json[/dim]
200
+ --output output.json --assets assets.json --metrics metrics.json[/dim]
191
201
 
192
202
  - Track a [magenta]failed[/magenta] run with an error message, for an app with ID
193
203
  [magenta]hare-app[/magenta].
@@ -215,7 +225,7 @@ def track(
215
225
  - Track a [magenta]successful[/magenta] [magenta]json[/magenta] run with all available options,
216
226
  for an app with ID [magenta]hare-app[/magenta].
217
227
  $ [dim]nextmv cloud run track --app-id hare-app --status succeeded --input input.json \\
218
- --output output.json --logs logs.log --assets assets.json --statistics statistics.json \\
228
+ --output output.json --logs logs.log --assets assets.json --metrics metrics.json \\
219
229
  --name "Full run" --description "Complete example" --duration 10000 --instance-id burrow[/dim]
220
230
  """
221
231
 
@@ -251,6 +261,7 @@ def track(
251
261
  assets=assets,
252
262
  logs=logs,
253
263
  statistics=statistics,
264
+ metrics=metrics,
254
265
  )
255
266
 
256
267
  # Actually track the run.
@@ -277,12 +288,13 @@ def build_tracked_run_input(
277
288
  assets: str | None = None,
278
289
  logs: str | None = None,
279
290
  statistics: str | None = None,
291
+ metrics: str | None = None,
280
292
  ) -> TrackedRun:
281
293
  """
282
294
  Builds the tracked run input for tracking a run. Starts by creating a
283
295
  TrackedRun object with the provided status, duration, error message, name,
284
296
  and description. Then resolves the input and output using helper functions.
285
- Finally, it reads the assets, logs, and statistics from the provided file
297
+ Finally, it reads the assets, logs, and metrics from the provided file
286
298
  paths, if any, and assigns them to the TrackedRun object.
287
299
 
288
300
  Parameters
@@ -310,7 +322,9 @@ def build_tracked_run_input(
310
322
  logs : str | None
311
323
  The logs file path, if any.
312
324
  statistics : str | None
313
- The statistics file path, if any.
325
+ Deprecated: Use metrics. The statistics file path, if any.
326
+ metrics : str | None
327
+ The metrics file path, if any.
314
328
  """
315
329
  tracked_run = TrackedRun(
316
330
  status=TrackedRunStatus(status),
@@ -355,6 +369,14 @@ def build_tracked_run_input(
355
369
  except json.JSONDecodeError as e:
356
370
  error(f"Failed to parse statistics file [magenta]{statistics}[/magenta] as [magenta]json[/magenta]: {e}.")
357
371
 
372
+ # Handle the metrics, which should be a JSON file.
373
+ if metrics is not None and metrics != "":
374
+ try:
375
+ with open(metrics) as f:
376
+ tracked_run.metrics = json.load(f)
377
+ except json.JSONDecodeError as e:
378
+ error(f"Failed to parse metrics file [magenta]{metrics}[/magenta] as [magenta]json[/magenta]: {e}.")
379
+
358
380
  return tracked_run
359
381
 
360
382
 
@@ -2,12 +2,13 @@
2
2
  This module defines the cloud sso create command for the Nextmv CLI.
3
3
  """
4
4
 
5
+ import sys
5
6
  from typing import Annotated
6
7
 
7
8
  import typer
8
9
 
9
10
  from nextmv.cli.configuration.config import build_client
10
- from nextmv.cli.message import in_progress, print_json
11
+ from nextmv.cli.message import in_progress, success
11
12
  from nextmv.cli.options import ProfileOption
12
13
  from nextmv.cloud.sso import SSOConfiguration
13
14
 
@@ -48,7 +49,7 @@ def create(
48
49
  typer.Option(
49
50
  "--metadata-document",
50
51
  "-d",
51
- help="The SSO metadata document as a string.",
52
+ help="The SSO metadata document as a string or a path to a file containing the document.",
52
53
  metavar="METADATA_DOCUMENT",
53
54
  ),
54
55
  ] = None,
@@ -60,8 +61,15 @@ def create(
60
61
  SSO must be configured to enable managed accounts in your organization.
61
62
  Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link] for assistance.
62
63
 
63
- You must provide either a metadata URL or a metadata document. The metadata
64
- document contains the SAML configuration details from your identity provider.
64
+ You must use either the --metadata-url or --metadata-document option. When
65
+ working with the metadata document, you have three options:
66
+
67
+ - Pipe the document into the command via [magenta]stdin[/magenta].
68
+ - Provide the document as a string with --metadata-document.
69
+ - Provide a path to a file containing the document with --metadata-document.
70
+
71
+ You can use the [code]nextmv cloud sso get[/code] to get the newly-created
72
+ configuration after running this command.
65
73
 
66
74
  [bold][underline]Examples[/underline][/bold]
67
75
 
@@ -79,19 +87,26 @@ def create(
79
87
  - Create SSO configuration using a metadata document string.
80
88
  $ [dim]nextmv cloud sso create --metadata-document "<EntityDescriptor ...</EntityDescriptor>"[/dim]
81
89
 
90
+ - Create SSO configuration using a metadata document file.
91
+ $ [dim]nextmv cloud sso create --metadata-document "/path/to/metadata_document.xml"[/dim]
92
+
82
93
  - Create SSO configuration using the profile named [magenta]hare[/magenta].
83
94
  $ [dim]nextmv cloud sso create --metadata-url "https://sso.cottontailcouriers.net/metadata" \\
84
95
  --profile hare[/dim]
85
96
  """
86
97
 
98
+ stdin = sys.stdin.read().strip() if sys.stdin.isatty() is False else None
99
+ if stdin is not None:
100
+ metadata_document = stdin
101
+
87
102
  cloud_client = build_client(profile)
88
103
  in_progress(msg="Creating configuration...")
89
104
 
90
- configuration = SSOConfiguration.new(
105
+ SSOConfiguration.new(
91
106
  client=cloud_client,
92
107
  allow_non_domain_users=allow_non_domain_users,
93
108
  enabled=enabled,
94
109
  metadata_url=metadata_url,
95
110
  metadata_document=metadata_document,
96
111
  )
97
- print_json(configuration.to_dict())
112
+ success("SSO configuration created successfully.")
@@ -30,10 +30,9 @@ def delete(
30
30
  """
31
31
  Deletes the SSO configuration.
32
32
 
33
- You must have the [magenta]administrator[/magenta] role on the organization in order to delete it.
34
-
35
- This action is permanent and cannot be undone. Use the --yes
36
- flag to skip the confirmation prompt.
33
+ You must have the [magenta]administrator[/magenta] role on the organization
34
+ in order to delete it. Use the --yes flag to skip the confirmation prompt.
35
+ You can create a new SSO configuration again with [code]nextmv cloud sso create[/code].
37
36
 
38
37
  [bold][underline]Examples[/underline][/bold]
39
38
 
@@ -46,7 +45,8 @@ def delete(
46
45
 
47
46
  if not yes:
48
47
  confirm = get_confirmation(
49
- "Are you sure you want to delete the sso configuration? This action cannot be undone.",
48
+ "Are you sure you want to delete the sso configuration? "
49
+ "You can create it again with [code]nextmv cloud sso create[/code].",
50
50
  )
51
51
 
52
52
  if not confirm:
@@ -55,4 +55,4 @@ def delete(
55
55
 
56
56
  sso_config = build_sso_config(profile)
57
57
  sso_config.delete()
58
- success("SSO configuration has been deleted.")
58
+ success("SSO configuration has been deleted. You can create it again with [code]nextmv cloud sso create[/code].")
@@ -2,13 +2,12 @@
2
2
  This module defines the cloud sso update command for the Nextmv CLI.
3
3
  """
4
4
 
5
- import json
6
5
  from typing import Annotated
7
6
 
8
7
  import typer
9
8
 
10
9
  from nextmv.cli.configuration.config import build_sso_config
11
- from nextmv.cli.message import print_json, success
10
+ from nextmv.cli.message import success
12
11
  from nextmv.cli.options import ProfileOption
13
12
 
14
13
  # Set up subcommand application.
@@ -35,44 +34,24 @@ def update(
35
34
  metavar="METADATA_DOCUMENT",
36
35
  ),
37
36
  ] = None,
38
- output: Annotated[
39
- str | None,
40
- typer.Option(
41
- "--output",
42
- "-o",
43
- help="Saves the updated SSO configuration information to this location.",
44
- metavar="OUTPUT_PATH",
45
- ),
46
- ] = None,
47
37
  profile: ProfileOption = None,
48
38
  ) -> None:
49
39
  """
50
40
  Updates information of a Nextmv Cloud SSO configuration.
51
41
 
52
42
  This command allows you to update the metadata URL or metadata document of
53
- an existing SSO configuration.
43
+ an existing SSO configuration. You can use the [code]nextmv cloud sso
44
+ get[/code] to get the updated configuration after running this command.
54
45
 
55
46
  [bold][underline]Examples[/underline][/bold]
56
47
 
57
48
  - Update the SSO configuration with a new metadata URL.
58
49
  $ [dim]nextmv cloud sso update --metadata-url "https://example.com/metadata.xml"[/dim]
59
50
 
60
- - Update the SSO configuration with a new metadata document and save the updated information to an
61
- [magenta]updated_sso_config.json[/magenta] file.
62
- $ [dim]nextmv cloud sso update --metadata-document "<xml>...</xml>" --output updated_sso_config.json[/dim]
51
+ - Update the SSO configuration with a new metadata document.
52
+ $ [dim]nextmv cloud sso update --metadata-document "<xml>...</xml>"[/dim]
63
53
  """
64
54
 
65
55
  sso_config = build_sso_config(profile)
66
- updated_config = sso_config.update(metadata_url=metadata_url, metadata_document=metadata_document)
56
+ sso_config.update(metadata_url=metadata_url, metadata_document=metadata_document)
67
57
  success("SSO configuration updated successfully.")
68
- updated_config_dict = updated_config.to_dict()
69
-
70
- if output is not None and output != "":
71
- with open(output, "w") as f:
72
- json.dump(updated_config_dict, f, indent=2)
73
-
74
- success(msg=f"Updated SSO configuration information saved to [magenta]{output}[/magenta].")
75
-
76
- return
77
-
78
- print_json(updated_config_dict)
@@ -19,6 +19,7 @@ from datetime import datetime
19
19
 
20
20
  from pydantic import AliasChoices, Field
21
21
 
22
+ from nextmv import deprecated
22
23
  from nextmv.base_model import BaseModel
23
24
  from nextmv.cloud.client import Client
24
25
  from nextmv.status import StatusV2
@@ -378,6 +379,9 @@ class Account(BaseModel):
378
379
 
379
380
  def queue(self) -> Queue:
380
381
  """
382
+ !!! warning
383
+ `Account.queue` is deprecated, use `Application.list_runs` with `status=StatusV2.queued` instead.
384
+
381
385
  Get the queue of runs in the account.
382
386
 
383
387
  Retrieves the current list of runs that are pending or being executed
@@ -404,6 +408,11 @@ class Account(BaseModel):
404
408
  Run run-123: Daily Optimization - Status: RUNNING
405
409
  Run run-456: Weekly Planning - Status: QUEUED
406
410
  """
411
+ deprecated(
412
+ name="Account.queue",
413
+ reason="`Account.queue` is deprecated, use `Application.list_runs` with `status=StatusV2.queued` instead",
414
+ )
415
+
407
416
  response = self.client.request(
408
417
  method="GET",
409
418
  endpoint=self.account_endpoint + "/queue",
@@ -789,6 +789,8 @@ class Application(
789
789
  output_config = multi_config["output_configuration"] = {}
790
790
  if content.multi_file.output.statistics:
791
791
  output_config["statistics_path"] = content.multi_file.output.statistics
792
+ if content.multi_file.output.metrics:
793
+ output_config["metrics_path"] = content.multi_file.output.metrics
792
794
  if content.multi_file.output.assets:
793
795
  output_config["assets_path"] = content.multi_file.output.assets
794
796
  if content.multi_file.output.solutions: