nextmv 1.0.0.dev8__tar.gz → 1.0.0.dev9__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.dev8 → nextmv-1.0.0.dev9}/PKG-INFO +3 -4
- nextmv-1.0.0.dev9/nextmv/__about__.py +1 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/_serialization.py +1 -1
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/acceptance/create.py +12 -12
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/community/clone.py +2 -1
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/__init__.py +0 -2
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_run.py +3 -10
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/client.py +1 -1
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/default_app/main.py +6 -4
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/local/executor.py +3 -83
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/local/geojson_handler.py +1 -1
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/manifest.py +7 -11
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/model.py +16 -13
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/output.py +21 -57
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/run.py +3 -12
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/pyproject.toml +2 -6
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cloud/app.yaml +0 -1
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cloud/test_package.py +1 -1
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_entrypoint/test_entrypoint.py +7 -8
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_manifest.py +0 -1
- nextmv-1.0.0.dev8/nextmv/__about__.py +0 -1
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/.gitignore +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/LICENSE +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/README.md +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/__entrypoint__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/base_model.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/CONTRIBUTING.md +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/acceptance/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/acceptance/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/acceptance/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/acceptance/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/account/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/account/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/account/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/account/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/account/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/app/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/app/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/app/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/app/exists.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/app/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/app/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/app/push.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/app/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/batch/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/batch/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/batch/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/batch/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/batch/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/batch/metadata.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/batch/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/data/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/data/upload.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/ensemble/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/ensemble/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/ensemble/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/ensemble/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/ensemble/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/ensemble/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/input_set/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/input_set/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/input_set/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/input_set/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/input_set/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/instance/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/instance/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/instance/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/instance/exists.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/instance/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/instance/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/instance/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/managed_input/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/managed_input/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/managed_input/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/managed_input/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/managed_input/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/run/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/run/cancel.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/run/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/run/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/run/input.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/run/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/run/logs.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/run/metadata.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/run/track.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/scenario/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/scenario/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/scenario/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/scenario/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/scenario/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/scenario/metadata.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/scenario/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/secrets/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/secrets/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/secrets/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/secrets/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/secrets/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/secrets/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/shadow/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/shadow/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/shadow/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/shadow/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/shadow/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/shadow/metadata.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/shadow/start.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/shadow/stop.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/shadow/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/switchback/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/switchback/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/switchback/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/switchback/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/switchback/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/switchback/metadata.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/switchback/start.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/switchback/stop.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/switchback/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/upload/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/upload/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/version/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/version/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/version/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/version/exists.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/version/get.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/version/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/cloud/version/update.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/community/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/community/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/configuration/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/configuration/config.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/configuration/create.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/configuration/delete.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/configuration/list.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/confirm.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/main.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/message.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/options.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cli/version.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/acceptance_test.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/account.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_acceptance.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_batch_scenario.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_ensemble.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_input_set.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_instance.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_managed_input.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_secrets.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_shadow.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_switchback.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_utils.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/application/_version.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/assets.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/batch_experiment.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/ensemble.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/input_set.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/instance.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/integration.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/package.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/scenario.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/secrets.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/shadow.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/switchback.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/url.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/cloud/version.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/default_app/.gitignore +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/default_app/README.md +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/default_app/app.yaml +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/default_app/input.json +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/default_app/requirements.txt +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/default_app/src/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/default_app/src/visuals.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/deprecated.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/input.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/local/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/local/application.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/local/local.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/local/plotly_handler.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/local/runner.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/logger.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/options.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/polling.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/safe.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/nextmv/status.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cli/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cli/test_community.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cli/test_configuration.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cli/test_main.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cli/test_version.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cloud/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cloud/test_client.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cloud/test_instance.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/cloud/test_scenario.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/local/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/local/test_application.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/local/test_executor.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/local/test_runner.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/scripts/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/scripts/options1.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/scripts/options2.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/scripts/options3.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/scripts/options4.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/scripts/options5.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/scripts/options6.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/scripts/options7.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_base_model.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_entrypoint/__init__.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_input.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_inputs/test_data.csv +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_inputs/test_data.json +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_inputs/test_data.txt +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_logger.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_model.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_options.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_output.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_polling.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_run.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_safe.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/tests/test_serialization.py +0 -0
- {nextmv-1.0.0.dev8 → nextmv-1.0.0.dev9}/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.dev9
|
|
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,8 +229,7 @@ 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: nextroute>=1.11.1; extra == 'dev'
|
|
232
|
+
Requires-Dist: mlflow>=3.9.0; extra == 'dev'
|
|
234
233
|
Requires-Dist: openpyxl>=3.1.5; extra == 'dev'
|
|
235
234
|
Requires-Dist: pandas>=2.2.3; extra == 'dev'
|
|
236
235
|
Requires-Dist: plotly>=6.0.1; extra == 'dev'
|
|
@@ -241,7 +240,7 @@ Requires-Dist: ruff>=0.1.7; extra == 'dev'
|
|
|
241
240
|
Requires-Dist: twine>=4.0.2; extra == 'dev'
|
|
242
241
|
Requires-Dist: urllib3>=2.1.0; extra == 'dev'
|
|
243
242
|
Provides-Extra: notebook
|
|
244
|
-
Requires-Dist: mlflow>=
|
|
243
|
+
Requires-Dist: mlflow>=3.9.0; extra == 'notebook'
|
|
245
244
|
Description-Content-Type: text/markdown
|
|
246
245
|
|
|
247
246
|
# Nextmv Python SDK
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "v1.0.0.dev9"
|
|
@@ -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",
|
|
@@ -119,7 +119,7 @@ def clone(
|
|
|
119
119
|
# Extract the tarball to a temporary directory to handle nested structure
|
|
120
120
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
121
121
|
with tarfile.open(downloaded_object, "r:gz") as tar:
|
|
122
|
-
tar.extractall(path=temp_dir)
|
|
122
|
+
tar.extractall(path=temp_dir, filter=None)
|
|
123
123
|
|
|
124
124
|
# Find the extracted directory (typically the app name)
|
|
125
125
|
extracted_items = os.listdir(temp_dir)
|
|
@@ -270,3 +270,4 @@ def download_object(file: str, path: str, output_dir: str, output_file: str, pro
|
|
|
270
270
|
f.write(response.content)
|
|
271
271
|
|
|
272
272
|
return file_name
|
|
273
|
+
return file_name
|
|
@@ -867,8 +867,6 @@ class Application(
|
|
|
867
867
|
output_config = multi_config["output_configuration"] = {}
|
|
868
868
|
if content.multi_file.output.statistics:
|
|
869
869
|
output_config["statistics_path"] = content.multi_file.output.statistics
|
|
870
|
-
if content.multi_file.output.metrics:
|
|
871
|
-
output_config["metrics_path"] = content.multi_file.output.metrics
|
|
872
870
|
if content.multi_file.output.assets:
|
|
873
871
|
output_config["assets_path"] = content.multi_file.output.assets
|
|
874
872
|
if content.multi_file.output.solutions:
|
|
@@ -21,14 +21,7 @@ from nextmv.cloud.url import DownloadURL
|
|
|
21
21
|
from nextmv.input import Input, InputFormat
|
|
22
22
|
from nextmv.logger import log
|
|
23
23
|
from nextmv.options import Options
|
|
24
|
-
from nextmv.output import
|
|
25
|
-
ASSETS_KEY,
|
|
26
|
-
STATISTICS_KEY,
|
|
27
|
-
Asset,
|
|
28
|
-
Output,
|
|
29
|
-
OutputFormat,
|
|
30
|
-
Statistics,
|
|
31
|
-
)
|
|
24
|
+
from nextmv.output import ASSETS_KEY, STATISTICS_KEY, Asset, Output, OutputFormat, Statistics
|
|
32
25
|
from nextmv.polling import DEFAULT_POLLING_OPTIONS, PollingOptions, poll
|
|
33
26
|
from nextmv.run import (
|
|
34
27
|
ExternalRunResult,
|
|
@@ -642,7 +635,7 @@ class ApplicationRunMixin:
|
|
|
642
635
|
temp_tar_path = os.path.join(tmpdirname, f"{run_id}.tar.gz")
|
|
643
636
|
with open(temp_tar_path, "wb") as f:
|
|
644
637
|
f.write(download_response.content)
|
|
645
|
-
shutil.unpack_archive(temp_tar_path, output_dir_path)
|
|
638
|
+
shutil.unpack_archive(temp_tar_path, output_dir_path, filter=None)
|
|
646
639
|
|
|
647
640
|
return
|
|
648
641
|
|
|
@@ -1294,7 +1287,7 @@ class ApplicationRunMixin:
|
|
|
1294
1287
|
temp_tar_path = os.path.join(tmpdirname, f"{run_id}.tar.gz")
|
|
1295
1288
|
with open(temp_tar_path, "wb") as f:
|
|
1296
1289
|
f.write(download_response.content)
|
|
1297
|
-
shutil.unpack_archive(temp_tar_path, output_dir_path)
|
|
1290
|
+
shutil.unpack_archive(temp_tar_path, output_dir_path, filter=None)
|
|
1298
1291
|
else:
|
|
1299
1292
|
result.output = download_response.json()
|
|
1300
1293
|
|
|
@@ -303,7 +303,7 @@ class Client:
|
|
|
303
303
|
if data is not None:
|
|
304
304
|
kwargs["data"] = data
|
|
305
305
|
if payload is not None:
|
|
306
|
-
if isinstance(payload, dict
|
|
306
|
+
if isinstance(payload, (dict, list)):
|
|
307
307
|
data = deflated_serialize_json(payload, json_configurations=json_configurations)
|
|
308
308
|
kwargs["data"] = data
|
|
309
309
|
else:
|
|
@@ -26,10 +26,12 @@ assets = create_visuals(name, input.data["radius"], input.data["distance"])
|
|
|
26
26
|
output = nextmv.Output(
|
|
27
27
|
options=options,
|
|
28
28
|
solution={"message": message},
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
statistics=nextmv.Statistics(
|
|
30
|
+
result=nextmv.ResultStatistics(
|
|
31
|
+
value=1.23,
|
|
32
|
+
custom={"message": message},
|
|
33
|
+
),
|
|
34
|
+
),
|
|
33
35
|
assets=assets,
|
|
34
36
|
)
|
|
35
37
|
nextmv.write(output)
|
|
@@ -22,8 +22,6 @@ process_run_information
|
|
|
22
22
|
Function to update run metadata including duration and status.
|
|
23
23
|
process_run_logs
|
|
24
24
|
Function to process and save run logs.
|
|
25
|
-
process_run_metrics
|
|
26
|
-
Function to process and save run metrics.
|
|
27
25
|
process_run_statistics
|
|
28
26
|
Function to process and save run statistics.
|
|
29
27
|
process_run_assets
|
|
@@ -59,16 +57,7 @@ from nextmv.local.local import (
|
|
|
59
57
|
)
|
|
60
58
|
from nextmv.local.plotly_handler import handle_plotly_visual
|
|
61
59
|
from nextmv.manifest import Manifest, ManifestType
|
|
62
|
-
from nextmv.output import
|
|
63
|
-
ASSETS_KEY,
|
|
64
|
-
METRICS_KEY,
|
|
65
|
-
OUTPUTS_KEY,
|
|
66
|
-
SOLUTIONS_KEY,
|
|
67
|
-
STATISTICS_KEY,
|
|
68
|
-
Asset,
|
|
69
|
-
OutputFormat,
|
|
70
|
-
VisualSchema,
|
|
71
|
-
)
|
|
60
|
+
from nextmv.output import ASSETS_KEY, OUTPUTS_KEY, SOLUTIONS_KEY, STATISTICS_KEY, Asset, OutputFormat, VisualSchema
|
|
72
61
|
from nextmv.status import StatusV2
|
|
73
62
|
|
|
74
63
|
|
|
@@ -316,7 +305,7 @@ def process_run_output(
|
|
|
316
305
|
) -> None:
|
|
317
306
|
"""
|
|
318
307
|
Processes the result of the subprocess run. This function is in charge of
|
|
319
|
-
handling the run results, including solutions, statistics,
|
|
308
|
+
handling the run results, including solutions, statistics, logs, assets,
|
|
320
309
|
and visuals.
|
|
321
310
|
|
|
322
311
|
Parameters
|
|
@@ -358,13 +347,6 @@ def process_run_output(
|
|
|
358
347
|
result=result,
|
|
359
348
|
stdout_output=stdout_output,
|
|
360
349
|
)
|
|
361
|
-
process_run_metrics(
|
|
362
|
-
temp_run_outputs_dir=temp_run_outputs_dir,
|
|
363
|
-
outputs_dir=outputs_dir,
|
|
364
|
-
stdout_output=stdout_output,
|
|
365
|
-
temp_src=temp_src,
|
|
366
|
-
manifest=manifest,
|
|
367
|
-
)
|
|
368
350
|
process_run_statistics(
|
|
369
351
|
temp_run_outputs_dir=temp_run_outputs_dir,
|
|
370
352
|
outputs_dir=outputs_dir,
|
|
@@ -517,65 +499,6 @@ def process_run_logs(
|
|
|
517
499
|
|
|
518
500
|
f.write(std_err)
|
|
519
501
|
|
|
520
|
-
def process_run_metrics(
|
|
521
|
-
temp_run_outputs_dir: str,
|
|
522
|
-
outputs_dir: str,
|
|
523
|
-
stdout_output: str | dict[str, Any],
|
|
524
|
-
temp_src: str,
|
|
525
|
-
manifest: Manifest,
|
|
526
|
-
) -> None:
|
|
527
|
-
"""
|
|
528
|
-
Processes the metrics of the run. Checks for an outputs/metrics folder
|
|
529
|
-
or custom metrics file location from manifest. If found, copies to run
|
|
530
|
-
directory. Otherwise, attempts to extract metrics from stdout.
|
|
531
|
-
|
|
532
|
-
Parameters
|
|
533
|
-
----------
|
|
534
|
-
temp_run_outputs_dir : str
|
|
535
|
-
The path to the temporary outputs directory.
|
|
536
|
-
outputs_dir : str
|
|
537
|
-
The path to the outputs directory in the run directory.
|
|
538
|
-
stdout_output : Union[str, dict[str, Any]]
|
|
539
|
-
The stdout output of the run, either as raw string or parsed dictionary.
|
|
540
|
-
temp_src : str
|
|
541
|
-
The path to the temporary source directory.
|
|
542
|
-
manifest : Manifest
|
|
543
|
-
The application manifest containing configuration and custom paths.
|
|
544
|
-
"""
|
|
545
|
-
|
|
546
|
-
metrics_dst = os.path.join(outputs_dir, METRICS_KEY)
|
|
547
|
-
os.makedirs(metrics_dst, exist_ok=True)
|
|
548
|
-
metrics_file = f"{METRICS_KEY}.json"
|
|
549
|
-
|
|
550
|
-
# Check for custom location in manifest and override metrics_src if needed.
|
|
551
|
-
if (
|
|
552
|
-
manifest.configuration is not None
|
|
553
|
-
and manifest.configuration.content is not None
|
|
554
|
-
and manifest.configuration.content.format == OutputFormat.MULTI_FILE
|
|
555
|
-
and manifest.configuration.content.multi_file is not None
|
|
556
|
-
):
|
|
557
|
-
metrics_src_file = os.path.join(temp_src, manifest.configuration.content.multi_file.output.metrics)
|
|
558
|
-
|
|
559
|
-
# If the custom metrics file exists, copy it to the metrics destination
|
|
560
|
-
if os.path.exists(metrics_src_file) and os.path.isfile(metrics_src_file):
|
|
561
|
-
metrics_dst_file = os.path.join(metrics_dst, metrics_file)
|
|
562
|
-
shutil.copy2(metrics_src_file, metrics_dst_file)
|
|
563
|
-
return
|
|
564
|
-
|
|
565
|
-
metrics_src = os.path.join(temp_run_outputs_dir, METRICS_KEY)
|
|
566
|
-
if os.path.exists(metrics_src) and os.path.isdir(metrics_src):
|
|
567
|
-
shutil.copytree(metrics_src, metrics_dst, dirs_exist_ok=True)
|
|
568
|
-
return
|
|
569
|
-
|
|
570
|
-
if not isinstance(stdout_output, dict):
|
|
571
|
-
return
|
|
572
|
-
|
|
573
|
-
if METRICS_KEY not in stdout_output:
|
|
574
|
-
return
|
|
575
|
-
|
|
576
|
-
with open(os.path.join(metrics_dst, metrics_file), "w") as f:
|
|
577
|
-
metrics = {METRICS_KEY: stdout_output[METRICS_KEY]}
|
|
578
|
-
json.dump(metrics, f, indent=2)
|
|
579
502
|
|
|
580
503
|
def process_run_statistics(
|
|
581
504
|
temp_run_outputs_dir: str,
|
|
@@ -585,9 +508,6 @@ def process_run_statistics(
|
|
|
585
508
|
manifest: Manifest,
|
|
586
509
|
) -> None:
|
|
587
510
|
"""
|
|
588
|
-
!!! warning
|
|
589
|
-
`process_run_statistics` is deprecated, use `process_run_metrics` instead.
|
|
590
|
-
|
|
591
511
|
Processes the statistics of the run. Checks for an outputs/statistics folder
|
|
592
512
|
or custom statistics file location from manifest. If found, copies to run
|
|
593
513
|
directory. Otherwise, attempts to extract statistics from stdout.
|
|
@@ -928,7 +848,7 @@ def _copy_new_or_modified_files( # noqa: C901
|
|
|
928
848
|
This function identifies files that are either new (not present in the original
|
|
929
849
|
source) or have been modified (different content, checksum, or modification time)
|
|
930
850
|
compared to the original source. It excludes files that exist in specified
|
|
931
|
-
exclusion directories to avoid copying input data, statistics,
|
|
851
|
+
exclusion directories to avoid copying input data, statistics, or assets as
|
|
932
852
|
solution outputs.
|
|
933
853
|
|
|
934
854
|
Parameters
|
|
@@ -111,7 +111,7 @@ def extract_coordinates(coords, all_coords) -> None:
|
|
|
111
111
|
like Polygons and MultiPolygons
|
|
112
112
|
"""
|
|
113
113
|
if isinstance(coords, list):
|
|
114
|
-
if len(coords) == 2 and isinstance(coords[0], int
|
|
114
|
+
if len(coords) == 2 and isinstance(coords[0], (int, float)) and isinstance(coords[1], (int, float)):
|
|
115
115
|
# This is a coordinate pair [lon, lat]
|
|
116
116
|
all_coords.append(coords)
|
|
117
117
|
else:
|
|
@@ -829,9 +829,7 @@ class ManifestContentMultiFileOutput(BaseModel):
|
|
|
829
829
|
Parameters
|
|
830
830
|
----------
|
|
831
831
|
statistics : Optional[str], default=""
|
|
832
|
-
|
|
833
|
-
metrics : Optional[str], default=""
|
|
834
|
-
The path to the metrics file.
|
|
832
|
+
The path to the statistics file.
|
|
835
833
|
assets : Optional[str], default=""
|
|
836
834
|
The path to the assets file.
|
|
837
835
|
solutions : Optional[str], default=""
|
|
@@ -841,18 +839,16 @@ class ManifestContentMultiFileOutput(BaseModel):
|
|
|
841
839
|
--------
|
|
842
840
|
>>> from nextmv import ManifestContentMultiFileOutput
|
|
843
841
|
>>> output_config = ManifestContentMultiFileOutput(
|
|
844
|
-
...
|
|
842
|
+
... statistics="my-outputs/statistics.json",
|
|
845
843
|
... assets="my-outputs/assets.json",
|
|
846
844
|
... solutions="my-outputs/solutions/"
|
|
847
845
|
... )
|
|
848
|
-
>>> output_config.
|
|
849
|
-
'my-outputs/
|
|
846
|
+
>>> output_config.statistics
|
|
847
|
+
'my-outputs/statistics.json'
|
|
850
848
|
"""
|
|
851
849
|
|
|
852
850
|
statistics: str | None = ""
|
|
853
|
-
"""
|
|
854
|
-
metrics: str | None = ""
|
|
855
|
-
"""The path to the metrics file."""
|
|
851
|
+
"""The path to the statistics file."""
|
|
856
852
|
assets: str | None = ""
|
|
857
853
|
"""The path to the assets file."""
|
|
858
854
|
solutions: str | None = ""
|
|
@@ -882,7 +878,7 @@ class ManifestContentMultiFile(BaseModel):
|
|
|
882
878
|
>>> multi_file_config = ManifestContentMultiFile(
|
|
883
879
|
... input=ManifestContentMultiFileInput(path="data/input/"),
|
|
884
880
|
... output=ManifestContentMultiFileOutput(
|
|
885
|
-
...
|
|
881
|
+
... statistics="my-outputs/statistics.json",
|
|
886
882
|
... assets="my-outputs/assets.json",
|
|
887
883
|
... solutions="my-outputs/solutions/"
|
|
888
884
|
... )
|
|
@@ -923,7 +919,7 @@ class ManifestContent(BaseModel):
|
|
|
923
919
|
... multi_file=ManifestContentMultiFile(
|
|
924
920
|
... input=ManifestContentMultiFileInput(path="data/input/"),
|
|
925
921
|
... output=ManifestContentMultiFileOutput(
|
|
926
|
-
...
|
|
922
|
+
... statistics="my-outputs/statistics.json",
|
|
927
923
|
... assets="my-outputs/assets.json",
|
|
928
924
|
... solutions="my-outputs/solutions/"
|
|
929
925
|
... )
|
|
@@ -84,6 +84,9 @@ def _custom_showwarning(message, category, filename, lineno, file=None, line=Non
|
|
|
84
84
|
if "mlflow/pyfunc/__init__.py" in filename:
|
|
85
85
|
return
|
|
86
86
|
|
|
87
|
+
if "/mlflow/tracing/provider.py" in filename:
|
|
88
|
+
return
|
|
89
|
+
|
|
87
90
|
_original_showwarning(message, category, filename, lineno, file, line)
|
|
88
91
|
|
|
89
92
|
|
|
@@ -195,7 +198,7 @@ class Model:
|
|
|
195
198
|
... return nextmv.Output(
|
|
196
199
|
... options=input.options,
|
|
197
200
|
... solution=nextroute_output.solutions[0].to_dict(),
|
|
198
|
-
...
|
|
201
|
+
... statistics=nextroute_output.statistics.to_dict(),
|
|
199
202
|
... )
|
|
200
203
|
"""
|
|
201
204
|
|
|
@@ -234,7 +237,7 @@ class Model:
|
|
|
234
237
|
... return Output(
|
|
235
238
|
... options=input.options,
|
|
236
239
|
... solution=result,
|
|
237
|
-
...
|
|
240
|
+
... statistics={"processing_time": 0.5}
|
|
238
241
|
... )
|
|
239
242
|
"""
|
|
240
243
|
|
|
@@ -288,7 +291,6 @@ class Model:
|
|
|
288
291
|
) from e
|
|
289
292
|
|
|
290
293
|
finally:
|
|
291
|
-
from mlflow.models import infer_signature
|
|
292
294
|
from mlflow.pyfunc import PythonModel, save_model
|
|
293
295
|
|
|
294
296
|
class MLFlowModel(PythonModel):
|
|
@@ -342,12 +344,13 @@ class Model:
|
|
|
342
344
|
|
|
343
345
|
_cleanup_python_model(model_dir, configuration, verbose=False)
|
|
344
346
|
|
|
345
|
-
signature = None
|
|
346
|
-
if configuration.options is not None:
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
347
|
+
# signature = None
|
|
348
|
+
# if configuration.options is not None:
|
|
349
|
+
# options_dict = configuration.options.to_dict()
|
|
350
|
+
# signature = infer_signature(
|
|
351
|
+
# model_input={},
|
|
352
|
+
# params=options_dict,
|
|
353
|
+
# )
|
|
351
354
|
|
|
352
355
|
# We use mlflow to save the model to the local filesystem, to be able to
|
|
353
356
|
# load it later on.
|
|
@@ -356,7 +359,7 @@ class Model:
|
|
|
356
359
|
path=model_path, # Customize the name of the model location.
|
|
357
360
|
infer_code_paths=True, # Makes the imports portable.
|
|
358
361
|
python_model=MLFlowModel(),
|
|
359
|
-
signature=signature, # Allows us to work with our own `Options` class.
|
|
362
|
+
# signature=signature, # Allows us to work with our own `Options` class.
|
|
360
363
|
)
|
|
361
364
|
|
|
362
365
|
# Create an auxiliary requirements file with the model dependencies.
|
|
@@ -415,9 +418,9 @@ def _cleanup_python_model(
|
|
|
415
418
|
if os.path.exists(model_path):
|
|
416
419
|
shutil.rmtree(model_path)
|
|
417
420
|
|
|
418
|
-
|
|
419
|
-
if os.path.exists(
|
|
420
|
-
|
|
421
|
+
mlflow_db_path = os.path.join(model_dir, "mlflow.db")
|
|
422
|
+
if os.path.exists(mlflow_db_path):
|
|
423
|
+
os.remove(mlflow_db_path)
|
|
421
424
|
|
|
422
425
|
requirements_file = os.path.join(model_dir, _REQUIREMENTS_FILE)
|
|
423
426
|
if os.path.exists(requirements_file):
|