ob-metaflow 2.13.3.1__tar.gz → 2.13.6.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.13.3.1/ob_metaflow.egg-info → ob_metaflow-2.13.6.1}/PKG-INFO +2 -2
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli.py +5 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/run_cmds.py +2 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/step_cmd.py +0 -13
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/decorators.py +2 -2
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/parameters.py +3 -1
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/__init__.py +5 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows.py +24 -8
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_decorator.py +53 -20
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/events_decorator.py +120 -149
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes.py +0 -9
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_cli.py +1 -1
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py +8 -0
- ob_metaflow-2.13.6.1/metaflow/plugins/kubernetes/spot_metadata_cli.py +69 -0
- ob_metaflow-2.13.6.1/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +109 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/project_decorator.py +33 -5
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/config_parameters.py +23 -9
- ob_metaflow-2.13.6.1/metaflow/version.py +1 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1/ob_metaflow.egg-info}/PKG-INFO +2 -2
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/SOURCES.txt +2 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/requires.txt +1 -1
- ob_metaflow-2.13.3.1/metaflow/version.py +0 -1
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/LICENSE +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/MANIFEST.in +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/README.md +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/R.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_bashcomplete.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_compat.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_termui_impl.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_textwrap.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_unicodefun.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_winconsole.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/core.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/decorators.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/exceptions.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/formatting.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/globals.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/parser.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/termui.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/testing.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/types.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_elffile.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_manylinux.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_musllinux.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_parser.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_structures.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/markers.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/py.typed +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/requirements.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/specifiers.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/tags.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/version.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_checkers.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_config.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_decorators.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_functions.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_importhook.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_memo.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_suppression.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_transformer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/py.typed +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typing_extensions.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/zipp.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/zipp.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/zipp.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cards.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_args.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/dump_cmd.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/init_cmd.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/client/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/client/core.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/client/filecache.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/clone_util.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/configure_cmd.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/develop/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/develop/stub_generator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/develop/stubs.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/main_cli.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/tutorials_cmd.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/util.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd_with_io.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/content_addressed_store.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/datastore_set.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/datastore_storage.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/exceptions.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/flow_datastore.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/inputs.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/task_datastore.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/debug.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/event_logger.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/events.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/exception.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/_empty_file.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/cmd.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/integrations.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/plugins.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/flowspec.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/graph.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/includefile.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/info_file.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/integrations.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/lint.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/heartbeat.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/metadata.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/util.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_config.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_config_funcs.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_current.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_environment.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_profile.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_version.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/mflog.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/save_logs.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/save_logs_periodically.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/tee.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/monitor.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/multicore_utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/package.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow_cli.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow_utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/dag.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/exception.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_client.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_events.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/capture_error.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/generate_input_paths.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/aws_client.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/aws_utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch_client.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_credential.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_exceptions.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_tail.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/includefile_support.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_cli.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_client.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_creator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_datastore.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/base.html +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/basic.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/card.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/components.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/main.js +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_resolver.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_server.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/component_serializer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/exception.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/catch_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/azure_storage.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/gs_storage.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/local_storage.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/s3_storage.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/local.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3op.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3util.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/debug_logger.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/debug_monitor.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/client.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/client_modules.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/channel.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/consts.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/data_transferer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/override_decorators.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/server.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/stub.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/environment_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/frameworks/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/frameworks/pytorch.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_tail.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/includefile_support.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/logs_cli.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/metadata_providers/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/metadata_providers/local.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/metadata_providers/service.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/package_cli.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/parallel_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/bootstrap.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/conda_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/conda_environment.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/micromamba.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/pip.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/pypi_environment.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/resources_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/retry_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/secrets/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/storage_executor.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/tag_cli.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/timeout_decorator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/procpoll.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/py.typed +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/pylint_wrapper.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/click_api.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/deployer.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/deployer_impl.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/metaflow_runner.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/nbdeploy.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/nbrun.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/subprocess_manager.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runtime.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar_messages.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar_subprocess.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar_worker.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/system/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/system/system_logger.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/system/system_monitor.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/system/system_utils.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tagging_util.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/task.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/propagator.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/span_exporter.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/tracing_modules.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tuple_util.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/00-helloworld/README.md +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/README.md +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/movies.csv +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/playlist.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/README.md +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/movies.csv +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/stats.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/07-worldview/README.md +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/08-autopilot/README.md +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/unbounded_foreach.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/__init__.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/config_decorators.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/config_options.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/util.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/vendor.py +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/dependency_links.txt +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/entry_points.txt +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/top_level.txt +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/setup.cfg +0 -0
- {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: ob-metaflow
|
|
3
|
-
Version: 2.13.
|
|
3
|
+
Version: 2.13.6.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.13.
|
|
15
|
+
Requires-Dist: metaflow-stubs==2.13.6.1; extra == "stubs"
|
|
16
16
|
Dynamic: author
|
|
17
17
|
Dynamic: author-email
|
|
18
18
|
Dynamic: description
|
|
@@ -504,6 +504,11 @@ def start(
|
|
|
504
504
|
# *after* the run decospecs so that they don't take precedence. In other
|
|
505
505
|
# words, for the same decorator, we want `myflow.py run --with foo` to
|
|
506
506
|
# take precedence over any other `foo` decospec
|
|
507
|
+
|
|
508
|
+
# Note that top-level decospecs are used primarily with non run/resume
|
|
509
|
+
# options as well as with the airflow/argo/sfn integrations which pass
|
|
510
|
+
# all the decospecs (the ones from top-level but also the ones from the
|
|
511
|
+
# run/resume level) through the tl decospecs.
|
|
507
512
|
ctx.obj.tl_decospecs = list(decospecs or [])
|
|
508
513
|
|
|
509
514
|
# initialize current and parameter context for deploy-time parameters
|
|
@@ -39,6 +39,8 @@ def before_run(obj, tags, decospecs):
|
|
|
39
39
|
+ list(obj.environment.decospecs() or [])
|
|
40
40
|
)
|
|
41
41
|
if all_decospecs:
|
|
42
|
+
# These decospecs are the ones from run/resume PLUS the ones from the
|
|
43
|
+
# environment (for example the @conda)
|
|
42
44
|
decorators._attach_decorators(obj.flow, all_decospecs)
|
|
43
45
|
decorators._init(obj.flow)
|
|
44
46
|
# Regenerate graph if we attached more decorators
|
|
@@ -77,14 +77,6 @@ from ..util import decompress_list
|
|
|
77
77
|
default=None,
|
|
78
78
|
help="Run id of the origin flow, if this task is part of a flow being resumed.",
|
|
79
79
|
)
|
|
80
|
-
@click.option(
|
|
81
|
-
"--with",
|
|
82
|
-
"decospecs",
|
|
83
|
-
multiple=True,
|
|
84
|
-
help="Add a decorator to this task. You can specify this "
|
|
85
|
-
"option multiple times to attach multiple decorators "
|
|
86
|
-
"to this task.",
|
|
87
|
-
)
|
|
88
80
|
@click.option(
|
|
89
81
|
"--ubf-context",
|
|
90
82
|
default="none",
|
|
@@ -112,7 +104,6 @@ def step(
|
|
|
112
104
|
max_user_code_retries=None,
|
|
113
105
|
clone_only=None,
|
|
114
106
|
clone_run_id=None,
|
|
115
|
-
decospecs=None,
|
|
116
107
|
ubf_context="none",
|
|
117
108
|
num_parallel=None,
|
|
118
109
|
):
|
|
@@ -136,10 +127,6 @@ def step(
|
|
|
136
127
|
raise CommandException("Function *%s* is not a step." % step_name)
|
|
137
128
|
echo("Executing a step, *%s*" % step_name, fg="magenta", bold=False)
|
|
138
129
|
|
|
139
|
-
if decospecs:
|
|
140
|
-
decorators._attach_decorators_to_step(func, decospecs)
|
|
141
|
-
decorators._init(ctx.obj.flow)
|
|
142
|
-
|
|
143
130
|
step_kwargs = ctx.params
|
|
144
131
|
# Remove argument `step_name` from `step_kwargs`.
|
|
145
132
|
step_kwargs.pop("step_name", None)
|
|
@@ -150,8 +150,8 @@ class Decorator(object):
|
|
|
150
150
|
return
|
|
151
151
|
|
|
152
152
|
# Note that by design, later values override previous ones.
|
|
153
|
-
self.attributes = unpack_delayed_evaluator(self.attributes)
|
|
154
|
-
self._user_defined_attributes.update(
|
|
153
|
+
self.attributes, new_user_attributes = unpack_delayed_evaluator(self.attributes)
|
|
154
|
+
self._user_defined_attributes.update(new_user_attributes)
|
|
155
155
|
self.attributes = resolve_delayed_evaluator(self.attributes)
|
|
156
156
|
|
|
157
157
|
self._ran_init = True
|
|
@@ -367,7 +367,9 @@ class Parameter(object):
|
|
|
367
367
|
)
|
|
368
368
|
|
|
369
369
|
# Resolve any value from configurations
|
|
370
|
-
self.kwargs = unpack_delayed_evaluator(
|
|
370
|
+
self.kwargs, _ = unpack_delayed_evaluator(
|
|
371
|
+
self.kwargs, ignore_errors=ignore_errors
|
|
372
|
+
)
|
|
371
373
|
# Do it one item at a time so errors are ignored at that level (as opposed to
|
|
372
374
|
# at the entire kwargs level)
|
|
373
375
|
self.kwargs = {
|
|
@@ -16,6 +16,7 @@ CLIS_DESC = [
|
|
|
16
16
|
("argo-workflows", ".argo.argo_workflows_cli.cli"),
|
|
17
17
|
("card", ".cards.card_cli.cli"),
|
|
18
18
|
("tag", ".tag_cli.cli"),
|
|
19
|
+
("spot-metadata", ".kubernetes.spot_metadata_cli.cli"),
|
|
19
20
|
("logs", ".logs_cli.cli"),
|
|
20
21
|
]
|
|
21
22
|
|
|
@@ -104,6 +105,10 @@ SIDECARS_DESC = [
|
|
|
104
105
|
"save_logs_periodically",
|
|
105
106
|
"..mflog.save_logs_periodically.SaveLogsPeriodicallySidecar",
|
|
106
107
|
),
|
|
108
|
+
(
|
|
109
|
+
"spot_termination_monitor",
|
|
110
|
+
".kubernetes.spot_monitor_sidecar.SpotTerminationMonitorSidecar",
|
|
111
|
+
),
|
|
107
112
|
("heartbeat", "metaflow.metadata_provider.heartbeat.MetadataHeartBeat"),
|
|
108
113
|
]
|
|
109
114
|
|
|
@@ -625,6 +625,16 @@ class ArgoWorkflows(object):
|
|
|
625
625
|
for event in trigger_on_finish_deco.triggers:
|
|
626
626
|
# Actual filters are deduced here since we don't have access to
|
|
627
627
|
# the current object in the @trigger_on_finish decorator.
|
|
628
|
+
project_name = event.get("project") or current.get("project_name")
|
|
629
|
+
branch_name = event.get("branch") or current.get("branch_name")
|
|
630
|
+
# validate that we have complete project info for an event name
|
|
631
|
+
if project_name or branch_name:
|
|
632
|
+
if not (project_name and branch_name):
|
|
633
|
+
# if one of the two is missing, we would end up listening to an event that will never be broadcast.
|
|
634
|
+
raise ArgoWorkflowsException(
|
|
635
|
+
"Incomplete project info. Please specify both 'project' and 'project_branch' or use the @project decorator"
|
|
636
|
+
)
|
|
637
|
+
|
|
628
638
|
triggers.append(
|
|
629
639
|
{
|
|
630
640
|
# Make sure this remains consistent with the event name format
|
|
@@ -633,18 +643,16 @@ class ArgoWorkflows(object):
|
|
|
633
643
|
% ".".join(
|
|
634
644
|
v
|
|
635
645
|
for v in [
|
|
636
|
-
|
|
637
|
-
|
|
646
|
+
project_name,
|
|
647
|
+
branch_name,
|
|
638
648
|
event["flow"],
|
|
639
649
|
]
|
|
640
650
|
if v
|
|
641
651
|
),
|
|
642
652
|
"filters": {
|
|
643
653
|
"auto-generated-by-metaflow": True,
|
|
644
|
-
"project_name":
|
|
645
|
-
|
|
646
|
-
"branch_name": event.get("branch")
|
|
647
|
-
or current.get("branch_name"),
|
|
654
|
+
"project_name": project_name,
|
|
655
|
+
"branch_name": branch_name,
|
|
648
656
|
# TODO: Add a time filters to guard against cached events
|
|
649
657
|
},
|
|
650
658
|
"type": "run",
|
|
@@ -842,8 +850,15 @@ class ArgoWorkflows(object):
|
|
|
842
850
|
Metadata()
|
|
843
851
|
.labels(self._base_labels)
|
|
844
852
|
.label("app.kubernetes.io/name", "metaflow-task")
|
|
845
|
-
.annotations(
|
|
846
|
-
|
|
853
|
+
.annotations(
|
|
854
|
+
{
|
|
855
|
+
**annotations,
|
|
856
|
+
**self._base_annotations,
|
|
857
|
+
**{
|
|
858
|
+
"metaflow/run_id": "argo-{{workflow.name}}"
|
|
859
|
+
}, # we want pods of the workflow to have the run_id as an annotation as well
|
|
860
|
+
}
|
|
861
|
+
)
|
|
847
862
|
)
|
|
848
863
|
# Set the entrypoint to flow name
|
|
849
864
|
.entrypoint(self.flow.name)
|
|
@@ -1706,6 +1721,7 @@ class ArgoWorkflows(object):
|
|
|
1706
1721
|
},
|
|
1707
1722
|
**{
|
|
1708
1723
|
# Some optional values for bookkeeping
|
|
1724
|
+
"METAFLOW_FLOW_FILENAME": os.path.basename(sys.argv[0]),
|
|
1709
1725
|
"METAFLOW_FLOW_NAME": self.flow.name,
|
|
1710
1726
|
"METAFLOW_STEP_NAME": node.name,
|
|
1711
1727
|
"METAFLOW_RUN_ID": run_id,
|
|
@@ -76,6 +76,12 @@ class CardDecorator(StepDecorator):
|
|
|
76
76
|
|
|
77
77
|
card_creator = None
|
|
78
78
|
|
|
79
|
+
_config_values = None
|
|
80
|
+
|
|
81
|
+
_config_file_name = None
|
|
82
|
+
|
|
83
|
+
task_finished_decos = 0
|
|
84
|
+
|
|
79
85
|
def __init__(self, *args, **kwargs):
|
|
80
86
|
super(CardDecorator, self).__init__(*args, **kwargs)
|
|
81
87
|
self._task_datastore = None
|
|
@@ -106,6 +112,25 @@ class CardDecorator(StepDecorator):
|
|
|
106
112
|
def _increment_step_counter(cls):
|
|
107
113
|
cls.step_counter += 1
|
|
108
114
|
|
|
115
|
+
@classmethod
|
|
116
|
+
def _increment_completed_counter(cls):
|
|
117
|
+
cls.task_finished_decos += 1
|
|
118
|
+
|
|
119
|
+
@classmethod
|
|
120
|
+
def _set_config_values(cls, config_values):
|
|
121
|
+
cls._config_values = config_values
|
|
122
|
+
|
|
123
|
+
@classmethod
|
|
124
|
+
def _set_config_file_name(cls, flow):
|
|
125
|
+
# Only create a config file from the very first card decorator.
|
|
126
|
+
if cls._config_values and not cls._config_file_name:
|
|
127
|
+
with tempfile.NamedTemporaryFile(
|
|
128
|
+
mode="w", encoding="utf-8", delete=False
|
|
129
|
+
) as config_file:
|
|
130
|
+
config_value = dump_config_values(flow)
|
|
131
|
+
json.dump(config_value, config_file)
|
|
132
|
+
cls._config_file_name = config_file.name
|
|
133
|
+
|
|
109
134
|
def step_init(
|
|
110
135
|
self, flow, graph, step_name, decorators, environment, flow_datastore, logger
|
|
111
136
|
):
|
|
@@ -116,11 +141,13 @@ class CardDecorator(StepDecorator):
|
|
|
116
141
|
|
|
117
142
|
# We check for configuration options. We do this here before they are
|
|
118
143
|
# converted to properties.
|
|
119
|
-
self.
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
144
|
+
self._set_config_values(
|
|
145
|
+
[
|
|
146
|
+
(config.name, ConfigInput.make_key_name(config.name))
|
|
147
|
+
for _, config in flow._get_parameters()
|
|
148
|
+
if config.IS_CONFIG_PARAMETER
|
|
149
|
+
]
|
|
150
|
+
)
|
|
124
151
|
|
|
125
152
|
self.card_options = self.attributes["options"]
|
|
126
153
|
|
|
@@ -159,15 +186,11 @@ class CardDecorator(StepDecorator):
|
|
|
159
186
|
|
|
160
187
|
# If we have configs, we need to dump them to a file so we can re-use them
|
|
161
188
|
# when calling the card creation subprocess.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
json.dump(config_value, config_file)
|
|
168
|
-
self._config_file_name = config_file.name
|
|
169
|
-
else:
|
|
170
|
-
self._config_file_name = None
|
|
189
|
+
# Since a step can contain multiple card decorators, and all the card creation processes
|
|
190
|
+
# will reference the same config file (because of how the CardCreator is created (only single class instance)),
|
|
191
|
+
# we need to ensure that a single config file is being referenced for all card create commands.
|
|
192
|
+
# This config file will be removed when the last card decorator has finished creating its card.
|
|
193
|
+
self._set_config_file_name(flow)
|
|
171
194
|
|
|
172
195
|
card_type = self.attributes["type"]
|
|
173
196
|
card_class = get_card_class(card_type)
|
|
@@ -246,12 +269,7 @@ class CardDecorator(StepDecorator):
|
|
|
246
269
|
self.card_creator.create(mode="render", final=True, **create_options)
|
|
247
270
|
self.card_creator.create(mode="refresh", final=True, **create_options)
|
|
248
271
|
|
|
249
|
-
|
|
250
|
-
if self._config_file_name:
|
|
251
|
-
try:
|
|
252
|
-
os.unlink(self._config_file_name)
|
|
253
|
-
except Exception as e:
|
|
254
|
-
pass
|
|
272
|
+
self._cleanup(step_name)
|
|
255
273
|
|
|
256
274
|
@staticmethod
|
|
257
275
|
def _options(mapping):
|
|
@@ -286,3 +304,18 @@ class CardDecorator(StepDecorator):
|
|
|
286
304
|
top_level_options["local-config-file"] = self._config_file_name
|
|
287
305
|
|
|
288
306
|
return list(self._options(top_level_options))
|
|
307
|
+
|
|
308
|
+
def task_exception(
|
|
309
|
+
self, exception, step_name, flow, graph, retry_count, max_user_code_retries
|
|
310
|
+
):
|
|
311
|
+
self._cleanup(step_name)
|
|
312
|
+
|
|
313
|
+
def _cleanup(self, step_name):
|
|
314
|
+
self._increment_completed_counter()
|
|
315
|
+
if self.task_finished_decos == self.total_decos_on_step[step_name]:
|
|
316
|
+
# Unlink the config file if it exists
|
|
317
|
+
if self._config_file_name:
|
|
318
|
+
try:
|
|
319
|
+
os.unlink(self._config_file_name)
|
|
320
|
+
except Exception as e:
|
|
321
|
+
pass
|
|
@@ -362,11 +362,7 @@ class TriggerOnFinishDecorator(FlowDecorator):
|
|
|
362
362
|
"""
|
|
363
363
|
|
|
364
364
|
name = "trigger_on_finish"
|
|
365
|
-
|
|
366
|
-
"flow": None, # flow_name or project_flow_name
|
|
367
|
-
"flows": [], # flow_names or project_flow_names
|
|
368
|
-
"options": {},
|
|
369
|
-
}
|
|
365
|
+
|
|
370
366
|
options = {
|
|
371
367
|
"trigger": dict(
|
|
372
368
|
multiple=True,
|
|
@@ -374,6 +370,14 @@ class TriggerOnFinishDecorator(FlowDecorator):
|
|
|
374
370
|
help="Specify run pathspec for testing @trigger_on_finish locally.",
|
|
375
371
|
),
|
|
376
372
|
}
|
|
373
|
+
defaults = {
|
|
374
|
+
"flow": None, # flow_name or project_flow_name
|
|
375
|
+
"flows": [], # flow_names or project_flow_names
|
|
376
|
+
"options": {},
|
|
377
|
+
# Re-enable if you want to support TL options directly in the decorator like
|
|
378
|
+
# for @project decorator
|
|
379
|
+
# **{k: v["default"] for k, v in options.items()},
|
|
380
|
+
}
|
|
377
381
|
|
|
378
382
|
def flow_init(
|
|
379
383
|
self,
|
|
@@ -394,111 +398,23 @@ class TriggerOnFinishDecorator(FlowDecorator):
|
|
|
394
398
|
)
|
|
395
399
|
elif self.attributes["flow"]:
|
|
396
400
|
# flow supports the format @trigger_on_finish(flow='FooFlow')
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
{
|
|
400
|
-
"fq_name": self.attributes["flow"],
|
|
401
|
-
}
|
|
402
|
-
)
|
|
403
|
-
elif isinstance(self.attributes["flow"], dict):
|
|
404
|
-
if "name" not in self.attributes["flow"]:
|
|
405
|
-
raise MetaflowException(
|
|
406
|
-
"The *flow* attribute for *@trigger_on_finish* is missing the "
|
|
407
|
-
"*name* key."
|
|
408
|
-
)
|
|
409
|
-
flow_name = self.attributes["flow"]["name"]
|
|
410
|
-
|
|
411
|
-
if not is_stringish(flow_name) or "." in flow_name:
|
|
412
|
-
raise MetaflowException(
|
|
413
|
-
"The *name* attribute of the *flow* is not a valid string"
|
|
414
|
-
)
|
|
415
|
-
result = {"fq_name": flow_name}
|
|
416
|
-
if "project" in self.attributes["flow"]:
|
|
417
|
-
if is_stringish(self.attributes["flow"]["project"]):
|
|
418
|
-
result["project"] = self.attributes["flow"]["project"]
|
|
419
|
-
else:
|
|
420
|
-
raise MetaflowException(
|
|
421
|
-
"The *project* attribute of the *flow* is not a string"
|
|
422
|
-
)
|
|
423
|
-
if "project_branch" in self.attributes["flow"]:
|
|
424
|
-
if is_stringish(self.attributes["flow"]["project_branch"]):
|
|
425
|
-
result["branch"] = self.attributes["flow"]["project_branch"]
|
|
426
|
-
else:
|
|
427
|
-
raise MetaflowException(
|
|
428
|
-
"The *project_branch* attribute of the *flow* is not a string"
|
|
429
|
-
)
|
|
430
|
-
self.triggers.append(result)
|
|
431
|
-
elif callable(self.attributes["flow"]) and not isinstance(
|
|
401
|
+
flow = self.attributes["flow"]
|
|
402
|
+
if callable(flow) and not isinstance(
|
|
432
403
|
self.attributes["flow"], DeployTimeField
|
|
433
404
|
):
|
|
434
|
-
trig = DeployTimeField(
|
|
435
|
-
"fq_name", [str, dict], None, self.attributes["flow"], False
|
|
436
|
-
)
|
|
405
|
+
trig = DeployTimeField("fq_name", [str, dict], None, flow, False)
|
|
437
406
|
self.triggers.append(trig)
|
|
438
407
|
else:
|
|
439
|
-
|
|
440
|
-
"Incorrect type for *flow* attribute in *@trigger_on_finish* "
|
|
441
|
-
" decorator. Supported type is string or Dict[str, str] - \n"
|
|
442
|
-
"@trigger_on_finish(flow='FooFlow') or "
|
|
443
|
-
"@trigger_on_finish(flow={'name':'FooFlow', 'project_branch': 'branch'})"
|
|
444
|
-
)
|
|
408
|
+
self.triggers.extend(self._parse_static_triggers([flow]))
|
|
445
409
|
elif self.attributes["flows"]:
|
|
446
410
|
# flows attribute supports the following formats -
|
|
447
411
|
# 1. flows=['FooFlow', 'BarFlow']
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
self.triggers.append(
|
|
452
|
-
{
|
|
453
|
-
"fq_name": flow,
|
|
454
|
-
}
|
|
455
|
-
)
|
|
456
|
-
elif isinstance(flow, dict):
|
|
457
|
-
if "name" not in flow:
|
|
458
|
-
raise MetaflowException(
|
|
459
|
-
"One or more flows in the *flows* attribute for "
|
|
460
|
-
"*@trigger_on_finish* is missing the "
|
|
461
|
-
"*name* key."
|
|
462
|
-
)
|
|
463
|
-
flow_name = flow["name"]
|
|
464
|
-
|
|
465
|
-
if not is_stringish(flow_name) or "." in flow_name:
|
|
466
|
-
raise MetaflowException(
|
|
467
|
-
"The *name* attribute '%s' is not a valid string"
|
|
468
|
-
% str(flow_name)
|
|
469
|
-
)
|
|
470
|
-
result = {"fq_name": flow_name}
|
|
471
|
-
if "project" in flow:
|
|
472
|
-
if is_stringish(flow["project"]):
|
|
473
|
-
result["project"] = flow["project"]
|
|
474
|
-
else:
|
|
475
|
-
raise MetaflowException(
|
|
476
|
-
"The *project* attribute of the *flow* '%s' is not "
|
|
477
|
-
"a string" % flow_name
|
|
478
|
-
)
|
|
479
|
-
if "project_branch" in flow:
|
|
480
|
-
if is_stringish(flow["project_branch"]):
|
|
481
|
-
result["branch"] = flow["project_branch"]
|
|
482
|
-
else:
|
|
483
|
-
raise MetaflowException(
|
|
484
|
-
"The *project_branch* attribute of the *flow* %s "
|
|
485
|
-
"is not a string" % flow_name
|
|
486
|
-
)
|
|
487
|
-
self.triggers.append(result)
|
|
488
|
-
else:
|
|
489
|
-
raise MetaflowException(
|
|
490
|
-
"One or more flows in *flows* attribute in "
|
|
491
|
-
"*@trigger_on_finish* decorator have an incorrect type. "
|
|
492
|
-
"Supported type is string or Dict[str, str]- \n"
|
|
493
|
-
"@trigger_on_finish(flows=['FooFlow', 'BarFlow']"
|
|
494
|
-
)
|
|
495
|
-
elif callable(self.attributes["flows"]) and not isinstance(
|
|
496
|
-
self.attributes["flows"], DeployTimeField
|
|
497
|
-
):
|
|
498
|
-
trig = DeployTimeField(
|
|
499
|
-
"flows", list, None, self.attributes["flows"], False
|
|
500
|
-
)
|
|
412
|
+
flows = self.attributes["flows"]
|
|
413
|
+
if callable(flows) and not isinstance(flows, DeployTimeField):
|
|
414
|
+
trig = DeployTimeField("flows", list, None, flows, False)
|
|
501
415
|
self.triggers.append(trig)
|
|
416
|
+
elif isinstance(flows, list):
|
|
417
|
+
self.triggers.extend(self._parse_static_triggers(flows))
|
|
502
418
|
else:
|
|
503
419
|
raise MetaflowException(
|
|
504
420
|
"Incorrect type for *flows* attribute in *@trigger_on_finish* "
|
|
@@ -515,37 +431,48 @@ class TriggerOnFinishDecorator(FlowDecorator):
|
|
|
515
431
|
for trigger in self.triggers:
|
|
516
432
|
if isinstance(trigger, DeployTimeField):
|
|
517
433
|
continue
|
|
518
|
-
|
|
519
|
-
# fully qualified name is just the flow name
|
|
520
|
-
trigger["flow"] = trigger["fq_name"]
|
|
521
|
-
elif trigger["fq_name"].count(".") >= 2:
|
|
522
|
-
# fully qualified name is of the format - project.branch.flow_name
|
|
523
|
-
trigger["project"], tail = trigger["fq_name"].split(".", maxsplit=1)
|
|
524
|
-
trigger["branch"], trigger["flow"] = tail.rsplit(".", maxsplit=1)
|
|
525
|
-
else:
|
|
526
|
-
raise MetaflowException(
|
|
527
|
-
"Incorrect format for *flow* in *@trigger_on_finish* "
|
|
528
|
-
"decorator. Specify either just the *flow_name* or a fully "
|
|
529
|
-
"qualified name like *project_name.branch_name.flow_name*."
|
|
530
|
-
)
|
|
531
|
-
# TODO: Also sanity check project and branch names
|
|
532
|
-
if not re.match(r"^[A-Za-z0-9_]+$", trigger["flow"]):
|
|
533
|
-
raise MetaflowException(
|
|
534
|
-
"Invalid flow name *%s* in *@trigger_on_finish* "
|
|
535
|
-
"decorator. Only alphanumeric characters and "
|
|
536
|
-
"underscores(_) are allowed." % trigger["flow"]
|
|
537
|
-
)
|
|
434
|
+
self._parse_fq_name(trigger)
|
|
538
435
|
|
|
539
436
|
self.options = self.attributes["options"]
|
|
540
437
|
|
|
541
438
|
# Handle scenario for local testing using --trigger.
|
|
439
|
+
|
|
440
|
+
# Re-enable this code if you want to support passing trigger directly in the
|
|
441
|
+
# decorator in a way similar to how production and branch are passed in the
|
|
442
|
+
# project decorator.
|
|
443
|
+
|
|
444
|
+
# # This is overkill since default is None for all options but adding this code
|
|
445
|
+
# # to make it safe if other non None-default options are added in the future.
|
|
446
|
+
# for op in options:
|
|
447
|
+
# if (
|
|
448
|
+
# op in self._user_defined_attributes
|
|
449
|
+
# and options[op] != self.defaults[op]
|
|
450
|
+
# and self.attributes[op] != options[op]
|
|
451
|
+
# ):
|
|
452
|
+
# # Exception if:
|
|
453
|
+
# # - the user provides a value in the attributes field
|
|
454
|
+
# # - AND the user provided a value in the command line (non default)
|
|
455
|
+
# # - AND the values are different
|
|
456
|
+
# # Note that this won't raise an error if the user provided the default
|
|
457
|
+
# # value in the command line and provided one in attribute but although
|
|
458
|
+
# # slightly inconsistent, it is not incorrect.
|
|
459
|
+
# raise MetaflowException(
|
|
460
|
+
# "You cannot pass %s as both a command-line argument and an attribute "
|
|
461
|
+
# "of the @trigger_on_finish decorator." % op
|
|
462
|
+
# )
|
|
463
|
+
|
|
464
|
+
# if "trigger" in self._user_defined_attributes:
|
|
465
|
+
# trigger_option = self.attributes["trigger"]
|
|
466
|
+
# else:
|
|
467
|
+
trigger_option = options["trigger"]
|
|
468
|
+
|
|
542
469
|
self._option_values = options
|
|
543
|
-
if
|
|
470
|
+
if trigger_option:
|
|
544
471
|
from metaflow import Run
|
|
545
472
|
from metaflow.events import Trigger
|
|
546
473
|
|
|
547
474
|
run_objs = []
|
|
548
|
-
for run_pathspec in
|
|
475
|
+
for run_pathspec in trigger_option:
|
|
549
476
|
if len(run_pathspec.split("/")) != 2:
|
|
550
477
|
raise MetaflowException(
|
|
551
478
|
"Incorrect format for run pathspec for *--trigger*. "
|
|
@@ -559,9 +486,67 @@ class TriggerOnFinishDecorator(FlowDecorator):
|
|
|
559
486
|
run_objs.append(run_obj)
|
|
560
487
|
current._update_env({"trigger": Trigger.from_runs(run_objs)})
|
|
561
488
|
|
|
489
|
+
@staticmethod
|
|
490
|
+
def _parse_static_triggers(flows):
|
|
491
|
+
results = []
|
|
492
|
+
for flow in flows:
|
|
493
|
+
if is_stringish(flow):
|
|
494
|
+
results.append(
|
|
495
|
+
{
|
|
496
|
+
"fq_name": flow,
|
|
497
|
+
}
|
|
498
|
+
)
|
|
499
|
+
elif isinstance(flow, dict):
|
|
500
|
+
if "name" not in flow:
|
|
501
|
+
if len(flows) > 1:
|
|
502
|
+
raise MetaflowException(
|
|
503
|
+
"One or more flows in the *flows* attribute for "
|
|
504
|
+
"*@trigger_on_finish* is missing the "
|
|
505
|
+
"*name* key."
|
|
506
|
+
)
|
|
507
|
+
raise MetaflowException(
|
|
508
|
+
"The *flow* attribute for *@trigger_on_finish* is missing the "
|
|
509
|
+
"*name* key."
|
|
510
|
+
)
|
|
511
|
+
flow_name = flow["name"]
|
|
512
|
+
|
|
513
|
+
if not is_stringish(flow_name) or "." in flow_name:
|
|
514
|
+
raise MetaflowException(
|
|
515
|
+
f"The *name* attribute of the *flow* {flow_name} is not a valid string"
|
|
516
|
+
)
|
|
517
|
+
result = {"fq_name": flow_name}
|
|
518
|
+
if "project" in flow:
|
|
519
|
+
if is_stringish(flow["project"]):
|
|
520
|
+
result["project"] = flow["project"]
|
|
521
|
+
else:
|
|
522
|
+
raise MetaflowException(
|
|
523
|
+
f"The *project* attribute of the *flow* {flow_name} is not a string"
|
|
524
|
+
)
|
|
525
|
+
if "project_branch" in flow:
|
|
526
|
+
if is_stringish(flow["project_branch"]):
|
|
527
|
+
result["branch"] = flow["project_branch"]
|
|
528
|
+
else:
|
|
529
|
+
raise MetaflowException(
|
|
530
|
+
f"The *project_branch* attribute of the *flow* {flow_name} is not a string"
|
|
531
|
+
)
|
|
532
|
+
results.append(result)
|
|
533
|
+
else:
|
|
534
|
+
if len(flows) > 1:
|
|
535
|
+
raise MetaflowException(
|
|
536
|
+
"One or more flows in the *flows* attribute for "
|
|
537
|
+
"*@trigger_on_finish* decorator have an incorrect type. "
|
|
538
|
+
"Supported type is string or Dict[str, str]- \n"
|
|
539
|
+
"@trigger_on_finish(flows=['FooFlow', 'BarFlow']"
|
|
540
|
+
)
|
|
541
|
+
raise MetaflowException(
|
|
542
|
+
"Incorrect type for *flow* attribute in *@trigger_on_finish* "
|
|
543
|
+
" decorator. Supported type is string or Dict[str, str] - \n"
|
|
544
|
+
"@trigger_on_finish(flow='FooFlow') or "
|
|
545
|
+
"@trigger_on_finish(flow={'name':'FooFlow', 'project_branch': 'branch'})"
|
|
546
|
+
)
|
|
547
|
+
return results
|
|
548
|
+
|
|
562
549
|
def _parse_fq_name(self, trigger):
|
|
563
|
-
if isinstance(trigger, DeployTimeField):
|
|
564
|
-
trigger["fq_name"] = deploy_time_eval(trigger["fq_name"])
|
|
565
550
|
if trigger["fq_name"].count(".") == 0:
|
|
566
551
|
# fully qualified name is just the flow name
|
|
567
552
|
trigger["flow"] = trigger["fq_name"]
|
|
@@ -581,32 +566,18 @@ class TriggerOnFinishDecorator(FlowDecorator):
|
|
|
581
566
|
"decorator. Only alphanumeric characters and "
|
|
582
567
|
"underscores(_) are allowed." % trigger["flow"]
|
|
583
568
|
)
|
|
584
|
-
return trigger
|
|
585
569
|
|
|
586
570
|
def format_deploytime_value(self):
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
deploy_value = deploy_time_eval(trigger)
|
|
592
|
-
if isinstance(deploy_value, list):
|
|
593
|
-
self.triggers = deploy_value
|
|
571
|
+
if len(self.triggers) == 1 and isinstance(self.triggers[0], DeployTimeField):
|
|
572
|
+
deploy_value = deploy_time_eval(self.triggers[0])
|
|
573
|
+
if isinstance(deploy_value, list):
|
|
574
|
+
self.triggers = deploy_value
|
|
594
575
|
else:
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
trigger = deploy_time_eval(trigger)
|
|
601
|
-
if isinstance(trigger, dict):
|
|
602
|
-
trigger["fq_name"] = trigger.get("name")
|
|
603
|
-
trigger["project"] = trigger.get("project")
|
|
604
|
-
trigger["branch"] = trigger.get("project_branch")
|
|
605
|
-
# We also added this bc it won't be formatted yet
|
|
606
|
-
if isinstance(trigger, str):
|
|
607
|
-
trigger = {"fq_name": trigger}
|
|
608
|
-
trigger = self._parse_fq_name(trigger)
|
|
609
|
-
self.triggers[self.triggers.index(old_trig)] = trigger
|
|
576
|
+
self.triggers = [deploy_value]
|
|
577
|
+
triggers = self._parse_static_triggers(self.triggers)
|
|
578
|
+
for trigger in triggers:
|
|
579
|
+
self._parse_fq_name(trigger)
|
|
580
|
+
self.triggers = triggers
|
|
610
581
|
|
|
611
582
|
def get_top_level_options(self):
|
|
612
583
|
return list(self._option_values.items())
|
|
@@ -685,15 +685,6 @@ class Kubernetes(object):
|
|
|
685
685
|
for name, value in system_annotations.items():
|
|
686
686
|
job.annotation(name, value)
|
|
687
687
|
|
|
688
|
-
(
|
|
689
|
-
job.annotation("metaflow/run_id", run_id)
|
|
690
|
-
.annotation("metaflow/step_name", step_name)
|
|
691
|
-
.annotation("metaflow/task_id", task_id)
|
|
692
|
-
.annotation("metaflow/attempt", attempt)
|
|
693
|
-
.label("app.kubernetes.io/name", "metaflow-task")
|
|
694
|
-
.label("app.kubernetes.io/part-of", "metaflow")
|
|
695
|
-
)
|
|
696
|
-
|
|
697
688
|
return job
|
|
698
689
|
|
|
699
690
|
def create_k8sjob(self, job):
|
|
@@ -190,7 +190,7 @@ def step(
|
|
|
190
190
|
executable = ctx.obj.environment.executable(step_name, executable)
|
|
191
191
|
|
|
192
192
|
# Set environment
|
|
193
|
-
env = {}
|
|
193
|
+
env = {"METAFLOW_FLOW_FILENAME": os.path.basename(sys.argv[0])}
|
|
194
194
|
env_deco = [deco for deco in node.decorators if deco.name == "environment"]
|
|
195
195
|
if env_deco:
|
|
196
196
|
env = env_deco[0].attributes["vars"]
|