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

|
|
18
18
|
|
|
@@ -701,12 +701,12 @@ def resume(
|
|
|
701
701
|
runtime.persist_constants()
|
|
702
702
|
|
|
703
703
|
if runner_attribute_file:
|
|
704
|
-
with open(runner_attribute_file, "w") as f:
|
|
704
|
+
with open(runner_attribute_file, "w", encoding="utf-8") as f:
|
|
705
705
|
json.dump(
|
|
706
706
|
{
|
|
707
707
|
"run_id": runtime.run_id,
|
|
708
708
|
"flow_name": obj.flow.name,
|
|
709
|
-
"metadata":
|
|
709
|
+
"metadata": obj.metadata.metadata_str(),
|
|
710
710
|
},
|
|
711
711
|
f,
|
|
712
712
|
)
|
|
@@ -779,12 +779,12 @@ def run(
|
|
|
779
779
|
runtime.persist_constants()
|
|
780
780
|
|
|
781
781
|
if runner_attribute_file:
|
|
782
|
-
with open(runner_attribute_file, "w") as f:
|
|
782
|
+
with open(runner_attribute_file, "w", encoding="utf-8") as f:
|
|
783
783
|
json.dump(
|
|
784
784
|
{
|
|
785
785
|
"run_id": runtime.run_id,
|
|
786
786
|
"flow_name": obj.flow.name,
|
|
787
|
-
"metadata":
|
|
787
|
+
"metadata": obj.metadata.metadata_str(),
|
|
788
788
|
},
|
|
789
789
|
f,
|
|
790
790
|
)
|
|
@@ -16,6 +16,7 @@ from typing import (
|
|
|
16
16
|
List,
|
|
17
17
|
NamedTuple,
|
|
18
18
|
Optional,
|
|
19
|
+
TYPE_CHECKING,
|
|
19
20
|
Tuple,
|
|
20
21
|
)
|
|
21
22
|
|
|
@@ -37,6 +38,9 @@ from metaflow.util import cached_property, is_stringish, resolve_identity, to_un
|
|
|
37
38
|
from ..info_file import INFO_FILE
|
|
38
39
|
from .filecache import FileCache
|
|
39
40
|
|
|
41
|
+
if TYPE_CHECKING:
|
|
42
|
+
from metaflow.metadata import MetadataProvider
|
|
43
|
+
|
|
40
44
|
try:
|
|
41
45
|
# python2
|
|
42
46
|
import cPickle as pickle
|
|
@@ -82,28 +86,16 @@ def metadata(ms: str) -> str:
|
|
|
82
86
|
get_metadata()).
|
|
83
87
|
"""
|
|
84
88
|
global current_metadata
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
else:
|
|
96
|
-
metadata_type = "local"
|
|
97
|
-
res = [m for m in METADATA_PROVIDERS if m.TYPE == metadata_type]
|
|
98
|
-
if not res:
|
|
99
|
-
print(
|
|
100
|
-
"Cannot find a '%s' metadata provider -- "
|
|
101
|
-
"try specifying one explicitly using <type>@<info>",
|
|
102
|
-
metadata_type,
|
|
103
|
-
)
|
|
104
|
-
return get_metadata()
|
|
105
|
-
current_metadata = res[0]
|
|
106
|
-
current_metadata.INFO = ms
|
|
89
|
+
provider, info = _metadata(ms)
|
|
90
|
+
if provider is None:
|
|
91
|
+
print(
|
|
92
|
+
"Cannot find a metadata provider -- "
|
|
93
|
+
"try specifying one explicitly using <type>@<info>",
|
|
94
|
+
)
|
|
95
|
+
return get_metadata()
|
|
96
|
+
current_metadata = provider
|
|
97
|
+
if info:
|
|
98
|
+
current_metadata.INFO = info
|
|
107
99
|
return get_metadata()
|
|
108
100
|
|
|
109
101
|
|
|
@@ -127,7 +119,7 @@ def get_metadata() -> str:
|
|
|
127
119
|
"""
|
|
128
120
|
if current_metadata is False:
|
|
129
121
|
default_metadata()
|
|
130
|
-
return
|
|
122
|
+
return current_metadata.metadata_str()
|
|
131
123
|
|
|
132
124
|
|
|
133
125
|
def default_metadata() -> str:
|
|
@@ -268,9 +260,16 @@ class MetaflowObject(object):
|
|
|
268
260
|
_object: Optional["MetaflowObject"] = None,
|
|
269
261
|
_parent: Optional["MetaflowObject"] = None,
|
|
270
262
|
_namespace_check: bool = True,
|
|
263
|
+
_metaflow: Optional["Metaflow"] = None,
|
|
271
264
|
_current_namespace: Optional[str] = None,
|
|
265
|
+
_current_metadata: Optional[str] = None,
|
|
272
266
|
):
|
|
273
|
-
|
|
267
|
+
# the default namespace is activated lazily at the first
|
|
268
|
+
# get_namespace(). The other option of activating
|
|
269
|
+
# the namespace at the import time is problematic, since there
|
|
270
|
+
# may be other modules that alter environment variables etc.
|
|
271
|
+
# which may affect the namespace setting.
|
|
272
|
+
self._metaflow = Metaflow(_current_metadata) or _metaflow
|
|
274
273
|
self._parent = _parent
|
|
275
274
|
self._path_components = None
|
|
276
275
|
self._attempt = attempt
|
|
@@ -390,6 +389,7 @@ class MetaflowObject(object):
|
|
|
390
389
|
attempt=self._attempt,
|
|
391
390
|
_object=obj,
|
|
392
391
|
_parent=self,
|
|
392
|
+
_metaflow=self._metaflow,
|
|
393
393
|
_namespace_check=self._namespace_check,
|
|
394
394
|
_current_namespace=(
|
|
395
395
|
self._current_namespace if self._namespace_check else None
|
|
@@ -505,6 +505,7 @@ class MetaflowObject(object):
|
|
|
505
505
|
attempt=self._attempt,
|
|
506
506
|
_object=obj,
|
|
507
507
|
_parent=self,
|
|
508
|
+
_metaflow=self._metaflow,
|
|
508
509
|
_namespace_check=self._namespace_check,
|
|
509
510
|
_current_namespace=(
|
|
510
511
|
self._current_namespace if self._namespace_check else None
|
|
@@ -552,7 +553,25 @@ class MetaflowObject(object):
|
|
|
552
553
|
_current_namespace=ns,
|
|
553
554
|
)
|
|
554
555
|
|
|
555
|
-
|
|
556
|
+
def _unpickle_21227(self, data):
|
|
557
|
+
if len(data) != 5:
|
|
558
|
+
raise MetaflowInternalError(
|
|
559
|
+
"Unexpected size of array: {}".format(len(data))
|
|
560
|
+
)
|
|
561
|
+
pathspec, attempt, md, ns, namespace_check = data
|
|
562
|
+
self.__init__(
|
|
563
|
+
pathspec=pathspec,
|
|
564
|
+
attempt=attempt,
|
|
565
|
+
_namespace_check=namespace_check,
|
|
566
|
+
_current_metadata=md,
|
|
567
|
+
_current_namespace=ns,
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
_UNPICKLE_FUNC = {
|
|
571
|
+
"2.8.4": _unpickle_284,
|
|
572
|
+
"2.12.4": _unpickle_2124,
|
|
573
|
+
"2.12.27": _unpickle_21227,
|
|
574
|
+
}
|
|
556
575
|
|
|
557
576
|
def __setstate__(self, state):
|
|
558
577
|
"""
|
|
@@ -595,10 +614,11 @@ class MetaflowObject(object):
|
|
|
595
614
|
# checking for the namespace even after unpickling since we will know which
|
|
596
615
|
# namespace to check.
|
|
597
616
|
return {
|
|
598
|
-
"version": "2.12.
|
|
617
|
+
"version": "2.12.27",
|
|
599
618
|
"data": [
|
|
600
619
|
self.pathspec,
|
|
601
620
|
self._attempt,
|
|
621
|
+
self._metaflow.metadata.metadata_str(),
|
|
602
622
|
self._current_namespace,
|
|
603
623
|
self._namespace_check,
|
|
604
624
|
],
|
|
@@ -670,7 +690,7 @@ class MetaflowObject(object):
|
|
|
670
690
|
origin_pathspec = None
|
|
671
691
|
if self._NAME == "run":
|
|
672
692
|
latest_step = next(self.steps())
|
|
673
|
-
if latest_step:
|
|
693
|
+
if latest_step and latest_step.task:
|
|
674
694
|
# If we had a step
|
|
675
695
|
task = latest_step.task
|
|
676
696
|
origin_run_id = [
|
|
@@ -1888,9 +1908,10 @@ class Run(MetaflowObject):
|
|
|
1888
1908
|
# TODO: A more optimized way of figuring out if a run has remote steps (and thus a codepackage) available.
|
|
1889
1909
|
# This might require changes to the metadata-service as well.
|
|
1890
1910
|
for step in self:
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1911
|
+
if step.task:
|
|
1912
|
+
code = step.task.code
|
|
1913
|
+
if code:
|
|
1914
|
+
return code
|
|
1894
1915
|
|
|
1895
1916
|
@property
|
|
1896
1917
|
def data(self) -> Optional[MetaflowData]:
|
|
@@ -2152,7 +2173,7 @@ class Run(MetaflowObject):
|
|
|
2152
2173
|
Trigger, optional
|
|
2153
2174
|
Container of triggering events
|
|
2154
2175
|
"""
|
|
2155
|
-
if "start" in self:
|
|
2176
|
+
if "start" in self and self["start"].task:
|
|
2156
2177
|
meta = self["start"].task.metadata_dict.get("execution-triggers")
|
|
2157
2178
|
if meta:
|
|
2158
2179
|
return Trigger(json.loads(meta))
|
|
@@ -2287,17 +2308,16 @@ class Metaflow(object):
|
|
|
2287
2308
|
if it has at least one run in the namespace.
|
|
2288
2309
|
"""
|
|
2289
2310
|
|
|
2290
|
-
def __init__(self):
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
self.metadata = current_metadata
|
|
2311
|
+
def __init__(self, _current_metadata: Optional[str] = None):
|
|
2312
|
+
if _current_metadata:
|
|
2313
|
+
provider, info = _metadata(_current_metadata)
|
|
2314
|
+
self.metadata = provider
|
|
2315
|
+
if info:
|
|
2316
|
+
self.metadata.INFO = info
|
|
2317
|
+
else:
|
|
2318
|
+
if current_metadata is False:
|
|
2319
|
+
default_metadata()
|
|
2320
|
+
self.metadata = current_metadata
|
|
2301
2321
|
|
|
2302
2322
|
@property
|
|
2303
2323
|
def flows(self) -> List[Flow]:
|
|
@@ -2334,7 +2354,7 @@ class Metaflow(object):
|
|
|
2334
2354
|
all_flows = all_flows if all_flows else []
|
|
2335
2355
|
for flow in all_flows:
|
|
2336
2356
|
try:
|
|
2337
|
-
v = Flow(_object=flow)
|
|
2357
|
+
v = Flow(_object=flow, _metaflow=self)
|
|
2338
2358
|
yield v
|
|
2339
2359
|
except MetaflowNamespaceMismatch:
|
|
2340
2360
|
continue
|
|
@@ -2358,7 +2378,26 @@ class Metaflow(object):
|
|
|
2358
2378
|
Flow
|
|
2359
2379
|
Flow with the given name.
|
|
2360
2380
|
"""
|
|
2361
|
-
return Flow(name)
|
|
2381
|
+
return Flow(name, _metaflow=self)
|
|
2382
|
+
|
|
2383
|
+
|
|
2384
|
+
def _metadata(ms: str) -> Tuple[Optional["MetadataProvider"], Optional[str]]:
|
|
2385
|
+
infos = ms.split("@", 1)
|
|
2386
|
+
types = [m.TYPE for m in METADATA_PROVIDERS]
|
|
2387
|
+
if infos[0] in types:
|
|
2388
|
+
provider = [m for m in METADATA_PROVIDERS if m.TYPE == infos[0]][0]
|
|
2389
|
+
if len(infos) > 1:
|
|
2390
|
+
return provider, infos[1]
|
|
2391
|
+
return provider, None
|
|
2392
|
+
# Deduce from ms; if starts with http, use service or else use local
|
|
2393
|
+
if ms.startswith("http"):
|
|
2394
|
+
metadata_type = "service"
|
|
2395
|
+
else:
|
|
2396
|
+
metadata_type = "local"
|
|
2397
|
+
res = [m for m in METADATA_PROVIDERS if m.TYPE == metadata_type]
|
|
2398
|
+
if not res:
|
|
2399
|
+
return None, None
|
|
2400
|
+
return res[0], ms
|
|
2362
2401
|
|
|
2363
2402
|
|
|
2364
2403
|
_CLASSES["flow"] = Flow
|
|
@@ -76,6 +76,12 @@ class ObjectOrder:
|
|
|
76
76
|
|
|
77
77
|
@with_metaclass(MetadataProviderMeta)
|
|
78
78
|
class MetadataProvider(object):
|
|
79
|
+
TYPE = None
|
|
80
|
+
|
|
81
|
+
@classmethod
|
|
82
|
+
def metadata_str(cls):
|
|
83
|
+
return "%s@%s" % (cls.TYPE, cls.INFO)
|
|
84
|
+
|
|
79
85
|
@classmethod
|
|
80
86
|
def compute_info(cls, val):
|
|
81
87
|
"""
|
|
@@ -10,6 +10,14 @@ class ArgoClientException(MetaflowException):
|
|
|
10
10
|
headline = "Argo Client error"
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
class ArgoResourceNotFound(MetaflowException):
|
|
14
|
+
headline = "Resource not found"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ArgoNotPermitted(MetaflowException):
|
|
18
|
+
headline = "Operation not permitted"
|
|
19
|
+
|
|
20
|
+
|
|
13
21
|
class ArgoClient(object):
|
|
14
22
|
def __init__(self, namespace=None):
|
|
15
23
|
self._client = KubernetesClient()
|
|
@@ -140,9 +148,7 @@ class ArgoClient(object):
|
|
|
140
148
|
if e.status == 404:
|
|
141
149
|
return None
|
|
142
150
|
else:
|
|
143
|
-
raise
|
|
144
|
-
json.loads(e.body)["message"] if e.body is not None else e.reason
|
|
145
|
-
)
|
|
151
|
+
raise wrap_api_error(e)
|
|
146
152
|
|
|
147
153
|
def delete_workflow_template(self, name):
|
|
148
154
|
"""
|
|
@@ -164,9 +170,7 @@ class ArgoClient(object):
|
|
|
164
170
|
if e.status == 404:
|
|
165
171
|
return None
|
|
166
172
|
else:
|
|
167
|
-
raise
|
|
168
|
-
json.loads(e.body)["message"] if e.body is not None else e.reason
|
|
169
|
-
)
|
|
173
|
+
raise wrap_api_error(e)
|
|
170
174
|
|
|
171
175
|
def terminate_workflow(self, name):
|
|
172
176
|
client = self._client.get()
|
|
@@ -428,6 +432,18 @@ class ArgoClient(object):
|
|
|
428
432
|
except client.rest.ApiException as e:
|
|
429
433
|
if e.status == 404:
|
|
430
434
|
return None
|
|
431
|
-
raise
|
|
432
|
-
|
|
433
|
-
|
|
435
|
+
raise wrap_api_error(e)
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
def wrap_api_error(error):
|
|
439
|
+
message = (
|
|
440
|
+
json.loads(error.body)["message"] if error.body is not None else error.reason
|
|
441
|
+
)
|
|
442
|
+
# catch all
|
|
443
|
+
ex = ArgoClientException(message)
|
|
444
|
+
if error.status == 404:
|
|
445
|
+
# usually handled outside this function as most cases want to return None instead.
|
|
446
|
+
ex = ArgoResourceNotFound(message)
|
|
447
|
+
if error.status == 403:
|
|
448
|
+
ex = ArgoNotPermitted(message)
|
|
449
|
+
return ex
|
|
@@ -2311,7 +2311,9 @@ class ArgoWorkflows(object):
|
|
|
2311
2311
|
and k not in set(ARGO_WORKFLOWS_ENV_VARS_TO_SKIP.split(","))
|
|
2312
2312
|
}
|
|
2313
2313
|
return [
|
|
2314
|
-
Template("error-msg-capture-hook")
|
|
2314
|
+
Template("error-msg-capture-hook")
|
|
2315
|
+
.service_account_name(resources["service_account"])
|
|
2316
|
+
.container(
|
|
2315
2317
|
to_camelcase(
|
|
2316
2318
|
kubernetes_sdk.V1Container(
|
|
2317
2319
|
name="main",
|
|
@@ -2462,7 +2464,7 @@ class ArgoWorkflows(object):
|
|
|
2462
2464
|
Use Slack's Block Kit to add general information about the environment and
|
|
2463
2465
|
execution metadata, including a link to the UI and an optional message.
|
|
2464
2466
|
"""
|
|
2465
|
-
ui_link = "%s
|
|
2467
|
+
ui_link = "%s/%s/argo-{{workflow.name}}" % (UI_URL.rstrip("/"), self.flow.name)
|
|
2466
2468
|
# fmt: off
|
|
2467
2469
|
if getattr(current, "project_name", None):
|
|
2468
2470
|
# Add @project metadata when available.
|
|
@@ -226,12 +226,12 @@ def create(
|
|
|
226
226
|
validate_tags(tags)
|
|
227
227
|
|
|
228
228
|
if deployer_attribute_file:
|
|
229
|
-
with open(deployer_attribute_file, "w") as f:
|
|
229
|
+
with open(deployer_attribute_file, "w", encoding="utf-8") as f:
|
|
230
230
|
json.dump(
|
|
231
231
|
{
|
|
232
232
|
"name": obj.workflow_name,
|
|
233
233
|
"flow_name": obj.flow.name,
|
|
234
|
-
"metadata":
|
|
234
|
+
"metadata": obj.metadata.metadata_str(),
|
|
235
235
|
},
|
|
236
236
|
f,
|
|
237
237
|
)
|
|
@@ -657,7 +657,7 @@ def trigger(obj, run_id_file=None, deployer_attribute_file=None, **kwargs):
|
|
|
657
657
|
json.dump(
|
|
658
658
|
{
|
|
659
659
|
"name": obj.workflow_name,
|
|
660
|
-
"metadata":
|
|
660
|
+
"metadata": obj.metadata.metadata_str(),
|
|
661
661
|
"pathspec": "/".join((obj.flow.name, run_id)),
|
|
662
662
|
},
|
|
663
663
|
f,
|
|
@@ -1016,13 +1016,7 @@ def validate_run_id(
|
|
|
1016
1016
|
|
|
1017
1017
|
if project_name is not None:
|
|
1018
1018
|
# Verify we are operating on the correct project.
|
|
1019
|
-
|
|
1020
|
-
# e.g. 'test_proj' and 'test_project' should count as a mismatch.
|
|
1021
|
-
project_part = "%s." % sanitize_for_argo(project_name)
|
|
1022
|
-
if (
|
|
1023
|
-
current.get("project_name") != project_name
|
|
1024
|
-
and project_part not in workflow_name
|
|
1025
|
-
):
|
|
1019
|
+
if current.get("project_name") != project_name:
|
|
1026
1020
|
raise RunIdMismatch(
|
|
1027
1021
|
"The workflow belongs to the project *%s*. "
|
|
1028
1022
|
"Please use the project decorator or --name to target the correct project"
|
|
@@ -1030,13 +1024,7 @@ def validate_run_id(
|
|
|
1030
1024
|
)
|
|
1031
1025
|
|
|
1032
1026
|
# Verify we are operating on the correct branch.
|
|
1033
|
-
|
|
1034
|
-
# e.g. 'user.tes' and 'user.test' should count as a mismatch.
|
|
1035
|
-
branch_part = ".%s." % sanitize_for_argo(branch_name)
|
|
1036
|
-
if (
|
|
1037
|
-
current.get("branch_name") != branch_name
|
|
1038
|
-
and branch_part not in workflow_name
|
|
1039
|
-
):
|
|
1027
|
+
if current.get("branch_name") != branch_name:
|
|
1040
1028
|
raise RunIdMismatch(
|
|
1041
1029
|
"The workflow belongs to the branch *%s*. "
|
|
1042
1030
|
"Please use --branch, --production or --name to target the correct branch"
|
{ob_metaflow-2.12.25.2 → ob_metaflow-2.12.27.1}/metaflow/plugins/aws/batch/batch_decorator.py
RENAMED
|
@@ -134,6 +134,10 @@ class BatchDecorator(StepDecorator):
|
|
|
134
134
|
package_sha = None
|
|
135
135
|
run_time_limit = None
|
|
136
136
|
|
|
137
|
+
# Conda environment support
|
|
138
|
+
supports_conda_environment = True
|
|
139
|
+
target_platform = "linux-64"
|
|
140
|
+
|
|
137
141
|
def __init__(self, attributes=None, statically_defined=False):
|
|
138
142
|
super(BatchDecorator, self).__init__(attributes, statically_defined)
|
|
139
143
|
|
|
@@ -162,7 +162,7 @@ def create(
|
|
|
162
162
|
{
|
|
163
163
|
"name": obj.state_machine_name,
|
|
164
164
|
"flow_name": obj.flow.name,
|
|
165
|
-
"metadata":
|
|
165
|
+
"metadata": obj.metadata.metadata_str(),
|
|
166
166
|
},
|
|
167
167
|
f,
|
|
168
168
|
)
|
|
@@ -502,7 +502,7 @@ def trigger(obj, run_id_file=None, deployer_attribute_file=None, **kwargs):
|
|
|
502
502
|
json.dump(
|
|
503
503
|
{
|
|
504
504
|
"name": obj.state_machine_name,
|
|
505
|
-
"metadata":
|
|
505
|
+
"metadata": obj.metadata.metadata_str(),
|
|
506
506
|
"pathspec": "/".join((obj.flow.name, run_id)),
|
|
507
507
|
},
|
|
508
508
|
f,
|
|
@@ -117,6 +117,7 @@ class CardDecorator(StepDecorator):
|
|
|
117
117
|
# `'%s-%s'%(evt_name,step_name)` ensures that we capture this once per @card per @step.
|
|
118
118
|
# Since there can be many steps checking if event is registered for `evt_name` will only make it check it once for all steps.
|
|
119
119
|
# Hence, we have `_is_event_registered('%s-%s'%(evt_name,step_name))`
|
|
120
|
+
self._is_runtime_card = False
|
|
120
121
|
evt = "%s-%s" % (evt_name, step_name)
|
|
121
122
|
if not self._is_event_registered(evt):
|
|
122
123
|
# We set the total count of decorators so that we can use it for
|
|
@@ -11,15 +11,15 @@ from metaflow.plugins.gcp.gs_utils import parse_gs_full_path
|
|
|
11
11
|
class GSTail(object):
|
|
12
12
|
def __init__(self, blob_full_uri):
|
|
13
13
|
"""Location should be something like gs://<bucket_name>/blob"""
|
|
14
|
-
bucket_name, blob_name = parse_gs_full_path(blob_full_uri)
|
|
15
|
-
if not blob_name:
|
|
14
|
+
self.bucket_name, self.blob_name = parse_gs_full_path(blob_full_uri)
|
|
15
|
+
if not self.blob_name:
|
|
16
16
|
raise MetaflowException(
|
|
17
17
|
msg="Failed to parse blob_full_uri into gs://<bucket_name>/<blob_name> (got %s)"
|
|
18
18
|
% blob_full_uri
|
|
19
19
|
)
|
|
20
20
|
client = get_gs_storage_client()
|
|
21
|
-
bucket = client.bucket(bucket_name)
|
|
22
|
-
self._blob_client = bucket.blob(blob_name)
|
|
21
|
+
self.bucket = client.bucket(self.bucket_name)
|
|
22
|
+
self._blob_client = self.bucket.blob(self.blob_name)
|
|
23
23
|
self._pos = 0
|
|
24
24
|
self._tail = b""
|
|
25
25
|
|
|
@@ -46,7 +46,11 @@ class GSTail(object):
|
|
|
46
46
|
def _make_range_request(self):
|
|
47
47
|
try:
|
|
48
48
|
# Yes we read to the end... memory blow up is possible. We can improve by specifying length param
|
|
49
|
-
|
|
49
|
+
# NOTE: We must re-instantiate the whole client here due to a behavior with the GS library,
|
|
50
|
+
# otherwise download_as_bytes will simply return the same content for consecutive requests with the same attributes,
|
|
51
|
+
# even if the blob has grown in size.
|
|
52
|
+
blob_client = self.bucket.blob(self.blob_name)
|
|
53
|
+
return blob_client.download_as_bytes(start=self._pos)
|
|
50
54
|
except NotFound:
|
|
51
55
|
return None
|
|
52
56
|
except ClientError as e:
|
|
@@ -63,7 +67,7 @@ class GSTail(object):
|
|
|
63
67
|
if data is None:
|
|
64
68
|
return None
|
|
65
69
|
if data:
|
|
66
|
-
buf = BytesIO(data)
|
|
70
|
+
buf = BytesIO(self._tail + data)
|
|
67
71
|
self._pos += len(data)
|
|
68
72
|
self._tail = b""
|
|
69
73
|
return buf
|
|
@@ -726,12 +726,23 @@ class Kubernetes(object):
|
|
|
726
726
|
wait_for_launch(self._job)
|
|
727
727
|
|
|
728
728
|
# 2) Tail logs until the job has finished
|
|
729
|
+
self._output_final_logs = False
|
|
730
|
+
|
|
731
|
+
def _has_updates():
|
|
732
|
+
if self._job.is_running:
|
|
733
|
+
return True
|
|
734
|
+
# Make sure to output final tail for a job that has finished.
|
|
735
|
+
if not self._output_final_logs:
|
|
736
|
+
self._output_final_logs = True
|
|
737
|
+
return True
|
|
738
|
+
return False
|
|
739
|
+
|
|
729
740
|
tail_logs(
|
|
730
741
|
prefix=prefix(),
|
|
731
742
|
stdout_tail=stdout_tail,
|
|
732
743
|
stderr_tail=stderr_tail,
|
|
733
744
|
echo=echo,
|
|
734
|
-
has_log_updates=
|
|
745
|
+
has_log_updates=_has_updates,
|
|
735
746
|
)
|
|
736
747
|
# 3) Fetch remaining logs
|
|
737
748
|
#
|
{ob_metaflow-2.12.25.2 → ob_metaflow-2.12.27.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py
RENAMED
|
@@ -2,6 +2,7 @@ import json
|
|
|
2
2
|
import os
|
|
3
3
|
import platform
|
|
4
4
|
import sys
|
|
5
|
+
import time
|
|
5
6
|
|
|
6
7
|
from metaflow import current
|
|
7
8
|
from metaflow.decorators import StepDecorator
|
|
@@ -106,6 +107,9 @@ class KubernetesDecorator(StepDecorator):
|
|
|
106
107
|
compute_pool : str, optional, default None
|
|
107
108
|
Compute pool to be used for for this step.
|
|
108
109
|
If not specified, any accessible compute pool within the perimeter is used.
|
|
110
|
+
hostname_resolution_timeout: int, default 10 * 60
|
|
111
|
+
Timeout in seconds for the workers tasks in the gang scheduled cluster to resolve the hostname of control task.
|
|
112
|
+
Only applicable when @parallel is used.
|
|
109
113
|
"""
|
|
110
114
|
|
|
111
115
|
name = "kubernetes"
|
|
@@ -132,11 +136,16 @@ class KubernetesDecorator(StepDecorator):
|
|
|
132
136
|
"port": None,
|
|
133
137
|
"compute_pool": None,
|
|
134
138
|
"executable": None,
|
|
139
|
+
"hostname_resolution_timeout": 10 * 60,
|
|
135
140
|
}
|
|
136
141
|
package_url = None
|
|
137
142
|
package_sha = None
|
|
138
143
|
run_time_limit = None
|
|
139
144
|
|
|
145
|
+
# Conda environment support
|
|
146
|
+
supports_conda_environment = True
|
|
147
|
+
target_platform = "linux-64"
|
|
148
|
+
|
|
140
149
|
def __init__(self, attributes=None, statically_defined=False):
|
|
141
150
|
super(KubernetesDecorator, self).__init__(attributes, statically_defined)
|
|
142
151
|
|
|
@@ -401,7 +410,7 @@ class KubernetesDecorator(StepDecorator):
|
|
|
401
410
|
cli_args.command_args.append(self.package_url)
|
|
402
411
|
|
|
403
412
|
# skip certain keys as CLI arguments
|
|
404
|
-
_skip_keys = ["compute_pool"]
|
|
413
|
+
_skip_keys = ["compute_pool", "hostname_resolution_timeout"]
|
|
405
414
|
# --namespace is used to specify Metaflow namespace (a different
|
|
406
415
|
# concept from k8s namespace).
|
|
407
416
|
for k, v in self.attributes.items():
|
|
@@ -493,7 +502,9 @@ class KubernetesDecorator(StepDecorator):
|
|
|
493
502
|
num_parallel = flow._parallel_ubf_iter.num_parallel
|
|
494
503
|
|
|
495
504
|
if num_parallel and num_parallel > 1:
|
|
496
|
-
_setup_multinode_environment(
|
|
505
|
+
_setup_multinode_environment(
|
|
506
|
+
ubf_context, self.attributes["hostname_resolution_timeout"]
|
|
507
|
+
)
|
|
497
508
|
# current.parallel.node_index will be correctly available over here.
|
|
498
509
|
meta.update({"parallel-node-index": current.parallel.node_index})
|
|
499
510
|
if ubf_context == UBF_CONTROL:
|
|
@@ -557,18 +568,44 @@ class KubernetesDecorator(StepDecorator):
|
|
|
557
568
|
|
|
558
569
|
|
|
559
570
|
# TODO: Unify this method with the multi-node setup in @batch
|
|
560
|
-
def _setup_multinode_environment():
|
|
561
|
-
# TODO [FIXME SOON]
|
|
562
|
-
# Even if Kubernetes may deploy control pods before worker pods, there is always a
|
|
563
|
-
# possibility that the worker pods may start before the control. In the case that this happens,
|
|
564
|
-
# the worker pods will not be able to resolve the control pod's IP address and this will cause
|
|
565
|
-
# the worker pods to fail. This function should account for this in the near future.
|
|
571
|
+
def _setup_multinode_environment(ubf_context, hostname_resolution_timeout):
|
|
566
572
|
import socket
|
|
567
573
|
|
|
574
|
+
def _wait_for_hostname_resolution(max_wait_timeout=10 * 60):
|
|
575
|
+
"""
|
|
576
|
+
keep trying to resolve the hostname of the control task until the hostname is resolved
|
|
577
|
+
or the max_wait_timeout is reached. This is a workaround for the issue where the control
|
|
578
|
+
task is not scheduled before the worker task and the worker task fails because it cannot
|
|
579
|
+
resolve the hostname of the control task.
|
|
580
|
+
"""
|
|
581
|
+
start_time = time.time()
|
|
582
|
+
while True:
|
|
583
|
+
try:
|
|
584
|
+
return socket.gethostbyname(os.environ["MF_MASTER_ADDR"])
|
|
585
|
+
except socket.gaierror:
|
|
586
|
+
if time.time() - start_time > max_wait_timeout:
|
|
587
|
+
raise MetaflowException(
|
|
588
|
+
"Failed to get host by name for MF_MASTER_ADDR after waiting for {} seconds.".format(
|
|
589
|
+
max_wait_timeout
|
|
590
|
+
)
|
|
591
|
+
)
|
|
592
|
+
time.sleep(1)
|
|
593
|
+
|
|
568
594
|
try:
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
595
|
+
# Even if Kubernetes may deploy control pods before worker pods, there is always a
|
|
596
|
+
# possibility that the worker pods may start before the control. In the case that this happens,
|
|
597
|
+
# the worker pods will not be able to resolve the control pod's IP address and this will cause
|
|
598
|
+
# the worker pods to fail. So if the worker pods are requesting a hostname resolution, we will
|
|
599
|
+
# make it wait for the name to be resolved within a reasonable timeout period.
|
|
600
|
+
if ubf_context != UBF_CONTROL:
|
|
601
|
+
os.environ["MF_PARALLEL_MAIN_IP"] = _wait_for_hostname_resolution(
|
|
602
|
+
hostname_resolution_timeout
|
|
603
|
+
)
|
|
604
|
+
else:
|
|
605
|
+
os.environ["MF_PARALLEL_MAIN_IP"] = socket.gethostbyname(
|
|
606
|
+
os.environ["MF_MASTER_ADDR"]
|
|
607
|
+
)
|
|
608
|
+
|
|
572
609
|
os.environ["MF_PARALLEL_NUM_NODES"] = os.environ["MF_WORLD_SIZE"]
|
|
573
610
|
os.environ["MF_PARALLEL_NODE_INDEX"] = (
|
|
574
611
|
str(0)
|
{ob_metaflow-2.12.25.2 → ob_metaflow-2.12.27.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py
RENAMED
|
@@ -332,11 +332,8 @@ class RunningJobSet(object):
|
|
|
332
332
|
name=self._name,
|
|
333
333
|
)
|
|
334
334
|
|
|
335
|
-
# Suspend the jobset
|
|
336
|
-
#
|
|
335
|
+
# Suspend the jobset
|
|
337
336
|
obj["spec"]["suspend"] = True
|
|
338
|
-
for replicated_job in obj["spec"]["replicatedJobs"]:
|
|
339
|
-
replicated_job["replicas"] = 0
|
|
340
337
|
|
|
341
338
|
api_instance.replace_namespaced_custom_object(
|
|
342
339
|
group=self._group,
|