metaflow 2.12.12__tar.gz → 2.12.14__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.
- {metaflow-2.12.12/metaflow.egg-info → metaflow-2.12.14}/PKG-INFO +2 -2
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cli.py +3 -3
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/client/core.py +2 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/flowspec.py +2 -1
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/graph.py +7 -3
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_config.py +11 -2
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_config_funcs.py +51 -3
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_environment.py +36 -21
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_workflows.py +9 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_workflows_cli.py +2 -2
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_workflows_deployer.py +3 -1
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/aws_utils.py +16 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/batch/batch_decorator.py +1 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +3 -1
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes.py +26 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes_decorator.py +15 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/conda_decorator.py +4 -4
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/pypi_decorator.py +13 -4
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/deployer.py +46 -3
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/metaflow_runner.py +7 -1
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/nbdeploy.py +3 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/nbrun.py +5 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runtime.py +26 -13
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/util.py +19 -0
- metaflow-2.12.14/metaflow/version.py +1 -0
- {metaflow-2.12.12 → metaflow-2.12.14/metaflow.egg-info}/PKG-INFO +2 -2
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow.egg-info/requires.txt +1 -1
- metaflow-2.12.12/metaflow/version.py +0 -1
- {metaflow-2.12.12 → metaflow-2.12.14}/LICENSE +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/MANIFEST.in +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/README.md +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/R.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_bashcomplete.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_compat.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_termui_impl.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_textwrap.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_unicodefun.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_winconsole.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/core.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/decorators.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/exceptions.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/formatting.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/globals.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/parser.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/termui.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/testing.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/types.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_elffile.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_manylinux.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_musllinux.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_parser.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_structures.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/markers.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/py.typed +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/requirements.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/specifiers.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/tags.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/version.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_checkers.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_config.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_decorators.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_functions.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_importhook.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_memo.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_suppression.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_transformer.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/py.typed +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typing_extensions.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_5/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_5/zipp.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/zipp.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/zipp.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cards.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cli_args.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/client/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/client/filecache.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/clone_util.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/configure_cmd.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/develop/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/develop/stub_generator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/develop/stubs.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/main_cli.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/tutorials_cmd.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/util.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd_with_io.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/content_addressed_store.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/datastore_set.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/datastore_storage.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/exceptions.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/flow_datastore.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/inputs.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/task_datastore.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/debug.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/decorators.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/event_logger.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/events.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/exception.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/extension_support/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/extension_support/_empty_file.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/extension_support/cmd.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/extension_support/integrations.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/extension_support/plugins.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/includefile.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/integrations.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/lint.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metadata/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metadata/heartbeat.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metadata/metadata.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metadata/util.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_current.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_profile.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_version.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/mflog/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/mflog/mflog.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/mflog/save_logs.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/mflog/save_logs_periodically.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/mflog/tee.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/monitor.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/multicore_utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/package.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/parameters.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/airflow.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/airflow_cli.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/airflow_utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/dag.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/exception.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_client.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_events.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/capture_error.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/daemon.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/generate_input_paths.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/aws_client.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/batch/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/batch/batch.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/batch/batch_client.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/azure_credential.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/azure_exceptions.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/azure_tail.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/azure_utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/includefile_support.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_cli.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_client.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_creator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_datastore.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/base.html +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/basic.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/card.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/components.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/main.js +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_resolver.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_server.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/component_serializer.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/exception.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/catch_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datastores/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datastores/azure_storage.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datastores/gs_storage.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datastores/local_storage.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datastores/s3_storage.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/local.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/s3/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/s3/s3.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/s3/s3op.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/s3/s3util.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/debug_logger.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/debug_monitor.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/client.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/client_modules.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/communication/channel.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/communication/utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/consts.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/data_transferer.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/override_decorators.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/server.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/stub.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/environment_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/events_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/frameworks/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/frameworks/pytorch.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/gs_tail.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/gs_utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/includefile_support.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/logs_cli.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/metadata/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/metadata/local.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/metadata/service.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/package_cli.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/parallel_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/project_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/bootstrap.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/conda_environment.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/micromamba.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/pip.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/pypi_environment.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/resources_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/retry_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/secrets/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/storage_executor.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/tag_cli.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/timeout_decorator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/procpoll.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/py.typed +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/pylint_wrapper.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/click_api.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/subprocess_manager.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/sidecar/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/sidecar/sidecar.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/sidecar/sidecar_messages.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/sidecar/sidecar_subprocess.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/sidecar/sidecar_worker.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/system/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/system/system_logger.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/system/system_monitor.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/system/system_utils.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tagging_util.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/task.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tracing/__init__.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tracing/propagator.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tracing/span_exporter.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tracing/tracing_modules.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tuple_util.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/00-helloworld/README.md +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/01-playlist/README.md +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/01-playlist/movies.csv +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/01-playlist/playlist.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/02-statistics/README.md +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/02-statistics/movies.csv +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/02-statistics/stats.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/07-worldview/README.md +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/08-autopilot/README.md +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/unbounded_foreach.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/vendor.py +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow.egg-info/SOURCES.txt +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow.egg-info/dependency_links.txt +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow.egg-info/entry_points.txt +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/metaflow.egg-info/top_level.txt +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/setup.cfg +0 -0
- {metaflow-2.12.12 → metaflow-2.12.14}/setup.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: metaflow
|
3
|
-
Version: 2.12.
|
3
|
+
Version: 2.12.14
|
4
4
|
Summary: Metaflow: More Data Science, Less Engineering
|
5
5
|
Author: Metaflow Developers
|
6
6
|
Author-email: help@metaflow.org
|
@@ -26,7 +26,7 @@ License-File: LICENSE
|
|
26
26
|
Requires-Dist: requests
|
27
27
|
Requires-Dist: boto3
|
28
28
|
Provides-Extra: stubs
|
29
|
-
Requires-Dist: metaflow-stubs==2.12.
|
29
|
+
Requires-Dist: metaflow-stubs==2.12.14; extra == "stubs"
|
30
30
|
|
31
31
|

|
32
32
|
|
@@ -650,7 +650,7 @@ def resume(
|
|
650
650
|
)
|
651
651
|
|
652
652
|
if step_to_rerun is None:
|
653
|
-
|
653
|
+
steps_to_rerun = set()
|
654
654
|
else:
|
655
655
|
# validate step name
|
656
656
|
if step_to_rerun not in obj.graph.nodes:
|
@@ -660,7 +660,7 @@ def resume(
|
|
660
660
|
step_to_rerun, ",".join(list(obj.graph.nodes.keys()))
|
661
661
|
)
|
662
662
|
)
|
663
|
-
|
663
|
+
steps_to_rerun = {step_to_rerun}
|
664
664
|
|
665
665
|
if run_id:
|
666
666
|
# Run-ids that are provided by the metadata service are always integers.
|
@@ -688,7 +688,7 @@ def resume(
|
|
688
688
|
clone_run_id=origin_run_id,
|
689
689
|
clone_only=clone_only,
|
690
690
|
reentrant=reentrant,
|
691
|
-
|
691
|
+
steps_to_rerun=steps_to_rerun,
|
692
692
|
max_workers=max_workers,
|
693
693
|
max_num_splits=max_num_splits,
|
694
694
|
max_log_size=max_log_size * 1024 * 1024,
|
@@ -1027,6 +1027,8 @@ class MetaflowData(object):
|
|
1027
1027
|
self._artifacts = dict((art.id, art) for art in artifacts)
|
1028
1028
|
|
1029
1029
|
def __getattr__(self, name: str):
|
1030
|
+
if name not in self._artifacts:
|
1031
|
+
raise AttributeError(name)
|
1030
1032
|
return self._artifacts[name].data
|
1031
1033
|
|
1032
1034
|
def __contains__(self, var):
|
@@ -17,6 +17,7 @@ from .exception import (
|
|
17
17
|
)
|
18
18
|
from .graph import FlowGraph
|
19
19
|
from .unbounded_foreach import UnboundedForeachInput
|
20
|
+
from .util import to_pod
|
20
21
|
from .metaflow_config import INCLUDE_FOREACH_STACK, MAXIMUM_FOREACH_VALUE_CHARS
|
21
22
|
|
22
23
|
# For Python 3 compatibility
|
@@ -201,7 +202,7 @@ class FlowSpec(metaclass=_FlowSpecMeta):
|
|
201
202
|
"decorators": [
|
202
203
|
{
|
203
204
|
"name": deco.name,
|
204
|
-
"attributes": deco.attributes,
|
205
|
+
"attributes": to_pod(deco.attributes),
|
205
206
|
"statically_defined": deco.statically_defined,
|
206
207
|
}
|
207
208
|
for deco in flow_decorators(self)
|
@@ -3,6 +3,9 @@ import ast
|
|
3
3
|
import re
|
4
4
|
|
5
5
|
|
6
|
+
from .util import to_pod
|
7
|
+
|
8
|
+
|
6
9
|
def deindent_docstring(doc):
|
7
10
|
if doc:
|
8
11
|
# Find the indent to remove from the docstring. We consider the following possibilities:
|
@@ -72,7 +75,6 @@ class DAGNode(object):
|
|
72
75
|
return "%s.%s" % (expr.value.id, expr.attr)
|
73
76
|
|
74
77
|
def _parse(self, func_ast):
|
75
|
-
|
76
78
|
self.num_args = len(func_ast.args.args)
|
77
79
|
tail = func_ast.body[-1]
|
78
80
|
|
@@ -171,6 +173,8 @@ class FlowGraph(object):
|
|
171
173
|
self.name = flow.__name__
|
172
174
|
self.nodes = self._create_nodes(flow)
|
173
175
|
self.doc = deindent_docstring(flow.__doc__)
|
176
|
+
# nodes sorted in topological order.
|
177
|
+
self.sorted_nodes = []
|
174
178
|
self._traverse_graph()
|
175
179
|
self._postprocess()
|
176
180
|
|
@@ -197,6 +201,7 @@ class FlowGraph(object):
|
|
197
201
|
|
198
202
|
def _traverse_graph(self):
|
199
203
|
def traverse(node, seen, split_parents):
|
204
|
+
self.sorted_nodes.append(node.name)
|
200
205
|
if node.type in ("split", "foreach"):
|
201
206
|
node.split_parents = split_parents
|
202
207
|
split_parents = split_parents + [node.name]
|
@@ -262,7 +267,6 @@ class FlowGraph(object):
|
|
262
267
|
)
|
263
268
|
|
264
269
|
def output_steps(self):
|
265
|
-
|
266
270
|
steps_info = {}
|
267
271
|
graph_structure = []
|
268
272
|
|
@@ -286,7 +290,7 @@ class FlowGraph(object):
|
|
286
290
|
"decorators": [
|
287
291
|
{
|
288
292
|
"name": deco.name,
|
289
|
-
"attributes": deco.attributes,
|
293
|
+
"attributes": to_pod(deco.attributes),
|
290
294
|
"statically_defined": deco.statically_defined,
|
291
295
|
}
|
292
296
|
for deco in node.decorators
|
@@ -15,6 +15,17 @@ if sys.platform == "darwin":
|
|
15
15
|
## value, either set `METAFLOW_DEFAULT_DATASTORE` in your configuration file or set
|
16
16
|
## an environment variable called `METAFLOW_DEFAULT_DATASTORE`
|
17
17
|
|
18
|
+
##
|
19
|
+
# Constants (NOTE: these need to live before any from_conf)
|
20
|
+
##
|
21
|
+
|
22
|
+
# Path to the local directory to store artifacts for 'local' datastore.
|
23
|
+
DATASTORE_LOCAL_DIR = ".metaflow"
|
24
|
+
|
25
|
+
# Local configuration file (in .metaflow) containing overrides per-project
|
26
|
+
LOCAL_CONFIG_FILE = "config.json"
|
27
|
+
|
28
|
+
|
18
29
|
###
|
19
30
|
# Default configuration
|
20
31
|
###
|
@@ -42,8 +53,6 @@ USER = from_conf("USER")
|
|
42
53
|
###
|
43
54
|
# Datastore configuration
|
44
55
|
###
|
45
|
-
# Path to the local directory to store artifacts for 'local' datastore.
|
46
|
-
DATASTORE_LOCAL_DIR = ".metaflow"
|
47
56
|
DATASTORE_SYSROOT_LOCAL = from_conf("DATASTORE_SYSROOT_LOCAL")
|
48
57
|
# S3 bucket and prefix to store artifacts for 's3' datastore.
|
49
58
|
DATASTORE_SYSROOT_S3 = from_conf("DATASTORE_SYSROOT_S3")
|
@@ -32,8 +32,40 @@ def init_config():
|
|
32
32
|
return config
|
33
33
|
|
34
34
|
|
35
|
+
def init_local_config():
|
36
|
+
# This function is heavily inspired from LocalStorage.get_datastore_root_from_config
|
37
|
+
# but simplifies certain things and also does not depend on DATASTORE_SYSROOT_LOCAL.
|
38
|
+
#
|
39
|
+
# In other words, since this config is meant to be local to a directory, it does not
|
40
|
+
# check in DATASTORE_SYSROOT_LOCAL but only up the current getcwd() path. This also
|
41
|
+
# prevents nasty circular dependencies :)
|
42
|
+
|
43
|
+
from metaflow.metaflow_config import DATASTORE_LOCAL_DIR, LOCAL_CONFIG_FILE
|
44
|
+
|
45
|
+
current_path = os.getcwd()
|
46
|
+
check_dir = os.path.join(current_path, DATASTORE_LOCAL_DIR)
|
47
|
+
check_dir = os.path.realpath(check_dir)
|
48
|
+
while not os.path.isdir(check_dir):
|
49
|
+
new_path = os.path.dirname(current_path)
|
50
|
+
if new_path == current_path: # No longer making upward progress
|
51
|
+
return {}
|
52
|
+
current_path = new_path
|
53
|
+
check_dir = os.path.join(current_path, DATASTORE_LOCAL_DIR)
|
54
|
+
path_to_config = os.path.join(check_dir, LOCAL_CONFIG_FILE)
|
55
|
+
# We found a directory to look for the config file in
|
56
|
+
if os.path.exists(path_to_config):
|
57
|
+
with open(path_to_config, encoding="utf-8") as f:
|
58
|
+
return json.load(f)
|
59
|
+
return {}
|
60
|
+
|
61
|
+
|
35
62
|
# Initialize defaults required to setup environment variables.
|
36
|
-
|
63
|
+
# (initialized lazily in from_conf since init_local_config requires
|
64
|
+
# some configuration values
|
65
|
+
|
66
|
+
METAFLOW_CONFIG = None
|
67
|
+
|
68
|
+
METAFLOW_LOCAL_CONFIG = None
|
37
69
|
|
38
70
|
_all_configs = {}
|
39
71
|
|
@@ -51,7 +83,13 @@ def config_values(include=0):
|
|
51
83
|
|
52
84
|
def from_conf(name, default=None, validate_fn=None):
|
53
85
|
"""
|
54
|
-
|
86
|
+
Pull value from the environment or configuration.
|
87
|
+
Order is:
|
88
|
+
1. Environment (use any environment variable explicitly set by user)
|
89
|
+
2. Local config (use any value set in the local config file -- so stuff in
|
90
|
+
.metaflow/project.json for example)
|
91
|
+
3. Global config (use any value set in the global config file)
|
92
|
+
4. Default
|
55
93
|
|
56
94
|
Prior to a value being returned, we will validate using validate_fn (if provided).
|
57
95
|
Only non-None values are validated.
|
@@ -59,9 +97,19 @@ def from_conf(name, default=None, validate_fn=None):
|
|
59
97
|
validate_fn should accept (name, value).
|
60
98
|
If the value validates, return None, else raise an MetaflowException.
|
61
99
|
"""
|
100
|
+
global METAFLOW_CONFIG, METAFLOW_LOCAL_CONFIG
|
101
|
+
|
102
|
+
if METAFLOW_CONFIG is None:
|
103
|
+
METAFLOW_CONFIG = init_config()
|
104
|
+
if METAFLOW_LOCAL_CONFIG is None:
|
105
|
+
METAFLOW_LOCAL_CONFIG = init_local_config()
|
106
|
+
|
62
107
|
is_default = True
|
63
108
|
env_name = "METAFLOW_%s" % name
|
64
|
-
value = os.environ.get(
|
109
|
+
value = os.environ.get(
|
110
|
+
env_name,
|
111
|
+
METAFLOW_LOCAL_CONFIG.get(env_name, METAFLOW_CONFIG.get(env_name, default)),
|
112
|
+
)
|
65
113
|
if validate_fn and value is not None:
|
66
114
|
validate_fn(env_name, value)
|
67
115
|
if default is not None:
|
@@ -89,10 +89,16 @@ class MetaflowEnvironment(object):
|
|
89
89
|
It should work silently if everything goes well.
|
90
90
|
"""
|
91
91
|
if datastore_type == "s3":
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
92
|
+
from .plugins.aws.aws_utils import parse_s3_full_path
|
93
|
+
|
94
|
+
bucket, s3_object = parse_s3_full_path(code_package_url)
|
95
|
+
# NOTE: the script quoting is extremely sensitive due to the way shlex.split operates and this being inserted
|
96
|
+
# into a quoted command elsewhere.
|
97
|
+
return "{python} -c '{script}'".format(
|
98
|
+
python=self._python(),
|
99
|
+
script='import boto3, os; boto3.client(\\"s3\\", endpoint_url=os.getenv(\\"METAFLOW_S3_ENDPOINT_URL\\")).download_file(\\"%s\\", \\"%s\\", \\"job.tar\\")'
|
100
|
+
% (bucket, s3_object),
|
101
|
+
)
|
96
102
|
elif datastore_type == "azure":
|
97
103
|
from .plugins.azure.azure_utils import parse_azure_full_path
|
98
104
|
|
@@ -119,25 +125,34 @@ class MetaflowEnvironment(object):
|
|
119
125
|
)
|
120
126
|
|
121
127
|
def _get_install_dependencies_cmd(self, datastore_type):
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
"
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
128
|
+
base_cmd = "{} -m pip install -qqq".format(self._python())
|
129
|
+
|
130
|
+
datastore_packages = {
|
131
|
+
"s3": ["boto3"],
|
132
|
+
"azure": [
|
133
|
+
"azure-identity",
|
134
|
+
"azure-storage-blob",
|
135
|
+
"azure-keyvault-secrets",
|
136
|
+
"simple-azure-blob-downloader",
|
137
|
+
],
|
138
|
+
"gs": [
|
139
|
+
"google-cloud-storage",
|
140
|
+
"google-auth",
|
141
|
+
"simple-gcp-object-downloader",
|
142
|
+
"google-cloud-secret-manager",
|
143
|
+
],
|
144
|
+
}
|
145
|
+
|
146
|
+
if datastore_type not in datastore_packages:
|
136
147
|
raise NotImplementedError(
|
137
|
-
"
|
138
|
-
% datastore_type
|
148
|
+
"Unknown datastore type: {}".format(datastore_type)
|
139
149
|
)
|
140
|
-
|
150
|
+
|
151
|
+
cmd = "{} {}".format(
|
152
|
+
base_cmd, " ".join(datastore_packages[datastore_type] + ["requests"])
|
153
|
+
)
|
154
|
+
# skip pip installs if we know that packages might already be available
|
155
|
+
return "if [ -z $METAFLOW_SKIP_INSTALL_DEPENDENCIES ]; then {}; fi".format(cmd)
|
141
156
|
|
142
157
|
def get_package_commands(self, code_package_url, datastore_type):
|
143
158
|
cmds = [
|
@@ -1658,6 +1658,9 @@ class ArgoWorkflows(object):
|
|
1658
1658
|
|
1659
1659
|
# support Metaflow sandboxes
|
1660
1660
|
env["METAFLOW_INIT_SCRIPT"] = KUBERNETES_SANDBOX_INIT_SCRIPT
|
1661
|
+
env["METAFLOW_KUBERNETES_SANDBOX_INIT_SCRIPT"] = (
|
1662
|
+
KUBERNETES_SANDBOX_INIT_SCRIPT
|
1663
|
+
)
|
1661
1664
|
|
1662
1665
|
# support for @secret
|
1663
1666
|
env["METAFLOW_DEFAULT_SECRETS_BACKEND_TYPE"] = DEFAULT_SECRETS_BACKEND_TYPE
|
@@ -1673,6 +1676,12 @@ class ArgoWorkflows(object):
|
|
1673
1676
|
)
|
1674
1677
|
env["METAFLOW_DATASTORE_SYSROOT_AZURE"] = DATASTORE_SYSROOT_AZURE
|
1675
1678
|
env["METAFLOW_CARD_AZUREROOT"] = CARD_AZUREROOT
|
1679
|
+
env["METAFLOW_ARGO_WORKFLOWS_KUBERNETES_SECRETS"] = (
|
1680
|
+
ARGO_WORKFLOWS_KUBERNETES_SECRETS
|
1681
|
+
)
|
1682
|
+
env["METAFLOW_ARGO_WORKFLOWS_ENV_VARS_TO_SKIP"] = (
|
1683
|
+
ARGO_WORKFLOWS_ENV_VARS_TO_SKIP
|
1684
|
+
)
|
1676
1685
|
|
1677
1686
|
# support for GCP
|
1678
1687
|
env["METAFLOW_DATASTORE_SYSROOT_GS"] = DATASTORE_SYSROOT_GS
|
@@ -172,7 +172,7 @@ def argo_workflows(obj, name=None):
|
|
172
172
|
)
|
173
173
|
@click.option(
|
174
174
|
"--enable-heartbeat-daemon/--no-enable-heartbeat-daemon",
|
175
|
-
default=
|
175
|
+
default=True,
|
176
176
|
show_default=True,
|
177
177
|
help="Use a daemon container to broadcast heartbeats.",
|
178
178
|
)
|
@@ -186,7 +186,7 @@ def argo_workflows(obj, name=None):
|
|
186
186
|
)
|
187
187
|
@click.option(
|
188
188
|
"--enable-error-msg-capture/--no-enable-error-msg-capture",
|
189
|
-
default=
|
189
|
+
default=True,
|
190
190
|
show_default=True,
|
191
191
|
help="Capture stack trace of first failed task in exit hook.",
|
192
192
|
)
|
@@ -226,7 +226,9 @@ def trigger(instance: DeployedFlow, **kwargs):
|
|
226
226
|
)
|
227
227
|
|
228
228
|
command_obj = instance.deployer.spm.get(pid)
|
229
|
-
content = handle_timeout(
|
229
|
+
content = handle_timeout(
|
230
|
+
tfp_runner_attribute, command_obj, instance.deployer.file_read_timeout
|
231
|
+
)
|
230
232
|
|
231
233
|
if command_obj.process.returncode == 0:
|
232
234
|
triggered_run = TriggeredRun(deployer=instance.deployer, content=content)
|
@@ -4,6 +4,22 @@ import requests
|
|
4
4
|
from metaflow.exception import MetaflowException
|
5
5
|
|
6
6
|
|
7
|
+
def parse_s3_full_path(s3_uri):
|
8
|
+
from urllib.parse import urlparse
|
9
|
+
|
10
|
+
# <scheme>://<netloc>/<path>;<params>?<query>#<fragment>
|
11
|
+
scheme, netloc, path, _, _, _ = urlparse(s3_uri)
|
12
|
+
assert scheme == "s3"
|
13
|
+
assert netloc is not None
|
14
|
+
|
15
|
+
bucket = netloc
|
16
|
+
path = path.lstrip("/").rstrip("/")
|
17
|
+
if path == "":
|
18
|
+
path = None
|
19
|
+
|
20
|
+
return bucket, path
|
21
|
+
|
22
|
+
|
7
23
|
def get_ec2_instance_metadata():
|
8
24
|
"""
|
9
25
|
Fetches the EC2 instance metadata through AWS instance metadata service
|
{metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions_deployer.py
RENAMED
@@ -193,7 +193,9 @@ def trigger(instance: DeployedFlow, **kwargs):
|
|
193
193
|
)
|
194
194
|
|
195
195
|
command_obj = instance.deployer.spm.get(pid)
|
196
|
-
content = handle_timeout(
|
196
|
+
content = handle_timeout(
|
197
|
+
tfp_runner_attribute, command_obj, instance.deployer.file_read_timeout
|
198
|
+
)
|
197
199
|
|
198
200
|
if command_obj.process.returncode == 0:
|
199
201
|
triggered_run = TriggeredRun(deployer=instance.deployer, content=content)
|
@@ -17,6 +17,8 @@ from metaflow.metaflow_config import (
|
|
17
17
|
ARGO_EVENTS_INTERNAL_WEBHOOK_URL,
|
18
18
|
ARGO_EVENTS_SERVICE_ACCOUNT,
|
19
19
|
ARGO_EVENTS_WEBHOOK_AUTH,
|
20
|
+
ARGO_WORKFLOWS_KUBERNETES_SECRETS,
|
21
|
+
ARGO_WORKFLOWS_ENV_VARS_TO_SKIP,
|
20
22
|
AWS_SECRETS_MANAGER_DEFAULT_REGION,
|
21
23
|
AZURE_KEY_VAULT_PREFIX,
|
22
24
|
AZURE_STORAGE_BLOB_SERVICE_ENDPOINT,
|
@@ -280,6 +282,18 @@ class Kubernetes(object):
|
|
280
282
|
.environment_variable(
|
281
283
|
"METAFLOW_INIT_SCRIPT", KUBERNETES_SANDBOX_INIT_SCRIPT
|
282
284
|
)
|
285
|
+
.environment_variable(
|
286
|
+
"METAFLOW_KUBERNETES_SANDBOX_INIT_SCRIPT",
|
287
|
+
KUBERNETES_SANDBOX_INIT_SCRIPT,
|
288
|
+
)
|
289
|
+
.environment_variable(
|
290
|
+
"METAFLOW_ARGO_WORKFLOWS_KUBERNETES_SECRETS",
|
291
|
+
ARGO_WORKFLOWS_KUBERNETES_SECRETS,
|
292
|
+
)
|
293
|
+
.environment_variable(
|
294
|
+
"METAFLOW_ARGO_WORKFLOWS_ENV_VARS_TO_SKIP",
|
295
|
+
ARGO_WORKFLOWS_ENV_VARS_TO_SKIP,
|
296
|
+
)
|
283
297
|
.environment_variable("METAFLOW_OTEL_ENDPOINT", OTEL_ENDPOINT)
|
284
298
|
# Skip setting METAFLOW_DATASTORE_SYSROOT_LOCAL because metadata sync
|
285
299
|
# between the local user instance and the remote Kubernetes pod
|
@@ -565,6 +579,18 @@ class Kubernetes(object):
|
|
565
579
|
.environment_variable(
|
566
580
|
"METAFLOW_INIT_SCRIPT", KUBERNETES_SANDBOX_INIT_SCRIPT
|
567
581
|
)
|
582
|
+
.environment_variable(
|
583
|
+
"METAFLOW_KUBERNETES_SANDBOX_INIT_SCRIPT",
|
584
|
+
KUBERNETES_SANDBOX_INIT_SCRIPT,
|
585
|
+
)
|
586
|
+
.environment_variable(
|
587
|
+
"METAFLOW_ARGO_WORKFLOWS_KUBERNETES_SECRETS",
|
588
|
+
ARGO_WORKFLOWS_KUBERNETES_SECRETS,
|
589
|
+
)
|
590
|
+
.environment_variable(
|
591
|
+
"METAFLOW_ARGO_WORKFLOWS_ENV_VARS_TO_SKIP",
|
592
|
+
ARGO_WORKFLOWS_ENV_VARS_TO_SKIP,
|
593
|
+
)
|
568
594
|
.environment_variable("METAFLOW_OTEL_ENDPOINT", OTEL_ENDPOINT)
|
569
595
|
# Skip setting METAFLOW_DATASTORE_SYSROOT_LOCAL because metadata sync
|
570
596
|
# between the local user instance and the remote Kubernetes pod
|
@@ -97,6 +97,9 @@ class KubernetesDecorator(StepDecorator):
|
|
97
97
|
Shared memory size (in MiB) required for this step
|
98
98
|
port: int, optional
|
99
99
|
Port number to specify in the Kubernetes job object
|
100
|
+
compute_pool : str, optional, default None
|
101
|
+
Compute pool to be used for for this step.
|
102
|
+
If not specified, any accessible compute pool within the perimeter is used.
|
100
103
|
"""
|
101
104
|
|
102
105
|
name = "kubernetes"
|
@@ -121,6 +124,8 @@ class KubernetesDecorator(StepDecorator):
|
|
121
124
|
"persistent_volume_claims": None, # e.g., {"pvc-name": "/mnt/vol", "another-pvc": "/mnt/vol2"}
|
122
125
|
"shared_memory": None,
|
123
126
|
"port": None,
|
127
|
+
"compute_pool": None,
|
128
|
+
"executable": None,
|
124
129
|
}
|
125
130
|
package_url = None
|
126
131
|
package_sha = None
|
@@ -153,6 +158,12 @@ class KubernetesDecorator(StepDecorator):
|
|
153
158
|
self.attributes["node_selector"] = parse_kube_keyvalue_list(
|
154
159
|
self.attributes["node_selector"].split(",")
|
155
160
|
)
|
161
|
+
if self.attributes["compute_pool"]:
|
162
|
+
if self.attributes["node_selector"] is None:
|
163
|
+
self.attributes["node_selector"] = {}
|
164
|
+
self.attributes["node_selector"].update(
|
165
|
+
{"outerbounds.co/compute-pool": self.attributes["compute_pool"]}
|
166
|
+
)
|
156
167
|
|
157
168
|
if self.attributes["tolerations"]:
|
158
169
|
try:
|
@@ -370,9 +381,13 @@ class KubernetesDecorator(StepDecorator):
|
|
370
381
|
cli_args.command_args.append(self.package_sha)
|
371
382
|
cli_args.command_args.append(self.package_url)
|
372
383
|
|
384
|
+
# skip certain keys as CLI arguments
|
385
|
+
_skip_keys = ["compute_pool"]
|
373
386
|
# --namespace is used to specify Metaflow namespace (a different
|
374
387
|
# concept from k8s namespace).
|
375
388
|
for k, v in self.attributes.items():
|
389
|
+
if k in _skip_keys:
|
390
|
+
continue
|
376
391
|
if k == "namespace":
|
377
392
|
cli_args.command_options["k8s_namespace"] = v
|
378
393
|
elif k in {"node_selector"} and v:
|
@@ -100,9 +100,9 @@ class CondaStepDecorator(StepDecorator):
|
|
100
100
|
# --environment=pypi to --environment=conda
|
101
101
|
_supported_virtual_envs.extend(["pypi"])
|
102
102
|
|
103
|
-
# TODO: Hardcoded for now to support
|
103
|
+
# TODO: Hardcoded for now to support the fast bakery environment.
|
104
104
|
# We should introduce a more robust mechanism for appending supported environments, for example from within extensions.
|
105
|
-
_supported_virtual_envs.extend(["
|
105
|
+
_supported_virtual_envs.extend(["fast-bakery"])
|
106
106
|
|
107
107
|
# The --environment= requirement ensures that valid virtual environments are
|
108
108
|
# created for every step to execute it, greatly simplifying the @conda
|
@@ -344,9 +344,9 @@ class CondaFlowDecorator(FlowDecorator):
|
|
344
344
|
# --environment=pypi to --environment=conda
|
345
345
|
_supported_virtual_envs.extend(["pypi"])
|
346
346
|
|
347
|
-
# TODO: Hardcoded for now to support
|
347
|
+
# TODO: Hardcoded for now to support the fast bakery environment.
|
348
348
|
# We should introduce a more robust mechanism for appending supported environments, for example from within extensions.
|
349
|
-
_supported_virtual_envs.extend(["
|
349
|
+
_supported_virtual_envs.extend(["fast-bakery"])
|
350
350
|
|
351
351
|
# The --environment= requirement ensures that valid virtual environments are
|
352
352
|
# created for every step to execute it, greatly simplifying the @conda
|
@@ -24,6 +24,12 @@ class PyPIStepDecorator(StepDecorator):
|
|
24
24
|
name = "pypi"
|
25
25
|
defaults = {"packages": {}, "python": None, "disabled": None} # wheels
|
26
26
|
|
27
|
+
def __init__(self, attributes=None, statically_defined=False):
|
28
|
+
self._user_defined_attributes = (
|
29
|
+
attributes.copy() if attributes is not None else {}
|
30
|
+
)
|
31
|
+
super().__init__(attributes, statically_defined)
|
32
|
+
|
27
33
|
def step_init(self, flow, graph, step, decos, environment, flow_datastore, logger):
|
28
34
|
# The init_environment hook for Environment creates the relevant virtual
|
29
35
|
# environments. The step_init hook sets up the relevant state for that hook to
|
@@ -70,9 +76,9 @@ class PyPIStepDecorator(StepDecorator):
|
|
70
76
|
# --environment=pypi to --environment=conda
|
71
77
|
_supported_virtual_envs.extend(["pypi"])
|
72
78
|
|
73
|
-
# TODO: Hardcoded for now to support
|
79
|
+
# TODO: Hardcoded for now to support the fast bakery environment.
|
74
80
|
# We should introduce a more robust mechanism for appending supported environments, for example from within extensions.
|
75
|
-
_supported_virtual_envs.extend(["
|
81
|
+
_supported_virtual_envs.extend(["fast-bakery"])
|
76
82
|
|
77
83
|
# The --environment= requirement ensures that valid virtual environments are
|
78
84
|
# created for every step to execute it, greatly simplifying the @pypi
|
@@ -88,6 +94,9 @@ class PyPIStepDecorator(StepDecorator):
|
|
88
94
|
)
|
89
95
|
)
|
90
96
|
|
97
|
+
def is_attribute_user_defined(self, name):
|
98
|
+
return name in self._user_defined_attributes
|
99
|
+
|
91
100
|
|
92
101
|
class PyPIFlowDecorator(FlowDecorator):
|
93
102
|
"""
|
@@ -123,9 +132,9 @@ class PyPIFlowDecorator(FlowDecorator):
|
|
123
132
|
# --environment=pypi to --environment=conda
|
124
133
|
_supported_virtual_envs.extend(["pypi"])
|
125
134
|
|
126
|
-
# TODO: Hardcoded for now to support
|
135
|
+
# TODO: Hardcoded for now to support the fast bakery environment.
|
127
136
|
# We should introduce a more robust mechanism for appending supported environments, for example from within extensions.
|
128
|
-
_supported_virtual_envs.extend(["
|
137
|
+
_supported_virtual_envs.extend(["fast-bakery"])
|
129
138
|
|
130
139
|
# The --environment= requirement ensures that valid virtual environments are
|
131
140
|
# created for every step to execute it, greatly simplifying the @conda
|