nextmv 1.0.0.dev5__tar.gz → 1.0.0.dev7__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.0.0.dev5 → nextmv-1.0.0.dev7}/PKG-INFO +3 -1
- nextmv-1.0.0.dev7/nextmv/__about__.py +1 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/_serialization.py +1 -1
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/acceptance/create.py +12 -12
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/app/push.py +15 -15
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/input_set/__init__.py +2 -0
- nextmv-1.0.0.dev7/nextmv/cli/cloud/input_set/delete.py +67 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/run/create.py +4 -9
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/shadow/stop.py +14 -2
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/switchback/stop.py +14 -2
- nextmv-1.0.0.dev7/nextmv/cli/community/clone.py +86 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/community/list.py +46 -116
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/__init__.py +4 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/__init__.py +1 -200
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_acceptance.py +13 -8
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_input_set.py +42 -6
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_run.py +1 -8
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_shadow.py +9 -3
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_switchback.py +11 -2
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/batch_experiment.py +3 -1
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/client.py +1 -1
- nextmv-1.0.0.dev7/nextmv/cloud/community.py +441 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/integration.py +7 -4
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/shadow.py +25 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/switchback.py +2 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/default_app/main.py +6 -4
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/local/executor.py +3 -83
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/local/geojson_handler.py +1 -1
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/manifest.py +7 -11
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/model.py +2 -2
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/options.py +1 -1
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/output.py +21 -57
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/run.py +3 -12
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/pyproject.toml +2 -0
- nextmv-1.0.0.dev7/tests/README.md +31 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/cloud/app.yaml +0 -1
- nextmv-1.0.0.dev7/tests/integration/cloud/test_integration_cloud.py +784 -0
- nextmv-1.0.0.dev7/tests/scripts/__init__.py +0 -0
- nextmv-1.0.0.dev7/tests/test_entrypoint/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_entrypoint/test_entrypoint.py +3 -3
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_manifest.py +0 -1
- nextmv-1.0.0.dev5/nextmv/__about__.py +0 -1
- nextmv-1.0.0.dev5/nextmv/cli/community/clone.py +0 -272
- nextmv-1.0.0.dev5/tests/cli/test_community.py +0 -666
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/.gitignore +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/LICENSE +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/README.md +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/__entrypoint__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/base_model.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/CONTRIBUTING.md +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/acceptance/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/acceptance/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/acceptance/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/acceptance/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/account/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/account/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/account/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/account/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/account/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/app/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/app/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/app/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/app/exists.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/app/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/app/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/app/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/batch/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/batch/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/batch/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/batch/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/batch/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/batch/metadata.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/batch/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/data/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/data/upload.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/ensemble/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/ensemble/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/ensemble/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/ensemble/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/ensemble/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/ensemble/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/input_set/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/input_set/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/input_set/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/input_set/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/instance/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/instance/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/instance/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/instance/exists.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/instance/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/instance/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/instance/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/managed_input/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/managed_input/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/managed_input/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/managed_input/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/managed_input/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/run/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/run/cancel.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/run/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/run/input.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/run/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/run/logs.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/run/metadata.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/run/track.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/scenario/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/scenario/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/scenario/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/scenario/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/scenario/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/scenario/metadata.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/scenario/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/secrets/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/secrets/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/secrets/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/secrets/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/secrets/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/secrets/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/shadow/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/shadow/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/shadow/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/shadow/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/shadow/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/shadow/metadata.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/shadow/start.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/shadow/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/switchback/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/switchback/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/switchback/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/switchback/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/switchback/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/switchback/metadata.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/switchback/start.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/switchback/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/upload/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/upload/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/version/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/version/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/version/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/version/exists.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/version/get.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/version/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/cloud/version/update.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/community/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/configuration/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/configuration/config.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/configuration/create.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/configuration/delete.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/configuration/list.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/confirm.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/main.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/message.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/options.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cli/version.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/acceptance_test.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/account.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_batch_scenario.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_ensemble.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_instance.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_managed_input.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_secrets.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_utils.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/application/_version.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/assets.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/ensemble.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/input_set.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/instance.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/package.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/scenario.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/secrets.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/url.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/cloud/version.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/default_app/.gitignore +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/default_app/README.md +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/default_app/app.yaml +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/default_app/input.json +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/default_app/requirements.txt +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/default_app/src/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/default_app/src/visuals.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/deprecated.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/input.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/local/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/local/application.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/local/local.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/local/plotly_handler.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/local/runner.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/logger.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/polling.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/safe.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/nextmv/status.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/cli/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/cli/test_configuration.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/cli/test_main.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/cli/test_version.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/cloud/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/cloud/test_client.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/cloud/test_instance.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/cloud/test_package.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/cloud/test_scenario.py +0 -0
- {nextmv-1.0.0.dev5/tests/local → nextmv-1.0.0.dev7/tests/integration}/__init__.py +0 -0
- {nextmv-1.0.0.dev5/tests/scripts → nextmv-1.0.0.dev7/tests/integration/cloud}/__init__.py +0 -0
- {nextmv-1.0.0.dev5/tests/test_entrypoint → nextmv-1.0.0.dev7/tests/local}/__init__.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/local/test_application.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/local/test_executor.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/local/test_runner.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/scripts/options1.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/scripts/options2.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/scripts/options3.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/scripts/options4.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/scripts/options5.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/scripts/options6.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/scripts/options7.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_base_model.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_input.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_inputs/test_data.csv +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_inputs/test_data.json +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_inputs/test_data.txt +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_logger.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_model.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_options.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_output.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_polling.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_run.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_safe.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_serialization.py +0 -0
- {nextmv-1.0.0.dev5 → nextmv-1.0.0.dev7}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nextmv
|
|
3
|
-
Version: 1.0.0.
|
|
3
|
+
Version: 1.0.0.dev7
|
|
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/
|
|
@@ -230,11 +230,13 @@ Provides-Extra: dev
|
|
|
230
230
|
Requires-Dist: build>=1.0.3; extra == 'dev'
|
|
231
231
|
Requires-Dist: folium>=0.20.0; extra == 'dev'
|
|
232
232
|
Requires-Dist: mlflow>=2.19.0; extra == 'dev'
|
|
233
|
+
Requires-Dist: nextpipe>=0.6.0; extra == 'dev'
|
|
233
234
|
Requires-Dist: nextroute>=1.11.1; extra == 'dev'
|
|
234
235
|
Requires-Dist: openpyxl>=3.1.5; extra == 'dev'
|
|
235
236
|
Requires-Dist: pandas>=2.2.3; extra == 'dev'
|
|
236
237
|
Requires-Dist: plotly>=6.0.1; extra == 'dev'
|
|
237
238
|
Requires-Dist: pydantic>=2.5.2; extra == 'dev'
|
|
239
|
+
Requires-Dist: pytest>=9.0.2; extra == 'dev'
|
|
238
240
|
Requires-Dist: pyyaml>=6.0.1; extra == 'dev'
|
|
239
241
|
Requires-Dist: requests>=2.31.0; extra == 'dev'
|
|
240
242
|
Requires-Dist: ruff>=0.1.7; extra == 'dev'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "v1.0.0.dev7"
|
|
@@ -90,7 +90,7 @@ def _custom_serial(obj: Any) -> str:
|
|
|
90
90
|
If the object type is not supported for serialization.
|
|
91
91
|
"""
|
|
92
92
|
|
|
93
|
-
if isinstance(obj, datetime.datetime
|
|
93
|
+
if isinstance(obj, (datetime.datetime, datetime.date)):
|
|
94
94
|
return obj.isoformat()
|
|
95
95
|
|
|
96
96
|
raise TypeError(f"Type {type(obj)} not serializable")
|
|
@@ -45,7 +45,7 @@ app = typer.Typer()
|
|
|
45
45
|
- Multiple metrics as a [magenta]json[/magenta] array in a single --metrics flag.
|
|
46
46
|
|
|
47
47
|
Each metric must have the following fields:
|
|
48
|
-
- [magenta]field[/magenta]: Field of the metric to measure (e.g., "
|
|
48
|
+
- [magenta]field[/magenta]: Field of the metric to measure (e.g., "solution.objective").
|
|
49
49
|
- [magenta]metric_type[/magenta]: Type of metric comparison. Allowed values: {enum_values(MetricType)}.
|
|
50
50
|
- [magenta]params[/magenta]: Parameters of the metric comparison.
|
|
51
51
|
- [magenta]operator[/magenta]: Comparison operator. Allowed values: {enum_values(Comparison)}.
|
|
@@ -71,8 +71,8 @@ app = typer.Typer()
|
|
|
71
71
|
[bold][underline]Examples[/underline][/bold]
|
|
72
72
|
|
|
73
73
|
- Create an acceptance test with a single metric.
|
|
74
|
-
$ [
|
|
75
|
-
"field": "
|
|
74
|
+
$ [dim]METRIC='{{
|
|
75
|
+
"field": "solution.objective",
|
|
76
76
|
"metric_type": "direct-comparison",
|
|
77
77
|
"params": {{
|
|
78
78
|
"operator": "lt",
|
|
@@ -85,8 +85,8 @@ app = typer.Typer()
|
|
|
85
85
|
--metrics "$METRIC" --input-set-id input-set-123[/dim]
|
|
86
86
|
|
|
87
87
|
- Create with multiple metrics by repeating the flag.
|
|
88
|
-
$ [
|
|
89
|
-
"field": "
|
|
88
|
+
$ [dim]METRIC1='{{
|
|
89
|
+
"field": "solution.objective",
|
|
90
90
|
"metric_type": "direct-comparison",
|
|
91
91
|
"params": {{
|
|
92
92
|
"operator": "lt",
|
|
@@ -95,7 +95,7 @@ app = typer.Typer()
|
|
|
95
95
|
"statistic": "mean"
|
|
96
96
|
}}'
|
|
97
97
|
METRIC2='{{
|
|
98
|
-
"field": "run.duration",
|
|
98
|
+
"field": "statistics.run.duration",
|
|
99
99
|
"metric_type": "direct-comparison",
|
|
100
100
|
"params": {{
|
|
101
101
|
"operator": "le",
|
|
@@ -110,7 +110,7 @@ app = typer.Typer()
|
|
|
110
110
|
- Create with multiple metrics in a single [magenta]json[/magenta] array.
|
|
111
111
|
$ [dim]METRICS='[
|
|
112
112
|
{{
|
|
113
|
-
"field": "
|
|
113
|
+
"field": "solution.objective",
|
|
114
114
|
"metric_type": "direct-comparison",
|
|
115
115
|
"params": {{
|
|
116
116
|
"operator": "lt",
|
|
@@ -119,7 +119,7 @@ app = typer.Typer()
|
|
|
119
119
|
"statistic": "mean"
|
|
120
120
|
}},
|
|
121
121
|
{{
|
|
122
|
-
"field": "run.duration",
|
|
122
|
+
"field": "statistics.run.duration",
|
|
123
123
|
"metric_type": "direct-comparison",
|
|
124
124
|
"params": {{
|
|
125
125
|
"operator": "le",
|
|
@@ -133,8 +133,8 @@ app = typer.Typer()
|
|
|
133
133
|
--metrics "$METRICS" --input-set-id input-set-123[/dim]
|
|
134
134
|
|
|
135
135
|
- Create an acceptance test and wait for it to complete.
|
|
136
|
-
$ [
|
|
137
|
-
"field": "
|
|
136
|
+
$ [dim]METRIC='{{
|
|
137
|
+
"field": "solution.objective",
|
|
138
138
|
"metric_type": "direct-comparison",
|
|
139
139
|
"params": {{
|
|
140
140
|
"operator": "lt",
|
|
@@ -147,8 +147,8 @@ app = typer.Typer()
|
|
|
147
147
|
--metrics "$METRIC" --input-set-id input-set-123 --wait[/dim]
|
|
148
148
|
|
|
149
149
|
- Create an acceptance test and save the results to a file, waiting for completion.
|
|
150
|
-
$ [
|
|
151
|
-
"field": "
|
|
150
|
+
$ [dim]METRIC='{{
|
|
151
|
+
"field": "solution.objective",
|
|
152
152
|
"metric_type": "direct-comparison",
|
|
153
153
|
"params": {{
|
|
154
154
|
"operator": "lt",
|
|
@@ -129,26 +129,34 @@ def push(
|
|
|
129
129
|
$ [dim]nextmv cloud app push --app-id hare-app --version-yes --update-instance-id inst-1[/dim]
|
|
130
130
|
"""
|
|
131
131
|
|
|
132
|
+
cloud_app = build_app(app_id=app_id, profile=profile)
|
|
133
|
+
|
|
134
|
+
# If a version already exists, we cannot create it.
|
|
135
|
+
if version_id is not None and version_id != "":
|
|
136
|
+
exists = cloud_app.version_exists(version_id=version_id)
|
|
137
|
+
if exists:
|
|
138
|
+
error(
|
|
139
|
+
f"Version [magenta]{version_id}[/magenta] already exists for application [magenta]{app_id}[/magenta]."
|
|
140
|
+
)
|
|
141
|
+
|
|
132
142
|
# We cannot create and update an instance at the same time.
|
|
133
143
|
update_defined = update_instance_id is not None and update_instance_id != ""
|
|
134
144
|
create_defined = create_instance_id is not None and create_instance_id != ""
|
|
135
145
|
if update_defined and create_defined:
|
|
136
146
|
error("Cannot use --update-instance-id and --create-instance-id at the same time.")
|
|
137
147
|
|
|
138
|
-
cloud_app = build_app(app_id=app_id, profile=profile)
|
|
139
|
-
|
|
140
148
|
# We cannot update an instance that does not exist.
|
|
141
149
|
if update_defined and not cloud_app.instance_exists(instance_id=update_instance_id):
|
|
142
150
|
error(
|
|
143
|
-
f"Used option --update-instance-id but the instance {update_instance_id}
|
|
144
|
-
"Use --create-instance-id instead."
|
|
151
|
+
f"Used option --update-instance-id but the instance [magenta]{update_instance_id}[/magenta] "
|
|
152
|
+
"does not exist. Use --create-instance-id instead."
|
|
145
153
|
)
|
|
146
154
|
|
|
147
155
|
# We cannot create an instance that already exists.
|
|
148
156
|
if create_defined and cloud_app.instance_exists(instance_id=create_instance_id):
|
|
149
157
|
error(
|
|
150
|
-
f"Used option --create-instance-id but the instance {create_instance_id}
|
|
151
|
-
"Use --update-instance-id instead."
|
|
158
|
+
f"Used option --create-instance-id but the instance [magenta]{create_instance_id}[/magenta] "
|
|
159
|
+
"already exists. Use --update-instance-id instead."
|
|
152
160
|
)
|
|
153
161
|
|
|
154
162
|
# Do the normal push first.
|
|
@@ -243,14 +251,6 @@ def _handle_version_creation(
|
|
|
243
251
|
# If the user provides a version, and it exists, we use it directly and we
|
|
244
252
|
# are done.
|
|
245
253
|
if version_id is not None and version_id != "":
|
|
246
|
-
exists = cloud_app.version_exists(version_id=version_id)
|
|
247
|
-
if exists:
|
|
248
|
-
error(
|
|
249
|
-
f"Version [magenta]{version_id}[/magenta] already exists for application [magenta]{app_id}[/magenta]."
|
|
250
|
-
)
|
|
251
|
-
|
|
252
|
-
return "", False
|
|
253
|
-
|
|
254
254
|
info(
|
|
255
255
|
msg=f"Version [magenta]{version_id}[/magenta] does not exist. A new version will be created.",
|
|
256
256
|
emoji=":bulb:",
|
|
@@ -261,7 +261,7 @@ def _handle_version_creation(
|
|
|
261
261
|
# If we are not auto-confirming version creation, ask the user.
|
|
262
262
|
if not version_yes:
|
|
263
263
|
should_create = get_confirmation(
|
|
264
|
-
msg=f"Do you want to create a new version [magenta]{app_id}[/magenta] now?",
|
|
264
|
+
msg=f"Do you want to create a new version for application [magenta]{app_id}[/magenta] now?",
|
|
265
265
|
default=True,
|
|
266
266
|
)
|
|
267
267
|
|
|
@@ -5,6 +5,7 @@ This module defines the cloud input-set command tree for the Nextmv CLI.
|
|
|
5
5
|
import typer
|
|
6
6
|
|
|
7
7
|
from nextmv.cli.cloud.input_set.create import app as create_app
|
|
8
|
+
from nextmv.cli.cloud.input_set.delete import app as delete_app
|
|
8
9
|
from nextmv.cli.cloud.input_set.get import app as get_app
|
|
9
10
|
from nextmv.cli.cloud.input_set.list import app as list_app
|
|
10
11
|
from nextmv.cli.cloud.input_set.update import app as update_app
|
|
@@ -12,6 +13,7 @@ from nextmv.cli.cloud.input_set.update import app as update_app
|
|
|
12
13
|
# Set up subcommand application.
|
|
13
14
|
app = typer.Typer()
|
|
14
15
|
app.add_typer(create_app)
|
|
16
|
+
app.add_typer(delete_app)
|
|
15
17
|
app.add_typer(get_app)
|
|
16
18
|
app.add_typer(list_app)
|
|
17
19
|
app.add_typer(update_app)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module defines the cloud input-set delete command for the Nextmv CLI.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Annotated
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from nextmv.cli.configuration.config import build_app
|
|
10
|
+
from nextmv.cli.confirm import get_confirmation
|
|
11
|
+
from nextmv.cli.message import info, success
|
|
12
|
+
from nextmv.cli.options import AppIDOption, InputSetIDOption, ProfileOption
|
|
13
|
+
|
|
14
|
+
# Set up subcommand application.
|
|
15
|
+
app = typer.Typer()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@app.command()
|
|
19
|
+
def delete(
|
|
20
|
+
app_id: AppIDOption,
|
|
21
|
+
input_set_id: InputSetIDOption,
|
|
22
|
+
yes: Annotated[
|
|
23
|
+
bool,
|
|
24
|
+
typer.Option(
|
|
25
|
+
"--yes",
|
|
26
|
+
"-y",
|
|
27
|
+
help="Agree to deletion confirmation prompt. Useful for non-interactive sessions.",
|
|
28
|
+
),
|
|
29
|
+
] = False,
|
|
30
|
+
profile: ProfileOption = None,
|
|
31
|
+
) -> None:
|
|
32
|
+
"""
|
|
33
|
+
Deletes a Nextmv Cloud input set.
|
|
34
|
+
|
|
35
|
+
This action is permanent and cannot be undone. The input set and all
|
|
36
|
+
associated data will be deleted. Use the --yes flag to skip the
|
|
37
|
+
confirmation prompt.
|
|
38
|
+
|
|
39
|
+
[bold][underline]Examples[/underline][/bold]
|
|
40
|
+
|
|
41
|
+
- Delete the input set with the ID [magenta]hop-analysis[/magenta] from application
|
|
42
|
+
[magenta]hare-app[/magenta].
|
|
43
|
+
$ [dim]nextmv cloud input-set delete --app-id hare-app --input-set-id hop-analysis[/dim]
|
|
44
|
+
|
|
45
|
+
- Delete the input set without confirmation prompt.
|
|
46
|
+
$ [dim]nextmv cloud input-set delete --app-id hare-app --input-set-id carrot-routes --yes[/dim]
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
if not yes:
|
|
50
|
+
confirm = get_confirmation(
|
|
51
|
+
f"Are you sure you want to delete input set [magenta]{input_set_id}[/magenta] "
|
|
52
|
+
f"from application [magenta]{app_id}[/magenta]? This action cannot be undone.",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
if not confirm:
|
|
56
|
+
info(
|
|
57
|
+
msg=f"Input set [magenta]{input_set_id}[/magenta] will not be deleted.",
|
|
58
|
+
emoji=":bulb:",
|
|
59
|
+
)
|
|
60
|
+
return
|
|
61
|
+
|
|
62
|
+
cloud_app = build_app(app_id=app_id, profile=profile)
|
|
63
|
+
cloud_app.delete_input_set(input_set_id=input_set_id)
|
|
64
|
+
success(
|
|
65
|
+
f"Input set [magenta]{input_set_id}[/magenta] deleted successfully "
|
|
66
|
+
f"from application [magenta]{app_id}[/magenta]."
|
|
67
|
+
)
|
|
@@ -129,7 +129,7 @@ def create(
|
|
|
129
129
|
metavar="INSTANCE_ID",
|
|
130
130
|
rich_help_panel="Run configuration",
|
|
131
131
|
),
|
|
132
|
-
] =
|
|
132
|
+
] = None,
|
|
133
133
|
integration_id: Annotated[
|
|
134
134
|
str | None,
|
|
135
135
|
typer.Option(
|
|
@@ -240,12 +240,11 @@ def create(
|
|
|
240
240
|
specify the instance with the --instance-id flag. These are the possible
|
|
241
241
|
values for this flag:
|
|
242
242
|
|
|
243
|
+
- [yellow]unspecified[/yellow]: Run against the default instance of the
|
|
244
|
+
application. When an application is created, the default instance is [magenta]latest[/magenta].
|
|
243
245
|
- [yellow]latest[/yellow]: uses the special [magenta]latest[/magenta]
|
|
244
246
|
instance of the application. This corresponds to the latest pushed
|
|
245
|
-
executable.
|
|
246
|
-
- [yellow]default[/yellow]: if the application has a [italic]default[/italic]
|
|
247
|
-
instance configured, then it uses that instance. Setting the flag's value
|
|
248
|
-
to [magenta]''[/magenta] (empty string) has the same effect.
|
|
247
|
+
executable.
|
|
249
248
|
- [yellow]<INSTANCE_ID>[/yellow]: uses the instance with the given ID.
|
|
250
249
|
|
|
251
250
|
[bold][underline]Examples[/underline][/bold]
|
|
@@ -319,10 +318,6 @@ def create(
|
|
|
319
318
|
)
|
|
320
319
|
run_options = build_run_options(options)
|
|
321
320
|
|
|
322
|
-
# Handles the default instance.
|
|
323
|
-
if instance_id == "default":
|
|
324
|
-
instance_id = ""
|
|
325
|
-
|
|
326
321
|
# Start the run before deciding if we should poll or not.
|
|
327
322
|
input_kwarg = resolve_input_kwarg(
|
|
328
323
|
stdin=stdin,
|
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
This module defines the cloud shadow stop command for the Nextmv CLI.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
from typing import Annotated
|
|
6
|
+
|
|
5
7
|
import typer
|
|
6
8
|
|
|
7
9
|
from nextmv.cli.configuration.config import build_app
|
|
8
|
-
from nextmv.cli.message import in_progress, success
|
|
10
|
+
from nextmv.cli.message import enum_values, in_progress, success
|
|
9
11
|
from nextmv.cli.options import AppIDOption, ProfileOption, ShadowTestIDOption
|
|
12
|
+
from nextmv.cloud.shadow import StopIntent
|
|
10
13
|
|
|
11
14
|
# Set up subcommand application.
|
|
12
15
|
app = typer.Typer()
|
|
@@ -15,6 +18,15 @@ app = typer.Typer()
|
|
|
15
18
|
@app.command()
|
|
16
19
|
def stop(
|
|
17
20
|
app_id: AppIDOption,
|
|
21
|
+
intent: Annotated[
|
|
22
|
+
StopIntent,
|
|
23
|
+
typer.Option(
|
|
24
|
+
"--intent",
|
|
25
|
+
"-i",
|
|
26
|
+
help=f"Intent for stopping the shadow test. Allowed values are: {enum_values(StopIntent)}.",
|
|
27
|
+
metavar="INTENT",
|
|
28
|
+
),
|
|
29
|
+
],
|
|
18
30
|
shadow_test_id: ShadowTestIDOption,
|
|
19
31
|
profile: ProfileOption = None,
|
|
20
32
|
) -> None:
|
|
@@ -34,7 +46,7 @@ def stop(
|
|
|
34
46
|
|
|
35
47
|
in_progress(msg="Stopping shadow test...")
|
|
36
48
|
cloud_app = build_app(app_id=app_id, profile=profile)
|
|
37
|
-
cloud_app.stop_shadow_test(shadow_test_id=shadow_test_id)
|
|
49
|
+
cloud_app.stop_shadow_test(shadow_test_id=shadow_test_id, intent=StopIntent(intent))
|
|
38
50
|
success(
|
|
39
51
|
f"Shadow test [magenta]{shadow_test_id}[/magenta] stopped successfully "
|
|
40
52
|
f"in application [magenta]{app_id}[/magenta]."
|
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
This module defines the cloud switchback stop command for the Nextmv CLI.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
from typing import Annotated
|
|
6
|
+
|
|
5
7
|
import typer
|
|
6
8
|
|
|
7
9
|
from nextmv.cli.configuration.config import build_app
|
|
8
|
-
from nextmv.cli.message import in_progress, success
|
|
10
|
+
from nextmv.cli.message import enum_values, in_progress, success
|
|
9
11
|
from nextmv.cli.options import AppIDOption, ProfileOption, SwitchbackTestIDOption
|
|
12
|
+
from nextmv.cloud.shadow import StopIntent
|
|
10
13
|
|
|
11
14
|
# Set up subcommand application.
|
|
12
15
|
app = typer.Typer()
|
|
@@ -15,6 +18,15 @@ app = typer.Typer()
|
|
|
15
18
|
@app.command()
|
|
16
19
|
def stop(
|
|
17
20
|
app_id: AppIDOption,
|
|
21
|
+
intent: Annotated[
|
|
22
|
+
StopIntent,
|
|
23
|
+
typer.Option(
|
|
24
|
+
"--intent",
|
|
25
|
+
"-i",
|
|
26
|
+
help=f"Intent for stopping the switchback test. Allowed values are: {enum_values(StopIntent)}.",
|
|
27
|
+
metavar="INTENT",
|
|
28
|
+
),
|
|
29
|
+
],
|
|
18
30
|
switchback_test_id: SwitchbackTestIDOption,
|
|
19
31
|
profile: ProfileOption = None,
|
|
20
32
|
) -> None:
|
|
@@ -34,7 +46,7 @@ def stop(
|
|
|
34
46
|
|
|
35
47
|
in_progress(msg="Stopping switchback test...")
|
|
36
48
|
cloud_app = build_app(app_id=app_id, profile=profile)
|
|
37
|
-
cloud_app.stop_switchback_test(switchback_test_id=switchback_test_id)
|
|
49
|
+
cloud_app.stop_switchback_test(switchback_test_id=switchback_test_id, intent=StopIntent(intent))
|
|
38
50
|
success(
|
|
39
51
|
f"Switchback test [magenta]{switchback_test_id}[/magenta] stopped successfully "
|
|
40
52
|
f"in application [magenta]{app_id}[/magenta]."
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module defines the community clone command for the Nextmv CLI.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Annotated
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from nextmv.cli.configuration.config import build_client
|
|
10
|
+
from nextmv.cli.message import error
|
|
11
|
+
from nextmv.cli.options import ProfileOption
|
|
12
|
+
from nextmv.cloud.community import clone_community_app
|
|
13
|
+
|
|
14
|
+
# Set up subcommand application.
|
|
15
|
+
app = typer.Typer()
|
|
16
|
+
|
|
17
|
+
# Helpful constants.
|
|
18
|
+
LATEST_VERSION = "latest"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@app.command()
|
|
22
|
+
def clone(
|
|
23
|
+
app: Annotated[
|
|
24
|
+
str,
|
|
25
|
+
typer.Option("--app", "-a", help="The name of the community app to clone.", metavar="COMMUNITY_APP"),
|
|
26
|
+
],
|
|
27
|
+
directory: Annotated[
|
|
28
|
+
str | None,
|
|
29
|
+
typer.Option(
|
|
30
|
+
"--directory",
|
|
31
|
+
"-d",
|
|
32
|
+
help="The directory in which to clone the app. Default is the name of the app at current directory.",
|
|
33
|
+
metavar="DIRECTORY",
|
|
34
|
+
),
|
|
35
|
+
] = None,
|
|
36
|
+
version: Annotated[
|
|
37
|
+
str | None,
|
|
38
|
+
typer.Option(
|
|
39
|
+
"--version",
|
|
40
|
+
"-v",
|
|
41
|
+
help="The version of the community app to clone.",
|
|
42
|
+
metavar="VERSION",
|
|
43
|
+
),
|
|
44
|
+
] = LATEST_VERSION,
|
|
45
|
+
profile: ProfileOption = None,
|
|
46
|
+
) -> None:
|
|
47
|
+
"""
|
|
48
|
+
Clone a community app locally.
|
|
49
|
+
|
|
50
|
+
By default, the [magenta]latest[/magenta] version will be used. You can
|
|
51
|
+
specify a version with the --version flag, and customize the output
|
|
52
|
+
directory with the --directory flag. If you want to list the available
|
|
53
|
+
apps, use the [code]nextmv community list[/code] command.
|
|
54
|
+
|
|
55
|
+
[bold][underline]Examples[/underline][/bold]
|
|
56
|
+
|
|
57
|
+
- Clone the [magenta]go-nextroute[/magenta] community app (under the
|
|
58
|
+
[magenta]"go-nextroute"[/magenta] directory), using the [magenta]latest[/magenta] version.
|
|
59
|
+
$ [dim]nextmv community clone --app go-nextroute[/dim]
|
|
60
|
+
|
|
61
|
+
- Clone the [magenta]go-nextroute[/magenta] community app under the
|
|
62
|
+
[magenta]"~/sample/my_app"[/magenta] directory, using the [magenta]latest[/magenta] version.
|
|
63
|
+
$ [dim]nextmv community clone --app go-nextroute --directory ~/sample/my_app[/dim]
|
|
64
|
+
|
|
65
|
+
- Clone the [magenta]go-nextroute[/magenta] community app (under the
|
|
66
|
+
[magenta]"go-nextroute"[/magenta] directory), using version [magenta]v1.2.0[/magenta].
|
|
67
|
+
$ [dim]nextmv community clone --app go-nextroute --version v1.2.0[/dim]
|
|
68
|
+
|
|
69
|
+
- Clone the [magenta]go-nextroute[/magenta] community app (under the
|
|
70
|
+
[magenta]"go-nextroute"[/magenta] directory), using the [magenta]latest[/magenta] version
|
|
71
|
+
and a profile named [magenta]hare[/magenta].
|
|
72
|
+
$ [dim]nextmv community clone --app go-nextroute --profile hare[/dim]
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
if version is not None and version == "":
|
|
76
|
+
error("The --version flag cannot be an empty string.")
|
|
77
|
+
|
|
78
|
+
client = build_client(profile)
|
|
79
|
+
clone_community_app(
|
|
80
|
+
client=client,
|
|
81
|
+
app=app,
|
|
82
|
+
directory=directory,
|
|
83
|
+
version=version,
|
|
84
|
+
verbose=True,
|
|
85
|
+
rich_print=True,
|
|
86
|
+
)
|