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

|
42
|
+
|
43
|
+
# Metaflow
|
44
|
+
|
45
|
+
[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.
|
46
|
+
|
47
|
+
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.
|
48
|
+
|
49
|
+
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.
|
50
|
+
|
51
|
+
## From prototype to production (and back)
|
52
|
+
|
53
|
+
Metaflow provides a simple and friendly pythonic [API](https://docs.metaflow.org) that covers foundational needs of AI and ML systems:
|
54
|
+
<img src="./docs/prototype-to-prod.png" width="800px">
|
55
|
+
|
56
|
+
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).
|
57
|
+
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).
|
58
|
+
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).
|
59
|
+
|
60
|
+
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.
|
61
|
+
|
62
|
+
|
63
|
+
## Getting started
|
64
|
+
|
65
|
+
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.
|
66
|
+
|
67
|
+
### Installing Metaflow
|
68
|
+
|
69
|
+
To install Metaflow in your Python environment from [PyPI](https://pypi.org/project/metaflow/):
|
70
|
+
|
71
|
+
```sh
|
72
|
+
pip install metaflow
|
73
|
+
```
|
74
|
+
Alternatively, using [conda-forge](https://anaconda.org/conda-forge/metaflow):
|
75
|
+
|
76
|
+
```sh
|
77
|
+
conda install -c conda-forge metaflow
|
78
|
+
```
|
79
|
+
|
80
|
+
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.
|
81
|
+
|
82
|
+
For more details on Metaflow’s features and best practices, check out:
|
83
|
+
- [How Metaflow works](https://docs.metaflow.org/metaflow/basics)
|
84
|
+
- [Additional resources](https://docs.metaflow.org/introduction/metaflow-resources)
|
85
|
+
|
86
|
+
If you need help, don’t hesitate to reach out on our [Slack community](http://slack.outerbounds.co/)!
|
87
|
+
|
88
|
+
|
89
|
+
### Deploying infrastructure for Metaflow in your cloud
|
90
|
+
<img src="./docs/multicloud.png" width="800px">
|
91
|
+
|
92
|
+
|
93
|
+
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)
|
94
|
+
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
|
95
|
+
configure Metaflow and the infrastructure behind it appropriately.
|
96
|
+
|
97
|
+
|
98
|
+
## Get in touch
|
99
|
+
We'd love to hear from you. Join our community [Slack workspace](http://slack.outerbounds.co/)!
|
100
|
+
|
101
|
+
## Contributing
|
102
|
+
We welcome contributions to Metaflow. Please see our [contribution guide](https://docs.metaflow.org/introduction/contributing-to-metaflow) for more details.
|
103
|
+
|
@@ -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
|
+
|
@@ -22,6 +22,7 @@ DEVTOOLS_DIR := $(MKFILE_DIR).devtools
|
|
22
22
|
PICK_SERVICES := $(MKFILE_DIR)pick_services.sh
|
23
23
|
MINIKUBE_DIR := $(DEVTOOLS_DIR)/minikube
|
24
24
|
MINIKUBE := $(MINIKUBE_DIR)/minikube
|
25
|
+
HELM_DIR := $(DEVTOOLS_DIR)/helm
|
25
26
|
TILT_DIR := $(DEVTOOLS_DIR)/tilt
|
26
27
|
TILT := $(TILT_DIR)/tilt
|
27
28
|
TILTFILE := $(MKFILE_DIR)/Tiltfile
|
@@ -51,9 +52,18 @@ endif
|
|
51
52
|
|
52
53
|
install-helm:
|
53
54
|
@if ! command -v helm >/dev/null 2>&1; then \
|
54
|
-
echo "📥 Installing Helm $(HELM_VERSION)
|
55
|
-
|
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"; \
|
56
64
|
echo "✅ Helm installation complete"; \
|
65
|
+
else \
|
66
|
+
echo "✅ Helm is already installed at $$(command -v helm)"; \
|
57
67
|
fi
|
58
68
|
|
59
69
|
check-docker:
|
@@ -99,7 +109,7 @@ install-gum:
|
|
99
109
|
@if ! command -v gum >/dev/null 2>&1; then \
|
100
110
|
echo "📥 Installing gum..."; \
|
101
111
|
if [ "$(shell uname)" = "Darwin" ]; then \
|
102
|
-
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; }; \
|
103
113
|
elif command -v apt-get >/dev/null 2>&1; then \
|
104
114
|
curl -fsSL -o /tmp/gum.deb \
|
105
115
|
"https://github.com/charmbracelet/gum/releases/download/$(GUM_VERSION)/gum_$(GUM_VERSION:v%=%)_$(arch).deb"; \
|
@@ -182,7 +192,7 @@ up: install-brew check-docker install-curl install-gum setup-minikube install-he
|
|
182
192
|
@echo 'PATH="$(MINIKUBE_DIR):$(TILT_DIR):$$PATH" $(MINIKUBE) tunnel &' >> $(DEVTOOLS_DIR)/start.sh
|
183
193
|
@echo 'echo -e "🚀 Starting Tilt with selected services..."' >> $(DEVTOOLS_DIR)/start.sh
|
184
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"
|
185
|
-
@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
|
186
196
|
@echo 'wait' >> $(DEVTOOLS_DIR)/start.sh
|
187
197
|
@chmod +x $(DEVTOOLS_DIR)/start.sh
|
188
198
|
@$(DEVTOOLS_DIR)/start.sh
|
@@ -529,8 +529,8 @@ if "metadata-service" in enabled_components:
|
|
529
529
|
'metadatadb.password=metaflow123',
|
530
530
|
'metadatadb.database=metaflow',
|
531
531
|
'metadatadb.host=postgresql',
|
532
|
-
'image.repository=public.ecr.aws/
|
533
|
-
'image.tag=2.4.13-
|
532
|
+
'image.repository=public.ecr.aws/outerbounds/metaflow_metadata_service',
|
533
|
+
'image.tag=2.4.13-2-g70af4ed',
|
534
534
|
'resources.requests.cpu=25m',
|
535
535
|
'resources.requests.memory=64Mi',
|
536
536
|
'resources.limits.cpu=50m',
|
@@ -567,8 +567,8 @@ if "ui" in enabled_components:
|
|
567
567
|
'uiBackend.metadatadb.host=postgresql',
|
568
568
|
'uiBackend.metaflowDatastoreSysRootS3=s3://metaflow-test',
|
569
569
|
'uiBackend.metaflowS3EndpointURL=http://minio.default.svc.cluster.local:9000',
|
570
|
-
'uiBackend.image.name=public.ecr.aws/
|
571
|
-
'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',
|
572
572
|
'uiBackend.env[0].name=AWS_ACCESS_KEY_ID',
|
573
573
|
'uiBackend.env[0].value=rootuser',
|
574
574
|
'uiBackend.env[1].name=AWS_SECRET_ACCESS_KEY',
|
@@ -256,12 +256,19 @@ class ArgoClient(object):
|
|
256
256
|
json.loads(e.body)["message"] if e.body is not None else e.reason
|
257
257
|
)
|
258
258
|
|
259
|
-
def trigger_workflow_template(self, name, parameters={}):
|
259
|
+
def trigger_workflow_template(self, name, usertype, username, parameters={}):
|
260
260
|
client = self._client.get()
|
261
261
|
body = {
|
262
262
|
"apiVersion": "argoproj.io/v1alpha1",
|
263
263
|
"kind": "Workflow",
|
264
|
-
"metadata": {
|
264
|
+
"metadata": {
|
265
|
+
"generateName": name + "-",
|
266
|
+
"annotations": {
|
267
|
+
"metaflow/triggered_by_user": json.dumps(
|
268
|
+
{"type": usertype, "name": username}
|
269
|
+
)
|
270
|
+
},
|
271
|
+
},
|
265
272
|
"spec": {
|
266
273
|
"workflowTemplateRef": {"name": name},
|
267
274
|
"arguments": {
|
@@ -64,6 +64,7 @@ from metaflow.util import (
|
|
64
64
|
)
|
65
65
|
|
66
66
|
from .argo_client import ArgoClient
|
67
|
+
from metaflow.util import resolve_identity
|
67
68
|
|
68
69
|
|
69
70
|
class ArgoWorkflowsException(MetaflowException):
|
@@ -108,8 +109,7 @@ class ArgoWorkflows(object):
|
|
108
109
|
notify_slack_webhook_url=None,
|
109
110
|
notify_pager_duty_integration_key=None,
|
110
111
|
notify_incident_io_api_key=None,
|
111
|
-
|
112
|
-
incident_io_error_severity_id=None,
|
112
|
+
incident_io_alert_source_config_id=None,
|
113
113
|
enable_heartbeat_daemon=True,
|
114
114
|
enable_error_msg_capture=False,
|
115
115
|
):
|
@@ -160,8 +160,7 @@ class ArgoWorkflows(object):
|
|
160
160
|
self.notify_slack_webhook_url = notify_slack_webhook_url
|
161
161
|
self.notify_pager_duty_integration_key = notify_pager_duty_integration_key
|
162
162
|
self.notify_incident_io_api_key = notify_incident_io_api_key
|
163
|
-
self.
|
164
|
-
self.incident_io_error_severity_id = incident_io_error_severity_id
|
163
|
+
self.incident_io_alert_source_config_id = incident_io_alert_source_config_id
|
165
164
|
self.enable_heartbeat_daemon = enable_heartbeat_daemon
|
166
165
|
self.enable_error_msg_capture = enable_error_msg_capture
|
167
166
|
self.parameters = self._process_parameters()
|
@@ -315,8 +314,16 @@ class ArgoWorkflows(object):
|
|
315
314
|
"Workflows before proceeding." % name
|
316
315
|
)
|
317
316
|
try:
|
317
|
+
id_parts = resolve_identity().split(":")
|
318
|
+
parts_size = len(id_parts)
|
319
|
+
usertype = id_parts[0] if parts_size > 0 else "unknown"
|
320
|
+
username = id_parts[1] if parts_size > 1 else "unknown"
|
321
|
+
|
318
322
|
return ArgoClient(namespace=KUBERNETES_NAMESPACE).trigger_workflow_template(
|
319
|
-
name,
|
323
|
+
name,
|
324
|
+
usertype,
|
325
|
+
username,
|
326
|
+
parameters,
|
320
327
|
)
|
321
328
|
except Exception as e:
|
322
329
|
raise ArgoWorkflowsException(str(e))
|
@@ -2505,25 +2512,49 @@ class ArgoWorkflows(object):
|
|
2505
2512
|
def _incident_io_alert_template(self):
|
2506
2513
|
if self.notify_incident_io_api_key is None:
|
2507
2514
|
return None
|
2508
|
-
if self.
|
2515
|
+
if self.incident_io_alert_source_config_id is None:
|
2509
2516
|
raise MetaflowException(
|
2510
|
-
"Creating
|
2517
|
+
"Creating alerts for errors requires a alert source config ID."
|
2511
2518
|
)
|
2519
|
+
ui_links = self._incident_io_ui_urls_for_run()
|
2512
2520
|
return Template("notify-incident-io-on-error").http(
|
2513
2521
|
Http("POST")
|
2514
|
-
.url(
|
2522
|
+
.url(
|
2523
|
+
"https://api.incident.io/v2/alert_events/http/%s"
|
2524
|
+
% self.incident_io_alert_source_config_id
|
2525
|
+
)
|
2515
2526
|
.header("Content-Type", "application/json")
|
2516
2527
|
.header("Authorization", "Bearer %s" % self.notify_incident_io_api_key)
|
2517
2528
|
.body(
|
2518
2529
|
json.dumps(
|
2519
2530
|
{
|
2520
2531
|
"idempotency_key": "argo-{{workflow.name}}", # use run id to deduplicate alerts.
|
2521
|
-
"
|
2522
|
-
"
|
2523
|
-
"
|
2524
|
-
|
2525
|
-
|
2526
|
-
|
2532
|
+
"status": "firing",
|
2533
|
+
"title": "Flow %s has failed." % self.flow.name,
|
2534
|
+
"description": "Metaflow run {run_pathspec} failed!{urls}".format(
|
2535
|
+
run_pathspec="%s/argo-{{workflow.name}}" % self.flow.name,
|
2536
|
+
urls=(
|
2537
|
+
"\n\nSee details for the run at:\n\n"
|
2538
|
+
+ "\n\n".join(ui_links)
|
2539
|
+
if ui_links
|
2540
|
+
else ""
|
2541
|
+
),
|
2542
|
+
),
|
2543
|
+
"source_url": (
|
2544
|
+
"%s/%s/%s"
|
2545
|
+
% (
|
2546
|
+
UI_URL.rstrip("/"),
|
2547
|
+
self.flow.name,
|
2548
|
+
"argo-{{workflow.name}}",
|
2549
|
+
)
|
2550
|
+
if UI_URL
|
2551
|
+
else None
|
2552
|
+
),
|
2553
|
+
"metadata": {
|
2554
|
+
"run_status": "failed",
|
2555
|
+
"flow_name": self.flow.name,
|
2556
|
+
"run_id": "argo-{{workflow.name}}",
|
2557
|
+
},
|
2527
2558
|
}
|
2528
2559
|
)
|
2529
2560
|
)
|
@@ -2532,27 +2563,49 @@ class ArgoWorkflows(object):
|
|
2532
2563
|
def _incident_io_change_template(self):
|
2533
2564
|
if self.notify_incident_io_api_key is None:
|
2534
2565
|
return None
|
2535
|
-
if self.
|
2566
|
+
if self.incident_io_alert_source_config_id is None:
|
2536
2567
|
raise MetaflowException(
|
2537
|
-
"Creating
|
2568
|
+
"Creating alerts for successes requires an alert source config ID."
|
2538
2569
|
)
|
2570
|
+
ui_links = self._incident_io_ui_urls_for_run()
|
2539
2571
|
return Template("notify-incident-io-on-success").http(
|
2540
2572
|
Http("POST")
|
2541
|
-
.url(
|
2573
|
+
.url(
|
2574
|
+
"https://api.incident.io/v2/alert_events/http/%s"
|
2575
|
+
% self.incident_io_alert_source_config_id
|
2576
|
+
)
|
2542
2577
|
.header("Content-Type", "application/json")
|
2543
2578
|
.header("Authorization", "Bearer %s" % self.notify_incident_io_api_key)
|
2544
2579
|
.body(
|
2545
2580
|
json.dumps(
|
2546
2581
|
{
|
2547
2582
|
"idempotency_key": "argo-{{workflow.name}}", # use run id to deduplicate alerts.
|
2548
|
-
"
|
2549
|
-
"
|
2550
|
-
|
2551
|
-
|
2552
|
-
|
2553
|
-
|
2554
|
-
|
2555
|
-
|
2583
|
+
"status": "firing",
|
2584
|
+
"title": "Flow %s has succeeded." % self.flow.name,
|
2585
|
+
"description": "Metaflow run {run_pathspec} succeeded!{urls}".format(
|
2586
|
+
run_pathspec="%s/argo-{{workflow.name}}" % self.flow.name,
|
2587
|
+
urls=(
|
2588
|
+
"\n\nSee details for the run at:\n\n"
|
2589
|
+
+ "\n\n".join(ui_links)
|
2590
|
+
if ui_links
|
2591
|
+
else ""
|
2592
|
+
),
|
2593
|
+
),
|
2594
|
+
"source_url": (
|
2595
|
+
"%s/%s/%s"
|
2596
|
+
% (
|
2597
|
+
UI_URL.rstrip("/"),
|
2598
|
+
self.flow.name,
|
2599
|
+
"argo-{{workflow.name}}",
|
2600
|
+
)
|
2601
|
+
if UI_URL
|
2602
|
+
else None
|
2603
|
+
),
|
2604
|
+
"metadata": {
|
2605
|
+
"run_status": "succeeded",
|
2606
|
+
"flow_name": self.flow.name,
|
2607
|
+
"run_id": "argo-{{workflow.name}}",
|
2608
|
+
},
|
2556
2609
|
}
|
2557
2610
|
)
|
2558
2611
|
)
|
@@ -2574,9 +2627,7 @@ class ArgoWorkflows(object):
|
|
2574
2627
|
"{{workflow.name}}",
|
2575
2628
|
)
|
2576
2629
|
links.append(url)
|
2577
|
-
|
2578
|
-
links = ["See details for the run at: ", *links]
|
2579
|
-
return "\n\n".join(links)
|
2630
|
+
return links
|
2580
2631
|
|
2581
2632
|
def _pager_duty_change_template(self):
|
2582
2633
|
# https://developer.pagerduty.com/docs/ZG9jOjExMDI5NTgy-send-a-change-event
|
@@ -130,6 +130,7 @@ def argo_workflows(obj, name=None):
|
|
130
130
|
is_flag=True,
|
131
131
|
default=False,
|
132
132
|
help="Only print out JSON sent to Argo Workflows. Do not deploy anything.",
|
133
|
+
hidden=True,
|
133
134
|
)
|
134
135
|
@click.option(
|
135
136
|
"--max-workers",
|
@@ -182,14 +183,9 @@ def argo_workflows(obj, name=None):
|
|
182
183
|
help="Incident.io API V2 key for workflow success/failure notifications.",
|
183
184
|
)
|
184
185
|
@click.option(
|
185
|
-
"--incident-io-
|
186
|
-
default=None,
|
187
|
-
help="Incident.io severity id for success alerts.",
|
188
|
-
)
|
189
|
-
@click.option(
|
190
|
-
"--incident-io-error-severity-id",
|
186
|
+
"--incident-io-alert-source-config-id",
|
191
187
|
default=None,
|
192
|
-
help="Incident.io
|
188
|
+
help="Incident.io Alert source config ID. Example '01GW2G3V0S59R238FAHPDS1R66'",
|
193
189
|
)
|
194
190
|
@click.option(
|
195
191
|
"--enable-heartbeat-daemon/--no-enable-heartbeat-daemon",
|
@@ -229,8 +225,7 @@ def create(
|
|
229
225
|
notify_slack_webhook_url=None,
|
230
226
|
notify_pager_duty_integration_key=None,
|
231
227
|
notify_incident_io_api_key=None,
|
232
|
-
|
233
|
-
incident_io_error_severity_id=None,
|
228
|
+
incident_io_alert_source_config_id=None,
|
234
229
|
enable_heartbeat_daemon=True,
|
235
230
|
deployer_attribute_file=None,
|
236
231
|
enable_error_msg_capture=False,
|
@@ -287,8 +282,7 @@ def create(
|
|
287
282
|
notify_slack_webhook_url,
|
288
283
|
notify_pager_duty_integration_key,
|
289
284
|
notify_incident_io_api_key,
|
290
|
-
|
291
|
-
incident_io_error_severity_id,
|
285
|
+
incident_io_alert_source_config_id,
|
292
286
|
enable_heartbeat_daemon,
|
293
287
|
enable_error_msg_capture,
|
294
288
|
)
|
@@ -464,8 +458,7 @@ def make_flow(
|
|
464
458
|
notify_slack_webhook_url,
|
465
459
|
notify_pager_duty_integration_key,
|
466
460
|
notify_incident_io_api_key,
|
467
|
-
|
468
|
-
incident_io_error_severity_id,
|
461
|
+
incident_io_alert_source_config_id,
|
469
462
|
enable_heartbeat_daemon,
|
470
463
|
enable_error_msg_capture,
|
471
464
|
):
|
@@ -488,19 +481,18 @@ def make_flow(
|
|
488
481
|
"https://api.slack.com/messaging/webhooks to generate a webhook url.\n"
|
489
482
|
" For notifications through PagerDuty, generate an integration key by following the instructions at "
|
490
483
|
"https://support.pagerduty.com/docs/services-and-integrations#create-a-generic-events-api-integration\n"
|
491
|
-
" For notifications through Incident.io, generate an
|
484
|
+
" For notifications through Incident.io, generate an alert source config."
|
492
485
|
)
|
493
486
|
|
494
|
-
if
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
487
|
+
if (
|
488
|
+
(notify_on_error or notify_on_success)
|
489
|
+
and notify_incident_io_api_key
|
490
|
+
and incident_io_alert_source_config_id is None
|
491
|
+
):
|
492
|
+
raise MetaflowException(
|
493
|
+
"Incident.io alerts require an alert source configuration ID. Please set one with --incident-io-alert-source-config-id"
|
494
|
+
)
|
499
495
|
|
500
|
-
if notify_on_success and incident_io_success_severity_id is None:
|
501
|
-
raise MetaflowException(
|
502
|
-
"Incident.io success notifications require a severity id. Please set one with --incident-io-success-severity-id"
|
503
|
-
)
|
504
496
|
# Attach @kubernetes and @environment decorator to the flow to
|
505
497
|
# ensure that the related decorator hooks are invoked.
|
506
498
|
decorators._attach_decorators(
|
@@ -545,8 +537,7 @@ def make_flow(
|
|
545
537
|
notify_slack_webhook_url=notify_slack_webhook_url,
|
546
538
|
notify_pager_duty_integration_key=notify_pager_duty_integration_key,
|
547
539
|
notify_incident_io_api_key=notify_incident_io_api_key,
|
548
|
-
|
549
|
-
incident_io_error_severity_id=incident_io_error_severity_id,
|
540
|
+
incident_io_alert_source_config_id=incident_io_alert_source_config_id,
|
550
541
|
enable_heartbeat_daemon=enable_heartbeat_daemon,
|
551
542
|
enable_error_msg_capture=enable_error_msg_capture,
|
552
543
|
)
|
{metaflow-2.15.3 → metaflow-2.15.5}/metaflow/plugins/argo/argo_workflows_deployer_objects.py
RENAMED
@@ -171,12 +171,16 @@ class ArgoWorkflowsTriggeredRun(TriggeredRun):
|
|
171
171
|
command_obj.sync_wait()
|
172
172
|
return command_obj.process.returncode == 0
|
173
173
|
|
174
|
-
def wait_for_completion(
|
174
|
+
def wait_for_completion(
|
175
|
+
self, check_interval: int = 5, timeout: Optional[int] = None
|
176
|
+
):
|
175
177
|
"""
|
176
178
|
Wait for the workflow to complete or timeout.
|
177
179
|
|
178
180
|
Parameters
|
179
181
|
----------
|
182
|
+
check_interval: int, default: 5
|
183
|
+
Frequency of checking for workflow completion, in seconds.
|
180
184
|
timeout : int, optional, default None
|
181
185
|
Maximum time in seconds to wait for workflow completion.
|
182
186
|
If None, waits indefinitely.
|
@@ -187,7 +191,6 @@ class ArgoWorkflowsTriggeredRun(TriggeredRun):
|
|
187
191
|
If the workflow does not complete within the specified timeout period.
|
188
192
|
"""
|
189
193
|
start_time = time.time()
|
190
|
-
check_interval = 5
|
191
194
|
while self.is_running:
|
192
195
|
if timeout is not None and (time.time() - start_time) > timeout:
|
193
196
|
raise TimeoutError(
|