nextmv 1.3.1.dev4__tar.gz → 1.4.0.dev0__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 (395) hide show
  1. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/.gitignore +0 -5
  2. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/PKG-INFO +1 -3
  3. nextmv-1.4.0.dev0/nextmv/__about__.py +1 -0
  4. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/create.py +4 -3
  5. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/init.py +141 -112
  6. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/main.py +1 -9
  7. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_batch_scenario.py +0 -15
  8. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_run.py +36 -12
  9. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/batch_experiment.py +0 -2
  10. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/application.py +34 -4
  11. nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/README.md +48 -0
  12. nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/app.yaml +87 -0
  13. nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/input.json +303 -0
  14. nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/main.py +439 -0
  15. nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/requirements.txt +3 -0
  16. nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/visualizations.py +656 -0
  17. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/.gitignore +1 -0
  18. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/README.md +14 -0
  19. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/README.md +50 -0
  20. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/app.yaml +83 -0
  21. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/input.json +7 -0
  22. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/main.py +494 -0
  23. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/requirements.txt +4 -0
  24. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/visuals.py +89 -0
  25. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/README.md +72 -0
  26. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/app.yaml +70 -0
  27. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/input.json +436 -0
  28. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/main.py +176 -0
  29. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/requirements.txt +5 -0
  30. nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/visuals.py +187 -0
  31. nextmv-1.4.0.dev0/nextmv/templates/python_json_hello-world/.gitignore +1 -0
  32. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/.gitignore +1 -0
  33. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/README.md +48 -0
  34. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/app.yaml +95 -0
  35. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/inputs/input.json +303 -0
  36. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/main.py +451 -0
  37. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/requirements.txt +3 -0
  38. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/visualizations.py +656 -0
  39. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/README.md +14 -0
  40. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/README.md +50 -0
  41. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/app.yaml +83 -0
  42. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/input.json +7 -0
  43. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/main.py +494 -0
  44. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/requirements.txt +4 -0
  45. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/visuals.py +89 -0
  46. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/README.md +70 -0
  47. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/app.yaml +78 -0
  48. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/inputs/input.json +436 -0
  49. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/main.py +187 -0
  50. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/requirements.txt +5 -0
  51. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/visuals.py +187 -0
  52. nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_hello-world/.gitignore +2 -0
  53. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/pyproject.toml +0 -4
  54. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/uv.lock +10 -303
  55. nextmv-1.3.1.dev4/nextmv/__about__.py +0 -1
  56. nextmv-1.3.1.dev4/nextmv/cli/mcp/__init__.py +0 -38
  57. nextmv-1.3.1.dev4/nextmv/cli/mcp/serve.py +0 -65
  58. nextmv-1.3.1.dev4/nextmv/cli/mcp/server.py +0 -115
  59. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/WORKFLOW.md +0 -373
  60. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/__init__.py +0 -1
  61. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/_helpers.py +0 -329
  62. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/acceptance.py +0 -112
  63. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/account.py +0 -47
  64. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/app.py +0 -148
  65. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/batch.py +0 -110
  66. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/community.py +0 -45
  67. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/ensemble.py +0 -338
  68. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/guide.py +0 -25
  69. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/input_set.py +0 -145
  70. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/instance.py +0 -140
  71. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/local.py +0 -425
  72. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/managed_input.py +0 -108
  73. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/profile.py +0 -89
  74. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/run.py +0 -405
  75. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/scenario.py +0 -227
  76. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/secrets.py +0 -100
  77. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/shadow.py +0 -149
  78. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/sso.py +0 -28
  79. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/switchback.py +0 -159
  80. nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/version.py +0 -113
  81. nextmv-1.3.1.dev4/tests/cli/test_mcp.py +0 -2054
  82. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/.python-version +0 -0
  83. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/CONTRIBUTING.md +0 -0
  84. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/LICENSE +0 -0
  85. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/README.md +0 -0
  86. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/__entrypoint__.py +0 -0
  87. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/__init__.py +0 -0
  88. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/_serialization.py +0 -0
  89. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/base_model.py +0 -0
  90. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/__init__.py +0 -0
  91. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/__init__.py +0 -0
  92. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
  93. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/create.py +0 -0
  94. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/delete.py +0 -0
  95. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/get.py +0 -0
  96. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/list.py +0 -0
  97. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/update.py +0 -0
  98. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/account/__init__.py +0 -0
  99. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/account/create.py +0 -0
  100. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/account/delete.py +0 -0
  101. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/account/get.py +0 -0
  102. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/account/update.py +0 -0
  103. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/__init__.py +0 -0
  104. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/create.py +0 -0
  105. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/delete.py +0 -0
  106. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/exists.py +0 -0
  107. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/get.py +0 -0
  108. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/list.py +0 -0
  109. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/push.py +0 -0
  110. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/update.py +0 -0
  111. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/__init__.py +0 -0
  112. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/create.py +0 -0
  113. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/delete.py +0 -0
  114. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/get.py +0 -0
  115. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/list.py +0 -0
  116. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/metadata.py +0 -0
  117. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/update.py +0 -0
  118. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/data/__init__.py +0 -0
  119. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/data/upload.py +0 -0
  120. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/__init__.py +0 -0
  121. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/create.py +0 -0
  122. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/delete.py +0 -0
  123. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/get.py +0 -0
  124. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/list.py +0 -0
  125. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/update.py +0 -0
  126. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/__init__.py +0 -0
  127. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/delete.py +0 -0
  128. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/get.py +0 -0
  129. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/list.py +0 -0
  130. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/update.py +0 -0
  131. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/__init__.py +0 -0
  132. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/create.py +0 -0
  133. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/delete.py +0 -0
  134. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/exists.py +0 -0
  135. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/get.py +0 -0
  136. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/list.py +0 -0
  137. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/update.py +0 -0
  138. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
  139. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/create.py +0 -0
  140. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/delete.py +0 -0
  141. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/get.py +0 -0
  142. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/list.py +0 -0
  143. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/update.py +0 -0
  144. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/__init__.py +0 -0
  145. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/app/__init__.py +0 -0
  146. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/app/create.py +0 -0
  147. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/app/get.py +0 -0
  148. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/app/list.py +0 -0
  149. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/app/update.py +0 -0
  150. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/subscription/__init__.py +0 -0
  151. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/subscription/create.py +0 -0
  152. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/subscription/delete.py +0 -0
  153. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/subscription/get.py +0 -0
  154. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/subscription/list.py +0 -0
  155. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/version/__init__.py +0 -0
  156. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/version/create.py +0 -0
  157. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/version/get.py +0 -0
  158. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/version/list.py +0 -0
  159. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/version/update.py +0 -0
  160. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/__init__.py +0 -0
  161. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/cancel.py +0 -0
  162. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/create.py +0 -0
  163. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/delete.py +0 -0
  164. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/get.py +0 -0
  165. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/input.py +0 -0
  166. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/list.py +0 -0
  167. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/logs.py +0 -0
  168. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/metadata.py +0 -0
  169. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/track.py +0 -0
  170. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/__init__.py +0 -0
  171. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/create.py +0 -0
  172. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/delete.py +0 -0
  173. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/get.py +0 -0
  174. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/list.py +0 -0
  175. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/metadata.py +0 -0
  176. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/update.py +0 -0
  177. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/__init__.py +0 -0
  178. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/create.py +0 -0
  179. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/delete.py +0 -0
  180. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/get.py +0 -0
  181. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/list.py +0 -0
  182. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/update.py +0 -0
  183. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/__init__.py +0 -0
  184. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/create.py +0 -0
  185. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/delete.py +0 -0
  186. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/get.py +0 -0
  187. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/list.py +0 -0
  188. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/metadata.py +0 -0
  189. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/start.py +0 -0
  190. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/stop.py +0 -0
  191. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/update.py +0 -0
  192. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/__init__.py +0 -0
  193. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/create.py +0 -0
  194. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/delete.py +0 -0
  195. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/disable.py +0 -0
  196. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/domain/__init__.py +0 -0
  197. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/domain/delete.py +0 -0
  198. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/enable.py +0 -0
  199. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/get.py +0 -0
  200. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/update.py +0 -0
  201. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/__init__.py +0 -0
  202. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/create.py +0 -0
  203. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/delete.py +0 -0
  204. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/get.py +0 -0
  205. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/list.py +0 -0
  206. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/metadata.py +0 -0
  207. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/start.py +0 -0
  208. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/stop.py +0 -0
  209. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/update.py +0 -0
  210. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/upload/__init__.py +0 -0
  211. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/upload/create.py +0 -0
  212. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/__init__.py +0 -0
  213. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/create.py +0 -0
  214. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/delete.py +0 -0
  215. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/exists.py +0 -0
  216. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/get.py +0 -0
  217. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/list.py +0 -0
  218. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/update.py +0 -0
  219. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/community/__init__.py +0 -0
  220. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/community/clone.py +0 -0
  221. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/community/list.py +0 -0
  222. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/configuration/__init__.py +0 -0
  223. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/configuration/config.py +0 -0
  224. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/configuration/create.py +0 -0
  225. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/configuration/delete.py +0 -0
  226. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/configuration/list.py +0 -0
  227. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/__init__.py +0 -0
  228. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/__init__.py +0 -0
  229. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/delete.py +0 -0
  230. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/get.py +0 -0
  231. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/list.py +0 -0
  232. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/register.py +0 -0
  233. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/registered.py +0 -0
  234. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/sync.py +0 -0
  235. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/update.py +0 -0
  236. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/__init__.py +0 -0
  237. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/create.py +0 -0
  238. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/get.py +0 -0
  239. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/input.py +0 -0
  240. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/list.py +0 -0
  241. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/logs.py +0 -0
  242. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/metadata.py +0 -0
  243. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/visuals.py +0 -0
  244. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/manifest/__init__.py +0 -0
  245. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/manifest/init.py +0 -0
  246. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/manifest/validate.py +0 -0
  247. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/message.py +0 -0
  248. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/options.py +0 -0
  249. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/version.py +0 -0
  250. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/__init__.py +0 -0
  251. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/acceptance_test.py +0 -0
  252. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/account.py +0 -0
  253. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/__init__.py +0 -0
  254. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_acceptance.py +0 -0
  255. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_ensemble.py +0 -0
  256. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_input_set.py +0 -0
  257. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_instance.py +0 -0
  258. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_managed_input.py +0 -0
  259. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_secrets.py +0 -0
  260. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_shadow.py +0 -0
  261. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_switchback.py +0 -0
  262. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_utils.py +0 -0
  263. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_version.py +0 -0
  264. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/assets.py +0 -0
  265. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/client.py +0 -0
  266. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/community.py +0 -0
  267. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/ensemble.py +0 -0
  268. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/input_set.py +0 -0
  269. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/instance.py +0 -0
  270. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/integration.py +0 -0
  271. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/marketplace.py +0 -0
  272. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/package.py +0 -0
  273. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/scenario.py +0 -0
  274. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/secrets.py +0 -0
  275. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/shadow.py +0 -0
  276. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/sso.py +0 -0
  277. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/switchback.py +0 -0
  278. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/url.py +0 -0
  279. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/version.py +0 -0
  280. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/content_format.py +0 -0
  281. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/.gitignore +0 -0
  282. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/README.md +0 -0
  283. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/app.yaml +0 -0
  284. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/input.json +0 -0
  285. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/main.py +0 -0
  286. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/requirements.txt +0 -0
  287. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/src/__init__.py +0 -0
  288. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/src/visuals.py +0 -0
  289. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/deprecated.py +0 -0
  290. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/input.py +0 -0
  291. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/__init__.py +0 -0
  292. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/executor.py +0 -0
  293. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/geojson_handler.py +0 -0
  294. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/local.py +0 -0
  295. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/plotly_handler.py +0 -0
  296. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/registry.py +0 -0
  297. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/runner.py +0 -0
  298. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/logger.py +0 -0
  299. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/manifest.py +0 -0
  300. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/model.py +0 -0
  301. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/options.py +0 -0
  302. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/output.py +0 -0
  303. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/polling.py +0 -0
  304. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/run.py +0 -0
  305. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/safe.py +0 -0
  306. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/status.py +0 -0
  307. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/binary_json_app.yaml +0 -0
  308. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/binary_multi-file_app.yaml +0 -0
  309. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/go_json_app.yaml +0 -0
  310. {nextmv-1.3.1.dev4/nextmv/templates/go_json_template → nextmv-1.4.0.dev0/nextmv/templates/go_json_hello-world}/.gitignore +0 -0
  311. {nextmv-1.3.1.dev4/nextmv/templates/go_json_template → nextmv-1.4.0.dev0/nextmv/templates/go_json_hello-world}/README.md +0 -0
  312. {nextmv-1.3.1.dev4/nextmv/templates/go_json_template → nextmv-1.4.0.dev0/nextmv/templates/go_json_hello-world}/app.yaml +0 -0
  313. {nextmv-1.3.1.dev4/nextmv/templates/go_json_template → nextmv-1.4.0.dev0/nextmv/templates/go_json_hello-world}/go.mod +0 -0
  314. {nextmv-1.3.1.dev4/nextmv/templates/go_json_template → nextmv-1.4.0.dev0/nextmv/templates/go_json_hello-world}/input.json +0 -0
  315. {nextmv-1.3.1.dev4/nextmv/templates/go_json_template → nextmv-1.4.0.dev0/nextmv/templates/go_json_hello-world}/main.go +0 -0
  316. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/go_multi-file_app.yaml +0 -0
  317. {nextmv-1.3.1.dev4/nextmv/templates/go_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/go_multi-file_hello-world}/.gitignore +0 -0
  318. {nextmv-1.3.1.dev4/nextmv/templates/go_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/go_multi-file_hello-world}/README.md +0 -0
  319. {nextmv-1.3.1.dev4/nextmv/templates/go_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/go_multi-file_hello-world}/app.yaml +0 -0
  320. {nextmv-1.3.1.dev4/nextmv/templates/go_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/go_multi-file_hello-world}/go.mod +0 -0
  321. {nextmv-1.3.1.dev4/nextmv/templates/go_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/go_multi-file_hello-world}/inputs/input.json +0 -0
  322. {nextmv-1.3.1.dev4/nextmv/templates/go_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/go_multi-file_hello-world}/main.go +0 -0
  323. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/java_json_app.yaml +0 -0
  324. {nextmv-1.3.1.dev4/nextmv/templates/java_json_template → nextmv-1.4.0.dev0/nextmv/templates/java_json_hello-world}/.gitignore +0 -0
  325. {nextmv-1.3.1.dev4/nextmv/templates/java_json_template → nextmv-1.4.0.dev0/nextmv/templates/java_json_hello-world}/Main.java +0 -0
  326. {nextmv-1.3.1.dev4/nextmv/templates/java_json_template → nextmv-1.4.0.dev0/nextmv/templates/java_json_hello-world}/README.md +0 -0
  327. {nextmv-1.3.1.dev4/nextmv/templates/java_json_template → nextmv-1.4.0.dev0/nextmv/templates/java_json_hello-world}/app.yaml +0 -0
  328. {nextmv-1.3.1.dev4/nextmv/templates/java_json_template → nextmv-1.4.0.dev0/nextmv/templates/java_json_hello-world}/input.json +0 -0
  329. {nextmv-1.3.1.dev4/nextmv/templates/java_json_template → nextmv-1.4.0.dev0/nextmv/templates/java_json_hello-world}/pom.xml +0 -0
  330. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/java_multi-file_app.yaml +0 -0
  331. {nextmv-1.3.1.dev4/nextmv/templates/java_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/java_multi-file_hello-world}/.gitignore +0 -0
  332. {nextmv-1.3.1.dev4/nextmv/templates/java_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/java_multi-file_hello-world}/Main.java +0 -0
  333. {nextmv-1.3.1.dev4/nextmv/templates/java_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/java_multi-file_hello-world}/README.md +0 -0
  334. {nextmv-1.3.1.dev4/nextmv/templates/java_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/java_multi-file_hello-world}/app.yaml +0 -0
  335. {nextmv-1.3.1.dev4/nextmv/templates/java_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/java_multi-file_hello-world}/inputs/input.json +0 -0
  336. {nextmv-1.3.1.dev4/nextmv/templates/java_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/java_multi-file_hello-world}/pom.xml +0 -0
  337. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/python_json_app.yaml +0 -0
  338. {nextmv-1.3.1.dev4/nextmv/templates/python_json_template → nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign}/.gitignore +0 -0
  339. {nextmv-1.3.1.dev4/nextmv/templates/python_json_template → nextmv-1.4.0.dev0/nextmv/templates/python_json_hello-world}/README.md +0 -0
  340. {nextmv-1.3.1.dev4/nextmv/templates/python_json_template → nextmv-1.4.0.dev0/nextmv/templates/python_json_hello-world}/app.yaml +0 -0
  341. {nextmv-1.3.1.dev4/nextmv/templates/python_json_template → nextmv-1.4.0.dev0/nextmv/templates/python_json_hello-world}/input.json +0 -0
  342. {nextmv-1.3.1.dev4/nextmv/templates/python_json_template → nextmv-1.4.0.dev0/nextmv/templates/python_json_hello-world}/main.py +0 -0
  343. {nextmv-1.3.1.dev4/nextmv/templates/python_json_template → nextmv-1.4.0.dev0/nextmv/templates/python_json_hello-world}/requirements.txt +0 -0
  344. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/python_multi-file_app.yaml +0 -0
  345. {nextmv-1.3.1.dev4/nextmv/templates/python_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow}/.gitignore +0 -0
  346. {nextmv-1.3.1.dev4/nextmv/templates/python_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_hello-world}/README.md +0 -0
  347. {nextmv-1.3.1.dev4/nextmv/templates/python_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_hello-world}/app.yaml +0 -0
  348. {nextmv-1.3.1.dev4/nextmv/templates/python_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_hello-world}/inputs/input.json +0 -0
  349. {nextmv-1.3.1.dev4/nextmv/templates/python_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_hello-world}/main.py +0 -0
  350. {nextmv-1.3.1.dev4/nextmv/templates/python_multi-file_template → nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_hello-world}/requirements.txt +0 -0
  351. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/__init__.py +0 -0
  352. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cli/__init__.py +0 -0
  353. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cli/test_configuration.py +0 -0
  354. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cli/test_main.py +0 -0
  355. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cli/test_version.py +0 -0
  356. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/__init__.py +0 -0
  357. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/app.yaml +0 -0
  358. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/test_client.py +0 -0
  359. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/test_instance.py +0 -0
  360. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/test_package.py +0 -0
  361. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/test_scenario.py +0 -0
  362. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/integration/__init__.py +0 -0
  363. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/integration/cloud/__init__.py +0 -0
  364. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/integration/cloud/test_integration_cloud.py +0 -0
  365. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/integration/cloud/test_integration_marketplace.py +0 -0
  366. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/local/__init__.py +0 -0
  367. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/local/test_application.py +0 -0
  368. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/local/test_executor.py +0 -0
  369. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/local/test_registry.py +0 -0
  370. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/local/test_runner.py +0 -0
  371. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/__init__.py +0 -0
  372. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options1.py +0 -0
  373. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options2.py +0 -0
  374. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options3.py +0 -0
  375. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options4.py +0 -0
  376. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options5.py +0 -0
  377. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options6.py +0 -0
  378. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options7.py +0 -0
  379. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_base_model.py +0 -0
  380. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_entrypoint/__init__.py +0 -0
  381. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_entrypoint/test_entrypoint.py +0 -0
  382. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_input.py +0 -0
  383. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_inputs/test_data.csv +0 -0
  384. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_inputs/test_data.json +0 -0
  385. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_inputs/test_data.txt +0 -0
  386. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_logger.py +0 -0
  387. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_manifest.py +0 -0
  388. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_model.py +0 -0
  389. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_options.py +0 -0
  390. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_output.py +0 -0
  391. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_polling.py +0 -0
  392. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_run.py +0 -0
  393. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_safe.py +0 -0
  394. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_serialization.py +0 -0
  395. {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_version.py +0 -0
@@ -161,10 +161,5 @@ cython_debug/
161
161
  # VSCode
162
162
  .vscode/
163
163
 
164
- # Agents
165
- .claude
166
-
167
164
  # Documentation stuff
168
165
  site/
169
-
170
- scratch
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextmv
3
- Version: 1.3.1.dev4
3
+ Version: 1.4.0.dev0
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/
@@ -227,8 +227,6 @@ Requires-Dist: questionary>=2.1.1
227
227
  Requires-Dist: requests>=2.31.0
228
228
  Requires-Dist: typer>=0.20.1
229
229
  Requires-Dist: urllib3>=2.1.0
230
- Provides-Extra: mcp
231
- Requires-Dist: mcp[cli]>=1.0; extra == 'mcp'
232
230
  Provides-Extra: notebook
233
231
  Requires-Dist: mlflow>=3.9.0; extra == 'notebook'
234
232
  Description-Content-Type: text/markdown
@@ -0,0 +1 @@
1
+ __version__ = "v1.4.0.dev0"
@@ -146,13 +146,14 @@ def create(
146
146
  if input_set_id is None:
147
147
  input_set_id = safe_id("input-set")
148
148
 
149
- managed_inputs = []
149
+ managed_input_list = []
150
150
  if managed_inputs is not None:
151
151
  for d in json.loads(managed_inputs):
152
152
  i = ManagedInput.from_dict(d)
153
153
  if i is None:
154
154
  error(f"[magenta]{d}[/magenta] is not a valid [yellow]ManagedInput[/yellow]")
155
- managed_inputs.append(i)
155
+
156
+ managed_input_list.append(i)
156
157
 
157
158
  input_set = cloud_app.new_input_set(
158
159
  input_set_id,
@@ -163,6 +164,6 @@ def create(
163
164
  start_time=start_time,
164
165
  end_time=end_time,
165
166
  maximum_runs=maximum_runs,
166
- inputs=managed_inputs,
167
+ inputs=managed_input_list or None,
167
168
  )
168
169
  print_json(input_set.to_dict())
@@ -73,113 +73,99 @@ def init() -> None:
73
73
  raise typer.Exit()
74
74
  rule()
75
75
 
76
- is_template = _template_question()
76
+ manifest_type = _manifest_type_question()
77
77
  rule()
78
78
 
79
- manifest_type = _manifest_type_question(is_template)
79
+ template = _template_question(manifest_type)
80
80
  rule()
81
81
 
82
- content_format = _content_format_question(is_template)
82
+ content_format = _content_format_question()
83
83
  rule()
84
84
 
85
- dirpath = _path_question(is_template)
85
+ dirpath = _path_question(template)
86
86
 
87
- local_app = _handle_files_initialization(is_template, dirpath, manifest_type, content_format)
87
+ local_app = _handle_files_initialization(template, dirpath, manifest_type, content_format)
88
88
  rule()
89
89
 
90
- commands = []
91
- try:
92
- local_run_id, cmds1 = _handle_local_run_create(local_app, is_template)
93
- commands.extend(cmds1)
90
+ if manifest_type == ManifestType.PYTHON and template == "demand-alloc":
91
+ message(
92
+ msg="This template is a complex, real-world example of a demand-forecast allocation workflow. "
93
+ "Please navigate to the directory and read the [magenta]README.md[/magenta] files for more information.",
94
+ emoji=":sparkles:",
95
+ )
94
96
  rule()
97
+ message(
98
+ msg="Congratulations! You've completed the Nextmv CLI tutorial.",
99
+ emoji=":rocket:",
100
+ )
95
101
 
96
- cmd2 = _handle_local_run_get(local_run_id)
97
- commands.append(cmd2)
98
- rule()
102
+ else:
103
+ commands = []
104
+ try:
105
+ local_run_id, cmds1 = _handle_local_run_create(local_app, template)
106
+ commands.extend(cmds1)
107
+ rule()
99
108
 
100
- cmd3 = _handle_configuration()
101
- commands.append(cmd3)
102
- rule()
109
+ cmd2 = _handle_local_run_get(local_run_id)
110
+ commands.append(cmd2)
111
+ rule()
103
112
 
104
- cloud_app, cmds4 = _handle_app_sync()
105
- commands.extend(cmds4)
106
- rule()
113
+ cmd3 = _handle_configuration()
114
+ commands.append(cmd3)
115
+ rule()
107
116
 
108
- cmd5 = _handle_app_push(cloud_app)
109
- commands.append(cmd5)
110
- rule()
117
+ cloud_app, cmds4 = _handle_app_sync()
118
+ commands.extend(cmds4)
119
+ rule()
111
120
 
112
- cloud_run_id, cmd6 = _handle_cloud_run_create(cloud_app, local_app, is_template)
113
- commands.append(cmd6)
114
- rule()
121
+ cmd5 = _handle_app_push(cloud_app)
122
+ commands.append(cmd5)
123
+ rule()
115
124
 
116
- cmd7 = _handle_cloud_run_get(cloud_app, cloud_run_id)
117
- commands.append(cmd7)
118
- rule()
125
+ cloud_run_id, cmd6 = _handle_cloud_run_create(cloud_app, local_app, template)
126
+ commands.append(cmd6)
127
+ rule()
128
+
129
+ cmd7 = _handle_cloud_run_get(cloud_app, cloud_run_id)
130
+ commands.append(cmd7)
131
+ rule()
119
132
 
120
- message(
121
- msg="Congratulations! You've completed the Nextmv CLI tutorial. "
122
- "This is a summary of the commands that were executed during the tutorial:",
123
- emoji=":rocket:",
124
- )
125
- except Exception:
126
- rule()
127
- message(msg="The tutorial was not completed! You can run [code]nextmv init[/code] any time.", emoji=":rabbit:")
128
- if len(commands) > 0:
129
133
  message(
130
- msg="Here are the commands that were run so far:",
134
+ msg="Congratulations! You've completed the Nextmv CLI tutorial. "
135
+ "This is a summary of the commands that were executed during the tutorial:",
131
136
  emoji=":rocket:",
132
137
  )
138
+ except Exception:
139
+ rule()
140
+ message(
141
+ msg="The tutorial was not completed! You can run [code]nextmv init[/code] any time.", emoji=":rabbit:"
142
+ )
143
+ if len(commands) > 0:
144
+ message(
145
+ msg="Here are the commands that were run so far:",
146
+ emoji=":rocket:",
147
+ )
133
148
 
134
- for cmd in commands:
135
- if cmd is not None:
136
- message(msg=f"- {cmd.explanation}: [code]{cmd.cmd}[/code]", indents=1)
149
+ for cmd in commands:
150
+ if cmd is not None:
151
+ message(msg=f"- {cmd.explanation}: [code]{cmd.cmd}[/code]", indents=1)
137
152
 
138
153
  print("", file=sys.stderr)
139
154
  message(msg="[yellow]Happy optimizing![/yellow]", emoji=":sparkles:")
140
155
 
141
156
 
142
- def _template_question() -> bool:
143
- """
144
- Ask the user if they want to start with a template or an existing model.
145
-
146
- Returns
147
- -------
148
- bool
149
- True if the user wants to start with a template, False if they want to
150
- start with an existing model.
151
- """
152
-
153
- init_type = choice(
154
- msg="Are you working with an existing model or do you want to start with a template?",
155
- choices=["Template", "Existing model"],
156
- default="Template",
157
- )
158
-
159
- return init_type == "Template"
160
-
161
-
162
- def _manifest_type_question(is_template: bool) -> ManifestType:
157
+ def _manifest_type_question() -> ManifestType:
163
158
  """
164
159
  Ask the user which language they want to use for their manifest.
165
160
 
166
- Parameters
167
- ----------
168
- is_template : bool
169
- Whether the user is starting with a template or an existing model.
170
-
171
161
  Returns
172
162
  -------
173
163
  ManifestType
174
164
  The type of manifest to initialize, based on the user's choice.
175
165
  """
176
166
 
177
- msg = "Which type (language) is your existing model written in?"
178
- if is_template:
179
- msg = "Which type (language) do you want to use for your Nextmv application template?"
180
-
181
167
  manifest_type = choice(
182
- msg=msg,
168
+ msg="Which type (language) do you want to work with?",
183
169
  choices=[member.value for member in ManifestType],
184
170
  default=ManifestType.PYTHON.value,
185
171
  )
@@ -191,7 +177,57 @@ def _manifest_type_question(is_template: bool) -> ManifestType:
191
177
  return manifest_type
192
178
 
193
179
 
194
- def _content_format_question(is_template: bool) -> ContentFormat:
180
+ def _template_question(manifest_type: ManifestType) -> str:
181
+ """
182
+ Ask the user how they want to start working with Nextmv.
183
+
184
+ Returns
185
+ -------
186
+ str
187
+ The user's choice for how to start working with Nextmv. If the user
188
+ chooses to start with an example template, the value will be the name
189
+ of the example. If they choose to start with an existing model, the
190
+ value will be "existing".
191
+ """
192
+
193
+ hello_world = questionary.Choice(
194
+ title="Example - hello world",
195
+ description="A simple, beginner-friendly example to get you started with the basics of Nextmv.",
196
+ value="hello-world",
197
+ )
198
+ existing_model = questionary.Choice(
199
+ title="Existing model",
200
+ description="I already have a model and want to make it work with Nextmv.",
201
+ value="existing",
202
+ )
203
+ if manifest_type == ManifestType.PYTHON:
204
+ choices = [
205
+ hello_world,
206
+ questionary.Choice(
207
+ title="Example - class-room assignment",
208
+ description="A more complete, real-world example to see Nextmv in action.",
209
+ value="class-assign",
210
+ ),
211
+ questionary.Choice(
212
+ title="Example - demand allocation workflow",
213
+ description="A complex example showcasing a decision workflow with multiple steps and a sub-app.",
214
+ value="demand-alloc",
215
+ ),
216
+ existing_model,
217
+ ]
218
+ else:
219
+ choices = [hello_world, existing_model]
220
+
221
+ init_type = choice(
222
+ msg="How do you want to start working with Nextmv?",
223
+ choices=choices,
224
+ default=hello_world.value,
225
+ )
226
+
227
+ return init_type
228
+
229
+
230
+ def _content_format_question() -> ContentFormat:
195
231
  """
196
232
  Ask the user which content format they want to use for their manifest.
197
233
 
@@ -212,12 +248,8 @@ def _content_format_question(is_template: bool) -> ContentFormat:
212
248
  description=member.description,
213
249
  )
214
250
 
215
- msg = "How does your existing model handle I/O (input/output) data?"
216
- if is_template:
217
- msg = "Which type of I/O (input/output) content format do you prefer for your app?"
218
-
219
251
  content_format = choice(
220
- msg=msg,
252
+ msg="Which type of I/O (input/output) content format do you prefer for your app?",
221
253
  choices=choices,
222
254
  default=ContentFormat.JSON.value,
223
255
  )
@@ -226,15 +258,15 @@ def _content_format_question(is_template: bool) -> ContentFormat:
226
258
  return content_format
227
259
 
228
260
 
229
- def _path_question(is_template: bool) -> str:
261
+ def _path_question(template: str) -> str:
230
262
  """
231
263
  Ask the user for the path to their existing model or where they want to
232
264
  initialize their template.
233
265
 
234
266
  Parameters
235
267
  ----------
236
- is_template : bool
237
- Whether the user is starting with a template or an existing model.
268
+ template : str
269
+ The name of the template or "existing" if the user is working with an existing model.
238
270
 
239
271
  Returns
240
272
  -------
@@ -244,7 +276,7 @@ def _path_question(is_template: bool) -> str:
244
276
  """
245
277
 
246
278
  msg = "What is the path to your existing model?"
247
- if is_template:
279
+ if template != "existing":
248
280
  msg = "Where would you like to initialize your Nextmv application template?"
249
281
 
250
282
  dirpath = directory_path(
@@ -257,7 +289,7 @@ def _path_question(is_template: bool) -> str:
257
289
 
258
290
 
259
291
  def _handle_files_initialization(
260
- is_template: bool,
292
+ template: str,
261
293
  dirpath: str,
262
294
  manifest_type: ManifestType,
263
295
  content_format: ContentFormat,
@@ -271,10 +303,8 @@ def _handle_files_initialization(
271
303
 
272
304
  Parameters
273
305
  ----------
274
- is_template : bool
275
- If True, a full application template is scaffolded under `dirpath`. If
276
- False, only the manifest (`app.yaml`) is initialized in the existing
277
- model directory.
306
+ template : str
307
+ The name of the template or "existing" if the user is working with an existing model.
278
308
  dirpath : str
279
309
  Path to the directory where the application or manifest will be
280
310
  initialized.
@@ -291,14 +321,15 @@ def _handle_files_initialization(
291
321
  local registry.
292
322
  """
293
323
 
294
- if is_template:
295
- template = f"{manifest_type.value}_{content_format.value}_template"
296
- resolved_template = _get_valid_path(template, os.stat)
324
+ if template != "existing":
325
+ template_dst = f"{manifest_type.value}_{content_format.value}_{template}"
326
+ resolved_template = _get_valid_path(template_dst, os.stat)
297
327
  local_app = local.Application.initialize(
298
328
  src=resolved_template,
299
329
  description="Sample Nextmv application initialized with the CLI.",
300
330
  manifest_type=manifest_type,
301
331
  content_format=content_format,
332
+ example=template,
302
333
  destination=dirpath,
303
334
  should_register=False,
304
335
  )
@@ -318,7 +349,7 @@ def _handle_files_initialization(
318
349
  return local_app
319
350
 
320
351
 
321
- def _handle_local_run_create(local_app: local.Application, is_template: bool) -> tuple[str, list[ExecutedCommand]]:
352
+ def _handle_local_run_create(local_app: local.Application, template: str) -> tuple[str, list[ExecutedCommand]]:
322
353
  """
323
354
  Prompt the user to start a local run for the initialized application.
324
355
 
@@ -330,8 +361,8 @@ def _handle_local_run_create(local_app: local.Application, is_template: bool) ->
330
361
  ----------
331
362
  local_app : Application
332
363
  The registered local application for which the run will be started.
333
- is_template : bool
334
- Indicates whether the application was initialized from a template.
364
+ template : str
365
+ The name of the template or "existing" if the user is working with an existing model.
335
366
 
336
367
  Returns
337
368
  -------
@@ -376,11 +407,25 @@ def _handle_local_run_create(local_app: local.Application, is_template: bool) ->
376
407
  cmd = ExecutedCommand(cmd=cmd_str, explanation="Compile/build the application")
377
408
  commands.append(cmd)
378
409
 
410
+ # If the application is Python, we ask if the user wants to install
411
+ # dependencies with pip.
412
+ if man_type == ManifestType.PYTHON and template != "hello-world":
413
+ cmd_str = Prompt.ask(
414
+ prompt=f"This application is of type [magenta]{man_type.value}[/magenta]. "
415
+ "Please type the command needed to install deps (e.g. [code]pip install -r requirements.txt[/code]). "
416
+ "Leave blank to omit",
417
+ default="",
418
+ )
419
+ if cmd_str:
420
+ result = _cli_call(cmd_str.split())
421
+ cmd = ExecutedCommand(cmd=cmd_str, explanation="Install dependencies for the Python application")
422
+ commands.append(cmd)
423
+
379
424
  # Select the input path to run the local app.
380
425
  default = "."
381
- if is_template and local_app.content_format == ContentFormat.JSON:
426
+ if template != "existing" and local_app.content_format == ContentFormat.JSON:
382
427
  default = "input.json"
383
- elif is_template and local_app.content_format == ContentFormat.MULTI_FILE:
428
+ elif template != "existing" and local_app.content_format == ContentFormat.MULTI_FILE:
384
429
  default = "inputs/"
385
430
 
386
431
  dirpath = directory_path(
@@ -457,14 +502,7 @@ def _handle_local_run_get(run_id: str) -> ExecutedCommand:
457
502
  raise typer.Exit()
458
503
 
459
504
  # Actually execute the command to get the local run results.
460
- command = [
461
- "nextmv",
462
- "local",
463
- "run",
464
- "get",
465
- "--run-id",
466
- run_id,
467
- ]
505
+ command = ["nextmv", "local", "run", "get", "--run-id", run_id, "--wait"]
468
506
  str_cmd = " ".join(command)
469
507
  in_progress(f"Getting local run results with command: [code]{str_cmd}[/code]")
470
508
  result = _cli_call(command)
@@ -851,16 +889,7 @@ def _handle_cloud_run_get(cloud_app: cloud.Application, run_id: str) -> Executed
851
889
  raise typer.Exit()
852
890
 
853
891
  # Actually execute the command to get the Cloud run results.
854
- command = [
855
- "nextmv",
856
- "cloud",
857
- "run",
858
- "get",
859
- "--app-id",
860
- cloud_app.id,
861
- "--run-id",
862
- run_id,
863
- ]
892
+ command = ["nextmv", "cloud", "run", "get", "--app-id", cloud_app.id, "--run-id", run_id, "--wait"]
864
893
  str_cmd = " ".join(command)
865
894
  in_progress(f"Getting [italic]remote[/italic] run results with command: [code]{str_cmd}[/code]")
866
895
  result = _cli_call(command)
@@ -55,14 +55,6 @@ app.add_typer(local_app, name="local")
55
55
  app.add_typer(manifest_app, name="manifest")
56
56
  app.add_typer(version_app)
57
57
 
58
- # Register the MCP subcommand only if the mcp extra is installed.
59
- try:
60
- from nextmv.cli.mcp import app as mcp_app
61
-
62
- app.add_typer(mcp_app, name="mcp", rich_help_panel="Preview")
63
- except ImportError:
64
- pass
65
-
66
58
 
67
59
  @app.callback()
68
60
  def callback(
@@ -87,7 +79,7 @@ def callback(
87
79
  return
88
80
 
89
81
  # Skip checks for certain commands.
90
- ignored_commands = {"configuration", "mcp", "local", "init", "manifest", "version"}
82
+ ignored_commands = {"configuration", "local", "init", "manifest", "version"}
91
83
  if ctx.invoked_subcommand in ignored_commands:
92
84
  return
93
85
 
@@ -262,7 +262,6 @@ class ApplicationBatchMixin:
262
262
  option_sets: dict[str, dict[str, str]] | None = None,
263
263
  runs: list[BatchExperimentRun | dict[str, Any]] | None = None,
264
264
  type: str | None = "batch",
265
- content_type: str | None = None,
266
265
  ) -> str:
267
266
  """
268
267
  Create a new batch experiment.
@@ -287,10 +286,6 @@ class ApplicationBatchMixin:
287
286
  Type of the batch experiment. This is used to determine the
288
287
  experiment type. The default value is "batch". If you want to
289
288
  create a scenario test, set this to "scenario".
290
- content_type: Optional[str]
291
- Content type for the app's input/output format. Set to
292
- "multi-file" for multi-file apps. If not provided, defaults
293
- to the app's configured content type.
294
289
 
295
290
  Returns
296
291
  -------
@@ -328,8 +323,6 @@ class ApplicationBatchMixin:
328
323
  payload["runs"] = payload_runs
329
324
  if type is not None:
330
325
  payload["type"] = type
331
- if content_type is not None:
332
- payload["content_type"] = content_type
333
326
 
334
327
  response = self.client.request(
335
328
  method="POST",
@@ -411,7 +404,6 @@ class ApplicationBatchMixin:
411
404
  name: str | None = None,
412
405
  description: str | None = None,
413
406
  repetitions: int | None = 0,
414
- content_type: str | None = None,
415
407
  ) -> str:
416
408
  """
417
409
  Create a new scenario test. The test is based on `scenarios` and you
@@ -456,10 +448,6 @@ class ApplicationBatchMixin:
456
448
  repetition means that the test will be repeated once, i.e.: it
457
449
  will be executed twice. 2 repetitions equals 3 executions, so on,
458
450
  and so forth.
459
- content_type: Optional[str]
460
- Content type for the app's input/output format. Set to
461
- "multi-file" for multi-file apps. If not provided, defaults
462
- to the app's configured content type.
463
451
 
464
452
  Returns
465
453
  -------
@@ -536,7 +524,6 @@ class ApplicationBatchMixin:
536
524
  type="scenario",
537
525
  option_sets=opt_sets,
538
526
  runs=runs,
539
- content_type=content_type,
540
527
  )
541
528
 
542
529
  def new_scenario_test_with_result(
@@ -546,7 +533,6 @@ class ApplicationBatchMixin:
546
533
  name: str | None = None,
547
534
  description: str | None = None,
548
535
  repetitions: int | None = 0,
549
- content_type: str | None = None,
550
536
  polling_options: PollingOptions = DEFAULT_POLLING_OPTIONS,
551
537
  ) -> BatchExperiment:
552
538
  """
@@ -598,7 +584,6 @@ class ApplicationBatchMixin:
598
584
  name=name,
599
585
  description=description,
600
586
  repetitions=repetitions,
601
- content_type=content_type,
602
587
  )
603
588
 
604
589
  return self.scenario_test_with_polling(
@@ -18,6 +18,7 @@ from nextmv._serialization import deflated_serialize_json
18
18
  from nextmv.base_model import BaseModel
19
19
  from nextmv.cloud.assets import RunAsset
20
20
  from nextmv.cloud.client import get_size
21
+ from nextmv.cloud.input_set import ManagedInput
21
22
  from nextmv.cloud.url import DownloadURL
22
23
  from nextmv.input import Input, InputFormat
23
24
  from nextmv.logger import log
@@ -256,7 +257,7 @@ class ApplicationRunMixin:
256
257
 
257
258
  def new_run( # noqa: C901 # Refactor this function at some point.
258
259
  self: "Application",
259
- input: Input | dict[str, Any] | BaseModel | str = None,
260
+ input: Input | dict[str, Any] | ManagedInput | BaseModel | str = None,
260
261
  instance_id: str | None = None,
261
262
  name: str | None = None,
262
263
  description: str | None = None,
@@ -275,9 +276,9 @@ class ApplicationRunMixin:
275
276
 
276
277
  Parameters
277
278
  ----------
278
- input: Union[Input, dict[str, Any], BaseModel, str]
279
+ input: Union[Input, dict[str, Any], ManagedInput, BaseModel, str]
279
280
  Input to use for the run. This can be a `nextmv.Input` object,
280
- `dict`, `BaseModel` or `str`.
281
+ `dict`, `ManagedInput`, `BaseModel` or `str`.
281
282
 
282
283
  If `nextmv.Input` is used, and the `input_format` is either
283
284
  `nextmv.InputFormat.JSON` or `nextmv.InputFormat.TEXT`, then the
@@ -380,14 +381,22 @@ class ApplicationRunMixin:
380
381
 
381
382
  input_data = self.__extract_input_data(input)
382
383
 
384
+ managed_input_used, managed_input = self.__prepare_managed_input(
385
+ managed_input=input,
386
+ managed_input_id=managed_input_id,
387
+ )
388
+ if managed_input_used:
389
+ input = managed_input
390
+ if input_dir_path is not None and input_dir_path != "":
391
+ raise ValueError("Cannot specify both a managed input and an input directory path.")
392
+
383
393
  input_size = 0
384
394
  if input_data is not None:
385
395
  input_size = get_size(input_data)
386
396
 
387
- managed_input_id_used = managed_input_id is not None and managed_input_id != ""
388
397
  upload_id_used = upload_id is not None and upload_id != ""
389
398
  if self.__upload_url_required(
390
- uploaded_input_used=upload_id_used or managed_input_id_used,
399
+ uploaded_input_used=upload_id_used or managed_input_used,
391
400
  input_size=input_size,
392
401
  tar_file=tar_file,
393
402
  input=input,
@@ -409,8 +418,8 @@ class ApplicationRunMixin:
409
418
  # use `upload_id` if no managed input is defined but `upload_id` is or
410
419
  # the input used necessitated the input be uploaded, and use `input`
411
420
  # for all remaining cases.
412
- if managed_input_id_used:
413
- payload["input_id"] = managed_input_id
421
+ if managed_input_used:
422
+ payload["input_id"] = managed_input.id
414
423
  elif upload_id_used:
415
424
  payload["upload_id"] = upload_id
416
425
  else:
@@ -453,7 +462,7 @@ class ApplicationRunMixin:
453
462
 
454
463
  def new_run_with_result(
455
464
  self: "Application",
456
- input: Input | dict[str, Any] | BaseModel | str = None,
465
+ input: Input | dict[str, Any] | ManagedInput | BaseModel | str = None,
457
466
  instance_id: str | None = None,
458
467
  name: str | None = None,
459
468
  description: str | None = None,
@@ -476,9 +485,9 @@ class ApplicationRunMixin:
476
485
 
477
486
  Parameters
478
487
  ----------
479
- input: Union[Input, dict[str, Any], BaseModel, str]
488
+ input: Union[Input, dict[str, Any], ManagedInput, BaseModel, str]
480
489
  Input to use for the run. This can be a `nextmv.Input` object,
481
- `dict`, `BaseModel` or `str`.
490
+ `dict`, `ManagedInput`, `BaseModel` or `str`.
482
491
 
483
492
  If `nextmv.Input` is used, and the `input_format` is either
484
493
  `nextmv.InputFormat.JSON` or `nextmv.InputFormat.TEXT`, then the
@@ -561,7 +570,8 @@ class ApplicationRunMixin:
561
570
  required if the output is non-JSON. If the directory does not exist, it
562
571
  will be created. Uses the current directory by default.
563
572
  managed_input_id : Optional[str],
564
- The ID of an existing managed input (`nextmv.cloud.ManagedInput`) to use as the run's input.
573
+ The ID of an existing managed input (`nextmv.cloud.ManagedInput`) to use as
574
+ the run's input.
565
575
 
566
576
  Returns
567
577
  ----------
@@ -1393,6 +1403,18 @@ class ApplicationRunMixin:
1393
1403
 
1394
1404
  return input_data
1395
1405
 
1406
+ def __prepare_managed_input(
1407
+ self: "Application",
1408
+ managed_input_id: str | None,
1409
+ managed_input: ManagedInput | None,
1410
+ ) -> tuple[bool, ManagedInput | None]:
1411
+ if managed_input is not None and isinstance(managed_input, ManagedInput):
1412
+ return True, managed_input
1413
+ elif managed_input_id is not None and managed_input_id != "":
1414
+ return True, self.managed_input(managed_input_id=managed_input_id)
1415
+ else:
1416
+ return False, None
1417
+
1396
1418
  def __extract_options_dict(
1397
1419
  self: "Application",
1398
1420
  options: Options | dict[str, str] | None = None,
@@ -1420,7 +1442,7 @@ class ApplicationRunMixin:
1420
1442
 
1421
1443
  def __extract_run_config(
1422
1444
  self: "Application",
1423
- input: Input | dict[str, Any] | BaseModel | str = None,
1445
+ input: Input | dict[str, Any] | ManagedInput | BaseModel | str = None,
1424
1446
  configuration: RunConfiguration | dict[str, Any] | None = None,
1425
1447
  dir_path: str | None = None,
1426
1448
  ) -> dict[str, Any]:
@@ -1436,6 +1458,8 @@ class ApplicationRunMixin:
1436
1458
  return configuration_dict
1437
1459
 
1438
1460
  configuration = RunConfiguration()
1461
+ if isinstance(input, ManagedInput):
1462
+ configuration.format = input.format
1439
1463
  configuration.resolve(input=input, dir_path=dir_path)
1440
1464
  configuration_dict = configuration.to_dict()
1441
1465