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

|
|
18
18
|
|
|
@@ -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")
|
|
@@ -247,7 +256,6 @@ DEFAULT_RUNTIME_LIMIT = from_conf("DEFAULT_RUNTIME_LIMIT", 5 * 24 * 60 * 60)
|
|
|
247
256
|
# Organization customizations
|
|
248
257
|
###
|
|
249
258
|
UI_URL = from_conf("UI_URL")
|
|
250
|
-
PAGERDUTY_TEMPLATE_URL = from_conf("PAGERDUTY_TEMPLATE_URL")
|
|
251
259
|
|
|
252
260
|
###
|
|
253
261
|
# Capture error logs from argo
|
|
@@ -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 = [
|
|
@@ -49,7 +49,6 @@ from metaflow.metaflow_config import (
|
|
|
49
49
|
SERVICE_HEADERS,
|
|
50
50
|
SERVICE_INTERNAL_URL,
|
|
51
51
|
UI_URL,
|
|
52
|
-
PAGERDUTY_TEMPLATE_URL,
|
|
53
52
|
)
|
|
54
53
|
from metaflow.metaflow_config_funcs import config_values
|
|
55
54
|
from metaflow.mflog import BASH_SAVE_LOGS, bash_capture_logs, export_mflog_env_vars
|
|
@@ -1659,6 +1658,9 @@ class ArgoWorkflows(object):
|
|
|
1659
1658
|
|
|
1660
1659
|
# support Metaflow sandboxes
|
|
1661
1660
|
env["METAFLOW_INIT_SCRIPT"] = KUBERNETES_SANDBOX_INIT_SCRIPT
|
|
1661
|
+
env["METAFLOW_KUBERNETES_SANDBOX_INIT_SCRIPT"] = (
|
|
1662
|
+
KUBERNETES_SANDBOX_INIT_SCRIPT
|
|
1663
|
+
)
|
|
1662
1664
|
|
|
1663
1665
|
# support for @secret
|
|
1664
1666
|
env["METAFLOW_DEFAULT_SECRETS_BACKEND_TYPE"] = DEFAULT_SECRETS_BACKEND_TYPE
|
|
@@ -1674,6 +1676,12 @@ class ArgoWorkflows(object):
|
|
|
1674
1676
|
)
|
|
1675
1677
|
env["METAFLOW_DATASTORE_SYSROOT_AZURE"] = DATASTORE_SYSROOT_AZURE
|
|
1676
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
|
+
)
|
|
1677
1685
|
|
|
1678
1686
|
# support for GCP
|
|
1679
1687
|
env["METAFLOW_DATASTORE_SYSROOT_GS"] = DATASTORE_SYSROOT_GS
|
|
@@ -2379,18 +2387,10 @@ class ArgoWorkflows(object):
|
|
|
2379
2387
|
def _pager_duty_notification_links(self):
|
|
2380
2388
|
links = []
|
|
2381
2389
|
if UI_URL:
|
|
2382
|
-
if PAGERDUTY_TEMPLATE_URL:
|
|
2383
|
-
pdproject = ''
|
|
2384
|
-
pdbranch = ''
|
|
2385
|
-
if getattr(current, "project_name", None):
|
|
2386
|
-
pdproject = current.project_name
|
|
2387
|
-
pdbranch = current.branch_name
|
|
2388
|
-
href_val = PAGERDUTY_TEMPLATE_URL.format(pd_flow=self.flow.name, pd_namespace=KUBERNETES_NAMESPACE,pd_template=self.name,pd_project=pdproject, pd_branch=pdbranch)
|
|
2389
|
-
else:
|
|
2390
|
-
href_val = "%s/%s/%s"% (UI_URL.rstrip("/"), self.flow.name, "argo-{{workflow.name}}")
|
|
2391
2390
|
links.append(
|
|
2392
2391
|
{
|
|
2393
|
-
"href":
|
|
2392
|
+
"href": "%s/%s/%s"
|
|
2393
|
+
% (UI_URL.rstrip("/"), self.flow.name, "argo-{{workflow.name}}"),
|
|
2394
2394
|
"text": "Metaflow UI",
|
|
2395
2395
|
}
|
|
2396
2396
|
)
|
|
@@ -36,6 +36,12 @@ from .argo_workflows import ArgoWorkflows
|
|
|
36
36
|
|
|
37
37
|
VALID_NAME = re.compile(r"^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$")
|
|
38
38
|
|
|
39
|
+
unsupported_decorators = {
|
|
40
|
+
"snowpark": "Step *%s* is marked for execution on Snowpark with Argo Workflows which isn't currently supported.",
|
|
41
|
+
"slurm": "Step *%s* is marked for execution on Slurm with Argo Workflows which isn't currently supported.",
|
|
42
|
+
"nvidia": "Step *%s* is marked for execution on Nvidia with Argo Workflows which isn't currently supported.",
|
|
43
|
+
}
|
|
44
|
+
|
|
39
45
|
|
|
40
46
|
class IncorrectProductionToken(MetaflowException):
|
|
41
47
|
headline = "Incorrect production token"
|
|
@@ -172,7 +178,7 @@ def argo_workflows(obj, name=None):
|
|
|
172
178
|
)
|
|
173
179
|
@click.option(
|
|
174
180
|
"--enable-heartbeat-daemon/--no-enable-heartbeat-daemon",
|
|
175
|
-
default=
|
|
181
|
+
default=True,
|
|
176
182
|
show_default=True,
|
|
177
183
|
help="Use a daemon container to broadcast heartbeats.",
|
|
178
184
|
)
|
|
@@ -186,7 +192,7 @@ def argo_workflows(obj, name=None):
|
|
|
186
192
|
)
|
|
187
193
|
@click.option(
|
|
188
194
|
"--enable-error-msg-capture/--no-enable-error-msg-capture",
|
|
189
|
-
default=
|
|
195
|
+
default=True,
|
|
190
196
|
show_default=True,
|
|
191
197
|
help="Capture stack trace of first failed task in exit hook.",
|
|
192
198
|
)
|
|
@@ -211,6 +217,11 @@ def create(
|
|
|
211
217
|
deployer_attribute_file=None,
|
|
212
218
|
enable_error_msg_capture=False,
|
|
213
219
|
):
|
|
220
|
+
for node in obj.graph:
|
|
221
|
+
for decorator, error_message in unsupported_decorators.items():
|
|
222
|
+
if any([d.name == decorator for d in node.decorators]):
|
|
223
|
+
raise MetaflowException(error_message % node.name)
|
|
224
|
+
|
|
214
225
|
validate_tags(tags)
|
|
215
226
|
|
|
216
227
|
if deployer_attribute_file:
|
{ob_metaflow-2.12.12.0 → ob_metaflow-2.12.15.1}/metaflow/plugins/argo/argo_workflows_deployer.py
RENAMED
|
@@ -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)
|
|
@@ -5,6 +5,22 @@ from metaflow.exception import MetaflowException
|
|
|
5
5
|
from metaflow.metaflow_config import MAX_MEMORY_PER_TASK, MAX_CPU_PER_TASK
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
def parse_s3_full_path(s3_uri):
|
|
9
|
+
from urllib.parse import urlparse
|
|
10
|
+
|
|
11
|
+
# <scheme>://<netloc>/<path>;<params>?<query>#<fragment>
|
|
12
|
+
scheme, netloc, path, _, _, _ = urlparse(s3_uri)
|
|
13
|
+
assert scheme == "s3"
|
|
14
|
+
assert netloc is not None
|
|
15
|
+
|
|
16
|
+
bucket = netloc
|
|
17
|
+
path = path.lstrip("/").rstrip("/")
|
|
18
|
+
if path == "":
|
|
19
|
+
path = None
|
|
20
|
+
|
|
21
|
+
return bucket, path
|
|
22
|
+
|
|
23
|
+
|
|
8
24
|
def get_ec2_instance_metadata():
|
|
9
25
|
"""
|
|
10
26
|
Fetches the EC2 instance metadata through AWS instance metadata service
|
|
@@ -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
|
{ob_metaflow-2.12.12.0 → ob_metaflow-2.12.15.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py
RENAMED
|
@@ -99,6 +99,9 @@ class KubernetesDecorator(StepDecorator):
|
|
|
99
99
|
Shared memory size (in MiB) required for this step
|
|
100
100
|
port: int, optional
|
|
101
101
|
Port number to specify in the Kubernetes job object
|
|
102
|
+
compute_pool : str, optional, default None
|
|
103
|
+
Compute pool to be used for for this step.
|
|
104
|
+
If not specified, any accessible compute pool within the perimeter is used.
|
|
102
105
|
"""
|
|
103
106
|
|
|
104
107
|
name = "kubernetes"
|
|
@@ -123,6 +126,8 @@ class KubernetesDecorator(StepDecorator):
|
|
|
123
126
|
"persistent_volume_claims": None, # e.g., {"pvc-name": "/mnt/vol", "another-pvc": "/mnt/vol2"}
|
|
124
127
|
"shared_memory": None,
|
|
125
128
|
"port": None,
|
|
129
|
+
"compute_pool": None,
|
|
130
|
+
"executable": None,
|
|
126
131
|
}
|
|
127
132
|
package_url = None
|
|
128
133
|
package_sha = None
|
|
@@ -155,6 +160,12 @@ class KubernetesDecorator(StepDecorator):
|
|
|
155
160
|
self.attributes["node_selector"] = parse_kube_keyvalue_list(
|
|
156
161
|
self.attributes["node_selector"].split(",")
|
|
157
162
|
)
|
|
163
|
+
if self.attributes["compute_pool"]:
|
|
164
|
+
if self.attributes["node_selector"] is None:
|
|
165
|
+
self.attributes["node_selector"] = {}
|
|
166
|
+
self.attributes["node_selector"].update(
|
|
167
|
+
{"outerbounds.co/compute-pool": self.attributes["compute_pool"]}
|
|
168
|
+
)
|
|
158
169
|
|
|
159
170
|
if self.attributes["tolerations"]:
|
|
160
171
|
try:
|
|
@@ -385,9 +396,13 @@ class KubernetesDecorator(StepDecorator):
|
|
|
385
396
|
cli_args.command_args.append(self.package_sha)
|
|
386
397
|
cli_args.command_args.append(self.package_url)
|
|
387
398
|
|
|
399
|
+
# skip certain keys as CLI arguments
|
|
400
|
+
_skip_keys = ["compute_pool"]
|
|
388
401
|
# --namespace is used to specify Metaflow namespace (a different
|
|
389
402
|
# concept from k8s namespace).
|
|
390
403
|
for k, v in self.attributes.items():
|
|
404
|
+
if k in _skip_keys:
|
|
405
|
+
continue
|
|
391
406
|
if k == "namespace":
|
|
392
407
|
cli_args.command_options["k8s_namespace"] = v
|
|
393
408
|
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
|
|
@@ -210,7 +210,7 @@ class CondaStepDecorator(StepDecorator):
|
|
|
210
210
|
self.interpreter = (
|
|
211
211
|
self.environment.interpreter(self.step)
|
|
212
212
|
if not any(
|
|
213
|
-
decorator.name in ["batch", "kubernetes"]
|
|
213
|
+
decorator.name in ["batch", "kubernetes", "nvidia", "snowpark", "slurm"]
|
|
214
214
|
for decorator in next(
|
|
215
215
|
step for step in self.flow if step.name == self.step
|
|
216
216
|
).decorators
|
|
@@ -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
|
|
@@ -268,7 +268,7 @@ class CondaEnvironment(MetaflowEnvironment):
|
|
|
268
268
|
for decorator in step.decorators:
|
|
269
269
|
# TODO: rather than relying on decorator names, rely on attributes
|
|
270
270
|
# to make them extensible.
|
|
271
|
-
if decorator.name in ["batch", "kubernetes", "nvidia"]:
|
|
271
|
+
if decorator.name in ["batch", "kubernetes", "nvidia", "snowpark", "slurm"]:
|
|
272
272
|
# TODO: Support arm architectures
|
|
273
273
|
target_platform = "linux-64"
|
|
274
274
|
break
|
|
@@ -288,13 +288,10 @@ class CondaEnvironment(MetaflowEnvironment):
|
|
|
288
288
|
# PyPI registries, the usage of environment variable `GOOGLE_APPLICATION_CREDENTIALS`
|
|
289
289
|
# demands that `keyrings.google-artifactregistry-auth` has to be installed
|
|
290
290
|
# and available in the underlying python environment.
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
# environment["conda"]["packages"][
|
|
296
|
-
# "keyrings.google-artifactregistry-auth"
|
|
297
|
-
# ] = ">=1.1.1"
|
|
291
|
+
if os.getenv("GOOGLE_APPLICATION_CREDENTIALS"):
|
|
292
|
+
environment["conda"]["packages"][
|
|
293
|
+
"keyrings.google-artifactregistry-auth"
|
|
294
|
+
] = ">=1.1.1"
|
|
298
295
|
|
|
299
296
|
# Z combinator for a recursive lambda
|
|
300
297
|
deep_sort = (lambda f: f(f))(
|
|
@@ -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
|