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

|
|
26
|
+
|
|
27
|
+
# Metaflow
|
|
28
|
+
|
|
29
|
+
[Metaflow](https://metaflow.org) is a human-centric framework designed to help scientists and engineers **build and manage real-life AI and ML systems**. Serving teams of all sizes and scale, Metaflow streamlines the entire development lifecycle—from rapid prototyping in notebooks to reliable, maintainable production deployments—enabling teams to iterate quickly and deliver robust systems efficiently.
|
|
30
|
+
|
|
31
|
+
Originally developed at [Netflix](https://netflixtechblog.com/open-sourcing-metaflow-a-human-centric-framework-for-data-science-fa72e04a5d9) and now supported by [Outerbounds](https://outerbounds.com), Metaflow is designed to boost the productivity for research and engineering teams working on [a wide variety of projects](https://netflixtechblog.com/supporting-diverse-ml-systems-at-netflix-2d2e6b6d205d), from classical statistics to state-of-the-art deep learning and foundation models. By unifying code, data, and compute at every stage, Metaflow ensures seamless, end-to-end management of real-world AI and ML systems.
|
|
32
|
+
|
|
33
|
+
Today, Metaflow powers thousands of AI and ML experiences across a diverse array of companies, large and small, including Amazon, Doordash, Dyson, Goldman Sachs, Ramp, and [many others](ADOPTERS.md). At Netflix alone, Metaflow supports over 3000 AI and ML projects, executes hundreds of millions of data-intensive high-performance compute jobs processing petabytes of data and manages tens of petabytes of models and artifacts for hundreds of users across its AI, ML, data science, and engineering teams.
|
|
34
|
+
|
|
35
|
+
## From prototype to production (and back)
|
|
36
|
+
|
|
37
|
+
Metaflow provides a simple and friendly pythonic [API](https://docs.metaflow.org) that covers foundational needs of AI and ML systems:
|
|
38
|
+
<img src="./docs/prototype-to-prod.png" width="800px">
|
|
39
|
+
|
|
40
|
+
1. [Rapid local prototyping](https://docs.metaflow.org/metaflow/basics), [support for notebooks](https://docs.metaflow.org/metaflow/managing-flows/notebook-runs), and built-in support for [experiment tracking, versioning](https://docs.metaflow.org/metaflow/client) and [visualization](https://docs.metaflow.org/metaflow/visualizing-results).
|
|
41
|
+
2. [Effortlessly scale horizontally and vertically in your cloud](https://docs.metaflow.org/scaling/remote-tasks/introduction), utilizing both CPUs and GPUs, with [fast data access](https://docs.metaflow.org/scaling/data) for running [massive embarrassingly parallel](https://docs.metaflow.org/metaflow/basics#foreach) as well as [gang-scheduled](https://docs.metaflow.org/scaling/remote-tasks/distributed-computing) compute workloads [reliably](https://docs.metaflow.org/scaling/failures) and [efficiently](https://docs.metaflow.org/scaling/checkpoint/introduction).
|
|
42
|
+
3. [Easily manage dependencies](https://docs.metaflow.org/scaling/dependencies) and [deploy with one-click](https://docs.metaflow.org/production/introduction) to highly available production orchestrators with built in support for [reactive orchestration](https://docs.metaflow.org/production/event-triggering).
|
|
43
|
+
|
|
44
|
+
For full documentation, check out our [API Reference](https://docs.metaflow.org/api) or see our [Release Notes](https://github.com/Netflix/metaflow/releases) for the latest features and improvements.
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
## Getting started
|
|
48
|
+
|
|
49
|
+
Getting up and running is easy. If you don't know where to start, [Metaflow sandbox](https://outerbounds.com/sandbox) will have you running and exploring in seconds.
|
|
50
|
+
|
|
51
|
+
### Installing Metaflow
|
|
52
|
+
|
|
53
|
+
To install Metaflow in your Python environment from [PyPI](https://pypi.org/project/metaflow/):
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
pip install metaflow
|
|
57
|
+
```
|
|
58
|
+
Alternatively, using [conda-forge](https://anaconda.org/conda-forge/metaflow):
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
conda install -c conda-forge metaflow
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Once installed, a great way to get started is by following our [tutorial](https://docs.metaflow.org/getting-started/tutorials). It walks you through creating and running your first Metaflow flow step by step.
|
|
65
|
+
|
|
66
|
+
For more details on Metaflow’s features and best practices, check out:
|
|
67
|
+
- [How Metaflow works](https://docs.metaflow.org/metaflow/basics)
|
|
68
|
+
- [Additional resources](https://docs.metaflow.org/introduction/metaflow-resources)
|
|
69
|
+
|
|
70
|
+
If you need help, don’t hesitate to reach out on our [Slack community](http://slack.outerbounds.co/)!
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
### Deploying infrastructure for Metaflow in your cloud
|
|
74
|
+
<img src="./docs/multicloud.png" width="800px">
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
While you can get started with Metaflow easily on your laptop, the main benefits of Metaflow lie in its ability to [scale out to external compute clusters](https://docs.metaflow.org/scaling/remote-tasks/introduction)
|
|
78
|
+
and to [deploy to production-grade workflow orchestrators](https://docs.metaflow.org/production/introduction). To benefit from these features, follow this [guide](https://outerbounds.com/engineering/welcome/) to
|
|
79
|
+
configure Metaflow and the infrastructure behind it appropriately.
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
## Get in touch
|
|
83
|
+
We'd love to hear from you. Join our community [Slack workspace](http://slack.outerbounds.co/)!
|
|
84
|
+
|
|
85
|
+
## Contributing
|
|
86
|
+
We welcome contributions to Metaflow. Please see our [contribution guide](https://docs.metaflow.org/introduction/contributing-to-metaflow) for more details.
|
|
87
|
+
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+

|
|
2
|
+
|
|
3
|
+
# Metaflow
|
|
4
|
+
|
|
5
|
+
[Metaflow](https://metaflow.org) is a human-centric framework designed to help scientists and engineers **build and manage real-life AI and ML systems**. Serving teams of all sizes and scale, Metaflow streamlines the entire development lifecycle—from rapid prototyping in notebooks to reliable, maintainable production deployments—enabling teams to iterate quickly and deliver robust systems efficiently.
|
|
6
|
+
|
|
7
|
+
Originally developed at [Netflix](https://netflixtechblog.com/open-sourcing-metaflow-a-human-centric-framework-for-data-science-fa72e04a5d9) and now supported by [Outerbounds](https://outerbounds.com), Metaflow is designed to boost the productivity for research and engineering teams working on [a wide variety of projects](https://netflixtechblog.com/supporting-diverse-ml-systems-at-netflix-2d2e6b6d205d), from classical statistics to state-of-the-art deep learning and foundation models. By unifying code, data, and compute at every stage, Metaflow ensures seamless, end-to-end management of real-world AI and ML systems.
|
|
8
|
+
|
|
9
|
+
Today, Metaflow powers thousands of AI and ML experiences across a diverse array of companies, large and small, including Amazon, Doordash, Dyson, Goldman Sachs, Ramp, and [many others](ADOPTERS.md). At Netflix alone, Metaflow supports over 3000 AI and ML projects, executes hundreds of millions of data-intensive high-performance compute jobs processing petabytes of data and manages tens of petabytes of models and artifacts for hundreds of users across its AI, ML, data science, and engineering teams.
|
|
10
|
+
|
|
11
|
+
## From prototype to production (and back)
|
|
12
|
+
|
|
13
|
+
Metaflow provides a simple and friendly pythonic [API](https://docs.metaflow.org) that covers foundational needs of AI and ML systems:
|
|
14
|
+
<img src="./docs/prototype-to-prod.png" width="800px">
|
|
15
|
+
|
|
16
|
+
1. [Rapid local prototyping](https://docs.metaflow.org/metaflow/basics), [support for notebooks](https://docs.metaflow.org/metaflow/managing-flows/notebook-runs), and built-in support for [experiment tracking, versioning](https://docs.metaflow.org/metaflow/client) and [visualization](https://docs.metaflow.org/metaflow/visualizing-results).
|
|
17
|
+
2. [Effortlessly scale horizontally and vertically in your cloud](https://docs.metaflow.org/scaling/remote-tasks/introduction), utilizing both CPUs and GPUs, with [fast data access](https://docs.metaflow.org/scaling/data) for running [massive embarrassingly parallel](https://docs.metaflow.org/metaflow/basics#foreach) as well as [gang-scheduled](https://docs.metaflow.org/scaling/remote-tasks/distributed-computing) compute workloads [reliably](https://docs.metaflow.org/scaling/failures) and [efficiently](https://docs.metaflow.org/scaling/checkpoint/introduction).
|
|
18
|
+
3. [Easily manage dependencies](https://docs.metaflow.org/scaling/dependencies) and [deploy with one-click](https://docs.metaflow.org/production/introduction) to highly available production orchestrators with built in support for [reactive orchestration](https://docs.metaflow.org/production/event-triggering).
|
|
19
|
+
|
|
20
|
+
For full documentation, check out our [API Reference](https://docs.metaflow.org/api) or see our [Release Notes](https://github.com/Netflix/metaflow/releases) for the latest features and improvements.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## Getting started
|
|
24
|
+
|
|
25
|
+
Getting up and running is easy. If you don't know where to start, [Metaflow sandbox](https://outerbounds.com/sandbox) will have you running and exploring in seconds.
|
|
26
|
+
|
|
27
|
+
### Installing Metaflow
|
|
28
|
+
|
|
29
|
+
To install Metaflow in your Python environment from [PyPI](https://pypi.org/project/metaflow/):
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
pip install metaflow
|
|
33
|
+
```
|
|
34
|
+
Alternatively, using [conda-forge](https://anaconda.org/conda-forge/metaflow):
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
conda install -c conda-forge metaflow
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Once installed, a great way to get started is by following our [tutorial](https://docs.metaflow.org/getting-started/tutorials). It walks you through creating and running your first Metaflow flow step by step.
|
|
41
|
+
|
|
42
|
+
For more details on Metaflow’s features and best practices, check out:
|
|
43
|
+
- [How Metaflow works](https://docs.metaflow.org/metaflow/basics)
|
|
44
|
+
- [Additional resources](https://docs.metaflow.org/introduction/metaflow-resources)
|
|
45
|
+
|
|
46
|
+
If you need help, don’t hesitate to reach out on our [Slack community](http://slack.outerbounds.co/)!
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
### Deploying infrastructure for Metaflow in your cloud
|
|
50
|
+
<img src="./docs/multicloud.png" width="800px">
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
While you can get started with Metaflow easily on your laptop, the main benefits of Metaflow lie in its ability to [scale out to external compute clusters](https://docs.metaflow.org/scaling/remote-tasks/introduction)
|
|
54
|
+
and to [deploy to production-grade workflow orchestrators](https://docs.metaflow.org/production/introduction). To benefit from these features, follow this [guide](https://outerbounds.com/engineering/welcome/) to
|
|
55
|
+
configure Metaflow and the infrastructure behind it appropriately.
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
## Get in touch
|
|
59
|
+
We'd love to hear from you. Join our community [Slack workspace](http://slack.outerbounds.co/)!
|
|
60
|
+
|
|
61
|
+
## Contributing
|
|
62
|
+
We welcome contributions to Metaflow. Please see our [contribution guide](https://docs.metaflow.org/introduction/contributing-to-metaflow) for more details.
|
|
63
|
+
|
|
@@ -8,6 +8,7 @@ help:
|
|
|
8
8
|
@echo " ui - Open Metaflow UI"
|
|
9
9
|
@echo " dashboard - Open Minikube dashboard"
|
|
10
10
|
@echo " down - Stop and clean up the environment"
|
|
11
|
+
@echo " all-up - Start the development environment with all services"
|
|
11
12
|
@echo " help - Show this help message"
|
|
12
13
|
|
|
13
14
|
HELM_VERSION := v3.14.0
|
|
@@ -21,13 +22,14 @@ DEVTOOLS_DIR := $(MKFILE_DIR).devtools
|
|
|
21
22
|
PICK_SERVICES := $(MKFILE_DIR)pick_services.sh
|
|
22
23
|
MINIKUBE_DIR := $(DEVTOOLS_DIR)/minikube
|
|
23
24
|
MINIKUBE := $(MINIKUBE_DIR)/minikube
|
|
25
|
+
HELM_DIR := $(DEVTOOLS_DIR)/helm
|
|
24
26
|
TILT_DIR := $(DEVTOOLS_DIR)/tilt
|
|
25
27
|
TILT := $(TILT_DIR)/tilt
|
|
26
28
|
TILTFILE := $(MKFILE_DIR)/Tiltfile
|
|
27
|
-
MAKE_CMD := $(MAKE) -
|
|
29
|
+
MAKE_CMD := $(MAKE) -f "$(MKFILE_PATH)"
|
|
28
30
|
|
|
29
31
|
MINIKUBE_CPUS ?= 4
|
|
30
|
-
MINIKUBE_MEMORY ?=
|
|
32
|
+
MINIKUBE_MEMORY ?= 6144
|
|
31
33
|
MINIKUBE_DISK_SIZE ?= 20g
|
|
32
34
|
|
|
33
35
|
ifeq ($(shell uname), Darwin)
|
|
@@ -50,9 +52,18 @@ endif
|
|
|
50
52
|
|
|
51
53
|
install-helm:
|
|
52
54
|
@if ! command -v helm >/dev/null 2>&1; then \
|
|
53
|
-
echo "📥 Installing Helm $(HELM_VERSION)
|
|
54
|
-
|
|
55
|
+
echo "📥 Installing Helm $(HELM_VERSION)..."; \
|
|
56
|
+
mkdir -p "$(HELM_DIR)"; \
|
|
57
|
+
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 \
|
|
58
|
+
| HELM_INSTALL_VERSION="$(HELM_VERSION)" \
|
|
59
|
+
USE_SUDO="false" \
|
|
60
|
+
PATH="$(HELM_DIR):$$PATH" \
|
|
61
|
+
HELM_INSTALL_DIR="$(HELM_DIR)" \
|
|
62
|
+
bash; \
|
|
63
|
+
chmod +x "$(HELM_DIR)/helm"; \
|
|
55
64
|
echo "✅ Helm installation complete"; \
|
|
65
|
+
else \
|
|
66
|
+
echo "✅ Helm is already installed at $$(command -v helm)"; \
|
|
56
67
|
fi
|
|
57
68
|
|
|
58
69
|
check-docker:
|
|
@@ -98,7 +109,7 @@ install-gum:
|
|
|
98
109
|
@if ! command -v gum >/dev/null 2>&1; then \
|
|
99
110
|
echo "📥 Installing gum..."; \
|
|
100
111
|
if [ "$(shell uname)" = "Darwin" ]; then \
|
|
101
|
-
HOMEBREW_NO_AUTO_UPDATE=1 brew install gum; \
|
|
112
|
+
HOMEBREW_NO_AUTO_UPDATE=1 brew install gum|| { echo "❌ Failed to install gum via Homebrew"; exit 1; }; \
|
|
102
113
|
elif command -v apt-get >/dev/null 2>&1; then \
|
|
103
114
|
curl -fsSL -o /tmp/gum.deb \
|
|
104
115
|
"https://github.com/charmbracelet/gum/releases/download/$(GUM_VERSION)/gum_$(GUM_VERSION:v%=%)_$(arch).deb"; \
|
|
@@ -129,7 +140,8 @@ setup-minikube:
|
|
|
129
140
|
--cpus $(MINIKUBE_CPUS) \
|
|
130
141
|
--memory $(MINIKUBE_MEMORY) \
|
|
131
142
|
--disk-size $(MINIKUBE_DISK_SIZE) \
|
|
132
|
-
--driver docker
|
|
143
|
+
--driver docker \
|
|
144
|
+
|| { echo "❌ Failed to start Minikube (check if Docker is running)"; exit 1; }; \
|
|
133
145
|
echo "🔌 Enabling metrics-server and dashboard (quietly)..."; \
|
|
134
146
|
$(MINIKUBE) addons enable metrics-server >/dev/null 2>&1; \
|
|
135
147
|
$(MINIKUBE) addons enable dashboard >/dev/null 2>&1; \
|
|
@@ -170,7 +182,6 @@ up: install-brew check-docker install-curl install-gum setup-minikube install-he
|
|
|
170
182
|
@echo 'trap "exit" INT TERM' >> $(DEVTOOLS_DIR)/start.sh
|
|
171
183
|
@echo 'trap "kill 0" EXIT' >> $(DEVTOOLS_DIR)/start.sh
|
|
172
184
|
@echo 'eval $$($(MINIKUBE) docker-env)' >> $(DEVTOOLS_DIR)/start.sh
|
|
173
|
-
|
|
174
185
|
@echo 'if [ -n "$$SERVICES_OVERRIDE" ]; then' >> "$(DEVTOOLS_DIR)/start.sh"
|
|
175
186
|
@echo ' echo "🌐 Using user-provided list of services: $$SERVICES_OVERRIDE"' >> "$(DEVTOOLS_DIR)/start.sh"
|
|
176
187
|
@echo ' SERVICES="$$SERVICES_OVERRIDE"' >> "$(DEVTOOLS_DIR)/start.sh"
|
|
@@ -181,16 +192,19 @@ up: install-brew check-docker install-curl install-gum setup-minikube install-he
|
|
|
181
192
|
@echo 'PATH="$(MINIKUBE_DIR):$(TILT_DIR):$$PATH" $(MINIKUBE) tunnel &' >> $(DEVTOOLS_DIR)/start.sh
|
|
182
193
|
@echo 'echo -e "🚀 Starting Tilt with selected services..."' >> $(DEVTOOLS_DIR)/start.sh
|
|
183
194
|
@echo 'echo -e "\033[1;38;5;46m\n🔥 \033[1;38;5;196mNext Steps:\033[0;38;5;46m Use \033[3mmetaflow-dev shell\033[23m to switch to the development\n environment'\''s shell and start executing your Metaflow flows.\n\033[0m"' >> "$(DEVTOOLS_DIR)/start.sh"
|
|
184
|
-
@echo 'PATH="$(MINIKUBE_DIR):$(TILT_DIR):$$PATH" SERVICES="$$SERVICES" tilt up -f $(TILTFILE)' >> $(DEVTOOLS_DIR)/start.sh
|
|
195
|
+
@echo 'PATH="$(HELM_DIR):$(MINIKUBE_DIR):$(TILT_DIR):$$PATH" SERVICES="$$SERVICES" tilt up -f $(TILTFILE)' >> $(DEVTOOLS_DIR)/start.sh
|
|
185
196
|
@echo 'wait' >> $(DEVTOOLS_DIR)/start.sh
|
|
186
197
|
@chmod +x $(DEVTOOLS_DIR)/start.sh
|
|
187
198
|
@$(DEVTOOLS_DIR)/start.sh
|
|
188
199
|
|
|
200
|
+
all-up:
|
|
201
|
+
@echo "🚀 Starting up all services..."
|
|
202
|
+
SERVICES_OVERRIDE=all $(MAKE_CMD) up
|
|
203
|
+
|
|
189
204
|
down:
|
|
190
205
|
@echo "🛑 Stopping all services..."
|
|
191
206
|
@-pkill -f "$(MINIKUBE) tunnel" 2>/dev/null || true
|
|
192
207
|
@echo "⏹️ Stopping Tilt..."
|
|
193
|
-
-PATH="$(MINIKUBE_DIR):$(TILT_DIR):$$PATH" tilt down -f $(TILTFILE)
|
|
194
208
|
@echo "🧹 Cleaning up Minikube..."
|
|
195
209
|
$(MAKE_CMD) teardown-minikube
|
|
196
210
|
@echo "🗑️ Removing Tilt binary and directory..."
|
|
@@ -201,7 +215,7 @@ down:
|
|
|
201
215
|
|
|
202
216
|
shell: setup-tilt
|
|
203
217
|
@echo "⏳ Checking if development environment is up..."
|
|
204
|
-
@set -
|
|
218
|
+
@set -eu; \
|
|
205
219
|
for i in $$(seq 1 90); do \
|
|
206
220
|
if "$(TILT)" get session >/dev/null 2>&1; then \
|
|
207
221
|
found_session=1; \
|
|
@@ -210,7 +224,7 @@ shell: setup-tilt
|
|
|
210
224
|
sleep 2; \
|
|
211
225
|
fi; \
|
|
212
226
|
done; \
|
|
213
|
-
if [ -z "$${found_session}" ]; then \
|
|
227
|
+
if [ -z "$${found_session:-}" ]; then \
|
|
214
228
|
echo "❌ Development environment is not up."; \
|
|
215
229
|
echo " Please run 'metaflow-dev up' in another terminal, then re-run 'metaflow-dev shell'."; \
|
|
216
230
|
exit 1; \
|
|
@@ -220,7 +234,10 @@ shell: setup-tilt
|
|
|
220
234
|
"$(TILT)" get uiresource generate-configs >/dev/null 2>&1; \
|
|
221
235
|
status=$$?; \
|
|
222
236
|
if [ $$status -eq 0 ]; then \
|
|
223
|
-
"$(TILT)" wait --for=condition=Ready uiresource/generate-configs; \
|
|
237
|
+
if ! "$(TILT)" wait --for=condition=Ready uiresource/generate-configs --timeout=300s; then \
|
|
238
|
+
echo "❌ Timed out waiting for development environment to be ready."; \
|
|
239
|
+
exit 1; \
|
|
240
|
+
fi; \
|
|
224
241
|
break; \
|
|
225
242
|
elif [ $$status -eq 127 ]; then \
|
|
226
243
|
echo "❌ Development environment is not up."; \
|
|
@@ -250,8 +267,7 @@ shell: setup-tilt
|
|
|
250
267
|
"$$user_shell" -i; \
|
|
251
268
|
fi'
|
|
252
269
|
|
|
253
|
-
|
|
254
|
-
#
|
|
270
|
+
|
|
255
271
|
# @echo '$(MAKE_CMD) create-dev-shell' >> $(DEVTOOLS_DIR)/start.sh
|
|
256
272
|
# @echo 'rm -f /tmp/metaflow-devshell-*' >> $(DEVTOOLS_DIR)/start.sh
|
|
257
273
|
create-dev-shell: setup-tilt
|
|
@@ -268,7 +284,10 @@ create-dev-shell: setup-tilt
|
|
|
268
284
|
echo "fi" >> $$SHELL_PATH && \
|
|
269
285
|
echo "" >> $$SHELL_PATH && \
|
|
270
286
|
echo "echo \"⏳ Waiting for development environment to be ready...\"" >> $$SHELL_PATH && \
|
|
271
|
-
echo "$(TILT) wait --for=condition=Ready uiresource/generate-configs" >> $$SHELL_PATH && \
|
|
287
|
+
echo "if ! $(TILT) wait --for=condition=Ready uiresource/generate-configs --timeout=300s; then" >> $$SHELL_PATH && \
|
|
288
|
+
echo " echo \"❌ Timed out waiting for development environment to be ready.\"" >> $$SHELL_PATH && \
|
|
289
|
+
echo " exit 1" >> $$SHELL_PATH && \
|
|
290
|
+
echo "fi" >> $$SHELL_PATH && \
|
|
272
291
|
echo "" >> $$SHELL_PATH && \
|
|
273
292
|
echo "echo \"🔧 Starting a new shell for development environment...\"" >> $$SHELL_PATH && \
|
|
274
293
|
echo "if [ -n \"\$$SHELL\" ]; then" >> $$SHELL_PATH && \
|
|
@@ -318,6 +337,6 @@ ui: setup-tilt
|
|
|
318
337
|
@echo "🔗 Opening Metaflow UI at http://localhost:3000"
|
|
319
338
|
@open http://localhost:3000
|
|
320
339
|
|
|
321
|
-
.PHONY: install-helm setup-minikube setup-tilt teardown-minikube tunnel up down check-docker install-curl install-gum install-brew up down dashboard shell ui help
|
|
340
|
+
.PHONY: install-helm setup-minikube setup-tilt teardown-minikube tunnel up down check-docker install-curl install-gum install-brew up down dashboard shell ui all-up help
|
|
322
341
|
|
|
323
|
-
.DEFAULT_GOAL :=
|
|
342
|
+
.DEFAULT_GOAL := help
|
|
@@ -23,8 +23,13 @@ components = {
|
|
|
23
23
|
"argo-events": ["argo-workflows"],
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
services_env = os.getenv("SERVICES", "").strip().lower()
|
|
27
|
+
|
|
28
|
+
if services_env:
|
|
29
|
+
if services_env == "all":
|
|
30
|
+
requested_components = list(components.keys())
|
|
31
|
+
else:
|
|
32
|
+
requested_components = services_env.split(",")
|
|
28
33
|
else:
|
|
29
34
|
requested_components = list(components.keys())
|
|
30
35
|
|
|
@@ -78,7 +83,7 @@ for component in requested_components:
|
|
|
78
83
|
if result not in enabled_components:
|
|
79
84
|
enabled_components.append(result)
|
|
80
85
|
|
|
81
|
-
# Print a friendly summary when running `tilt up`.
|
|
86
|
+
# Print a friendly summary when running `tilt up`.
|
|
82
87
|
if config.tilt_subcommand == 'up':
|
|
83
88
|
print("\n📦 Components to install:")
|
|
84
89
|
for component in enabled_components:
|
|
@@ -99,6 +104,7 @@ if "minio" in enabled_components:
|
|
|
99
104
|
set=[
|
|
100
105
|
'rootUser=rootuser',
|
|
101
106
|
'rootPassword=rootpass123',
|
|
107
|
+
# TODO: perturb the bucket name to avoid conflicts
|
|
102
108
|
'buckets[0].name=metaflow-test',
|
|
103
109
|
'buckets[0].policy=none',
|
|
104
110
|
'buckets[0].purge=false',
|
|
@@ -498,13 +504,14 @@ if "argo-events" in enabled_components:
|
|
|
498
504
|
'argo-events-controller-manager',
|
|
499
505
|
labels=['argo-events'],
|
|
500
506
|
)
|
|
501
|
-
|
|
507
|
+
|
|
502
508
|
metaflow_config["METAFLOW_ARGO_EVENTS_EVENT"] = "metaflow-event"
|
|
503
509
|
metaflow_config["METAFLOW_ARGO_EVENTS_EVENT_BUS"] = "default"
|
|
504
510
|
metaflow_config["METAFLOW_ARGO_EVENTS_EVENT_SOURCE"] = "argo-events-webhook"
|
|
505
511
|
metaflow_config["METAFLOW_ARGO_EVENTS_SERVICE_ACCOUNT"] = "operate-workflow-sa"
|
|
506
512
|
metaflow_config["METAFLOW_ARGO_EVENTS_WEBHOOK_AUTH"] = "service"
|
|
507
|
-
metaflow_config["
|
|
513
|
+
metaflow_config["METAFLOW_ARGO_EVENTS_INTERNAL_WEBHOOK_URL"] = "http://argo-events-webhook-eventsource-svc:12000/metaflow-event"
|
|
514
|
+
metaflow_config["METAFLOW_ARGO_EVENTS_WEBHOOK_URL"] = "http://localhost:12000/metaflow-event"
|
|
508
515
|
|
|
509
516
|
config_resources.append('argo-events-controller-manager')
|
|
510
517
|
config_resources.append('argo-events-webhook-eventsource-svc')
|
|
@@ -522,8 +529,8 @@ if "metadata-service" in enabled_components:
|
|
|
522
529
|
'metadatadb.password=metaflow123',
|
|
523
530
|
'metadatadb.database=metaflow',
|
|
524
531
|
'metadatadb.host=postgresql',
|
|
525
|
-
'image.repository=public.ecr.aws/
|
|
526
|
-
'image.tag=2.4.13-
|
|
532
|
+
'image.repository=public.ecr.aws/outerbounds/metaflow_metadata_service',
|
|
533
|
+
'image.tag=2.4.13-2-g70af4ed',
|
|
527
534
|
'resources.requests.cpu=25m',
|
|
528
535
|
'resources.requests.memory=64Mi',
|
|
529
536
|
'resources.limits.cpu=50m',
|
|
@@ -560,8 +567,8 @@ if "ui" in enabled_components:
|
|
|
560
567
|
'uiBackend.metadatadb.host=postgresql',
|
|
561
568
|
'uiBackend.metaflowDatastoreSysRootS3=s3://metaflow-test',
|
|
562
569
|
'uiBackend.metaflowS3EndpointURL=http://minio.default.svc.cluster.local:9000',
|
|
563
|
-
'uiBackend.image.name=public.ecr.aws/
|
|
564
|
-
'uiBackend.image.tag=2.4.13-
|
|
570
|
+
'uiBackend.image.name=public.ecr.aws/outerbounds/metaflow_metadata_service',
|
|
571
|
+
'uiBackend.image.tag=2.4.13-2-g70af4ed',
|
|
565
572
|
'uiBackend.env[0].name=AWS_ACCESS_KEY_ID',
|
|
566
573
|
'uiBackend.env[0].value=rootuser',
|
|
567
574
|
'uiBackend.env[1].name=AWS_SECRET_ACCESS_KEY',
|
|
@@ -600,8 +607,20 @@ if "ui" in enabled_components:
|
|
|
600
607
|
config_resources.append('metaflow-ui')
|
|
601
608
|
config_resources.append('metaflow-ui-static')
|
|
602
609
|
|
|
610
|
+
cmd = '''
|
|
611
|
+
ARCH=$(kubectl get nodes -o jsonpath='{.items[0].status.nodeInfo.architecture}')
|
|
612
|
+
case "$ARCH" in
|
|
613
|
+
arm64) echo linux-aarch64 ;;
|
|
614
|
+
amd64) echo linux-64 ;;
|
|
615
|
+
*) echo linux-64 ;;
|
|
616
|
+
esac
|
|
617
|
+
'''
|
|
618
|
+
|
|
619
|
+
# For @conda/@pypi emulation
|
|
620
|
+
metaflow_config["METAFLOW_KUBERNETES_CONDA_ARCH"] = str(local(cmd)).strip()
|
|
621
|
+
|
|
603
622
|
local_resource(
|
|
604
623
|
name="generate-configs",
|
|
605
624
|
cmd=write_config_files(),
|
|
606
625
|
resource_deps=config_resources,
|
|
607
|
-
)
|
|
626
|
+
)
|
|
@@ -119,6 +119,12 @@ from .includefile import IncludeFile
|
|
|
119
119
|
# Decorators
|
|
120
120
|
from .decorators import step, _import_plugin_decorators
|
|
121
121
|
|
|
122
|
+
|
|
123
|
+
# Parsers (for configs) for now
|
|
124
|
+
from .plugins import _import_tl_plugins
|
|
125
|
+
|
|
126
|
+
_import_tl_plugins(globals())
|
|
127
|
+
|
|
122
128
|
# this auto-generates decorator functions from Decorator objects
|
|
123
129
|
# in the top-level metaflow namespace
|
|
124
130
|
_import_plugin_decorators(globals())
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import shutil
|
|
3
|
+
import sys
|
|
4
|
+
from subprocess import PIPE, CompletedProcess, run
|
|
5
|
+
from tempfile import TemporaryDirectory
|
|
6
|
+
from typing import Any, Callable, List, Mapping, Optional, cast
|
|
7
|
+
|
|
8
|
+
from metaflow import Run
|
|
9
|
+
from metaflow._vendor import click
|
|
10
|
+
from metaflow.cli import echo_always
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@click.group()
|
|
14
|
+
def cli():
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@cli.group(help="Access, compare, and manage code associated with Metaflow runs.")
|
|
19
|
+
def code():
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def echo(line: str) -> None:
|
|
24
|
+
echo_always(line, err=True, fg="magenta")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def extract_code_package(runspec: str) -> TemporaryDirectory:
|
|
28
|
+
try:
|
|
29
|
+
mf_run = Run(runspec, _namespace_check=False)
|
|
30
|
+
echo(f"✅ Run *{runspec}* found, downloading code..")
|
|
31
|
+
except Exception as e:
|
|
32
|
+
echo(f"❌ Run **{runspec}** not found")
|
|
33
|
+
raise e
|
|
34
|
+
|
|
35
|
+
if mf_run.code is None:
|
|
36
|
+
echo(
|
|
37
|
+
f"❌ Run **{runspec}** doesn't have a code package. Maybe it's a local run?"
|
|
38
|
+
)
|
|
39
|
+
raise RuntimeError("no code package found")
|
|
40
|
+
|
|
41
|
+
return mf_run.code.extract()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def perform_diff(
|
|
45
|
+
source_dir: str,
|
|
46
|
+
target_dir: Optional[str] = None,
|
|
47
|
+
output: bool = False,
|
|
48
|
+
**kwargs: Mapping[str, Any],
|
|
49
|
+
) -> Optional[List[str]]:
|
|
50
|
+
if target_dir is None:
|
|
51
|
+
target_dir = os.getcwd()
|
|
52
|
+
|
|
53
|
+
diffs = []
|
|
54
|
+
for dirpath, dirnames, filenames in os.walk(source_dir, followlinks=True):
|
|
55
|
+
for fname in filenames:
|
|
56
|
+
# NOTE: the paths below need to be set up carefully
|
|
57
|
+
# for the `patch` command to work. Better not to touch
|
|
58
|
+
# the directories below. If you must, test that patches
|
|
59
|
+
# work after your changes.
|
|
60
|
+
#
|
|
61
|
+
# target_file is the git repo in the current working directory
|
|
62
|
+
rel = os.path.relpath(dirpath, source_dir)
|
|
63
|
+
target_file = os.path.join(rel, fname)
|
|
64
|
+
# source_file is the run file loaded in a tmp directory
|
|
65
|
+
source_file = os.path.join(dirpath, fname)
|
|
66
|
+
|
|
67
|
+
if sys.stdout.isatty() and not output:
|
|
68
|
+
color = ["--color"]
|
|
69
|
+
else:
|
|
70
|
+
color = ["--no-color"]
|
|
71
|
+
|
|
72
|
+
if os.path.exists(os.path.join(target_dir, target_file)):
|
|
73
|
+
cmd = (
|
|
74
|
+
["git", "diff", "--no-index", "--exit-code"]
|
|
75
|
+
+ color
|
|
76
|
+
+ [
|
|
77
|
+
target_file,
|
|
78
|
+
source_file,
|
|
79
|
+
]
|
|
80
|
+
)
|
|
81
|
+
result: CompletedProcess = run(
|
|
82
|
+
cmd, text=True, stdout=PIPE, cwd=target_dir
|
|
83
|
+
)
|
|
84
|
+
if result.returncode == 0:
|
|
85
|
+
if not output:
|
|
86
|
+
echo(f"✅ {target_file} is identical, skipping")
|
|
87
|
+
continue
|
|
88
|
+
|
|
89
|
+
if output:
|
|
90
|
+
diffs.append(result.stdout)
|
|
91
|
+
else:
|
|
92
|
+
run(["less", "-R"], input=result.stdout, text=True)
|
|
93
|
+
else:
|
|
94
|
+
if not output:
|
|
95
|
+
echo(f"❗ {target_file} not in the target directory, skipping")
|
|
96
|
+
return diffs if output else None
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def run_op(
|
|
100
|
+
runspec: str, op: Callable[..., Optional[List[str]]], **op_args: Mapping[str, Any]
|
|
101
|
+
) -> Optional[List[str]]:
|
|
102
|
+
tmp = None
|
|
103
|
+
try:
|
|
104
|
+
tmp = extract_code_package(runspec)
|
|
105
|
+
return op(tmp.name, **op_args)
|
|
106
|
+
finally:
|
|
107
|
+
if tmp and os.path.exists(tmp.name):
|
|
108
|
+
shutil.rmtree(tmp.name)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def run_op_diff_runs(
|
|
112
|
+
source_run_pathspec: str, target_run_pathspec: str, **op_args: Mapping[str, Any]
|
|
113
|
+
) -> Optional[List[str]]:
|
|
114
|
+
source_tmp = None
|
|
115
|
+
target_tmp = None
|
|
116
|
+
try:
|
|
117
|
+
source_tmp = extract_code_package(source_run_pathspec)
|
|
118
|
+
target_tmp = extract_code_package(target_run_pathspec)
|
|
119
|
+
return perform_diff(source_tmp.name, target_tmp.name, **op_args)
|
|
120
|
+
finally:
|
|
121
|
+
for d in [source_tmp, target_tmp]:
|
|
122
|
+
if d and os.path.exists(d.name):
|
|
123
|
+
shutil.rmtree(d.name)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def op_diff(tmpdir: str, **kwargs: Mapping[str, Any]) -> Optional[List[str]]:
|
|
127
|
+
kwargs_dict = dict(kwargs)
|
|
128
|
+
target_dir = cast(Optional[str], kwargs_dict.pop("target_dir", None))
|
|
129
|
+
output: bool = bool(kwargs_dict.pop("output", False))
|
|
130
|
+
op_args: Mapping[str, Any] = {**kwargs_dict}
|
|
131
|
+
return perform_diff(tmpdir, target_dir=target_dir, output=output, **op_args)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def op_pull(tmpdir: str, dst: str, **op_args: Mapping[str, Any]) -> None:
|
|
135
|
+
if os.path.exists(dst):
|
|
136
|
+
echo(f"❌ Directory *{dst}* already exists")
|
|
137
|
+
else:
|
|
138
|
+
shutil.move(tmpdir, dst)
|
|
139
|
+
echo(f"Code downloaded to *{dst}*")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def op_patch(tmpdir: str, dst: str, **kwargs: Mapping[str, Any]) -> None:
|
|
143
|
+
diffs = perform_diff(tmpdir, output=True) or []
|
|
144
|
+
with open(dst, "w", encoding="utf-8") as f:
|
|
145
|
+
for out in diffs:
|
|
146
|
+
out = out.replace(tmpdir, "/.")
|
|
147
|
+
out = out.replace("+++ b/./", "+++ b/")
|
|
148
|
+
out = out.replace("--- b/./", "--- b/")
|
|
149
|
+
out = out.replace("--- a/./", "--- a/")
|
|
150
|
+
out = out.replace("+++ a/./", "+++ a/")
|
|
151
|
+
f.write(out)
|
|
152
|
+
echo(f"Patch saved in *{dst}*")
|
|
153
|
+
path = run(
|
|
154
|
+
["git", "rev-parse", "--show-prefix"], text=True, stdout=PIPE
|
|
155
|
+
).stdout.strip()
|
|
156
|
+
if path:
|
|
157
|
+
diropt = f" --directory={path.rstrip('/')}"
|
|
158
|
+
else:
|
|
159
|
+
diropt = ""
|
|
160
|
+
echo("Apply the patch by running:")
|
|
161
|
+
echo_always(
|
|
162
|
+
f"git apply --verbose{diropt} {dst}", highlight=True, bold=True, err=True
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
@code.command()
|
|
167
|
+
@click.argument("run_pathspec")
|
|
168
|
+
def diff(run_pathspec: str, **kwargs: Mapping[str, Any]) -> None:
|
|
169
|
+
"""
|
|
170
|
+
Do a 'git diff' of the current directory and a Metaflow run.
|
|
171
|
+
"""
|
|
172
|
+
_ = run_op(run_pathspec, op_diff, **kwargs)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
@code.command()
|
|
176
|
+
@click.argument("source_run_pathspec")
|
|
177
|
+
@click.argument("target_run_pathspec")
|
|
178
|
+
def diff_runs(
|
|
179
|
+
source_run_pathspec: str, target_run_pathspec: str, **kwargs: Mapping[str, Any]
|
|
180
|
+
) -> None:
|
|
181
|
+
"""
|
|
182
|
+
Do a 'git diff' between two Metaflow runs.
|
|
183
|
+
"""
|
|
184
|
+
_ = run_op_diff_runs(source_run_pathspec, target_run_pathspec, **kwargs)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
@code.command()
|
|
188
|
+
@click.argument("run_pathspec")
|
|
189
|
+
@click.option(
|
|
190
|
+
"--dir", help="Destination directory (default: {run_pathspec}_code)", default=None
|
|
191
|
+
)
|
|
192
|
+
def pull(
|
|
193
|
+
run_pathspec: str, dir: Optional[str] = None, **kwargs: Mapping[str, Any]
|
|
194
|
+
) -> None:
|
|
195
|
+
"""
|
|
196
|
+
Pull the code of a Metaflow run.
|
|
197
|
+
"""
|
|
198
|
+
if dir is None:
|
|
199
|
+
dir = run_pathspec.lower().replace("/", "_") + "_code"
|
|
200
|
+
op_args: Mapping[str, Any] = {**kwargs, "dst": dir}
|
|
201
|
+
run_op(run_pathspec, op_pull, **op_args)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
@code.command()
|
|
205
|
+
@click.argument("run_pathspec")
|
|
206
|
+
@click.option(
|
|
207
|
+
"--file_path",
|
|
208
|
+
help="Patch file name. If not provided, defaults to a sanitized version of RUN_PATHSPEC "
|
|
209
|
+
"with slashes replaced by underscores, plus '.patch'.",
|
|
210
|
+
show_default=False,
|
|
211
|
+
)
|
|
212
|
+
@click.option(
|
|
213
|
+
"--overwrite", is_flag=True, help="Overwrite the patch file if it exists."
|
|
214
|
+
)
|
|
215
|
+
def patch(
|
|
216
|
+
run_pathspec: str,
|
|
217
|
+
file_path: Optional[str] = None,
|
|
218
|
+
overwrite: bool = False,
|
|
219
|
+
**kwargs: Mapping[str, Any],
|
|
220
|
+
) -> None:
|
|
221
|
+
"""
|
|
222
|
+
Create a patch by comparing current dir with a Metaflow run.
|
|
223
|
+
"""
|
|
224
|
+
if file_path is None:
|
|
225
|
+
file_path = run_pathspec.lower().replace("/", "_") + ".patch"
|
|
226
|
+
if os.path.exists(file_path) and not overwrite:
|
|
227
|
+
echo(f"File *{file_path}* already exists. To overwrite, specify --overwrite.")
|
|
228
|
+
return
|
|
229
|
+
op_args: Mapping[str, Any] = {**kwargs, "dst": file_path}
|
|
230
|
+
run_op(run_pathspec, op_patch, **op_args)
|
|
@@ -1133,13 +1133,16 @@ class StubGenerator:
|
|
|
1133
1133
|
result = result[1:]
|
|
1134
1134
|
# Add doc to first and last overloads. Jedi uses the last one and pycharm
|
|
1135
1135
|
# the first one. Go figure.
|
|
1136
|
+
result_docstring = docs["func_doc"]
|
|
1137
|
+
if docs["param_doc"]:
|
|
1138
|
+
result_docstring += "\nParameters\n----------\n" + docs["param_doc"]
|
|
1136
1139
|
result[0] = (
|
|
1137
1140
|
result[0][0],
|
|
1138
|
-
|
|
1141
|
+
result_docstring,
|
|
1139
1142
|
)
|
|
1140
1143
|
result[-1] = (
|
|
1141
1144
|
result[-1][0],
|
|
1142
|
-
|
|
1145
|
+
result_docstring,
|
|
1143
1146
|
)
|
|
1144
1147
|
return result
|
|
1145
1148
|
|