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.
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/.gitignore +0 -5
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/PKG-INFO +1 -3
- nextmv-1.4.0.dev0/nextmv/__about__.py +1 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/create.py +4 -3
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/init.py +141 -112
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/main.py +1 -9
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_batch_scenario.py +0 -15
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_run.py +36 -12
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/batch_experiment.py +0 -2
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/application.py +34 -4
- nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/README.md +48 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/app.yaml +87 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/input.json +303 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/main.py +439 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/requirements.txt +3 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign/visualizations.py +656 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/.gitignore +1 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/README.md +14 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/README.md +50 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/app.yaml +83 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/input.json +7 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/main.py +494 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/requirements.txt +4 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/allocation/visuals.py +89 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/README.md +72 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/app.yaml +70 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/input.json +436 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/main.py +176 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/requirements.txt +5 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_demand-alloc/workflow/visuals.py +187 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_json_hello-world/.gitignore +1 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/.gitignore +1 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/README.md +48 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/app.yaml +95 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/inputs/input.json +303 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/main.py +451 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/requirements.txt +3 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_class-assign/visualizations.py +656 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/README.md +14 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/README.md +50 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/app.yaml +83 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/input.json +7 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/main.py +494 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/requirements.txt +4 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/allocation/visuals.py +89 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/README.md +70 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/app.yaml +78 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/inputs/input.json +436 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/main.py +187 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/requirements.txt +5 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_demand-alloc/workflow/visuals.py +187 -0
- nextmv-1.4.0.dev0/nextmv/templates/python_multi-file_hello-world/.gitignore +2 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/pyproject.toml +0 -4
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/uv.lock +10 -303
- nextmv-1.3.1.dev4/nextmv/__about__.py +0 -1
- nextmv-1.3.1.dev4/nextmv/cli/mcp/__init__.py +0 -38
- nextmv-1.3.1.dev4/nextmv/cli/mcp/serve.py +0 -65
- nextmv-1.3.1.dev4/nextmv/cli/mcp/server.py +0 -115
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/WORKFLOW.md +0 -373
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/__init__.py +0 -1
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/_helpers.py +0 -329
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/acceptance.py +0 -112
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/account.py +0 -47
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/app.py +0 -148
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/batch.py +0 -110
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/community.py +0 -45
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/ensemble.py +0 -338
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/guide.py +0 -25
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/input_set.py +0 -145
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/instance.py +0 -140
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/local.py +0 -425
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/managed_input.py +0 -108
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/profile.py +0 -89
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/run.py +0 -405
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/scenario.py +0 -227
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/secrets.py +0 -100
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/shadow.py +0 -149
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/sso.py +0 -28
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/switchback.py +0 -159
- nextmv-1.3.1.dev4/nextmv/cli/mcp/tools/version.py +0 -113
- nextmv-1.3.1.dev4/tests/cli/test_mcp.py +0 -2054
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/.python-version +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/CONTRIBUTING.md +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/LICENSE +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/README.md +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/__entrypoint__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/_serialization.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/base_model.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/acceptance/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/account/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/account/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/account/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/account/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/account/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/exists.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/push.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/app/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/metadata.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/batch/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/data/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/data/upload.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/ensemble/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/input_set/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/exists.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/instance/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/managed_input/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/app/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/app/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/app/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/app/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/app/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/subscription/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/subscription/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/subscription/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/subscription/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/subscription/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/version/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/version/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/version/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/version/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/marketplace/version/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/cancel.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/input.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/logs.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/metadata.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/run/track.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/metadata.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/scenario/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/secrets/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/metadata.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/start.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/stop.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/shadow/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/disable.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/domain/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/domain/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/enable.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/sso/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/metadata.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/start.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/stop.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/switchback/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/upload/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/upload/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/exists.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/cloud/version/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/community/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/community/clone.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/community/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/configuration/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/configuration/config.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/configuration/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/configuration/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/configuration/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/delete.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/register.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/registered.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/sync.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/app/update.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/create.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/get.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/input.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/list.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/logs.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/metadata.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/local/run/visuals.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/manifest/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/manifest/init.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/manifest/validate.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/message.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/options.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cli/version.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/acceptance_test.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/account.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_acceptance.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_ensemble.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_input_set.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_instance.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_managed_input.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_secrets.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_shadow.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_switchback.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_utils.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/application/_version.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/assets.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/client.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/community.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/ensemble.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/input_set.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/instance.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/integration.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/marketplace.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/package.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/scenario.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/secrets.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/shadow.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/sso.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/switchback.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/url.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/cloud/version.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/content_format.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/.gitignore +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/README.md +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/app.yaml +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/input.json +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/main.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/requirements.txt +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/src/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/default_app/src/visuals.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/deprecated.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/input.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/executor.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/geojson_handler.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/local.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/plotly_handler.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/registry.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/local/runner.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/logger.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/manifest.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/model.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/options.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/output.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/polling.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/run.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/safe.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/status.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/binary_json_app.yaml +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/binary_multi-file_app.yaml +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/go_json_app.yaml +0 -0
- {nextmv-1.3.1.dev4/nextmv/templates/go_json_template → nextmv-1.4.0.dev0/nextmv/templates/go_json_hello-world}/.gitignore +0 -0
- {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
- {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
- {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
- {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
- {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
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/go_multi-file_app.yaml +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/java_json_app.yaml +0 -0
- {nextmv-1.3.1.dev4/nextmv/templates/java_json_template → nextmv-1.4.0.dev0/nextmv/templates/java_json_hello-world}/.gitignore +0 -0
- {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
- {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
- {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
- {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
- {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
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/java_multi-file_app.yaml +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/python_json_app.yaml +0 -0
- {nextmv-1.3.1.dev4/nextmv/templates/python_json_template → nextmv-1.4.0.dev0/nextmv/templates/python_json_class-assign}/.gitignore +0 -0
- {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
- {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
- {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
- {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
- {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
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/nextmv/templates/python_multi-file_app.yaml +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cli/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cli/test_configuration.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cli/test_main.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cli/test_version.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/app.yaml +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/test_client.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/test_instance.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/test_package.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/cloud/test_scenario.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/integration/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/integration/cloud/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/integration/cloud/test_integration_cloud.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/integration/cloud/test_integration_marketplace.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/local/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/local/test_application.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/local/test_executor.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/local/test_registry.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/local/test_runner.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options1.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options2.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options3.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options4.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options5.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options6.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/scripts/options7.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_base_model.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_entrypoint/__init__.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_entrypoint/test_entrypoint.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_input.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_inputs/test_data.csv +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_inputs/test_data.json +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_inputs/test_data.txt +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_logger.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_manifest.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_model.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_options.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_output.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_polling.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_run.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_safe.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_serialization.py +0 -0
- {nextmv-1.3.1.dev4 → nextmv-1.4.0.dev0}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nextmv
|
|
3
|
-
Version: 1.
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
76
|
+
manifest_type = _manifest_type_question()
|
|
77
77
|
rule()
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
template = _template_question(manifest_type)
|
|
80
80
|
rule()
|
|
81
81
|
|
|
82
|
-
content_format = _content_format_question(
|
|
82
|
+
content_format = _content_format_question()
|
|
83
83
|
rule()
|
|
84
84
|
|
|
85
|
-
dirpath = _path_question(
|
|
85
|
+
dirpath = _path_question(template)
|
|
86
86
|
|
|
87
|
-
local_app = _handle_files_initialization(
|
|
87
|
+
local_app = _handle_files_initialization(template, dirpath, manifest_type, content_format)
|
|
88
88
|
rule()
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
97
|
-
commands
|
|
98
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
109
|
+
cmd2 = _handle_local_run_get(local_run_id)
|
|
110
|
+
commands.append(cmd2)
|
|
111
|
+
rule()
|
|
103
112
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
113
|
+
cmd3 = _handle_configuration()
|
|
114
|
+
commands.append(cmd3)
|
|
115
|
+
rule()
|
|
107
116
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
117
|
+
cloud_app, cmds4 = _handle_app_sync()
|
|
118
|
+
commands.extend(cmds4)
|
|
119
|
+
rule()
|
|
111
120
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
121
|
+
cmd5 = _handle_app_push(cloud_app)
|
|
122
|
+
commands.append(cmd5)
|
|
123
|
+
rule()
|
|
115
124
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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="
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
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=
|
|
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
|
|
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=
|
|
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(
|
|
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
|
-
|
|
237
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
275
|
-
|
|
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
|
|
295
|
-
|
|
296
|
-
resolved_template = _get_valid_path(
|
|
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,
|
|
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
|
-
|
|
334
|
-
|
|
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
|
|
426
|
+
if template != "existing" and local_app.content_format == ContentFormat.JSON:
|
|
382
427
|
default = "input.json"
|
|
383
|
-
elif
|
|
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", "
|
|
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
|
|
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
|
|
413
|
-
payload["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
|
|
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
|
|