ob-metaflow 2.15.7.2__tar.gz → 2.15.11.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.15.7.2/ob_metaflow.egg-info → ob_metaflow-2.15.11.1}/PKG-INFO +2 -2
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/devtools/Makefile +2 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli.py +8 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/run_cmds.py +2 -2
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/main_cli.py +1 -1
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/includefile.py +2 -2
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metadata_provider/metadata.py +35 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_config.py +6 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_environment.py +6 -1
- ob_metaflow-2.15.11.1/metaflow/metaflow_git.py +115 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_version.py +2 -2
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/__init__.py +1 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_workflows.py +13 -2
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_workflows_cli.py +1 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/aws_client.py +4 -3
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datastores/gs_storage.py +3 -1
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/s3/s3.py +54 -45
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/s3/s3op.py +149 -62
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes.py +4 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes_cli.py +8 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py +10 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes_job.py +8 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +7 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/conda_decorator.py +2 -1
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/conda_environment.py +1 -0
- ob_metaflow-2.15.11.1/metaflow/plugins/uv/bootstrap.py +100 -0
- ob_metaflow-2.15.11.1/metaflow/plugins/uv/uv_environment.py +70 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/deployer.py +8 -2
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/deployer_impl.py +6 -2
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/metaflow_runner.py +7 -2
- ob_metaflow-2.15.11.1/metaflow/user_configs/__init__.py +0 -0
- ob_metaflow-2.15.11.1/metaflow/version.py +1 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1/ob_metaflow.egg-info}/PKG-INFO +2 -2
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/ob_metaflow.egg-info/SOURCES.txt +4 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/ob_metaflow.egg-info/requires.txt +1 -1
- ob_metaflow-2.15.7.2/metaflow/version.py +0 -1
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/LICENSE +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/MANIFEST.in +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/README.md +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/devtools/Tiltfile +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/devtools/pick_services.sh +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/R.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_bashcomplete.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_compat.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_termui_impl.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_textwrap.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_unicodefun.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_winconsole.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/core.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/decorators.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/exceptions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/formatting.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/globals.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/parser.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/termui.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/testing.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/types.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_elffile.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_manylinux.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_musllinux.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_parser.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_structures.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/markers.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/py.typed +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/requirements.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/specifiers.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/tags.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/version.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_checkers.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_config.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_decorators.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_functions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_importhook.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_memo.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_suppression.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_transformer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/py.typed +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typing_extensions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_5/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_5/zipp.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/zipp.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_adapters.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_collections.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_compat.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_functools.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_itertools.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_meta.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_text.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/py.typed +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_checkers.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_config.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_decorators.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_exceptions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_functions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_importhook.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_memo.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_pytest_plugin.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_suppression.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_transformer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_union_transformer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/py.typed +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typing_extensions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/zipp.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/zipp.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cards.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_args.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/dump_cmd.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/init_cmd.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/step_cmd.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/client/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/client/core.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/client/filecache.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/clone_util.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/code/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/configure_cmd.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/develop/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/develop/stub_generator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/develop/stubs.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/make_wrapper.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/tutorials_cmd.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/util.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd_with_io.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/content_addressed_store.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/datastore_set.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/datastore_storage.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/exceptions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/flow_datastore.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/inputs.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/task_datastore.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/debug.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/decorators.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/event_logger.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/events.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/exception.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/extension_support/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/extension_support/_empty_file.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/extension_support/cmd.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/extension_support/integrations.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/extension_support/plugins.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/flowspec.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/graph.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/info_file.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/integrations.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/lint.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metadata_provider/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metadata_provider/heartbeat.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metadata_provider/util.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_config_funcs.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_current.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_profile.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/mflog/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/mflog/mflog.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/mflog/save_logs.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/mflog/save_logs_periodically.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/mflog/tee.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/monitor.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/multicore_utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/package.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/parameters.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/airflow.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/airflow_cli.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/airflow_utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/dag.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/exception.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_client.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_events.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/capture_error.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/generate_input_paths.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/aws_utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/batch/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/batch/batch.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/batch/batch_client.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/azure_credential.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/azure_exceptions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/azure_tail.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/azure_utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/includefile_support.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_cli.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_client.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_creator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_datastore.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/base.html +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/basic.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/card.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/components.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/main.js +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_resolver.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_server.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/component_serializer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/exception.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/catch_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datastores/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datastores/azure_storage.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datastores/local_storage.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datastores/s3_storage.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/local.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/s3/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/s3/s3util.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/debug_logger.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/debug_monitor.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/client.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/client_modules.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/communication/channel.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/communication/utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/consts.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/data_transferer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/override_decorators.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/server.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/stub.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/environment_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/events_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/frameworks/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/frameworks/pytorch.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/gs_tail.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/gs_utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/includefile_support.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/spot_metadata_cli.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/logs_cli.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/metadata_providers/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/metadata_providers/local.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/metadata_providers/service.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/package_cli.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/parallel_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/project_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/bootstrap.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/micromamba.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/parsers.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/pip.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/pypi_environment.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/resources_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/retry_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/secrets/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/storage_executor.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/tag_cli.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/timeout_decorator.py +0 -0
- {ob_metaflow-2.15.7.2/metaflow/runner → ob_metaflow-2.15.11.1/metaflow/plugins/uv}/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/procpoll.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/py.typed +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/pylint_wrapper.py +0 -0
- {ob_metaflow-2.15.7.2/metaflow/user_configs → ob_metaflow-2.15.11.1/metaflow/runner}/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/click_api.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/nbdeploy.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/nbrun.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/subprocess_manager.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runtime.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/sidecar/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/sidecar/sidecar.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/sidecar/sidecar_messages.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/sidecar/sidecar_subprocess.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/sidecar/sidecar_worker.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/system/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/system/system_logger.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/system/system_monitor.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/system/system_utils.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tagging_util.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/task.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tracing/__init__.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tracing/propagator.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tracing/span_exporter.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tracing/tracing_modules.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tuple_util.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/00-helloworld/README.md +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/01-playlist/README.md +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/01-playlist/movies.csv +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/01-playlist/playlist.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/02-statistics/README.md +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/02-statistics/movies.csv +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/02-statistics/stats.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/07-worldview/README.md +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/08-autopilot/README.md +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/unbounded_foreach.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/user_configs/config_decorators.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/user_configs/config_options.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/user_configs/config_parameters.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/util.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/vendor.py +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/ob_metaflow.egg-info/dependency_links.txt +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/ob_metaflow.egg-info/entry_points.txt +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/ob_metaflow.egg-info/top_level.txt +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/setup.cfg +0 -0
- {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ob-metaflow
|
|
3
|
-
Version: 2.15.
|
|
3
|
+
Version: 2.15.11.1
|
|
4
4
|
Summary: Metaflow: More AI and ML, 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.15.
|
|
15
|
+
Requires-Dist: metaflow-stubs==2.15.11.1; extra == "stubs"
|
|
16
16
|
Dynamic: author
|
|
17
17
|
Dynamic: author-email
|
|
18
18
|
Dynamic: description
|
|
@@ -260,6 +260,7 @@ shell: setup-tilt
|
|
|
260
260
|
env METAFLOW_HOME="$(DEVTOOLS_DIR)" \
|
|
261
261
|
METAFLOW_PROFILE=local \
|
|
262
262
|
AWS_CONFIG_FILE="$(DEVTOOLS_DIR)/aws_config" \
|
|
263
|
+
AWS_SHARED_CREDENTIALS_FILE= \
|
|
263
264
|
"$$user_shell" -i; \
|
|
264
265
|
else \
|
|
265
266
|
env METAFLOW_HOME="$(DEVTOOLS_DIR)" \
|
|
@@ -301,6 +302,7 @@ create-dev-shell: setup-tilt
|
|
|
301
302
|
echo " env METAFLOW_HOME=\"$(DEVTOOLS_DIR)\" \\" >> $$SHELL_PATH && \
|
|
302
303
|
echo " METAFLOW_PROFILE=local \\" >> $$SHELL_PATH && \
|
|
303
304
|
echo " AWS_CONFIG_FILE=\"$(DEVTOOLS_DIR)/aws_config\" \\" >> $$SHELL_PATH && \
|
|
305
|
+
echo " AWS_SHARED_CREDENTIALS_FILE= \\" >> $$SHELL_PATH && \
|
|
304
306
|
echo " \"\$$user_shell\" -i" >> $$SHELL_PATH && \
|
|
305
307
|
echo "else" >> $$SHELL_PATH && \
|
|
306
308
|
echo " env METAFLOW_HOME=\"$(DEVTOOLS_DIR)\" \\" >> $$SHELL_PATH && \
|
|
@@ -17,6 +17,7 @@ from .flowspec import _FlowState
|
|
|
17
17
|
from .graph import FlowGraph
|
|
18
18
|
from .metaflow_config import (
|
|
19
19
|
DEFAULT_DATASTORE,
|
|
20
|
+
DEFAULT_DECOSPECS,
|
|
20
21
|
DEFAULT_ENVIRONMENT,
|
|
21
22
|
DEFAULT_EVENT_LOGGER,
|
|
22
23
|
DEFAULT_METADATA,
|
|
@@ -509,9 +510,16 @@ def start(
|
|
|
509
510
|
):
|
|
510
511
|
# run/resume are special cases because they can add more decorators with --with,
|
|
511
512
|
# so they have to take care of themselves.
|
|
513
|
+
|
|
512
514
|
all_decospecs = ctx.obj.tl_decospecs + list(
|
|
513
515
|
ctx.obj.environment.decospecs() or []
|
|
514
516
|
)
|
|
517
|
+
|
|
518
|
+
# We add the default decospecs for everything except init and step since in those
|
|
519
|
+
# cases, the decospecs will already have been handled by either a run/resume
|
|
520
|
+
# or a scheduler setting them up in their own way.
|
|
521
|
+
if ctx.saved_args[0] not in ("step", "init"):
|
|
522
|
+
all_decospecs += DEFAULT_DECOSPECS.split()
|
|
515
523
|
if all_decospecs:
|
|
516
524
|
decorators._attach_decorators(ctx.obj.flow, all_decospecs)
|
|
517
525
|
decorators._init(ctx.obj.flow)
|
|
@@ -71,7 +71,7 @@ def write_file(file_path, content):
|
|
|
71
71
|
f.write(str(content))
|
|
72
72
|
|
|
73
73
|
|
|
74
|
-
def
|
|
74
|
+
def config_callback(ctx, param, value):
|
|
75
75
|
# Callback to:
|
|
76
76
|
# - read the Click auto_envvar variable from both the
|
|
77
77
|
# environment AND the configuration
|
|
@@ -127,7 +127,7 @@ def common_run_options(func):
|
|
|
127
127
|
help="Add a decorator to all steps. You can specify this "
|
|
128
128
|
"option multiple times to attach multiple decorators "
|
|
129
129
|
"in steps.",
|
|
130
|
-
callback=
|
|
130
|
+
callback=config_callback,
|
|
131
131
|
)
|
|
132
132
|
@click.option(
|
|
133
133
|
"--run-id-file",
|
|
@@ -94,7 +94,7 @@ def start(ctx):
|
|
|
94
94
|
echo("(%s)\n" % version, fg="magenta", bold=False)
|
|
95
95
|
|
|
96
96
|
if ctx.invoked_subcommand is None:
|
|
97
|
-
echo("More
|
|
97
|
+
echo("More AI, less engineering\n", fg="magenta")
|
|
98
98
|
|
|
99
99
|
lnk_sz = max(len(lnk) for lnk in CONTACT_INFO.values()) + 1
|
|
100
100
|
for what, lnk in CONTACT_INFO.items():
|
|
@@ -459,7 +459,7 @@ class UploaderV2:
|
|
|
459
459
|
@classmethod
|
|
460
460
|
def encode_url(cls, url_type, url, **kwargs):
|
|
461
461
|
return_value = {
|
|
462
|
-
"note": "Internal representation of IncludeFile
|
|
462
|
+
"note": "Internal representation of IncludeFile",
|
|
463
463
|
"type": cls.file_type,
|
|
464
464
|
"sub-type": url_type,
|
|
465
465
|
"url": url,
|
|
@@ -472,7 +472,7 @@ class UploaderV2:
|
|
|
472
472
|
r = UploaderV1.store(flow_name, path, is_text, encoding, handler, echo)
|
|
473
473
|
|
|
474
474
|
# In V2, we store size for faster access
|
|
475
|
-
r["note"] = "Internal representation of IncludeFile
|
|
475
|
+
r["note"] = "Internal representation of IncludeFile"
|
|
476
476
|
r["type"] = cls.file_type
|
|
477
477
|
r["sub-type"] = "uploaded"
|
|
478
478
|
r["size"] = os.stat(path).st_size
|
|
@@ -630,6 +630,20 @@ class MetadataProvider(object):
|
|
|
630
630
|
sys_info["r_version"] = env["r_version_code"]
|
|
631
631
|
return sys_info
|
|
632
632
|
|
|
633
|
+
def _get_git_info_as_dict(self):
|
|
634
|
+
git_info = {}
|
|
635
|
+
env = self._environment.get_environment_info()
|
|
636
|
+
for key in [
|
|
637
|
+
"repo_url",
|
|
638
|
+
"branch_name",
|
|
639
|
+
"commit_sha",
|
|
640
|
+
"has_uncommitted_changes",
|
|
641
|
+
]:
|
|
642
|
+
if key in env and env[key]:
|
|
643
|
+
git_info[key] = env[key]
|
|
644
|
+
|
|
645
|
+
return git_info
|
|
646
|
+
|
|
633
647
|
def _get_system_tags(self):
|
|
634
648
|
"""Convert system info dictionary into a list of system tags"""
|
|
635
649
|
return [
|
|
@@ -670,6 +684,27 @@ class MetadataProvider(object):
|
|
|
670
684
|
tags=["attempt_id:{0}".format(attempt)],
|
|
671
685
|
)
|
|
672
686
|
)
|
|
687
|
+
# Add script name as metadata
|
|
688
|
+
script_name = self._environment.get_environment_info()["script"]
|
|
689
|
+
metadata.append(
|
|
690
|
+
MetaDatum(
|
|
691
|
+
field="script-name",
|
|
692
|
+
value=script_name,
|
|
693
|
+
type="script-name",
|
|
694
|
+
tags=["attempt_id:{0}".format(attempt)],
|
|
695
|
+
)
|
|
696
|
+
)
|
|
697
|
+
# And add git metadata
|
|
698
|
+
git_info = self._get_git_info_as_dict()
|
|
699
|
+
if git_info:
|
|
700
|
+
metadata.append(
|
|
701
|
+
MetaDatum(
|
|
702
|
+
field="git-info",
|
|
703
|
+
value=json.dumps(git_info),
|
|
704
|
+
type="git-info",
|
|
705
|
+
tags=["attempt_id:{0}".format(attempt)],
|
|
706
|
+
)
|
|
707
|
+
)
|
|
673
708
|
if metadata:
|
|
674
709
|
self.register_metadata(run_id, step_name, task_id, metadata)
|
|
675
710
|
|
|
@@ -109,6 +109,12 @@ S3_WORKER_COUNT = from_conf("S3_WORKER_COUNT", 64)
|
|
|
109
109
|
# top-level retries)
|
|
110
110
|
S3_TRANSIENT_RETRY_COUNT = from_conf("S3_TRANSIENT_RETRY_COUNT", 20)
|
|
111
111
|
|
|
112
|
+
# S3 retry configuration used in the aws client
|
|
113
|
+
# Use the adaptive retry strategy by default
|
|
114
|
+
S3_CLIENT_RETRY_CONFIG = from_conf(
|
|
115
|
+
"S3_CLIENT_RETRY_CONFIG", {"max_attempts": 10, "mode": "adaptive"}
|
|
116
|
+
)
|
|
117
|
+
|
|
112
118
|
# Threshold to start printing warnings for an AWS retry
|
|
113
119
|
RETRY_WARNING_THRESHOLD = 3
|
|
114
120
|
|
|
@@ -4,6 +4,7 @@ import sys
|
|
|
4
4
|
|
|
5
5
|
from .util import get_username
|
|
6
6
|
from . import metaflow_version
|
|
7
|
+
from . import metaflow_git
|
|
7
8
|
from metaflow.exception import MetaflowException
|
|
8
9
|
from metaflow.extension_support import dump_module_info
|
|
9
10
|
from metaflow.mflog import BASH_MFLOG, BASH_FLUSH_LOGS
|
|
@@ -197,6 +198,10 @@ class MetaflowEnvironment(object):
|
|
|
197
198
|
"python_version_code": "%d.%d.%d" % sys.version_info[:3],
|
|
198
199
|
"metaflow_version": metaflow_version.get_version(),
|
|
199
200
|
"script": os.path.basename(os.path.abspath(sys.argv[0])),
|
|
201
|
+
# Add git info
|
|
202
|
+
**metaflow_git.get_repository_info(
|
|
203
|
+
path=os.path.dirname(os.path.abspath(sys.argv[0]))
|
|
204
|
+
),
|
|
200
205
|
}
|
|
201
206
|
if R.use_r():
|
|
202
207
|
env["metaflow_r_version"] = R.metaflow_r_version()
|
|
@@ -206,7 +211,7 @@ class MetaflowEnvironment(object):
|
|
|
206
211
|
# Information about extension modules (to load them in the proper order)
|
|
207
212
|
ext_key, ext_val = dump_module_info()
|
|
208
213
|
env[ext_key] = ext_val
|
|
209
|
-
return env
|
|
214
|
+
return {k: v for k, v in env.items() if v is not None and v != ""}
|
|
210
215
|
|
|
211
216
|
def executable(self, step_name, default=None):
|
|
212
217
|
if default is not None:
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Get git repository information for the package
|
|
3
|
+
|
|
4
|
+
Functions to retrieve git repository details like URL, branch name,
|
|
5
|
+
and commit SHA for Metaflow code provenance tracking.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
import subprocess
|
|
10
|
+
from typing import Dict, List, Optional, Tuple, Union
|
|
11
|
+
|
|
12
|
+
# Cache for git information to avoid repeated subprocess calls
|
|
13
|
+
_git_info_cache = None
|
|
14
|
+
|
|
15
|
+
__all__ = ("get_repository_info",)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _call_git(
|
|
19
|
+
args: List[str], path=Union[str, os.PathLike]
|
|
20
|
+
) -> Tuple[Optional[str], Optional[int], bool]:
|
|
21
|
+
"""
|
|
22
|
+
Call git with provided args.
|
|
23
|
+
|
|
24
|
+
Returns
|
|
25
|
+
-------
|
|
26
|
+
tuple : Tuple containing
|
|
27
|
+
(stdout, exitcode, failure) of the call
|
|
28
|
+
"""
|
|
29
|
+
try:
|
|
30
|
+
result = subprocess.run(
|
|
31
|
+
["git", *args],
|
|
32
|
+
cwd=path,
|
|
33
|
+
capture_output=True,
|
|
34
|
+
text=True,
|
|
35
|
+
check=False,
|
|
36
|
+
)
|
|
37
|
+
return result.stdout.strip(), result.returncode, False
|
|
38
|
+
except (OSError, subprocess.SubprocessError):
|
|
39
|
+
# Covers subprocess timeouts and other errors which would not lead to an exit code
|
|
40
|
+
return None, None, True
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _get_repo_url(path: Union[str, os.PathLike]) -> Optional[str]:
|
|
44
|
+
"""Get the repository URL from git config"""
|
|
45
|
+
stdout, returncode, _failed = _call_git(
|
|
46
|
+
["config", "--get", "remote.origin.url"], path
|
|
47
|
+
)
|
|
48
|
+
if returncode == 0:
|
|
49
|
+
url = stdout
|
|
50
|
+
# Convert SSH URLs to HTTPS for clickable links
|
|
51
|
+
if url.startswith("git@"):
|
|
52
|
+
parts = url.split(":", 1)
|
|
53
|
+
if len(parts) == 2:
|
|
54
|
+
domain = parts[0].replace("git@", "")
|
|
55
|
+
repo_path = parts[1]
|
|
56
|
+
url = f"https://{domain}/{repo_path}"
|
|
57
|
+
return url
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _get_branch_name(path: Union[str, os.PathLike]) -> Optional[str]:
|
|
62
|
+
"""Get the current git branch name"""
|
|
63
|
+
stdout, returncode, _failed = _call_git(["rev-parse", "--abbrev-ref", "HEAD"], path)
|
|
64
|
+
return stdout if returncode == 0 else None
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _get_commit_sha(path: Union[str, os.PathLike]) -> Optional[str]:
|
|
68
|
+
"""Get the current git commit SHA"""
|
|
69
|
+
stdout, returncode, _failed = _call_git(["rev-parse", "HEAD"], path)
|
|
70
|
+
return stdout if returncode == 0 else None
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _is_in_git_repo(path: Union[str, os.PathLike]) -> bool:
|
|
74
|
+
"""Check if we're currently in a git repository"""
|
|
75
|
+
stdout, returncode, _failed = _call_git(
|
|
76
|
+
["rev-parse", "--is-inside-work-tree"], path
|
|
77
|
+
)
|
|
78
|
+
return returncode == 0 and stdout == "true"
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _has_uncommitted_changes(path: Union[str, os.PathLike]) -> Optional[bool]:
|
|
82
|
+
"""Check if the git repository has uncommitted changes"""
|
|
83
|
+
_stdout, returncode, failed = _call_git(
|
|
84
|
+
["diff-index", "--quiet", "HEAD", "--"], path
|
|
85
|
+
)
|
|
86
|
+
if failed:
|
|
87
|
+
return None
|
|
88
|
+
return returncode != 0
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def get_repository_info(path: Union[str, os.PathLike]) -> Dict[str, Union[str, bool]]:
|
|
92
|
+
"""Get git repository information for a path
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
dict: Dictionary containing:
|
|
96
|
+
repo_url: Repository URL (converted to HTTPS if from SSH)
|
|
97
|
+
branch_name: Current branch name
|
|
98
|
+
commit_sha: Current commit SHA
|
|
99
|
+
has_uncommitted_changes: Boolean indicating if there are uncommitted changes
|
|
100
|
+
"""
|
|
101
|
+
global _git_info_cache
|
|
102
|
+
|
|
103
|
+
if _git_info_cache is not None:
|
|
104
|
+
return _git_info_cache
|
|
105
|
+
|
|
106
|
+
_git_info_cache = {}
|
|
107
|
+
if _is_in_git_repo(path):
|
|
108
|
+
_git_info_cache = {
|
|
109
|
+
"repo_url": _get_repo_url(path),
|
|
110
|
+
"branch_name": _get_branch_name(path),
|
|
111
|
+
"commit_sha": _get_commit_sha(path),
|
|
112
|
+
"has_uncommitted_changes": _has_uncommitted_changes(path),
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return _git_info_cache
|
|
@@ -27,11 +27,11 @@ if name == "nt":
|
|
|
27
27
|
"""find the path to the git executable on Windows"""
|
|
28
28
|
# first see if git is in the path
|
|
29
29
|
try:
|
|
30
|
-
check_output(["where", "/Q", "git"])
|
|
30
|
+
subprocess.check_output(["where", "/Q", "git"])
|
|
31
31
|
# if this command succeeded, git is in the path
|
|
32
32
|
return "git"
|
|
33
33
|
# catch the exception thrown if git was not found
|
|
34
|
-
except CalledProcessError:
|
|
34
|
+
except subprocess.CalledProcessError:
|
|
35
35
|
pass
|
|
36
36
|
# There are several locations where git.exe may be hiding
|
|
37
37
|
possible_locations = []
|
|
@@ -1992,6 +1992,15 @@ class ArgoWorkflows(object):
|
|
|
1992
1992
|
resources["disk"],
|
|
1993
1993
|
)
|
|
1994
1994
|
|
|
1995
|
+
security_context = resources.get("security_context", None)
|
|
1996
|
+
_security_context = {}
|
|
1997
|
+
if security_context is not None and len(security_context) > 0:
|
|
1998
|
+
_security_context = {
|
|
1999
|
+
"security_context": kubernetes_sdk.V1SecurityContext(
|
|
2000
|
+
**security_context
|
|
2001
|
+
)
|
|
2002
|
+
}
|
|
2003
|
+
|
|
1995
2004
|
# Create a ContainerTemplate for this node. Ideally, we would have
|
|
1996
2005
|
# liked to inline this ContainerTemplate and avoid scanning the workflow
|
|
1997
2006
|
# twice, but due to issues with variable substitution, we will have to
|
|
@@ -2048,6 +2057,7 @@ class ArgoWorkflows(object):
|
|
|
2048
2057
|
shared_memory=shared_memory,
|
|
2049
2058
|
port=port,
|
|
2050
2059
|
qos=resources["qos"],
|
|
2060
|
+
security_context=security_context,
|
|
2051
2061
|
)
|
|
2052
2062
|
|
|
2053
2063
|
for k, v in env.items():
|
|
@@ -2333,6 +2343,7 @@ class ArgoWorkflows(object):
|
|
|
2333
2343
|
is not None
|
|
2334
2344
|
else []
|
|
2335
2345
|
),
|
|
2346
|
+
**_security_context,
|
|
2336
2347
|
).to_dict()
|
|
2337
2348
|
)
|
|
2338
2349
|
)
|
|
@@ -2762,7 +2773,7 @@ class ArgoWorkflows(object):
|
|
|
2762
2773
|
"type": "section",
|
|
2763
2774
|
"text": {
|
|
2764
2775
|
"type": "mrkdwn",
|
|
2765
|
-
"text": "
|
|
2776
|
+
"text": "Environment details"
|
|
2766
2777
|
},
|
|
2767
2778
|
"fields": [
|
|
2768
2779
|
{
|
|
@@ -2780,7 +2791,7 @@ class ArgoWorkflows(object):
|
|
|
2780
2791
|
"type": "section",
|
|
2781
2792
|
"text": {
|
|
2782
2793
|
"type": "mrkdwn",
|
|
2783
|
-
"text": "
|
|
2794
|
+
"text": "Environment details"
|
|
2784
2795
|
}
|
|
2785
2796
|
}
|
|
2786
2797
|
|
|
@@ -40,6 +40,7 @@ unsupported_decorators = {
|
|
|
40
40
|
"snowpark": "Step *%s* is marked for execution on Snowpark with Argo Workflows which isn't currently supported.",
|
|
41
41
|
"slurm": "Step *%s* is marked for execution on Slurm with Argo Workflows which isn't currently supported.",
|
|
42
42
|
"nvidia": "Step *%s* is marked for execution on Nvidia with Argo Workflows which isn't currently supported.",
|
|
43
|
+
"nvct": "Step *%s* is marked for execution on Nvct with Argo Workflows which isn't currently supported.",
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
|
|
@@ -14,6 +14,7 @@ class Boto3ClientProvider(object):
|
|
|
14
14
|
AWS_SANDBOX_ENABLED,
|
|
15
15
|
AWS_SANDBOX_STS_ENDPOINT_URL,
|
|
16
16
|
AWS_SANDBOX_API_KEY,
|
|
17
|
+
S3_CLIENT_RETRY_CONFIG,
|
|
17
18
|
)
|
|
18
19
|
|
|
19
20
|
if session_vars is None:
|
|
@@ -37,10 +38,10 @@ class Boto3ClientProvider(object):
|
|
|
37
38
|
if module == "s3" and (
|
|
38
39
|
"config" not in client_params or client_params["config"].retries is None
|
|
39
40
|
):
|
|
40
|
-
#
|
|
41
|
-
# the user has already set something
|
|
41
|
+
# do not set anything if the user has already set something
|
|
42
42
|
config = client_params.get("config", Config())
|
|
43
|
-
config.retries =
|
|
43
|
+
config.retries = S3_CLIENT_RETRY_CONFIG
|
|
44
|
+
client_params["config"] = config
|
|
44
45
|
|
|
45
46
|
if AWS_SANDBOX_ENABLED:
|
|
46
47
|
# role is ignored in the sandbox
|
|
@@ -119,7 +119,9 @@ class _GSRootClient(object):
|
|
|
119
119
|
blob.metadata = {"metaflow-user-attributes": json.dumps(metadata)}
|
|
120
120
|
from google.cloud.storage.retry import DEFAULT_RETRY
|
|
121
121
|
|
|
122
|
-
blob.upload_from_filename(
|
|
122
|
+
blob.upload_from_filename(
|
|
123
|
+
tmpfile, retry=DEFAULT_RETRY, timeout=(14400, 60)
|
|
124
|
+
) # generous timeout for massive uploads. Use the same values as for Azure (connection_timeout, read_timeout)
|
|
123
125
|
except Exception as e:
|
|
124
126
|
process_gs_exception(e)
|
|
125
127
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import errno
|
|
1
2
|
import json
|
|
2
3
|
import os
|
|
3
4
|
import re
|
|
@@ -18,6 +19,7 @@ from metaflow.metaflow_config import (
|
|
|
18
19
|
S3_RETRY_COUNT,
|
|
19
20
|
S3_TRANSIENT_RETRY_COUNT,
|
|
20
21
|
S3_SERVER_SIDE_ENCRYPTION,
|
|
22
|
+
S3_WORKER_COUNT,
|
|
21
23
|
TEMPDIR,
|
|
22
24
|
)
|
|
23
25
|
from metaflow.util import (
|
|
@@ -136,6 +138,10 @@ class MetaflowS3InvalidRange(MetaflowException):
|
|
|
136
138
|
headline = "S3 invalid range"
|
|
137
139
|
|
|
138
140
|
|
|
141
|
+
class MetaflowS3InsufficientDiskSpace(MetaflowException):
|
|
142
|
+
headline = "Insufficient disk space"
|
|
143
|
+
|
|
144
|
+
|
|
139
145
|
class S3Object(object):
|
|
140
146
|
"""
|
|
141
147
|
This object represents a path or an object in S3,
|
|
@@ -1376,8 +1382,10 @@ class S3(object):
|
|
|
1376
1382
|
elif error_code == "NoSuchBucket":
|
|
1377
1383
|
raise MetaflowS3URLException("Specified S3 bucket doesn't exist.")
|
|
1378
1384
|
error = str(err)
|
|
1385
|
+
except OSError as e:
|
|
1386
|
+
if e.errno == errno.ENOSPC:
|
|
1387
|
+
raise MetaflowS3InsufficientDiskSpace(str(e))
|
|
1379
1388
|
except Exception as ex:
|
|
1380
|
-
# TODO specific error message for out of disk space
|
|
1381
1389
|
error = str(ex)
|
|
1382
1390
|
if tmp:
|
|
1383
1391
|
os.unlink(tmp.name)
|
|
@@ -1390,9 +1398,31 @@ class S3(object):
|
|
|
1390
1398
|
)
|
|
1391
1399
|
|
|
1392
1400
|
# add some jitter to make sure retries are not synchronized
|
|
1393
|
-
def _jitter_sleep(
|
|
1394
|
-
|
|
1395
|
-
|
|
1401
|
+
def _jitter_sleep(
|
|
1402
|
+
self, trynum: int, base: int = 2, cap: int = 360, jitter: float = 0.1
|
|
1403
|
+
) -> None:
|
|
1404
|
+
"""
|
|
1405
|
+
Sleep for an exponentially increasing interval with added jitter.
|
|
1406
|
+
|
|
1407
|
+
Parameters
|
|
1408
|
+
----------
|
|
1409
|
+
trynum: The current retry attempt number.
|
|
1410
|
+
base: The base multiplier for the exponential backoff.
|
|
1411
|
+
cap: The maximum interval to sleep.
|
|
1412
|
+
jitter: The maximum jitter percentage to add to the interval.
|
|
1413
|
+
"""
|
|
1414
|
+
# Calculate the exponential backoff interval
|
|
1415
|
+
interval = min(cap, base**trynum)
|
|
1416
|
+
|
|
1417
|
+
# Add random jitter
|
|
1418
|
+
jitter_value = interval * jitter * random.uniform(-1, 1)
|
|
1419
|
+
interval_with_jitter = interval + jitter_value
|
|
1420
|
+
|
|
1421
|
+
# Ensure the interval is not negative
|
|
1422
|
+
interval_with_jitter = max(0, interval_with_jitter)
|
|
1423
|
+
|
|
1424
|
+
# Sleep for the calculated interval
|
|
1425
|
+
time.sleep(interval_with_jitter)
|
|
1396
1426
|
|
|
1397
1427
|
# NOTE: re: _read_many_files and _put_many_files
|
|
1398
1428
|
# All file IO is through binary files - we write bytes, we read
|
|
@@ -1480,20 +1510,17 @@ class S3(object):
|
|
|
1480
1510
|
# - a known transient failure (SlowDown for example) in which case we will
|
|
1481
1511
|
# retry *only* the inputs that have this transient failure.
|
|
1482
1512
|
# - an unknown failure (something went wrong but we cannot say if it was
|
|
1483
|
-
# a known permanent failure or something else). In this case, we
|
|
1484
|
-
#
|
|
1513
|
+
# a known permanent failure or something else). In this case, we assume
|
|
1514
|
+
# it's a transient failure and retry only those inputs (same as above).
|
|
1485
1515
|
#
|
|
1486
|
-
#
|
|
1487
|
-
#
|
|
1488
|
-
#
|
|
1489
|
-
#
|
|
1490
|
-
#
|
|
1491
|
-
#
|
|
1492
|
-
#
|
|
1493
|
-
#
|
|
1494
|
-
# transient_retry_count * retry_count tries).
|
|
1495
|
-
# Finally, if on transient failures, we make NO progress (ie: no input is
|
|
1496
|
-
# successfully processed), that counts as an "unknown" failure.
|
|
1516
|
+
# NOTES(npow): 2025-05-13
|
|
1517
|
+
# Previously, this code would also retry the fatal failures, including no_progress
|
|
1518
|
+
# and unknown failures, from the beginning. This is not ideal because:
|
|
1519
|
+
# 1. Fatal errors are not supposed to be retried.
|
|
1520
|
+
# 2. Retrying from the beginning does not improve the situation, and is
|
|
1521
|
+
# wasteful since we have already uploaded some files.
|
|
1522
|
+
# 3. The number of transient errors is far more than fatal errors, so we
|
|
1523
|
+
# can be optimistic and assume the unknown errors are transient.
|
|
1497
1524
|
cmdline = [sys.executable, os.path.abspath(s3op.__file__), mode]
|
|
1498
1525
|
recursive_get = False
|
|
1499
1526
|
for key, value in options.items():
|
|
@@ -1528,7 +1555,6 @@ class S3(object):
|
|
|
1528
1555
|
# Otherwise, we cap the failure rate at 90%
|
|
1529
1556
|
return min(90, self._s3_inject_failures)
|
|
1530
1557
|
|
|
1531
|
-
retry_count = 0 # Number of retries (excluding transient failures)
|
|
1532
1558
|
transient_retry_count = 0 # Number of transient retries (per top-level retry)
|
|
1533
1559
|
inject_failures = _inject_failure_rate()
|
|
1534
1560
|
out_lines = [] # List to contain the lines returned by _s3op_with_retries
|
|
@@ -1595,7 +1621,12 @@ class S3(object):
|
|
|
1595
1621
|
# things, this will shrink more and more until we are doing a
|
|
1596
1622
|
# single operation at a time. If things start going better, it
|
|
1597
1623
|
# will increase by 20% every round.
|
|
1598
|
-
|
|
1624
|
+
#
|
|
1625
|
+
# If we made no progress (last_ok_count == 0) we retry at most
|
|
1626
|
+
# 2*S3_WORKER_COUNT from whatever is left in `pending_retries`
|
|
1627
|
+
max_count = min(
|
|
1628
|
+
int(last_ok_count * 1.2), len(pending_retries)
|
|
1629
|
+
) or min(2 * S3_WORKER_COUNT, len(pending_retries))
|
|
1599
1630
|
tmp_input.writelines(pending_retries[:max_count])
|
|
1600
1631
|
tmp_input.flush()
|
|
1601
1632
|
debug.s3client_exec(
|
|
@@ -1712,38 +1743,16 @@ class S3(object):
|
|
|
1712
1743
|
_update_out_lines(out_lines, ok_lines, resize=loop_count == 0)
|
|
1713
1744
|
return 0, 0, inject_failures, err_out
|
|
1714
1745
|
|
|
1715
|
-
while
|
|
1746
|
+
while transient_retry_count <= S3_TRANSIENT_RETRY_COUNT:
|
|
1716
1747
|
(
|
|
1717
1748
|
last_ok_count,
|
|
1718
1749
|
last_retry_count,
|
|
1719
1750
|
inject_failures,
|
|
1720
1751
|
err_out,
|
|
1721
1752
|
) = try_s3_op(last_ok_count, pending_retries, out_lines, inject_failures)
|
|
1722
|
-
if err_out
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
last_ok_count == 0
|
|
1726
|
-
or transient_retry_count > S3_TRANSIENT_RETRY_COUNT
|
|
1727
|
-
)
|
|
1728
|
-
):
|
|
1729
|
-
# We had a fatal failure (err_out is not None)
|
|
1730
|
-
# or we made no progress (last_ok_count is 0)
|
|
1731
|
-
# or we are out of transient retries
|
|
1732
|
-
# so we will restart from scratch (being very conservative)
|
|
1733
|
-
retry_count += 1
|
|
1734
|
-
err_msg = err_out
|
|
1735
|
-
if err_msg is None and last_ok_count == 0:
|
|
1736
|
-
err_msg = "No progress"
|
|
1737
|
-
if err_msg is None:
|
|
1738
|
-
err_msg = "Too many transient errors"
|
|
1739
|
-
print(
|
|
1740
|
-
"S3 non-transient error (attempt #%d): %s" % (retry_count, err_msg)
|
|
1741
|
-
)
|
|
1742
|
-
_reset()
|
|
1743
|
-
if retry_count <= S3_RETRY_COUNT:
|
|
1744
|
-
self._jitter_sleep(retry_count)
|
|
1745
|
-
continue
|
|
1746
|
-
elif last_retry_count != 0:
|
|
1753
|
+
if err_out:
|
|
1754
|
+
break
|
|
1755
|
+
if last_retry_count != 0:
|
|
1747
1756
|
# During our last try, we did not manage to process everything we wanted
|
|
1748
1757
|
# due to a transient failure so we try again.
|
|
1749
1758
|
transient_retry_count += 1
|