nextmv 1.0.0__tar.gz → 1.0.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.0.0 → nextmv-1.0.0.dev0}/PKG-INFO +4 -5
- nextmv-1.0.0.dev0/nextmv/__about__.py +1 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/__entrypoint__.py +2 -1
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/__init__.py +4 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/CONTRIBUTING.md +40 -112
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/__init__.py +0 -4
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/acceptance/create.py +22 -20
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/acceptance/delete.py +12 -8
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/acceptance/get.py +10 -9
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/acceptance/list.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/acceptance/update.py +6 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/account/__init__.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/account/create.py +11 -11
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/account/delete.py +8 -7
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/account/get.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/account/update.py +5 -5
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/app/create.py +26 -25
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/app/delete.py +7 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/app/exists.py +2 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/app/get.py +2 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/app/list.py +3 -3
- nextmv-1.0.0.dev0/nextmv/cli/cloud/app/push.py +137 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/app/update.py +12 -12
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/batch/create.py +28 -26
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/batch/delete.py +10 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/batch/get.py +9 -9
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/batch/list.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/batch/metadata.py +4 -4
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/batch/update.py +6 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/data/__init__.py +1 -1
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/data/upload.py +15 -15
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/ensemble/__init__.py +0 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/ensemble/create.py +22 -21
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/ensemble/delete.py +10 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/ensemble/get.py +4 -4
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/ensemble/update.py +9 -9
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/input_set/__init__.py +0 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/input_set/create.py +22 -22
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/input_set/get.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/input_set/list.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/input_set/update.py +24 -24
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/instance/create.py +15 -14
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/instance/delete.py +7 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/instance/exists.py +2 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/instance/get.py +2 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/instance/list.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/instance/update.py +14 -14
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/managed_input/create.py +16 -14
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/managed_input/delete.py +8 -7
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/managed_input/get.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/managed_input/list.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/managed_input/update.py +9 -9
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/run/cancel.py +2 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/run/create.py +40 -34
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/run/get.py +8 -8
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/run/input.py +4 -4
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/run/list.py +6 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/run/logs.py +10 -9
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/run/metadata.py +4 -4
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/run/track.py +33 -32
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/scenario/create.py +21 -21
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/scenario/delete.py +10 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/scenario/get.py +9 -9
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/scenario/list.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/scenario/metadata.py +4 -4
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/scenario/update.py +6 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/secrets/create.py +17 -17
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/secrets/delete.py +10 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/secrets/get.py +4 -4
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/secrets/list.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/secrets/update.py +20 -17
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/upload/create.py +2 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/version/create.py +10 -9
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/version/delete.py +7 -6
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/version/exists.py +2 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/version/get.py +2 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/version/list.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/version/update.py +8 -8
- nextmv-1.0.0.dev0/nextmv/cli/community/clone.py +270 -0
- nextmv-1.0.0.dev0/nextmv/cli/community/list.py +265 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/configuration/config.py +10 -43
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/configuration/create.py +7 -7
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/configuration/delete.py +8 -8
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/configuration/list.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/main.py +36 -26
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/message.py +54 -71
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/options.py +0 -28
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/version.py +1 -1
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/__init__.py +38 -14
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/acceptance_test.py +65 -1
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/account.py +6 -1
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/__init__.py +75 -18
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/_acceptance.py +8 -13
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/_batch_scenario.py +19 -4
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/_input_set.py +6 -42
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/_instance.py +3 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/_managed_input.py +2 -2
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/_version.py +3 -4
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/batch_experiment.py +1 -3
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/integration.py +4 -7
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/deprecated.py +3 -5
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/input.py +52 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/local/runner.py +1 -1
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/model.py +11 -50
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/options.py +256 -11
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/output.py +62 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/run.py +10 -1
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/status.py +51 -1
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/pyproject.toml +8 -6
- nextmv-1.0.0.dev0/tests/cli/test_community.py +665 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/cli/test_configuration.py +37 -8
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/cli/test_main.py +31 -0
- nextmv-1.0.0.dev0/tests/scripts/options_deprecated.py +8 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_entrypoint/test_entrypoint.py +13 -15
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_options.py +252 -1
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_run.py +13 -2
- nextmv-1.0.0/nextmv/__about__.py +0 -1
- nextmv-1.0.0/nextmv/cli/cloud/app/push.py +0 -432
- nextmv-1.0.0/nextmv/cli/cloud/ensemble/list.py +0 -63
- nextmv-1.0.0/nextmv/cli/cloud/input_set/delete.py +0 -64
- nextmv-1.0.0/nextmv/cli/cloud/shadow/__init__.py +0 -33
- nextmv-1.0.0/nextmv/cli/cloud/shadow/create.py +0 -184
- nextmv-1.0.0/nextmv/cli/cloud/shadow/delete.py +0 -64
- nextmv-1.0.0/nextmv/cli/cloud/shadow/get.py +0 -61
- nextmv-1.0.0/nextmv/cli/cloud/shadow/list.py +0 -63
- nextmv-1.0.0/nextmv/cli/cloud/shadow/metadata.py +0 -66
- nextmv-1.0.0/nextmv/cli/cloud/shadow/start.py +0 -43
- nextmv-1.0.0/nextmv/cli/cloud/shadow/stop.py +0 -53
- nextmv-1.0.0/nextmv/cli/cloud/shadow/update.py +0 -96
- nextmv-1.0.0/nextmv/cli/cloud/switchback/__init__.py +0 -33
- nextmv-1.0.0/nextmv/cli/cloud/switchback/create.py +0 -151
- nextmv-1.0.0/nextmv/cli/cloud/switchback/delete.py +0 -64
- nextmv-1.0.0/nextmv/cli/cloud/switchback/get.py +0 -62
- nextmv-1.0.0/nextmv/cli/cloud/switchback/list.py +0 -63
- nextmv-1.0.0/nextmv/cli/cloud/switchback/metadata.py +0 -68
- nextmv-1.0.0/nextmv/cli/cloud/switchback/start.py +0 -43
- nextmv-1.0.0/nextmv/cli/cloud/switchback/stop.py +0 -53
- nextmv-1.0.0/nextmv/cli/cloud/switchback/update.py +0 -96
- nextmv-1.0.0/nextmv/cli/community/clone.py +0 -86
- nextmv-1.0.0/nextmv/cli/community/list.py +0 -200
- nextmv-1.0.0/nextmv/cli/confirm.py +0 -34
- nextmv-1.0.0/nextmv/cloud/application/_shadow.py +0 -320
- nextmv-1.0.0/nextmv/cloud/application/_switchback.py +0 -332
- nextmv-1.0.0/nextmv/cloud/community.py +0 -446
- nextmv-1.0.0/nextmv/cloud/shadow.py +0 -254
- nextmv-1.0.0/nextmv/cloud/switchback.py +0 -228
- nextmv-1.0.0/tests/README.md +0 -91
- nextmv-1.0.0/tests/integration/cloud/test_integration_cloud.py +0 -790
- nextmv-1.0.0/tests/scripts/__init__.py +0 -0
- nextmv-1.0.0/tests/test_entrypoint/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/.gitignore +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/LICENSE +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/README.md +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/_serialization.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/base_model.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/app/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/batch/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/instance/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/run/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/scenario/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/secrets/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/upload/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/cloud/version/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/community/__init__.py +1 -1
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cli/configuration/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/_ensemble.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/_run.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/_secrets.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/application/_utils.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/assets.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/client.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/ensemble.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/input_set.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/instance.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/package.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/scenario.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/secrets.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/url.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/cloud/version.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/default_app/.gitignore +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/default_app/README.md +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/default_app/app.yaml +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/default_app/input.json +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/default_app/main.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/default_app/requirements.txt +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/default_app/src/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/default_app/src/visuals.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/local/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/local/application.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/local/executor.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/local/geojson_handler.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/local/local.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/local/plotly_handler.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/logger.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/manifest.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/polling.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/nextmv/safe.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/cli/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/cli/test_version.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/cloud/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/cloud/app.yaml +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/cloud/test_client.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/cloud/test_instance.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/cloud/test_package.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/cloud/test_scenario.py +0 -0
- {nextmv-1.0.0/tests/integration → nextmv-1.0.0.dev0/tests/local}/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/local/test_application.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/local/test_executor.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/local/test_runner.py +0 -0
- {nextmv-1.0.0/tests/integration/cloud → nextmv-1.0.0.dev0/tests/scripts}/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/scripts/options1.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/scripts/options2.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/scripts/options3.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/scripts/options4.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/scripts/options5.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/scripts/options6.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/scripts/options7.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_base_model.py +0 -0
- {nextmv-1.0.0/tests/local → nextmv-1.0.0.dev0/tests/test_entrypoint}/__init__.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_input.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_inputs/test_data.csv +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_inputs/test_data.json +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_inputs/test_data.txt +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_logger.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_manifest.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_model.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_output.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_polling.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_safe.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_serialization.py +0 -0
- {nextmv-1.0.0 → nextmv-1.0.0.dev0}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nextmv
|
|
3
|
-
Version: 1.0.0
|
|
3
|
+
Version: 1.0.0.dev0
|
|
4
4
|
Summary: The all-purpose Python SDK for Nextmv
|
|
5
5
|
Project-URL: Homepage, https://www.nextmv.io
|
|
6
6
|
Project-URL: Documentation, https://nextmv-py.docs.nextmv.io/en/latest/nextmv/
|
|
@@ -229,20 +229,19 @@ Requires-Dist: plotly>=6.0.1; extra == 'all'
|
|
|
229
229
|
Provides-Extra: dev
|
|
230
230
|
Requires-Dist: build>=1.0.3; extra == 'dev'
|
|
231
231
|
Requires-Dist: folium>=0.20.0; extra == 'dev'
|
|
232
|
-
Requires-Dist: mlflow>=
|
|
233
|
-
Requires-Dist:
|
|
232
|
+
Requires-Dist: mlflow>=2.19.0; extra == 'dev'
|
|
233
|
+
Requires-Dist: nextroute>=1.11.1; extra == 'dev'
|
|
234
234
|
Requires-Dist: openpyxl>=3.1.5; extra == 'dev'
|
|
235
235
|
Requires-Dist: pandas>=2.2.3; extra == 'dev'
|
|
236
236
|
Requires-Dist: plotly>=6.0.1; extra == 'dev'
|
|
237
237
|
Requires-Dist: pydantic>=2.5.2; extra == 'dev'
|
|
238
|
-
Requires-Dist: pytest>=9.0.2; extra == 'dev'
|
|
239
238
|
Requires-Dist: pyyaml>=6.0.1; extra == 'dev'
|
|
240
239
|
Requires-Dist: requests>=2.31.0; extra == 'dev'
|
|
241
240
|
Requires-Dist: ruff>=0.1.7; extra == 'dev'
|
|
242
241
|
Requires-Dist: twine>=4.0.2; extra == 'dev'
|
|
243
242
|
Requires-Dist: urllib3>=2.1.0; extra == 'dev'
|
|
244
243
|
Provides-Extra: notebook
|
|
245
|
-
Requires-Dist: mlflow>=
|
|
244
|
+
Requires-Dist: mlflow>=2.19.0; extra == 'notebook'
|
|
246
245
|
Description-Content-Type: text/markdown
|
|
247
246
|
|
|
248
247
|
# Nextmv Python SDK
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "v1.0.0.dev0"
|
|
@@ -10,12 +10,13 @@ human to use it during local development. It is the standard way in which a
|
|
|
10
10
|
from mlflow.pyfunc import load_model
|
|
11
11
|
|
|
12
12
|
import nextmv
|
|
13
|
+
from nextmv import cloud
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
def main() -> None:
|
|
16
17
|
"""Entry point for the program."""
|
|
17
18
|
|
|
18
|
-
manifest =
|
|
19
|
+
manifest = cloud.Manifest.from_yaml(".")
|
|
19
20
|
|
|
20
21
|
# Load the options from the manifest.
|
|
21
22
|
options = manifest.extract_options()
|
|
@@ -11,6 +11,7 @@ from .input import LocalInputLoader as LocalInputLoader
|
|
|
11
11
|
from .input import csv_data_file as csv_data_file
|
|
12
12
|
from .input import json_data_file as json_data_file
|
|
13
13
|
from .input import load as load
|
|
14
|
+
from .input import load_local as load_local
|
|
14
15
|
from .input import text_data_file as text_data_file
|
|
15
16
|
from .logger import log as log
|
|
16
17
|
from .logger import redirect_stdout as redirect_stdout
|
|
@@ -30,6 +31,7 @@ from .model import Model as Model
|
|
|
30
31
|
from .model import ModelConfiguration as ModelConfiguration
|
|
31
32
|
from .options import Option as Option
|
|
32
33
|
from .options import Options as Options
|
|
34
|
+
from .options import Parameter as Parameter
|
|
33
35
|
from .output import Asset as Asset
|
|
34
36
|
from .output import DataPoint as DataPoint
|
|
35
37
|
from .output import LocalOutputWriter as LocalOutputWriter
|
|
@@ -48,6 +50,7 @@ from .output import csv_solution_file as csv_solution_file
|
|
|
48
50
|
from .output import json_solution_file as json_solution_file
|
|
49
51
|
from .output import text_solution_file as text_solution_file
|
|
50
52
|
from .output import write as write
|
|
53
|
+
from .output import write_local as write_local
|
|
51
54
|
from .polling import DEFAULT_POLLING_OPTIONS as DEFAULT_POLLING_OPTIONS
|
|
52
55
|
from .polling import PollingOptions as PollingOptions
|
|
53
56
|
from .polling import default_polling_options as default_polling_options
|
|
@@ -76,6 +79,7 @@ from .run import TrackedRunStatus as TrackedRunStatus
|
|
|
76
79
|
from .run import run_duration as run_duration
|
|
77
80
|
from .safe import safe_id as safe_id
|
|
78
81
|
from .safe import safe_name_and_id as safe_name_and_id
|
|
82
|
+
from .status import Status as Status
|
|
79
83
|
from .status import StatusV2 as StatusV2
|
|
80
84
|
|
|
81
85
|
VERSION = __version__
|
|
@@ -152,16 +152,14 @@ guidelines:
|
|
|
152
152
|
- We embrace the use of emojis. They make the CLI friendlier and more
|
|
153
153
|
approachable.
|
|
154
154
|
- The `message.py` file contains helper functions for printing messages, like:
|
|
155
|
-
- `
|
|
156
|
-
|
|
157
|
-
- `
|
|
158
|
-
- `in_progress`: prints an in-progress message.
|
|
159
|
-
- `
|
|
160
|
-
|
|
161
|
-
- `error`: prints an error and raises an exception. Use for critical issues
|
|
162
|
-
and to return early from commands.
|
|
155
|
+
- `error`: prints an error and raises an exception.
|
|
156
|
+
- `success`: prints a success message.
|
|
157
|
+
- `warning`: prints a warning message.
|
|
158
|
+
- `in_progress`: prints an in-progress message.
|
|
159
|
+
- `info`: prints an informational message. You can give it an emoji for the
|
|
160
|
+
message. The other commands have fixed emojis.
|
|
163
161
|
- For printing `JSON` information, use the `print_json` function in the
|
|
164
|
-
`
|
|
162
|
+
`messages.py` file to print JSON output. This ensures consistent formatting
|
|
165
163
|
across the CLI.
|
|
166
164
|
- Emojis should be formatted according to [Rich's emoji guide][rich-emoji].
|
|
167
165
|
They are strings enclosed in colons, e.g. `:rocket:`, `:boom:`,
|
|
@@ -173,110 +171,40 @@ guidelines:
|
|
|
173
171
|
success(f"Application [magenta]{app_id}[/magenta] deleted successfully.")
|
|
174
172
|
```
|
|
175
173
|
|
|
176
|
-
- When showing the values of an `Enum`, use the `enum_values` function in the
|
|
177
|
-
`message.py` file which will give a nicely colored, comma-separated list of
|
|
178
|
-
the enum values. Consider the following example, where we get the allowed
|
|
179
|
-
values for the `InputFormat` class.
|
|
180
|
-
|
|
181
|
-
```python
|
|
182
|
-
content_format: Annotated[
|
|
183
|
-
InputFormat | None,
|
|
184
|
-
typer.Option(
|
|
185
|
-
"--content-format",
|
|
186
|
-
"-c",
|
|
187
|
-
help=f"The content format for the instance. Allowed values are: {enum_values(InputFormat)}.",
|
|
188
|
-
metavar="CONTENT_FORMAT",
|
|
189
|
-
rich_help_panel="Instance configuration",
|
|
190
|
-
),
|
|
191
|
-
] = None,
|
|
192
|
-
```
|
|
193
|
-
|
|
194
174
|
## Confirmation prompts
|
|
195
175
|
|
|
196
|
-
For destructive actions (like deletions), use
|
|
197
|
-
|
|
198
|
-
the `cli/confirm.py` file. This method already handles sensible values used for
|
|
199
|
-
getting a confirmation from a user. Additionally, it handles non-interactive
|
|
200
|
-
sessions by defaulting to `False` if no input can be provided.
|
|
176
|
+
For destructive actions (like deletions), use `rich.prompt.Confirm.ask()` to
|
|
177
|
+
ask for user confirmation before proceeding. Follow these guidelines:
|
|
201
178
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
- The confirmation message should use `[magenta]` for the variable/s being
|
|
179
|
+
- The confirmation message should use `[magenta]` for the variable being
|
|
205
180
|
affected.
|
|
206
|
-
-
|
|
207
|
-
|
|
208
|
-
-
|
|
181
|
+
- Set `default=False` for safety, so the user must explicitly confirm.
|
|
182
|
+
- Provide a `--yes` / `-y` flag to skip the confirmation prompt, useful for
|
|
183
|
+
non-interactive sessions.
|
|
184
|
+
- If the user declines, call `info()` with the `:bulb:` emoji and return early.
|
|
209
185
|
|
|
210
186
|
Consider the `nextmv cloud app delete` command:
|
|
211
187
|
|
|
212
188
|
```python
|
|
213
189
|
if not yes:
|
|
214
|
-
confirm =
|
|
215
|
-
f"Are you sure you want to delete application [magenta]{app_id}[/magenta]? This action cannot be undone
|
|
190
|
+
confirm = Confirm.ask(
|
|
191
|
+
f"Are you sure you want to delete application [magenta]{app_id}[/magenta]? This action cannot be undone",
|
|
192
|
+
default=False,
|
|
216
193
|
)
|
|
217
194
|
|
|
218
195
|
if not confirm:
|
|
219
|
-
info(f"Application [magenta]{app_id}[/magenta] will not be deleted.")
|
|
196
|
+
info(msg=f"Application [magenta]{app_id}[/magenta] will not be deleted.", emoji=":bulb:")
|
|
220
197
|
return
|
|
221
198
|
```
|
|
222
199
|
|
|
223
|
-
## Formatting
|
|
224
|
-
|
|
225
|
-
Use these Rich markup colors/styles when formatting help text and messages.
|
|
226
|
-
These are the main colors/styles that can be used for highlighting/contrast (we
|
|
227
|
-
limit colors to keep coloring consistent):
|
|
228
|
-
|
|
229
|
-
- `[code]`: commands. CLI related variables. - technical things that are CLI
|
|
230
|
-
commands.
|
|
231
|
-
- `[magenta]`: variable names, values, literals, etc. - mainly short technical things.
|
|
232
|
-
- `[dim]`: examples. - longer technical things.
|
|
233
|
-
- `[yellow]`: emphasis, highlight of special items, type contrast to
|
|
234
|
-
`[magenta]`. Use sparingly only.
|
|
200
|
+
## Formatting
|
|
235
201
|
|
|
236
|
-
|
|
237
|
-
maintain consistency.
|
|
202
|
+
Use these Rich markup guidelines when formatting help text and messages.
|
|
238
203
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
delete an experiment with the `nextmv cloud shadow delete` command. The
|
|
244
|
-
formatting of that command is done using the `[code]` `[/code]` tags:
|
|
245
|
-
|
|
246
|
-
```python
|
|
247
|
-
@app.command()
|
|
248
|
-
def stop(
|
|
249
|
-
app_id: AppIDOption,
|
|
250
|
-
shadow_test_id: ShadowTestIDOption,
|
|
251
|
-
profile: ProfileOption = None,
|
|
252
|
-
) -> None:
|
|
253
|
-
"""
|
|
254
|
-
Stops a Nextmv Cloud shadow test.
|
|
255
|
-
|
|
256
|
-
Before stopping a shadow test, it must be in a started state. Experiments
|
|
257
|
-
in a [magenta]draft[/magenta] state, that haven't started, can be deleted
|
|
258
|
-
with the [code]nextmv cloud shadow delete[/code] command.
|
|
259
|
-
|
|
260
|
-
[bold][underline]Examples[/underline][/bold]
|
|
261
|
-
|
|
262
|
-
- Stop the shadow test with the ID [magenta]hop-analysis[/magenta] from application
|
|
263
|
-
[magenta]hare-app[/magenta].
|
|
264
|
-
$ [dim]nextmv cloud shadow stop --app-id hare-app --shadow-test-id hop-analysis[/dim]
|
|
265
|
-
"""
|
|
266
|
-
|
|
267
|
-
in_progress(msg="Stopping shadow test...")
|
|
268
|
-
cloud_app = build_app(app_id=app_id, profile=profile)
|
|
269
|
-
cloud_app.stop_shadow_test(shadow_test_id=shadow_test_id)
|
|
270
|
-
success(
|
|
271
|
-
f"Shadow test [magenta]{shadow_test_id}[/magenta] stopped successfully "
|
|
272
|
-
f"in application [magenta]{app_id}[/magenta]."
|
|
273
|
-
)
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
- When talking about a command option, there is no formatting needed. Typer
|
|
277
|
-
automatically adds coloring to options in the help menu. Take this example
|
|
278
|
-
from the help menu of the `cloud/app/delete.py` file. In the command help,
|
|
279
|
-
when referring to the `--yes` option:
|
|
204
|
+
- When talking about a command, or a command option, use the `[code]` `[/code]`
|
|
205
|
+
tags. Take this example from the help menu of the `cloud/app/delete.py` file.
|
|
206
|
+
In the command help, when referring to the `--yes` option, we use
|
|
207
|
+
`[code]--yes[/code]` to format it as code.
|
|
280
208
|
|
|
281
209
|
```python
|
|
282
210
|
@app.command()
|
|
@@ -295,16 +223,16 @@ Here are some guidelines for when to use each formatting style.
|
|
|
295
223
|
"""
|
|
296
224
|
Deletes a Nextmv Cloud application.
|
|
297
225
|
|
|
298
|
-
This action is permanent and cannot be undone. Use the --yes
|
|
226
|
+
This action is permanent and cannot be undone. Use the [code]--yes[/code]
|
|
299
227
|
flag to skip the confirmation prompt.
|
|
300
228
|
|
|
301
229
|
[bold][underline]Examples[/underline][/bold]
|
|
302
230
|
|
|
303
231
|
- Delete the application with the ID [magenta]hare-app[/magenta].
|
|
304
|
-
$ [
|
|
232
|
+
$ [green]nextmv cloud app delete --app-id hare-app[/green]
|
|
305
233
|
|
|
306
234
|
- Delete the application with the ID [magenta]hare-app[/magenta] without confirmation prompt.
|
|
307
|
-
$ [
|
|
235
|
+
$ [green]nextmv cloud app delete --app-id hare-app --yes[/green]
|
|
308
236
|
"""
|
|
309
237
|
```
|
|
310
238
|
|
|
@@ -318,12 +246,6 @@ Here are some guidelines for when to use each formatting style.
|
|
|
318
246
|
error(f"Input path [magenta]{input}[/magenta] does not exist.")
|
|
319
247
|
```
|
|
320
248
|
|
|
321
|
-
- When talking about longer technical things, like examples for a command
|
|
322
|
-
usage, or examples of a JSON object, use the `[dim]` `[/dim]` tags. Consider
|
|
323
|
-
the examples section of the `cloud/app/delete.py` file above. The example
|
|
324
|
-
commands are formatted using the `[dim]` `[/dim]` tags. The `[dim]` tag is
|
|
325
|
-
discussed in more detail in the command documentation section below.
|
|
326
|
-
|
|
327
249
|
- Links to URLs should be formatted using the `[link=URL_LINK][bold]
|
|
328
250
|
[/bold][/link]` tags. Consider the main help message of the `nextmv
|
|
329
251
|
community` command, in the `community/__init__.py` file:
|
|
@@ -343,6 +265,11 @@ Here are some guidelines for when to use each formatting style.
|
|
|
343
265
|
The link provided is <https://github.com/nextmv-io/community-apps>, and it will
|
|
344
266
|
be applied to the text `nextmv-io/community-apps`.
|
|
345
267
|
|
|
268
|
+
- Colors that can be used for highlighting (we limit colors to keep coloring consistent):
|
|
269
|
+
- `[magenta]`: variable, literals, etc. - mainly short technical things (see above).
|
|
270
|
+
- `[green]`: commands, etc. - longer technical things, or, as a type-contrast to magenta.
|
|
271
|
+
- `[yellow]`: emphasis, highlight of special items, etc. (use sparingly only).
|
|
272
|
+
|
|
346
273
|
## Command documentation
|
|
347
274
|
|
|
348
275
|
Every command should have good-enough documentation that guides the user on how
|
|
@@ -389,15 +316,15 @@ to use it.
|
|
|
389
316
|
[bold][underline]Examples[/underline][/bold]
|
|
390
317
|
|
|
391
318
|
- Get the application with the ID [magenta]hare-app[/magenta].
|
|
392
|
-
$ [
|
|
319
|
+
$ [green]nextmv cloud app get --app-id hare-app[/green]
|
|
393
320
|
|
|
394
321
|
- Get the application with the ID [magenta]hare-app[/magenta] and save the information to an
|
|
395
322
|
[magenta]app.json[/magenta] file.
|
|
396
|
-
$ [
|
|
323
|
+
$ [green]nextmv cloud app get --app-id hare-app --output app.json[/green]
|
|
397
324
|
"""
|
|
398
325
|
|
|
399
326
|
client = build_client(profile)
|
|
400
|
-
|
|
327
|
+
info(msg="Getting application...", emoji=":hourglass_flowing_sand:")
|
|
401
328
|
|
|
402
329
|
cloud_app = Application.get(
|
|
403
330
|
client=client,
|
|
@@ -409,7 +336,7 @@ to use it.
|
|
|
409
336
|
with open(output, "w") as f:
|
|
410
337
|
json.dump(cloud_app_dict, f, indent=2)
|
|
411
338
|
|
|
412
|
-
success(f"Application information saved to [magenta]{output}[/magenta].")
|
|
339
|
+
success(msg=f"Application information saved to [magenta]{output}[/magenta].")
|
|
413
340
|
|
|
414
341
|
return
|
|
415
342
|
|
|
@@ -426,10 +353,11 @@ to use it.
|
|
|
426
353
|
|
|
427
354
|
- The examples section is fenced with the `[bold][underline]
|
|
428
355
|
[/underline][/bold]` tags.
|
|
356
|
+
|
|
429
357
|
- Each example is listed as a bullet, using a hyphen (`-`).
|
|
430
358
|
- Each example has a short description, followed by the command itself in a
|
|
431
359
|
new line, with 4 spaces of indentation in comparison to where the hyphen is.
|
|
432
|
-
- The command itself should be formatted using the `[
|
|
360
|
+
- The command itself should be formatted using the `[green]` `[/green]` tags.
|
|
433
361
|
- The command should start with a dollar sign (`$`), followed by a space, and
|
|
434
362
|
then the actual command.
|
|
435
363
|
- When an example command is too long, use a double backslash (`\\`) for line
|
|
@@ -438,8 +366,8 @@ to use it.
|
|
|
438
366
|
|
|
439
367
|
```text
|
|
440
368
|
- Create an application with an ID and description.
|
|
441
|
-
$ [
|
|
442
|
-
--description "An application for routing hares"[/
|
|
369
|
+
$ [green]nextmv cloud app create --name "Hare App" --app-id hare-app \\
|
|
370
|
+
--description "An application for routing hares"[/green]
|
|
443
371
|
```
|
|
444
372
|
|
|
445
373
|
## Command options
|
|
@@ -16,8 +16,6 @@ from nextmv.cli.cloud.managed_input import app as managed_input_app
|
|
|
16
16
|
from nextmv.cli.cloud.run import app as run_app
|
|
17
17
|
from nextmv.cli.cloud.scenario import app as scenario_app
|
|
18
18
|
from nextmv.cli.cloud.secrets import app as secrets_app
|
|
19
|
-
from nextmv.cli.cloud.shadow import app as shadow_app
|
|
20
|
-
from nextmv.cli.cloud.switchback import app as switchback_app
|
|
21
19
|
from nextmv.cli.cloud.upload import app as upload_app
|
|
22
20
|
from nextmv.cli.cloud.version import app as version_app
|
|
23
21
|
|
|
@@ -35,8 +33,6 @@ app.add_typer(managed_input_app, name="managed-input")
|
|
|
35
33
|
app.add_typer(run_app, name="run")
|
|
36
34
|
app.add_typer(scenario_app, name="scenario")
|
|
37
35
|
app.add_typer(secrets_app, name="secrets")
|
|
38
|
-
app.add_typer(shadow_app, name="shadow")
|
|
39
|
-
app.add_typer(switchback_app, name="switchback")
|
|
40
36
|
app.add_typer(upload_app, name="upload")
|
|
41
37
|
app.add_typer(version_app, name="version")
|
|
42
38
|
|
|
@@ -27,22 +27,24 @@ app = typer.Typer()
|
|
|
27
27
|
|
|
28
28
|
The acceptance test is based on a batch experiment. If the batch experiment
|
|
29
29
|
with the same ID already exists, it will be reused. Otherwise, you must
|
|
30
|
-
provide the --input-set-id option to create a new batch
|
|
30
|
+
provide the [code]--input-set-id[/code] option to create a new batch
|
|
31
|
+
experiment.
|
|
31
32
|
|
|
32
|
-
Use the --wait flag to wait for the acceptance test to
|
|
33
|
-
for results. Using the --output flag will
|
|
34
|
-
you to specify a destination file for the
|
|
33
|
+
Use the [code]--wait[/code] flag to wait for the acceptance test to
|
|
34
|
+
complete, polling for results. Using the [code]--output[/code] flag will
|
|
35
|
+
also activate waiting, and allows you to specify a destination file for the
|
|
36
|
+
results.
|
|
35
37
|
|
|
36
38
|
[bold][underline]Metrics[/underline][/bold]
|
|
37
39
|
|
|
38
40
|
Metrics are provided as [magenta]json[/magenta] objects using the
|
|
39
|
-
--metrics flag. Each metric defines how to compare the
|
|
41
|
+
[code]--metrics[/code] flag. Each metric defines how to compare the
|
|
40
42
|
candidate and baseline instances.
|
|
41
43
|
|
|
42
44
|
You can provide metrics in three ways:
|
|
43
45
|
- A single metric as a [magenta]json[/magenta] object.
|
|
44
|
-
- Multiple metrics by repeating the --metrics flag.
|
|
45
|
-
- Multiple metrics as a [magenta]json[/magenta] array in a single --metrics flag.
|
|
46
|
+
- Multiple metrics by repeating the [code]--metrics[/code] flag.
|
|
47
|
+
- Multiple metrics as a [magenta]json[/magenta] array in a single [code]--metrics[/code] flag.
|
|
46
48
|
|
|
47
49
|
Each metric must have the following fields:
|
|
48
50
|
- [magenta]field[/magenta]: Field of the metric to measure (e.g., "solution.objective").
|
|
@@ -55,7 +57,7 @@ app = typer.Typer()
|
|
|
55
57
|
- [magenta]statistic[/magenta]: Statistical method. Allowed values: {enum_values(StatisticType)}.
|
|
56
58
|
|
|
57
59
|
Object format:
|
|
58
|
-
[
|
|
60
|
+
[green]{{
|
|
59
61
|
"field": "field",
|
|
60
62
|
"metric_type": "type",
|
|
61
63
|
"params": {{
|
|
@@ -66,12 +68,12 @@ app = typer.Typer()
|
|
|
66
68
|
}}
|
|
67
69
|
}},
|
|
68
70
|
"statistic": "statistic"
|
|
69
|
-
}}[/
|
|
71
|
+
}}[/green]
|
|
70
72
|
|
|
71
73
|
[bold][underline]Examples[/underline][/bold]
|
|
72
74
|
|
|
73
75
|
- Create an acceptance test with a single metric.
|
|
74
|
-
$ [
|
|
76
|
+
$ [green]METRIC='{{
|
|
75
77
|
"field": "solution.objective",
|
|
76
78
|
"metric_type": "direct-comparison",
|
|
77
79
|
"params": {{
|
|
@@ -82,10 +84,10 @@ app = typer.Typer()
|
|
|
82
84
|
}}'
|
|
83
85
|
nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
|
|
84
86
|
--candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
|
|
85
|
-
--metrics "$METRIC" --input-set-id input-set-123[/
|
|
87
|
+
--metrics "$METRIC" --input-set-id input-set-123[/green]
|
|
86
88
|
|
|
87
89
|
- Create with multiple metrics by repeating the flag.
|
|
88
|
-
$ [
|
|
90
|
+
$ [green]METRIC1='{{
|
|
89
91
|
"field": "solution.objective",
|
|
90
92
|
"metric_type": "direct-comparison",
|
|
91
93
|
"params": {{
|
|
@@ -105,10 +107,10 @@ app = typer.Typer()
|
|
|
105
107
|
}}'
|
|
106
108
|
nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
|
|
107
109
|
--candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
|
|
108
|
-
--metrics "$METRIC1" --metrics "$METRIC2" --input-set-id input-set-123[/
|
|
110
|
+
--metrics "$METRIC1" --metrics "$METRIC2" --input-set-id input-set-123[/green]
|
|
109
111
|
|
|
110
112
|
- Create with multiple metrics in a single [magenta]json[/magenta] array.
|
|
111
|
-
$ [
|
|
113
|
+
$ [green]METRICS='[
|
|
112
114
|
{{
|
|
113
115
|
"field": "solution.objective",
|
|
114
116
|
"metric_type": "direct-comparison",
|
|
@@ -130,10 +132,10 @@ app = typer.Typer()
|
|
|
130
132
|
]'
|
|
131
133
|
nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
|
|
132
134
|
--candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
|
|
133
|
-
--metrics "$METRICS" --input-set-id input-set-123[/
|
|
135
|
+
--metrics "$METRICS" --input-set-id input-set-123[/green]
|
|
134
136
|
|
|
135
137
|
- Create an acceptance test and wait for it to complete.
|
|
136
|
-
$ [
|
|
138
|
+
$ [green]METRIC='{{
|
|
137
139
|
"field": "solution.objective",
|
|
138
140
|
"metric_type": "direct-comparison",
|
|
139
141
|
"params": {{
|
|
@@ -144,10 +146,10 @@ app = typer.Typer()
|
|
|
144
146
|
}}'
|
|
145
147
|
nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
|
|
146
148
|
--candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
|
|
147
|
-
--metrics "$METRIC" --input-set-id input-set-123 --wait[/
|
|
149
|
+
--metrics "$METRIC" --input-set-id input-set-123 --wait[/green]
|
|
148
150
|
|
|
149
151
|
- Create an acceptance test and save the results to a file, waiting for completion.
|
|
150
|
-
$ [
|
|
152
|
+
$ [green]METRIC='{{
|
|
151
153
|
"field": "solution.objective",
|
|
152
154
|
"metric_type": "direct-comparison",
|
|
153
155
|
"params": {{
|
|
@@ -158,7 +160,7 @@ app = typer.Typer()
|
|
|
158
160
|
}}'
|
|
159
161
|
nextmv cloud acceptance create --app-id hare-app --acceptance-test-id test-123 \\
|
|
160
162
|
--candidate-instance-id candidate-123 --baseline-instance-id baseline-456 \\
|
|
161
|
-
--metrics "$METRIC" --input-set-id input-set-123 --output results.json[/
|
|
163
|
+
--metrics "$METRIC" --input-set-id input-set-123 --output results.json[/green]
|
|
162
164
|
"""
|
|
163
165
|
)
|
|
164
166
|
def create(
|
|
@@ -263,7 +265,7 @@ def create(
|
|
|
263
265
|
"--wait",
|
|
264
266
|
"-w",
|
|
265
267
|
help="Wait for the acceptance test to complete. Results are printed to [magenta]stdout[/magenta]. "
|
|
266
|
-
"Specify output location with --output.",
|
|
268
|
+
"Specify output location with [code]--output[/code].",
|
|
267
269
|
rich_help_panel="Output control",
|
|
268
270
|
),
|
|
269
271
|
] = False,
|
|
@@ -5,9 +5,9 @@ This module defines the cloud acceptance delete command for the Nextmv CLI.
|
|
|
5
5
|
from typing import Annotated
|
|
6
6
|
|
|
7
7
|
import typer
|
|
8
|
+
from rich.prompt import Confirm
|
|
8
9
|
|
|
9
10
|
from nextmv.cli.configuration.config import build_app
|
|
10
|
-
from nextmv.cli.confirm import get_confirmation
|
|
11
11
|
from nextmv.cli.message import info, success
|
|
12
12
|
from nextmv.cli.options import AcceptanceTestIDOption, AppIDOption, ProfileOption
|
|
13
13
|
|
|
@@ -32,28 +32,32 @@ def delete(
|
|
|
32
32
|
"""
|
|
33
33
|
Deletes a Nextmv Cloud acceptance test.
|
|
34
34
|
|
|
35
|
-
This action is permanent and cannot be undone. The underlying batch
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
This action is permanent and cannot be undone. The underlying batch experiment
|
|
36
|
+
and associated data will also be deleted. Use the [code]--yes[/code] flag to skip
|
|
37
|
+
the confirmation prompt.
|
|
38
38
|
|
|
39
39
|
[bold][underline]Examples[/underline][/bold]
|
|
40
40
|
|
|
41
41
|
- Delete the acceptance test with the ID [magenta]test-cotton-tail[/magenta] from application
|
|
42
42
|
[magenta]hare-app[/magenta].
|
|
43
|
-
$ [
|
|
43
|
+
$ [green]nextmv cloud acceptance delete --app-id hare-app --acceptance-test-id test-cotton-tail[/green]
|
|
44
44
|
|
|
45
45
|
- Delete the acceptance test without confirmation prompt.
|
|
46
|
-
$ [
|
|
46
|
+
$ [green]nextmv cloud acceptance delete --app-id hare-app --acceptance-test-id test-cotton-tail --yes[/green]
|
|
47
47
|
"""
|
|
48
48
|
|
|
49
49
|
if not yes:
|
|
50
|
-
confirm =
|
|
50
|
+
confirm = Confirm.ask(
|
|
51
51
|
f"Are you sure you want to delete acceptance test [magenta]{acceptance_test_id}[/magenta] "
|
|
52
52
|
f"from application [magenta]{app_id}[/magenta]? This action cannot be undone.",
|
|
53
|
+
default=False,
|
|
53
54
|
)
|
|
54
55
|
|
|
55
56
|
if not confirm:
|
|
56
|
-
info(
|
|
57
|
+
info(
|
|
58
|
+
msg=f"Acceptance test [magenta]{acceptance_test_id}[/magenta] will not be deleted.",
|
|
59
|
+
emoji=":bulb:",
|
|
60
|
+
)
|
|
57
61
|
return
|
|
58
62
|
|
|
59
63
|
cloud_app = build_app(app_id=app_id, profile=profile)
|
|
@@ -42,7 +42,7 @@ def get(
|
|
|
42
42
|
"--wait",
|
|
43
43
|
"-w",
|
|
44
44
|
help="Wait for the acceptance test to complete. Results are printed to [magenta]stdout[/magenta]. "
|
|
45
|
-
"Specify output location with --output.",
|
|
45
|
+
"Specify output location with [code]--output[/code].",
|
|
46
46
|
),
|
|
47
47
|
] = False,
|
|
48
48
|
profile: ProfileOption = None,
|
|
@@ -50,25 +50,26 @@ def get(
|
|
|
50
50
|
"""
|
|
51
51
|
Get a Nextmv Cloud acceptance test.
|
|
52
52
|
|
|
53
|
-
Use the --wait flag to wait for the acceptance test to
|
|
54
|
-
for results. Using the --output flag will
|
|
55
|
-
you to specify a destination file for the
|
|
53
|
+
Use the [code]--wait[/code] flag to wait for the acceptance test to
|
|
54
|
+
complete, polling for results. Using the [code]--output[/code] flag will
|
|
55
|
+
also activate waiting, and allows you to specify a destination file for the
|
|
56
|
+
results.
|
|
56
57
|
|
|
57
58
|
[bold][underline]Examples[/underline][/bold]
|
|
58
59
|
|
|
59
60
|
- Get the acceptance test with ID [magenta]test-123[/magenta] from application
|
|
60
61
|
[magenta]hare-app[/magenta].
|
|
61
|
-
$ [
|
|
62
|
+
$ [green]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123[/green]
|
|
62
63
|
|
|
63
64
|
- Get the acceptance test and wait for it to complete if necessary.
|
|
64
|
-
$ [
|
|
65
|
+
$ [green]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123 --wait[/green]
|
|
65
66
|
|
|
66
67
|
- Get the acceptance test and save the results to a file.
|
|
67
|
-
$ [
|
|
68
|
-
--acceptance-test-id test-123 --output results.json[/
|
|
68
|
+
$ [green]nextmv cloud acceptance get --app-id hare-app \\
|
|
69
|
+
--acceptance-test-id test-123 --output results.json[/green]
|
|
69
70
|
|
|
70
71
|
- Get the acceptance test using a specific profile.
|
|
71
|
-
$ [
|
|
72
|
+
$ [green]nextmv cloud acceptance get --app-id hare-app --acceptance-test-id test-123 --profile prod[/green]
|
|
72
73
|
"""
|
|
73
74
|
|
|
74
75
|
cloud_app = build_app(app_id=app_id, profile=profile)
|
|
@@ -38,13 +38,13 @@ def list(
|
|
|
38
38
|
[bold][underline]Examples[/underline][/bold]
|
|
39
39
|
|
|
40
40
|
- List all acceptance tests for application [magenta]hare-app[/magenta].
|
|
41
|
-
$ [
|
|
41
|
+
$ [green]nextmv cloud acceptance list --app-id hare-app[/green]
|
|
42
42
|
|
|
43
43
|
- List all acceptance tests and save to a file.
|
|
44
|
-
$ [
|
|
44
|
+
$ [green]nextmv cloud acceptance list --app-id hare-app --output tests.json[/green]
|
|
45
45
|
|
|
46
46
|
- List all acceptance tests using a specific profile.
|
|
47
|
-
$ [
|
|
47
|
+
$ [green]nextmv cloud acceptance list --app-id hare-app --profile prod[/green]
|
|
48
48
|
"""
|
|
49
49
|
|
|
50
50
|
cloud_app = build_app(app_id=app_id, profile=profile)
|
|
@@ -57,17 +57,17 @@ def update(
|
|
|
57
57
|
[bold][underline]Examples[/underline][/bold]
|
|
58
58
|
|
|
59
59
|
- Update the name of an acceptance test.
|
|
60
|
-
$ [
|
|
61
|
-
--acceptance-test-id test-123 --name "Updated Test Name"[/
|
|
60
|
+
$ [green]nextmv cloud acceptance update --app-id hare-app \\
|
|
61
|
+
--acceptance-test-id test-123 --name "Updated Test Name"[/green]
|
|
62
62
|
|
|
63
63
|
- Update the description of an acceptance test.
|
|
64
|
-
$ [
|
|
65
|
-
--acceptance-test-id test-123 --description "Updated description"[/
|
|
64
|
+
$ [green]nextmv cloud acceptance update --app-id hare-app \\
|
|
65
|
+
--acceptance-test-id test-123 --description "Updated description"[/green]
|
|
66
66
|
|
|
67
67
|
- Update both name and description and save the result.
|
|
68
|
-
$ [
|
|
68
|
+
$ [green]nextmv cloud acceptance update --app-id hare-app \\
|
|
69
69
|
--acceptance-test-id test-123 --name "New Name" \\
|
|
70
|
-
--description "New description" --output updated-test.json[/
|
|
70
|
+
--description "New description" --output updated-test.json[/green]
|
|
71
71
|
"""
|
|
72
72
|
|
|
73
73
|
cloud_app = build_app(app_id=app_id, profile=profile)
|
|
@@ -20,9 +20,9 @@ app.add_typer(update_app)
|
|
|
20
20
|
@app.callback()
|
|
21
21
|
def callback() -> None:
|
|
22
22
|
"""
|
|
23
|
-
Manage
|
|
23
|
+
Manage your Nextmv Cloud account (organization).
|
|
24
24
|
|
|
25
|
-
Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link]
|
|
26
|
-
|
|
25
|
+
Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link] for assistance
|
|
26
|
+
configuring SSO for your organization.
|
|
27
27
|
"""
|
|
28
28
|
pass
|