nextmv 1.6.2.dev0__tar.gz → 1.7.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.6.2.dev0 → nextmv-1.7.0.dev0}/CONTRIBUTING.md +3 -3
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/PKG-INFO +1 -1
- nextmv-1.7.0.dev0/nextmv/__about__.py +1 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/__init__.py +2 -2
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/app/push.py +28 -12
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/instance/create.py +9 -6
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/instance/update.py +6 -3
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/managed_input/create.py +7 -4
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/run/create.py +10 -8
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/run/get.py +15 -5
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/run/input.py +2 -2
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/run/track.py +40 -28
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/configuration/config.py +3 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/init.py +15 -21
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/run/create.py +8 -6
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/run/get.py +14 -4
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/run/input.py +2 -2
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/main.py +103 -10
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/manifest/init.py +5 -2
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/_helpers.py +13 -13
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/message.py +41 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/__init__.py +2 -2
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_managed_input.py +3 -4
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_run.py +31 -32
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/client.py +7 -7
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/package.py +2 -2
- nextmv-1.7.0.dev0/nextmv/content_format.py +122 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/input.py +326 -154
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/local/application.py +256 -77
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/local/executor.py +79 -130
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/local/registry.py +9 -9
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/manifest.py +184 -22
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/model.py +1 -61
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/output.py +1076 -275
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/run.py +76 -35
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/binary_multi-file_app.yaml +3 -3
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_multi-file_app.yaml +3 -3
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_multi-file_hello-world/app.yaml +2 -2
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_multi-file_hello-world/main.go +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_multi-file_app.yaml +3 -3
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_multi-file_hello-world/Main.java +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_multi-file_hello-world/app.yaml +2 -2
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_class-assign/main.py +5 -7
- {nextmv-1.6.2.dev0/nextmv/templates/python_multi-file_class-assign → nextmv-1.7.0.dev0/nextmv/templates/python_json_class-assign}/requirements.txt +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/allocation/main.py +48 -42
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/allocation/requirements.txt +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/workflow/main.py +2 -3
- {nextmv-1.6.2.dev0/nextmv/templates/python_multi-file_demand-alloc → nextmv-1.7.0.dev0/nextmv/templates/python_json_demand-alloc}/workflow/requirements.txt +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_hello-world/main.py +3 -8
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_hello-world/requirements.txt +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_app.yaml +3 -3
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_class-assign/app.yaml +3 -3
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_class-assign/main.py +4 -10
- {nextmv-1.6.2.dev0/nextmv/templates/python_json_class-assign → nextmv-1.7.0.dev0/nextmv/templates/python_multi-file_class-assign}/requirements.txt +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/main.py +30 -27
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/requirements.txt +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/app.yaml +3 -3
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/main.py +2 -2
- {nextmv-1.6.2.dev0/nextmv/templates/python_json_demand-alloc → nextmv-1.7.0.dev0/nextmv/templates/python_multi-file_demand-alloc}/workflow/requirements.txt +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_hello-world/app.yaml +3 -3
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_hello-world/main.py +2 -11
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_hello-world/requirements.txt +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/cli/test_configuration.py +10 -6
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/cli/test_main.py +4 -4
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/cli/test_mcp.py +36 -117
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/cloud/app.yaml +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/local/test_application.py +12 -12
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/local/test_executor.py +49 -80
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/local/test_registry.py +34 -34
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_input.py +570 -28
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_manifest.py +1 -1
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_output.py +1078 -44
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/uv.lock +184 -174
- nextmv-1.6.2.dev0/nextmv/__about__.py +0 -1
- nextmv-1.6.2.dev0/nextmv/content_format.py +0 -53
- nextmv-1.6.2.dev0/nextmv/default_app/README.md +0 -32
- nextmv-1.6.2.dev0/nextmv/default_app/app.yaml +0 -21
- nextmv-1.6.2.dev0/nextmv/default_app/main.py +0 -35
- nextmv-1.6.2.dev0/nextmv/default_app/requirements.txt +0 -2
- nextmv-1.6.2.dev0/nextmv/default_app/src/visuals.py +0 -36
- nextmv-1.6.2.dev0/nextmv/templates/python_json_hello-world/.gitignore +0 -1
- nextmv-1.6.2.dev0/nextmv/templates/python_multi-file_hello-world/inputs/input.json +0 -5
- nextmv-1.6.2.dev0/tests/test_entrypoint/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/.python-version +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/LICENSE +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/__entrypoint__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/_serialization.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/account.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/base_model.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/acceptance/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/acceptance/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/acceptance/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/acceptance/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/acceptance/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/account/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/account/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/account/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/account/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/account/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/app/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/app/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/app/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/app/exists.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/app/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/app/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/app/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/batch/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/batch/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/batch/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/batch/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/batch/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/batch/metadata.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/batch/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/data/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/data/upload.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/ensemble/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/ensemble/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/ensemble/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/ensemble/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/ensemble/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/ensemble/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/input_set/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/input_set/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/input_set/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/input_set/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/input_set/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/input_set/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/instance/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/instance/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/instance/exists.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/instance/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/instance/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/managed_input/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/managed_input/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/managed_input/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/managed_input/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/app/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/app/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/app/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/app/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/app/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/subscription/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/subscription/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/subscription/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/subscription/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/subscription/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/version/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/version/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/version/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/version/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/marketplace/version/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/run/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/run/cancel.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/run/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/run/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/run/logs.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/run/metadata.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/scenario/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/scenario/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/scenario/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/scenario/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/scenario/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/scenario/metadata.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/scenario/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/secrets/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/secrets/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/secrets/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/secrets/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/secrets/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/secrets/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/shadow/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/shadow/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/shadow/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/shadow/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/shadow/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/shadow/metadata.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/shadow/start.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/shadow/stop.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/shadow/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/sso/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/sso/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/sso/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/sso/disable.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/sso/domain/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/sso/domain/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/sso/enable.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/sso/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/sso/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/switchback/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/switchback/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/switchback/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/switchback/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/switchback/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/switchback/metadata.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/switchback/start.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/switchback/stop.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/switchback/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/upload/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/upload/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/version/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/version/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/version/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/version/exists.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/version/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/version/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/cloud/version/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/community/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/community/clone.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/community/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/configuration/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/configuration/create.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/configuration/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/configuration/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/app/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/app/delete.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/app/get.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/app/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/app/register.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/app/registered.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/app/sync.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/app/update.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/run/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/run/list.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/run/logs.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/run/metadata.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/local/run/visuals.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/manifest/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/manifest/validate.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/serve.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/server.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/WORKFLOW.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/acceptance.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/account.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/app.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/batch.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/community.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/ensemble.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/guide.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/input_set.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/instance.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/local.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/managed_input.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/profile.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/run.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/scenario.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/secrets.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/shadow.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/sso.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/switchback.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/mcp/tools/version.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/options.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cli/version.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/acceptance_test.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/account.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_acceptance.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_batch_scenario.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_ensemble.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_input_set.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_instance.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_secrets.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_shadow.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_switchback.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_utils.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/application/_version.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/assets.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/batch_experiment.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/community.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/ensemble.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/input_set.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/instance.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/integration.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/marketplace.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/scenario.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/secrets.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/shadow.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/sso.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/switchback.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/url.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/cloud/version.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/deprecated.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/local/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/local/geojson_handler.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/local/local.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/local/plotly_handler.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/local/runner.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/logger.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/options.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/polling.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/safe.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/status.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/binary_json_app.yaml +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_json_app.yaml +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_json_hello-world/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_json_hello-world/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_json_hello-world/app.yaml +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_json_hello-world/go.mod +0 -0
- {nextmv-1.6.2.dev0/nextmv/default_app → nextmv-1.7.0.dev0/nextmv/templates/go_json_hello-world}/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_json_hello-world/main.go +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_multi-file_hello-world/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_multi-file_hello-world/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/go_multi-file_hello-world/go.mod +0 -0
- {nextmv-1.6.2.dev0/nextmv/templates/go_json_hello-world → nextmv-1.7.0.dev0/nextmv/templates/go_multi-file_hello-world/inputs}/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_json_app.yaml +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_json_hello-world/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_json_hello-world/Main.java +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_json_hello-world/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_json_hello-world/app.yaml +0 -0
- {nextmv-1.6.2.dev0/nextmv/templates/go_multi-file_hello-world/inputs → nextmv-1.7.0.dev0/nextmv/templates/java_json_hello-world}/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_json_hello-world/pom.xml +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_multi-file_hello-world/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_multi-file_hello-world/README.md +0 -0
- {nextmv-1.6.2.dev0/nextmv/templates/java_json_hello-world → nextmv-1.7.0.dev0/nextmv/templates/java_multi-file_hello-world/inputs}/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/java_multi-file_hello-world/pom.xml +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_app.yaml +0 -0
- {nextmv-1.6.2.dev0/nextmv/default_app → nextmv-1.7.0.dev0/nextmv/templates/python_json_class-assign}/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_class-assign/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_class-assign/app.yaml +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_class-assign/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_class-assign/visualizations.py +0 -0
- {nextmv-1.6.2.dev0/nextmv/templates/python_json_class-assign → nextmv-1.7.0.dev0/nextmv/templates/python_json_demand-alloc}/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/allocation/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/allocation/app.yaml +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/allocation/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/allocation/visuals.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/workflow/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/workflow/app.yaml +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/workflow/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_demand-alloc/workflow/visuals.py +0 -0
- {nextmv-1.6.2.dev0/nextmv/templates/python_json_demand-alloc → nextmv-1.7.0.dev0/nextmv/templates/python_json_hello-world}/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_hello-world/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_json_hello-world/app.yaml +0 -0
- {nextmv-1.6.2.dev0/nextmv/templates/java_multi-file_hello-world/inputs → nextmv-1.7.0.dev0/nextmv/templates/python_json_hello-world}/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_class-assign/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_class-assign/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_class-assign/inputs/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_class-assign/visualizations.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/app.yaml +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/visuals.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/README.md +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/inputs/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/visuals.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_hello-world/.gitignore +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/nextmv/templates/python_multi-file_hello-world/README.md +0 -0
- {nextmv-1.6.2.dev0/nextmv/templates/python_json_hello-world → nextmv-1.7.0.dev0/nextmv/templates/python_multi-file_hello-world/inputs}/input.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/pyproject.toml +0 -0
- {nextmv-1.6.2.dev0/nextmv/default_app/src → nextmv-1.7.0.dev0/tests}/__init__.py +0 -0
- {nextmv-1.6.2.dev0/tests → nextmv-1.7.0.dev0/tests/cli}/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/cli/test_version.py +0 -0
- {nextmv-1.6.2.dev0/tests/cli → nextmv-1.7.0.dev0/tests/cloud}/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/cloud/test_client.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/cloud/test_instance.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/cloud/test_package.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/cloud/test_scenario.py +0 -0
- {nextmv-1.6.2.dev0/tests/cloud → nextmv-1.7.0.dev0/tests/integration}/__init__.py +0 -0
- {nextmv-1.6.2.dev0/tests/integration → nextmv-1.7.0.dev0/tests/integration/cloud}/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/integration/cloud/test_integration_cloud.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/integration/cloud/test_integration_marketplace.py +0 -0
- {nextmv-1.6.2.dev0/tests/integration/cloud → nextmv-1.7.0.dev0/tests/local}/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/local/test_runner.py +0 -0
- {nextmv-1.6.2.dev0/tests/local → nextmv-1.7.0.dev0/tests/scripts}/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/scripts/options1.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/scripts/options2.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/scripts/options3.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/scripts/options4.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/scripts/options5.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/scripts/options6.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/scripts/options7.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_base_model.py +0 -0
- {nextmv-1.6.2.dev0/tests/scripts → nextmv-1.7.0.dev0/tests/test_entrypoint}/__init__.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_entrypoint/test_entrypoint.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_inputs/test_data.csv +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_inputs/test_data.json +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_inputs/test_data.txt +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_logger.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_model.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_options.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_polling.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_run.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_safe.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_serialization.py +0 -0
- {nextmv-1.6.2.dev0 → nextmv-1.7.0.dev0}/tests/test_version.py +0 -0
|
@@ -331,15 +331,15 @@ guidelines:
|
|
|
331
331
|
- When showing the values of an `Enum`, use the `enum_values` function in the
|
|
332
332
|
`message.py` file which will give a nicely colored, comma-separated list of
|
|
333
333
|
the enum values. Consider the following example, where we get the allowed
|
|
334
|
-
values for the `
|
|
334
|
+
values for the `ContentFormat` class.
|
|
335
335
|
|
|
336
336
|
```python
|
|
337
337
|
content_format: Annotated[
|
|
338
|
-
|
|
338
|
+
ContentFormat | None,
|
|
339
339
|
typer.Option(
|
|
340
340
|
"--content-format",
|
|
341
341
|
"-c",
|
|
342
|
-
help=f"The content format for the instance. Allowed values are: {enum_values(
|
|
342
|
+
help=f"The content format for the instance. Allowed values are: {enum_values(ContentFormat)}.",
|
|
343
343
|
metavar="CONTENT_FORMAT",
|
|
344
344
|
rich_help_panel="Instance configuration",
|
|
345
345
|
),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "v1.7.0.dev0"
|
|
@@ -5,9 +5,9 @@ from .account import AccountMemberRole as AccountMemberRole
|
|
|
5
5
|
from .base_model import BaseModel as BaseModel
|
|
6
6
|
from .base_model import from_dict as from_dict
|
|
7
7
|
from .content_format import ContentFormat as ContentFormat
|
|
8
|
+
from .content_format import InputFormat as InputFormat
|
|
8
9
|
from .input import DataFile as DataFile
|
|
9
10
|
from .input import Input as Input
|
|
10
|
-
from .input import InputFormat as InputFormat
|
|
11
11
|
from .input import InputLoader as InputLoader
|
|
12
12
|
from .input import LocalInputLoader as LocalInputLoader
|
|
13
13
|
from .input import csv_data_file as csv_data_file
|
|
@@ -27,11 +27,11 @@ from .manifest import ManifestPythonArch as ManifestPythonArch
|
|
|
27
27
|
from .manifest import ManifestPythonModel as ManifestPythonModel
|
|
28
28
|
from .manifest import ManifestRuntime as ManifestRuntime
|
|
29
29
|
from .manifest import ManifestType as ManifestType
|
|
30
|
+
from .manifest import ModelConfiguration as ModelConfiguration
|
|
30
31
|
from .manifest import default_python_manifest as default_python_manifest
|
|
31
32
|
from .manifest import find_files as find_files
|
|
32
33
|
from .manifest import initialize_manifest as initialize_manifest
|
|
33
34
|
from .model import Model as Model
|
|
34
|
-
from .model import ModelConfiguration as ModelConfiguration
|
|
35
35
|
from .options import Option as Option
|
|
36
36
|
from .options import Options as Options
|
|
37
37
|
from .output import Asset as Asset
|
|
@@ -198,7 +198,7 @@ def handle_push(
|
|
|
198
198
|
update_instance_id: str | None,
|
|
199
199
|
create_defined: bool,
|
|
200
200
|
create_instance_id: str | None,
|
|
201
|
-
) ->
|
|
201
|
+
) -> str:
|
|
202
202
|
"""
|
|
203
203
|
Handle the core push flow: push the application, create a version, and link it to an instance.
|
|
204
204
|
|
|
@@ -226,6 +226,12 @@ def handle_push(
|
|
|
226
226
|
Whether --create-instance-id was provided.
|
|
227
227
|
create_instance_id : str | None
|
|
228
228
|
The instance ID to create.
|
|
229
|
+
|
|
230
|
+
Returns
|
|
231
|
+
-------
|
|
232
|
+
str
|
|
233
|
+
The instance ID that was linked to the version, or an empty string if
|
|
234
|
+
no instance was linked.
|
|
229
235
|
"""
|
|
230
236
|
|
|
231
237
|
# Do the normal push first.
|
|
@@ -247,7 +253,7 @@ def handle_push(
|
|
|
247
253
|
now=now,
|
|
248
254
|
)
|
|
249
255
|
if not should_continue:
|
|
250
|
-
return
|
|
256
|
+
return ""
|
|
251
257
|
|
|
252
258
|
# If the override for updating an instance was used, we update the instance
|
|
253
259
|
# and we are done.
|
|
@@ -260,7 +266,7 @@ def handle_push(
|
|
|
260
266
|
instance_id=update_instance_id,
|
|
261
267
|
)
|
|
262
268
|
|
|
263
|
-
return
|
|
269
|
+
return update_instance_id
|
|
264
270
|
|
|
265
271
|
# If the override for creating a new instance was used, we create the
|
|
266
272
|
# instance and we are done.
|
|
@@ -274,16 +280,18 @@ def handle_push(
|
|
|
274
280
|
now=now,
|
|
275
281
|
)
|
|
276
282
|
|
|
277
|
-
return
|
|
283
|
+
return create_instance_id
|
|
278
284
|
|
|
279
285
|
# If no overrides are used, we handle instance prompting.
|
|
280
|
-
_handle_instance_prompting(
|
|
286
|
+
instance_id = _handle_instance_prompting(
|
|
281
287
|
cloud_app=cloud_app,
|
|
282
288
|
app_id=app_id,
|
|
283
289
|
version_id=version_id,
|
|
284
290
|
now=now,
|
|
285
291
|
)
|
|
286
292
|
|
|
293
|
+
return instance_id
|
|
294
|
+
|
|
287
295
|
|
|
288
296
|
def _handle_version_creation(
|
|
289
297
|
cloud_app: Application,
|
|
@@ -363,7 +371,7 @@ def _handle_instance_prompting(
|
|
|
363
371
|
app_id: str,
|
|
364
372
|
version_id: str,
|
|
365
373
|
now: datetime,
|
|
366
|
-
) ->
|
|
374
|
+
) -> str:
|
|
367
375
|
"""
|
|
368
376
|
Handle interactive prompting for linking a version to an instance after a push.
|
|
369
377
|
|
|
@@ -379,7 +387,13 @@ def _handle_instance_prompting(
|
|
|
379
387
|
version_id : str
|
|
380
388
|
The version ID to link to an instance.
|
|
381
389
|
now : datetime
|
|
382
|
-
The current datetime, used for instance description if a new instance
|
|
390
|
+
The current datetime, used for instance description if a new instance
|
|
391
|
+
is created.
|
|
392
|
+
|
|
393
|
+
Returns
|
|
394
|
+
-------
|
|
395
|
+
str
|
|
396
|
+
The instance ID that was linked to the version, or an empty string if no instance was linked.
|
|
383
397
|
"""
|
|
384
398
|
|
|
385
399
|
# If this is not an interactive terminal, do not ask for instance linking,
|
|
@@ -387,7 +401,7 @@ def _handle_instance_prompting(
|
|
|
387
401
|
if not sys.stdin.isatty():
|
|
388
402
|
info("Non-interactive terminal detected. Skipping instance linking.")
|
|
389
403
|
|
|
390
|
-
return
|
|
404
|
+
return ""
|
|
391
405
|
|
|
392
406
|
# Prompt the user for an instance ID to link the new version to.
|
|
393
407
|
instance_id = Prompt.ask(
|
|
@@ -397,7 +411,7 @@ def _handle_instance_prompting(
|
|
|
397
411
|
)
|
|
398
412
|
if instance_id == "":
|
|
399
413
|
info("No instance ID provided. Skipping instance linking.")
|
|
400
|
-
return
|
|
414
|
+
return ""
|
|
401
415
|
|
|
402
416
|
# Based on whether the instance exists or not, ask the user if they want to
|
|
403
417
|
# update or create it.
|
|
@@ -413,7 +427,7 @@ def _handle_instance_prompting(
|
|
|
413
427
|
|
|
414
428
|
if not should_update:
|
|
415
429
|
info(f"Will not update instance [magenta]{instance_id}[/magenta].")
|
|
416
|
-
return
|
|
430
|
+
return ""
|
|
417
431
|
|
|
418
432
|
_update_instance(
|
|
419
433
|
cloud_app=cloud_app,
|
|
@@ -422,7 +436,7 @@ def _handle_instance_prompting(
|
|
|
422
436
|
instance_id=instance_id,
|
|
423
437
|
)
|
|
424
438
|
|
|
425
|
-
return
|
|
439
|
+
return instance_id
|
|
426
440
|
|
|
427
441
|
# If the instance does not exist, ask if we want to create it.
|
|
428
442
|
should_create = confirmation(
|
|
@@ -433,7 +447,7 @@ def _handle_instance_prompting(
|
|
|
433
447
|
|
|
434
448
|
if not should_create:
|
|
435
449
|
info(f"Will not create instance [magenta]{instance_id}[/magenta].")
|
|
436
|
-
return
|
|
450
|
+
return ""
|
|
437
451
|
|
|
438
452
|
_create_instance(
|
|
439
453
|
cloud_app=cloud_app,
|
|
@@ -443,6 +457,8 @@ def _handle_instance_prompting(
|
|
|
443
457
|
now=now,
|
|
444
458
|
)
|
|
445
459
|
|
|
460
|
+
return instance_id
|
|
461
|
+
|
|
446
462
|
|
|
447
463
|
def _update_instance(
|
|
448
464
|
cloud_app: Application,
|
|
@@ -7,9 +7,10 @@ from typing import Annotated
|
|
|
7
7
|
import typer
|
|
8
8
|
|
|
9
9
|
from nextmv.cli.configuration.config import build_cloud_app
|
|
10
|
-
from nextmv.cli.message import enum_values, error, in_progress, print_json
|
|
10
|
+
from nextmv.cli.message import enum_values, error, in_progress, parse_content_format, print_json
|
|
11
11
|
from nextmv.cli.options import AppIDOption, ProfileOption, VersionIDOption
|
|
12
12
|
from nextmv.cloud.instance import InstanceConfiguration
|
|
13
|
+
from nextmv.content_format import ContentFormat
|
|
13
14
|
from nextmv.input import InputFormat
|
|
14
15
|
from nextmv.run import Format, FormatInput, RunQueuing
|
|
15
16
|
|
|
@@ -60,11 +61,11 @@ def create(
|
|
|
60
61
|
] = None,
|
|
61
62
|
# Options for configuring the instance.
|
|
62
63
|
content_format: Annotated[
|
|
63
|
-
InputFormat | None,
|
|
64
|
+
InputFormat | None, # Keep deprecated type for backwards compatibility, translated in the code.
|
|
64
65
|
typer.Option(
|
|
65
66
|
"--content-format",
|
|
66
67
|
"-c",
|
|
67
|
-
help=f"The content format of the instance to create. Allowed values are: {enum_values(
|
|
68
|
+
help=f"The content format of the instance to create. Allowed values are: {enum_values(ContentFormat)}.",
|
|
68
69
|
metavar="CONTENT_FORMAT",
|
|
69
70
|
rich_help_panel="Instance configuration",
|
|
70
71
|
),
|
|
@@ -162,6 +163,8 @@ def create(
|
|
|
162
163
|
--instance-id prod --options max_duration=30 --options timeout=60[/dim]
|
|
163
164
|
"""
|
|
164
165
|
|
|
166
|
+
content_format = parse_content_format(content_format)
|
|
167
|
+
|
|
165
168
|
cloud_app, _ = build_cloud_app(app_id=app_id, profile=profile)
|
|
166
169
|
if exist_ok:
|
|
167
170
|
in_progress(msg="Creating or getting instance...")
|
|
@@ -233,7 +236,7 @@ def build_options(options: list[str] | None) -> dict[str, str] | None:
|
|
|
233
236
|
def build_config(
|
|
234
237
|
priority: int,
|
|
235
238
|
no_queuing: bool,
|
|
236
|
-
content_format:
|
|
239
|
+
content_format: ContentFormat | None = None,
|
|
237
240
|
execution_class: str | None = None,
|
|
238
241
|
integration_id: str | None = None,
|
|
239
242
|
options: dict | None = None,
|
|
@@ -248,7 +251,7 @@ def build_config(
|
|
|
248
251
|
The priority of the instance.
|
|
249
252
|
no_queuing : bool
|
|
250
253
|
Whether to disable queuing for the instance.
|
|
251
|
-
content_format :
|
|
254
|
+
content_format : ContentFormat | None
|
|
252
255
|
The content format for the instance, if applicable.
|
|
253
256
|
execution_class : str | None
|
|
254
257
|
The execution class to use for the instance, if applicable.
|
|
@@ -282,7 +285,7 @@ def build_config(
|
|
|
282
285
|
if content_format is not None:
|
|
283
286
|
config.format = Format(
|
|
284
287
|
format_input=FormatInput(
|
|
285
|
-
input_type=
|
|
288
|
+
input_type=content_format,
|
|
286
289
|
),
|
|
287
290
|
)
|
|
288
291
|
|
|
@@ -9,8 +9,9 @@ import typer
|
|
|
9
9
|
|
|
10
10
|
from nextmv.cli.cloud.instance.create import build_config, build_options
|
|
11
11
|
from nextmv.cli.configuration.config import build_cloud_app
|
|
12
|
-
from nextmv.cli.message import enum_values, error, in_progress, print_json, success
|
|
12
|
+
from nextmv.cli.message import enum_values, error, in_progress, parse_content_format, print_json, success
|
|
13
13
|
from nextmv.cli.options import AppIDOption, InstanceIDOption, ProfileOption
|
|
14
|
+
from nextmv.content_format import ContentFormat
|
|
14
15
|
from nextmv.input import InputFormat
|
|
15
16
|
|
|
16
17
|
# Set up subcommand application.
|
|
@@ -66,11 +67,11 @@ def update(
|
|
|
66
67
|
] = None,
|
|
67
68
|
# Options for updating the instance configuration.
|
|
68
69
|
content_format: Annotated[
|
|
69
|
-
InputFormat | None,
|
|
70
|
+
InputFormat | None, # Keep deprecated type for backwards compatibility, translated in the code.
|
|
70
71
|
typer.Option(
|
|
71
72
|
"--content-format",
|
|
72
73
|
"-c",
|
|
73
|
-
help=f"The content format for the instance. Allowed values are: {enum_values(
|
|
74
|
+
help=f"The content format for the instance. Allowed values are: {enum_values(ContentFormat)}.",
|
|
74
75
|
metavar="CONTENT_FORMAT",
|
|
75
76
|
rich_help_panel="Instance configuration",
|
|
76
77
|
),
|
|
@@ -165,6 +166,8 @@ def update(
|
|
|
165
166
|
--options max_duration=30 --options timeout=60[/dim]
|
|
166
167
|
"""
|
|
167
168
|
|
|
169
|
+
content_format = parse_content_format(content_format)
|
|
170
|
+
|
|
168
171
|
# Check if any configuration options are provided
|
|
169
172
|
has_config_options = any(
|
|
170
173
|
[
|
|
@@ -7,8 +7,9 @@ from typing import Annotated
|
|
|
7
7
|
import typer
|
|
8
8
|
|
|
9
9
|
from nextmv.cli.configuration.config import build_cloud_app
|
|
10
|
-
from nextmv.cli.message import enum_values, error, in_progress, print_json
|
|
10
|
+
from nextmv.cli.message import enum_values, error, in_progress, parse_content_format, print_json
|
|
11
11
|
from nextmv.cli.options import AppIDOption, ProfileOption
|
|
12
|
+
from nextmv.content_format import ContentFormat
|
|
12
13
|
from nextmv.input import InputFormat
|
|
13
14
|
from nextmv.run import Format, FormatInput
|
|
14
15
|
|
|
@@ -20,12 +21,12 @@ app = typer.Typer()
|
|
|
20
21
|
def create(
|
|
21
22
|
app_id: AppIDOption,
|
|
22
23
|
content_format: Annotated[
|
|
23
|
-
InputFormat | None,
|
|
24
|
+
InputFormat | None, # Keep deprecated type for backwards compatibility, translated in the code.
|
|
24
25
|
typer.Option(
|
|
25
26
|
"--content-format",
|
|
26
27
|
"-c",
|
|
27
28
|
help=f"The content format for the managed input. "
|
|
28
|
-
f"Allowed values are: {enum_values(
|
|
29
|
+
f"Allowed values are: {enum_values(ContentFormat)}. Default is [magenta]json[/magenta].",
|
|
29
30
|
metavar="CONTENT_FORMAT",
|
|
30
31
|
),
|
|
31
32
|
] = None,
|
|
@@ -114,6 +115,8 @@ def create(
|
|
|
114
115
|
--upload-id upl_123456789 --content-format csv[/dim]
|
|
115
116
|
"""
|
|
116
117
|
|
|
118
|
+
content_format = parse_content_format(content_format)
|
|
119
|
+
|
|
117
120
|
if upload_id is None and run_id is None:
|
|
118
121
|
error(
|
|
119
122
|
"Either --upload-id or --run-id must be specified. "
|
|
@@ -128,7 +131,7 @@ def create(
|
|
|
128
131
|
if content_format is not None:
|
|
129
132
|
format_obj = Format(
|
|
130
133
|
format_input=FormatInput(
|
|
131
|
-
input_type=
|
|
134
|
+
input_type=content_format,
|
|
132
135
|
),
|
|
133
136
|
)
|
|
134
137
|
|
|
@@ -13,9 +13,10 @@ import typer
|
|
|
13
13
|
from nextmv.cli.cloud.run.get import handle_outputs
|
|
14
14
|
from nextmv.cli.cloud.run.logs import handle_logs
|
|
15
15
|
from nextmv.cli.configuration.config import build_cloud_app
|
|
16
|
-
from nextmv.cli.message import enum_values, error, print_json, success
|
|
16
|
+
from nextmv.cli.message import enum_values, error, parse_content_format, print_json, success
|
|
17
17
|
from nextmv.cli.options import AppIDOption, ProfileOption
|
|
18
18
|
from nextmv.cloud.application import Application
|
|
19
|
+
from nextmv.content_format import ContentFormat
|
|
19
20
|
from nextmv.input import InputFormat
|
|
20
21
|
from nextmv.polling import default_polling_options
|
|
21
22
|
from nextmv.run import Format, FormatInput, RunConfiguration, RunQueuing, RunType, RunTypeConfiguration
|
|
@@ -96,11 +97,11 @@ def create(
|
|
|
96
97
|
] = False,
|
|
97
98
|
# Options for run configuration.
|
|
98
99
|
content_format: Annotated[
|
|
99
|
-
InputFormat | None,
|
|
100
|
+
InputFormat | None, # Keep deprecated type for backwards compatibility, translated in the code.
|
|
100
101
|
typer.Option(
|
|
101
102
|
"--content-format",
|
|
102
103
|
"-c",
|
|
103
|
-
help=f"The content format of the run to create. Allowed values are: {enum_values(
|
|
104
|
+
help=f"The content format of the run to create. Allowed values are: {enum_values(ContentFormat)}.",
|
|
104
105
|
metavar="CONTENT_FORMAT",
|
|
105
106
|
rich_help_panel="Run configuration",
|
|
106
107
|
),
|
|
@@ -225,8 +226,7 @@ def create(
|
|
|
225
226
|
When using the --input flag, the value can be one of the following:
|
|
226
227
|
|
|
227
228
|
- [yellow]<FILE_PATH>[/yellow]: path to a [magenta]file[/magenta] containing
|
|
228
|
-
the input data. Use with the [magenta]json[/magenta]
|
|
229
|
-
[magenta]text[/magenta] content formats.
|
|
229
|
+
the input data. Use with the [magenta]json[/magenta] content format.
|
|
230
230
|
- [yellow]<DIR_PATH>[/yellow]: path to a [magenta]directory[/magenta]
|
|
231
231
|
containing the input data files. Use with the
|
|
232
232
|
[magenta]multi-file[/magenta] content format.
|
|
@@ -315,6 +315,8 @@ def create(
|
|
|
315
315
|
$ [dim]nextmv cloud run create --app-id hare-app --managed-input-id carrot-input --output outputs[/dim]
|
|
316
316
|
"""
|
|
317
317
|
|
|
318
|
+
content_format = parse_content_format(content_format)
|
|
319
|
+
|
|
318
320
|
# Validate that input is provided.
|
|
319
321
|
stdin = sys.stdin.read().strip() if sys.stdin.isatty() is False else None
|
|
320
322
|
if stdin is None and (input is None or input == "") and (managed_input_id is None or managed_input_id == ""):
|
|
@@ -387,7 +389,7 @@ def build_run_config(
|
|
|
387
389
|
priority: int,
|
|
388
390
|
no_queuing: bool,
|
|
389
391
|
execution_class: str | None = None,
|
|
390
|
-
content_format:
|
|
392
|
+
content_format: ContentFormat | None = None,
|
|
391
393
|
secret_collection_id: str | None = None,
|
|
392
394
|
integration_id: str | None = None,
|
|
393
395
|
definition_id: str | None = None,
|
|
@@ -405,7 +407,7 @@ def build_run_config(
|
|
|
405
407
|
Whether to disable queuing for the run.
|
|
406
408
|
execution_class : str | None
|
|
407
409
|
The execution class to use for the run, if applicable.
|
|
408
|
-
content_format :
|
|
410
|
+
content_format : ContentFormat | None
|
|
409
411
|
The content format of the run to create, if applicable.
|
|
410
412
|
secret_collection_id : str | None
|
|
411
413
|
The secret collection ID to use for the run, if applicable.
|
|
@@ -434,7 +436,7 @@ def build_run_config(
|
|
|
434
436
|
if content_format is not None:
|
|
435
437
|
config.format = Format(
|
|
436
438
|
format_input=FormatInput(
|
|
437
|
-
input_type=
|
|
439
|
+
input_type=content_format,
|
|
438
440
|
),
|
|
439
441
|
)
|
|
440
442
|
if secret_collection_id is not None:
|
|
@@ -8,10 +8,10 @@ from typing import Annotated
|
|
|
8
8
|
import typer
|
|
9
9
|
|
|
10
10
|
from nextmv.cli.configuration.config import build_cloud_app
|
|
11
|
-
from nextmv.cli.message import in_progress, print_json, success
|
|
11
|
+
from nextmv.cli.message import in_progress, info, print_json, success
|
|
12
12
|
from nextmv.cli.options import AppIDOption, ProfileOption, RunIDOption
|
|
13
13
|
from nextmv.cloud.application import Application
|
|
14
|
-
from nextmv.
|
|
14
|
+
from nextmv.content_format import ContentFormat
|
|
15
15
|
from nextmv.polling import PollingOptions, default_polling_options
|
|
16
16
|
|
|
17
17
|
# Set up subcommand application.
|
|
@@ -158,8 +158,8 @@ def handle_outputs(
|
|
|
158
158
|
# Build kwargs for the result retrieval.
|
|
159
159
|
kwargs = {"run_id": run_id}
|
|
160
160
|
|
|
161
|
-
# For MULTI_FILE
|
|
162
|
-
if content_format
|
|
161
|
+
# For MULTI_FILE, we need output_dir_path.
|
|
162
|
+
if content_format != ContentFormat.JSON:
|
|
163
163
|
output_dir = f"{run_id}-output" if output is None or output == "" else output
|
|
164
164
|
kwargs["output_dir_path"] = output_dir
|
|
165
165
|
|
|
@@ -174,8 +174,18 @@ def handle_outputs(
|
|
|
174
174
|
run_result = cloud_app.run_result(**kwargs)
|
|
175
175
|
|
|
176
176
|
# Handle the case where output is embedded directly in the result: json and text.
|
|
177
|
-
if content_format
|
|
177
|
+
if content_format == ContentFormat.JSON:
|
|
178
178
|
if output is None or output == "":
|
|
179
|
+
# To avoid overflowing the terminal with a huge output, we trim the assets.
|
|
180
|
+
res_output = run_result.output
|
|
181
|
+
if isinstance(res_output, dict) and "assets" in res_output.keys():
|
|
182
|
+
info(
|
|
183
|
+
"Removed [magenta]assets[/magenta] from output for cleaner display, "
|
|
184
|
+
"use --output to save the full output."
|
|
185
|
+
)
|
|
186
|
+
del res_output["assets"]
|
|
187
|
+
run_result.output = res_output
|
|
188
|
+
|
|
179
189
|
print_json(run_result.to_dict())
|
|
180
190
|
else:
|
|
181
191
|
with open(output, "w") as f:
|
|
@@ -10,7 +10,7 @@ import typer
|
|
|
10
10
|
from nextmv.cli.configuration.config import build_cloud_app
|
|
11
11
|
from nextmv.cli.message import in_progress, print_json, success
|
|
12
12
|
from nextmv.cli.options import AppIDOption, ProfileOption, RunIDOption
|
|
13
|
-
from nextmv.
|
|
13
|
+
from nextmv.content_format import ContentFormat
|
|
14
14
|
|
|
15
15
|
# Set up subcommand application.
|
|
16
16
|
app = typer.Typer()
|
|
@@ -61,7 +61,7 @@ def input(
|
|
|
61
61
|
|
|
62
62
|
# If the input is multi-file, we need to provide an `output_dir_path` to
|
|
63
63
|
# save the files to.
|
|
64
|
-
if run_info.metadata.format.format_input.input_type
|
|
64
|
+
if run_info.metadata.format.format_input.input_type != ContentFormat.JSON:
|
|
65
65
|
# If no output path is provided, use the run ID as the directory name.
|
|
66
66
|
output = f"{run_id}-input" if output is None or output == "" else output
|
|
67
67
|
cloud_app.run_input(run_id=run_id, output_dir_path=output)
|
|
@@ -11,8 +11,9 @@ import typer
|
|
|
11
11
|
|
|
12
12
|
from nextmv.cli.cloud.run.create import build_run_config
|
|
13
13
|
from nextmv.cli.configuration.config import build_cloud_app
|
|
14
|
-
from nextmv.cli.message import enum_values, error, in_progress, print_json, warning
|
|
14
|
+
from nextmv.cli.message import enum_values, error, in_progress, parse_content_format, print_json, warning
|
|
15
15
|
from nextmv.cli.options import AppIDOption, ProfileOption
|
|
16
|
+
from nextmv.content_format import ContentFormat
|
|
16
17
|
from nextmv.input import InputFormat
|
|
17
18
|
from nextmv.run import RunType, TrackedRun, TrackedRunStatus
|
|
18
19
|
|
|
@@ -53,11 +54,11 @@ def track(
|
|
|
53
54
|
),
|
|
54
55
|
] = None,
|
|
55
56
|
content_format: Annotated[
|
|
56
|
-
InputFormat | None,
|
|
57
|
+
InputFormat | None, # Keep deprecated type for backwards compatibility, translated in the code.
|
|
57
58
|
typer.Option(
|
|
58
59
|
"--content-format",
|
|
59
60
|
"-c",
|
|
60
|
-
help=f"The content format of the run to track. Allowed values are: {enum_values(
|
|
61
|
+
help=f"The content format of the run to track. Allowed values are: {enum_values(ContentFormat)}.",
|
|
61
62
|
metavar="CONTENT_FORMAT",
|
|
62
63
|
rich_help_panel="Tracked run configuration",
|
|
63
64
|
),
|
|
@@ -155,18 +156,18 @@ def track(
|
|
|
155
156
|
Please see the help of the --content-type option for details on valid
|
|
156
157
|
content types.
|
|
157
158
|
|
|
158
|
-
If the content type is [magenta]json[/magenta]
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
159
|
+
If the content type is [magenta]json[/magenta], then input for the run can
|
|
160
|
+
be given through [magenta]stdin[/magenta]. The --input option allows you to
|
|
161
|
+
specify a file or directory path for the input, instead of using
|
|
162
|
+
[magenta]stdin[/magenta]. In the case of [magenta]multi-file[/magenta]
|
|
163
|
+
content type, the input must be given through a directory specified via the
|
|
164
|
+
--input option.
|
|
164
165
|
|
|
165
166
|
The --output option allows you to specify a file or directory path for the
|
|
166
167
|
output of the run. The behavior depends on the content type. If the content
|
|
167
|
-
type is [magenta]json[/magenta]
|
|
168
|
-
|
|
169
|
-
|
|
168
|
+
type is [magenta]json[/magenta], then a file path must be provided. If the
|
|
169
|
+
content type is [magenta]multi-file[/magenta], then a directory path must
|
|
170
|
+
be provided.
|
|
170
171
|
|
|
171
172
|
Run logs, assets, and metrics can be provided via files using the
|
|
172
173
|
--logs, --assets, and --metrics options, respectively. Assets and
|
|
@@ -203,11 +204,6 @@ def track(
|
|
|
203
204
|
$ [dim]nextmv cloud run track --app-id hare-app --status failed --input input.json \\
|
|
204
205
|
--error-msg "Solver timed out"[/dim]
|
|
205
206
|
|
|
206
|
-
- Track a [magenta]successful[/magenta] [magenta]text[/magenta] run with text content type,
|
|
207
|
-
for an app with ID [magenta]hare-app[/magenta].
|
|
208
|
-
$ [dim]nextmv cloud run track --app-id hare-app --status succeeded --input input.txt \\
|
|
209
|
-
--output output.txt --content-type text[/dim]
|
|
210
|
-
|
|
211
207
|
- Track a [magenta]successful[/magenta] [magenta]multi-file[/magenta] run from an
|
|
212
208
|
[magenta]inputs[/magenta] directory with output to an
|
|
213
209
|
[magenta]outputs[/magenta] directory, for an app with ID
|
|
@@ -230,6 +226,9 @@ def track(
|
|
|
230
226
|
|
|
231
227
|
if statistics:
|
|
232
228
|
warning("The --statistics option is deprecated, use --metrics instead.")
|
|
229
|
+
|
|
230
|
+
content_format = parse_content_format(content_format)
|
|
231
|
+
|
|
233
232
|
# Validate that input is provided.
|
|
234
233
|
stdin = sys.stdin.read().strip() if sys.stdin.isatty() is False else None
|
|
235
234
|
if stdin is None and (input is None or input == ""):
|
|
@@ -284,7 +283,7 @@ def build_tracked_run_input(
|
|
|
284
283
|
description: str | None,
|
|
285
284
|
stdin: str | None,
|
|
286
285
|
input: str | None,
|
|
287
|
-
content_format:
|
|
286
|
+
content_format: ContentFormat,
|
|
288
287
|
output: str,
|
|
289
288
|
assets: str | None = None,
|
|
290
289
|
logs: str | None = None,
|
|
@@ -314,8 +313,8 @@ def build_tracked_run_input(
|
|
|
314
313
|
The input provided via stdin, if any.
|
|
315
314
|
input : str | None
|
|
316
315
|
The input file or directory path, if any.
|
|
317
|
-
content_format :
|
|
318
|
-
The content format of the input (json or
|
|
316
|
+
content_format : ContentFormat
|
|
317
|
+
The content format of the input (json or multi-file).
|
|
319
318
|
output : str
|
|
320
319
|
The output file or directory path.
|
|
321
320
|
assets : str | None
|
|
@@ -385,7 +384,7 @@ def resolve_input(
|
|
|
385
384
|
tracked_run: TrackedRun,
|
|
386
385
|
stdin: str | None,
|
|
387
386
|
input: str | None,
|
|
388
|
-
content_format:
|
|
387
|
+
content_format: ContentFormat,
|
|
389
388
|
) -> TrackedRun:
|
|
390
389
|
"""
|
|
391
390
|
Resolves the input for the tracked run, either from stdin or from a
|
|
@@ -399,8 +398,8 @@ def resolve_input(
|
|
|
399
398
|
The input provided via stdin, if any.
|
|
400
399
|
input : str | None
|
|
401
400
|
The input file or directory path, if any.
|
|
402
|
-
content_format :
|
|
403
|
-
The content format of the input (json or
|
|
401
|
+
content_format : ContentFormat
|
|
402
|
+
The content format of the input (json or multi-file).
|
|
404
403
|
|
|
405
404
|
Returns
|
|
406
405
|
-------
|
|
@@ -411,7 +410,7 @@ def resolve_input(
|
|
|
411
410
|
# Handle the case where stdin is provided as JSON for a JSON app.
|
|
412
411
|
try:
|
|
413
412
|
input_data = json.loads(stdin)
|
|
414
|
-
if content_format !=
|
|
413
|
+
if content_format != ContentFormat.JSON:
|
|
415
414
|
error(
|
|
416
415
|
"Input provided via [magenta]stdin[/magenta] is [magenta]json[/magenta], "
|
|
417
416
|
f"but the specified content format is {content_format.value}. "
|
|
@@ -427,6 +426,11 @@ def resolve_input(
|
|
|
427
426
|
"--content-format should be set to [magenta]text[/magenta]."
|
|
428
427
|
)
|
|
429
428
|
|
|
429
|
+
warning(
|
|
430
|
+
"[magenta]text[/magenta] is being deprecated as a content format, "
|
|
431
|
+
"please use [magenta]multi-file[/magenta] instead."
|
|
432
|
+
)
|
|
433
|
+
|
|
430
434
|
tracked_run.input = input_data
|
|
431
435
|
|
|
432
436
|
return tracked_run
|
|
@@ -436,7 +440,7 @@ def resolve_input(
|
|
|
436
440
|
input_path = Path(input)
|
|
437
441
|
|
|
438
442
|
if input_path.is_file():
|
|
439
|
-
if content_format ==
|
|
443
|
+
if content_format == ContentFormat.JSON:
|
|
440
444
|
try:
|
|
441
445
|
with input_path.open("r") as f:
|
|
442
446
|
input_data = json.load(f)
|
|
@@ -449,6 +453,10 @@ def resolve_input(
|
|
|
449
453
|
error(f"Failed to parse input file [magenta]{input}[/magenta] as [magenta]json[/magenta]: {e}.")
|
|
450
454
|
|
|
451
455
|
elif content_format == InputFormat.TEXT:
|
|
456
|
+
warning(
|
|
457
|
+
"[magenta]text[/magenta] is being deprecated as a content format, "
|
|
458
|
+
"please use [magenta]multi-file[/magenta] instead.",
|
|
459
|
+
)
|
|
452
460
|
input_data = input_path.read_text()
|
|
453
461
|
tracked_run.input = input_data
|
|
454
462
|
|
|
@@ -470,7 +478,7 @@ def resolve_input(
|
|
|
470
478
|
def resolve_output(
|
|
471
479
|
tracked_run: TrackedRun,
|
|
472
480
|
output: str,
|
|
473
|
-
content_format:
|
|
481
|
+
content_format: ContentFormat,
|
|
474
482
|
) -> TrackedRun:
|
|
475
483
|
"""
|
|
476
484
|
Resolves the output for the tracked run.
|
|
@@ -481,7 +489,7 @@ def resolve_output(
|
|
|
481
489
|
The tracked run to set the output for.
|
|
482
490
|
output : str
|
|
483
491
|
The output file or directory path.
|
|
484
|
-
content_format :
|
|
492
|
+
content_format : ContentFormat
|
|
485
493
|
The content format of the output (json or text).
|
|
486
494
|
|
|
487
495
|
Returns
|
|
@@ -492,7 +500,7 @@ def resolve_output(
|
|
|
492
500
|
|
|
493
501
|
output_path = Path(output)
|
|
494
502
|
if output_path.is_file():
|
|
495
|
-
if content_format ==
|
|
503
|
+
if content_format == ContentFormat.JSON:
|
|
496
504
|
try:
|
|
497
505
|
with output_path.open("r") as f:
|
|
498
506
|
output_data = json.load(f)
|
|
@@ -507,6 +515,10 @@ def resolve_output(
|
|
|
507
515
|
elif content_format == InputFormat.TEXT:
|
|
508
516
|
output_data = output_path.read_text()
|
|
509
517
|
tracked_run.output = output_data
|
|
518
|
+
warning(
|
|
519
|
+
"[magenta]text[/magenta] is being deprecated as a content format, "
|
|
520
|
+
"please use [magenta]multi-file[/magenta] instead.",
|
|
521
|
+
)
|
|
510
522
|
|
|
511
523
|
return tracked_run
|
|
512
524
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
This module contains configuration utilities for the Nextmv CLI.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import platform
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
from typing import Any
|
|
7
8
|
|
|
@@ -21,6 +22,8 @@ API_KEY_KEY = "apikey"
|
|
|
21
22
|
ENDPOINT_KEY = "endpoint"
|
|
22
23
|
DEFAULT_ENDPOINT = "api.cloud.nextmv.io"
|
|
23
24
|
GO_CLI_PATH = CONFIG_DIR / "nextmv"
|
|
25
|
+
if platform.system() == "Windows":
|
|
26
|
+
GO_CLI_PATH = CONFIG_DIR / "nextmv.exe"
|
|
24
27
|
|
|
25
28
|
|
|
26
29
|
def load_config() -> dict[str, Any]:
|