metaflow 2.13.6__tar.gz → 2.13.8__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.13.6/metaflow.egg-info → metaflow-2.13.8}/PKG-INFO +2 -2
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/decorators.py +6 -2
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/flowspec.py +33 -1
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_config.py +3 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/parameters.py +1 -1
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes_decorator.py +4 -4
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/bootstrap.py +91 -6
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/micromamba.py +16 -9
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/click_api.py +52 -26
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/deployer_impl.py +14 -5
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/metaflow_runner.py +14 -5
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/user_configs/config_options.py +7 -4
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/user_configs/config_parameters.py +7 -7
- metaflow-2.13.8/metaflow/version.py +1 -0
- {metaflow-2.13.6 → metaflow-2.13.8/metaflow.egg-info}/PKG-INFO +2 -2
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow.egg-info/requires.txt +1 -1
- metaflow-2.13.6/metaflow/version.py +0 -1
- {metaflow-2.13.6 → metaflow-2.13.8}/LICENSE +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/MANIFEST.in +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/README.md +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/R.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_bashcomplete.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_compat.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_termui_impl.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_textwrap.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_unicodefun.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_winconsole.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/core.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/decorators.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/exceptions.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/formatting.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/globals.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/parser.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/termui.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/testing.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/types.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_elffile.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_manylinux.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_musllinux.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_parser.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_structures.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/markers.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/py.typed +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/requirements.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/specifiers.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/tags.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/version.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_checkers.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_config.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_decorators.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_functions.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_importhook.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_memo.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_suppression.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_transformer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/py.typed +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typing_extensions.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_5/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_5/zipp.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/zipp.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/zipp.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cards.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_args.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/dump_cmd.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/init_cmd.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/run_cmds.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/step_cmd.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/client/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/client/core.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/client/filecache.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/clone_util.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/configure_cmd.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/develop/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/develop/stub_generator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/develop/stubs.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/main_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/tutorials_cmd.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/util.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd_with_io.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/content_addressed_store.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/datastore_set.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/datastore_storage.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/exceptions.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/flow_datastore.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/inputs.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/task_datastore.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/debug.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/event_logger.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/events.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/exception.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/extension_support/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/extension_support/_empty_file.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/extension_support/cmd.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/extension_support/integrations.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/extension_support/plugins.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/graph.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/includefile.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/info_file.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/integrations.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/lint.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metadata_provider/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metadata_provider/heartbeat.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metadata_provider/metadata.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metadata_provider/util.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_config_funcs.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_current.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_environment.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_profile.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_version.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/mflog/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/mflog/mflog.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/mflog/save_logs.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/mflog/save_logs_periodically.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/mflog/tee.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/monitor.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/multicore_utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/package.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/airflow.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/airflow_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/airflow_utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/dag.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/exception.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_client.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_events.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_workflows.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/capture_error.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/generate_input_paths.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/aws_client.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/aws_utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/batch/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/batch/batch.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/batch/batch_client.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/azure_credential.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/azure_exceptions.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/azure_tail.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/azure_utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/includefile_support.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_client.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_creator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_datastore.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/base.html +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/basic.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/card.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/components.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/main.js +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_resolver.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_server.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/component_serializer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/exception.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/catch_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datastores/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datastores/azure_storage.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datastores/gs_storage.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datastores/local_storage.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datastores/s3_storage.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/local.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/s3/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/s3/s3.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/s3/s3op.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/s3/s3util.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/debug_logger.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/debug_monitor.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/client.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/client_modules.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/communication/channel.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/communication/utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/consts.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/data_transferer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/override_decorators.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/server.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/stub.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/environment_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/events_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/frameworks/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/frameworks/pytorch.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/gs_tail.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/gs_utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/includefile_support.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/spot_metadata_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/logs_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/metadata_providers/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/metadata_providers/local.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/metadata_providers/service.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/package_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/parallel_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/project_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/conda_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/conda_environment.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/pip.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/pypi_environment.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/resources_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/retry_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/secrets/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/storage_executor.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/tag_cli.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/timeout_decorator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/procpoll.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/py.typed +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/pylint_wrapper.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/deployer.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/nbdeploy.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/nbrun.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/subprocess_manager.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runtime.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/sidecar/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/sidecar/sidecar.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/sidecar/sidecar_messages.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/sidecar/sidecar_subprocess.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/sidecar/sidecar_worker.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/system/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/system/system_logger.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/system/system_monitor.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/system/system_utils.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tagging_util.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/task.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tracing/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tracing/propagator.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tracing/span_exporter.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tracing/tracing_modules.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tuple_util.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/00-helloworld/README.md +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/01-playlist/README.md +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/01-playlist/movies.csv +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/01-playlist/playlist.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/02-statistics/README.md +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/02-statistics/movies.csv +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/02-statistics/stats.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/07-worldview/README.md +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/08-autopilot/README.md +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/unbounded_foreach.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/user_configs/__init__.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/user_configs/config_decorators.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/util.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/vendor.py +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow.egg-info/SOURCES.txt +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow.egg-info/dependency_links.txt +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow.egg-info/entry_points.txt +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/metaflow.egg-info/top_level.txt +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/setup.cfg +0 -0
- {metaflow-2.13.6 → metaflow-2.13.8}/setup.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: metaflow
|
3
|
-
Version: 2.13.
|
3
|
+
Version: 2.13.8
|
4
4
|
Summary: Metaflow: More Data Science, Less Engineering
|
5
5
|
Author: Metaflow Developers
|
6
6
|
Author-email: help@metaflow.org
|
@@ -26,7 +26,7 @@ License-File: LICENSE
|
|
26
26
|
Requires-Dist: requests
|
27
27
|
Requires-Dist: boto3
|
28
28
|
Provides-Extra: stubs
|
29
|
-
Requires-Dist: metaflow-stubs==2.13.
|
29
|
+
Requires-Dist: metaflow-stubs==2.13.8; extra == "stubs"
|
30
30
|
Dynamic: author
|
31
31
|
Dynamic: author-email
|
32
32
|
Dynamic: classifier
|
@@ -591,9 +591,13 @@ def _init_flow_decorators(
|
|
591
591
|
)
|
592
592
|
else:
|
593
593
|
# Each "non-multiple" flow decorator is only allowed to have one set of options
|
594
|
+
# Note that there may be no deco_options if a MutableFlow config injected
|
595
|
+
# the decorator.
|
594
596
|
deco_flow_init_options = {
|
595
|
-
option: deco_options
|
596
|
-
|
597
|
+
option: deco_options.get(
|
598
|
+
option.replace("-", "_"), option_info["default"]
|
599
|
+
)
|
600
|
+
for option, option_info in deco.options.items()
|
597
601
|
}
|
598
602
|
for deco in decorators:
|
599
603
|
deco.flow_init(
|
@@ -86,6 +86,11 @@ class FlowSpecMeta(type):
|
|
86
86
|
super().__init__(name, bases, attrs)
|
87
87
|
if name == "FlowSpec":
|
88
88
|
return
|
89
|
+
|
90
|
+
from .decorators import (
|
91
|
+
DuplicateFlowDecoratorException,
|
92
|
+
) # Prevent circular import
|
93
|
+
|
89
94
|
# We store some state in the flow class itself. This is primarily used to
|
90
95
|
# attach global state to a flow. It is *not* an actual global because of
|
91
96
|
# Runner/NBRunner. This is also created here in the meta class to avoid it being
|
@@ -98,6 +103,31 @@ class FlowSpecMeta(type):
|
|
98
103
|
# Keys are _FlowState enum values
|
99
104
|
cls._flow_state = {}
|
100
105
|
|
106
|
+
# We inherit stuff from our parent classes as well -- we need to be careful
|
107
|
+
# in terms of the order; we will follow the MRO with the following rules:
|
108
|
+
# - decorators (cls._flow_decorators) will cause an error if they do not
|
109
|
+
# support multiple and we see multiple instances of the same
|
110
|
+
# - config decorators will be joined
|
111
|
+
# - configs will be added later directly by the class; base class configs will
|
112
|
+
# be taken into account as they would be inherited.
|
113
|
+
|
114
|
+
# We only need to do this for the base classes since the current class will
|
115
|
+
# get updated as decorators are parsed.
|
116
|
+
for base in cls.__mro__:
|
117
|
+
if base != cls and base != FlowSpec and issubclass(base, FlowSpec):
|
118
|
+
# Take care of decorators
|
119
|
+
for deco_name, deco in base._flow_decorators.items():
|
120
|
+
if deco_name in cls._flow_decorators and not deco.allow_multiple:
|
121
|
+
raise DuplicateFlowDecoratorException(deco_name)
|
122
|
+
cls._flow_decorators.setdefault(deco_name, []).extend(deco)
|
123
|
+
|
124
|
+
# Take care of configs and config decorators
|
125
|
+
base_configs = base._flow_state.get(_FlowState.CONFIG_DECORATORS)
|
126
|
+
if base_configs:
|
127
|
+
cls._flow_state.setdefault(_FlowState.CONFIG_DECORATORS, []).extend(
|
128
|
+
base_configs
|
129
|
+
)
|
130
|
+
|
101
131
|
cls._init_attrs()
|
102
132
|
|
103
133
|
def _init_attrs(cls):
|
@@ -196,7 +226,9 @@ class FlowSpec(metaclass=FlowSpecMeta):
|
|
196
226
|
def _process_config_decorators(cls, config_options, ignore_errors=False):
|
197
227
|
|
198
228
|
# Fast path for no user configurations
|
199
|
-
if not cls._flow_state.get(_FlowState.CONFIG_DECORATORS)
|
229
|
+
if not cls._flow_state.get(_FlowState.CONFIG_DECORATORS) and all(
|
230
|
+
len(step.config_decorators) == 0 for step in cls._steps
|
231
|
+
):
|
200
232
|
# Process parameters to allow them to also use config values easily
|
201
233
|
for var, param in cls._get_parameters():
|
202
234
|
if param.IS_CONFIG_PARAMETER:
|
@@ -433,6 +433,9 @@ CONDA_PACKAGE_GSROOT = from_conf("CONDA_PACKAGE_GSROOT")
|
|
433
433
|
# should result in an appreciable speedup in flow environment initialization.
|
434
434
|
CONDA_DEPENDENCY_RESOLVER = from_conf("CONDA_DEPENDENCY_RESOLVER", "conda")
|
435
435
|
|
436
|
+
# Default to not using fast init binary.
|
437
|
+
CONDA_USE_FAST_INIT = from_conf("CONDA_USE_FAST_INIT", False)
|
438
|
+
|
436
439
|
###
|
437
440
|
# Escape hatch configuration
|
438
441
|
###
|
@@ -316,7 +316,7 @@ class Parameter(object):
|
|
316
316
|
help : str, optional, default None
|
317
317
|
Help text to show in `run --help`.
|
318
318
|
required : bool, optional, default None
|
319
|
-
Require that the user
|
319
|
+
Require that the user specifies a value for the parameter. Note that if
|
320
320
|
a default is provide, the required flag is ignored.
|
321
321
|
A value of None is equivalent to False.
|
322
322
|
show_default : bool, optional, default None
|
@@ -600,10 +600,10 @@ class KubernetesDecorator(StepDecorator):
|
|
600
600
|
# local file system after the user code has finished execution.
|
601
601
|
# This happens via datastore as a communication bridge.
|
602
602
|
|
603
|
-
# TODO: There is no guarantee that
|
604
|
-
# task_finished is invoked.
|
605
|
-
#
|
606
|
-
if self.metadata.TYPE == "local":
|
603
|
+
# TODO: There is no guarantee that task_pre_step executes before
|
604
|
+
# task_finished is invoked.
|
605
|
+
# For now we guard against the missing metadata object in this case.
|
606
|
+
if hasattr(self, "metadata") and self.metadata.TYPE == "local":
|
607
607
|
# Note that the datastore is *always* Amazon S3 (see
|
608
608
|
# runtime_task_created function).
|
609
609
|
sync_local_metadata_to_datastore(
|
@@ -10,7 +10,7 @@ import tarfile
|
|
10
10
|
import time
|
11
11
|
from urllib.error import URLError
|
12
12
|
from urllib.request import urlopen
|
13
|
-
from metaflow.metaflow_config import DATASTORE_LOCAL_DIR
|
13
|
+
from metaflow.metaflow_config import DATASTORE_LOCAL_DIR, CONDA_USE_FAST_INIT
|
14
14
|
from metaflow.plugins import DATASTORES
|
15
15
|
from metaflow.plugins.pypi.utils import MICROMAMBA_MIRROR_URL, MICROMAMBA_URL
|
16
16
|
from metaflow.util import which
|
@@ -19,6 +19,8 @@ import warnings
|
|
19
19
|
|
20
20
|
from . import MAGIC_FILE, _datastore_packageroot
|
21
21
|
|
22
|
+
FAST_INIT_BIN_URL = "https://fast-flow-init.outerbounds.sh/{platform}/fast-env-0.1.1.gz"
|
23
|
+
|
22
24
|
# Bootstraps a valid conda virtual environment composed of conda and pypi packages
|
23
25
|
|
24
26
|
|
@@ -58,9 +60,14 @@ if __name__ == "__main__":
|
|
58
60
|
# fi
|
59
61
|
# fi
|
60
62
|
|
61
|
-
def run_cmd(cmd):
|
63
|
+
def run_cmd(cmd, stdin_str=None):
|
62
64
|
result = subprocess.run(
|
63
|
-
cmd,
|
65
|
+
cmd,
|
66
|
+
shell=True,
|
67
|
+
input=stdin_str,
|
68
|
+
stdout=subprocess.PIPE,
|
69
|
+
stderr=subprocess.PIPE,
|
70
|
+
text=True,
|
64
71
|
)
|
65
72
|
if result.returncode != 0:
|
66
73
|
print(f"Bootstrap failed while executing: {cmd}")
|
@@ -68,6 +75,58 @@ if __name__ == "__main__":
|
|
68
75
|
print("Stderr:", result.stderr)
|
69
76
|
sys.exit(1)
|
70
77
|
|
78
|
+
@timer
|
79
|
+
def install_fast_initializer(architecture):
|
80
|
+
import gzip
|
81
|
+
|
82
|
+
fast_initializer_path = os.path.join(
|
83
|
+
os.getcwd(), "fast-initializer", "bin", "fast-initializer"
|
84
|
+
)
|
85
|
+
|
86
|
+
if which("fast-initializer"):
|
87
|
+
return which("fast-initializer")
|
88
|
+
if os.path.exists(fast_initializer_path):
|
89
|
+
os.environ["PATH"] += os.pathsep + os.path.dirname(fast_initializer_path)
|
90
|
+
return fast_initializer_path
|
91
|
+
|
92
|
+
url = FAST_INIT_BIN_URL.format(platform=architecture)
|
93
|
+
|
94
|
+
# Prepare directory once
|
95
|
+
os.makedirs(os.path.dirname(fast_initializer_path), exist_ok=True)
|
96
|
+
|
97
|
+
# Download and decompress in one go
|
98
|
+
def _download_and_extract(url):
|
99
|
+
headers = {
|
100
|
+
"Accept-Encoding": "gzip, deflate, br",
|
101
|
+
"Connection": "keep-alive",
|
102
|
+
"User-Agent": "python-urllib",
|
103
|
+
}
|
104
|
+
|
105
|
+
max_retries = 3
|
106
|
+
for attempt in range(max_retries):
|
107
|
+
try:
|
108
|
+
req = Request(url, headers=headers)
|
109
|
+
with urlopen(req) as response:
|
110
|
+
with gzip.GzipFile(fileobj=response) as gz:
|
111
|
+
with open(fast_initializer_path, "wb") as f:
|
112
|
+
f.write(gz.read())
|
113
|
+
break
|
114
|
+
except (URLError, IOError) as e:
|
115
|
+
if attempt == max_retries - 1:
|
116
|
+
raise Exception(
|
117
|
+
f"Failed to download fast-initializer after {max_retries} attempts: {e}"
|
118
|
+
)
|
119
|
+
time.sleep(2**attempt)
|
120
|
+
|
121
|
+
_download_and_extract(url)
|
122
|
+
|
123
|
+
# Set executable permission
|
124
|
+
os.chmod(fast_initializer_path, 0o755)
|
125
|
+
|
126
|
+
# Update PATH only once at the end
|
127
|
+
os.environ["PATH"] += os.pathsep + os.path.dirname(fast_initializer_path)
|
128
|
+
return fast_initializer_path
|
129
|
+
|
71
130
|
@timer
|
72
131
|
def install_micromamba(architecture):
|
73
132
|
micromamba_dir = os.path.join(os.getcwd(), "micromamba")
|
@@ -268,6 +327,29 @@ if __name__ == "__main__":
|
|
268
327
|
# wait for conda environment to be created
|
269
328
|
futures["conda_env"].result()
|
270
329
|
|
330
|
+
@timer
|
331
|
+
def fast_setup_environment(architecture, storage, env, prefix, pkgs_dir):
|
332
|
+
install_fast_initializer(architecture)
|
333
|
+
|
334
|
+
# Get package urls
|
335
|
+
conda_pkgs = env["conda"]
|
336
|
+
pypi_pkgs = env.get("pypi", [])
|
337
|
+
conda_pkg_urls = [package["path"] for package in conda_pkgs]
|
338
|
+
pypi_pkg_urls = [package["path"] for package in pypi_pkgs]
|
339
|
+
|
340
|
+
# Create string with package URLs
|
341
|
+
all_package_urls = ""
|
342
|
+
for url in conda_pkg_urls:
|
343
|
+
all_package_urls += f"{storage.datastore_root}/{url}\n"
|
344
|
+
all_package_urls += "---\n"
|
345
|
+
for url in pypi_pkg_urls:
|
346
|
+
all_package_urls += f"{storage.datastore_root}/{url}\n"
|
347
|
+
|
348
|
+
# Initialize environment
|
349
|
+
# NOTE: For the time being the fast-initializer only works for the S3 datastore implementation
|
350
|
+
cmd = f"fast-initializer --prefix {prefix} --packages-dir {pkgs_dir}"
|
351
|
+
run_cmd(cmd, all_package_urls)
|
352
|
+
|
271
353
|
if len(sys.argv) != 5:
|
272
354
|
print("Usage: bootstrap.py <flow_name> <id> <datastore_type> <architecture>")
|
273
355
|
sys.exit(1)
|
@@ -299,9 +381,12 @@ if __name__ == "__main__":
|
|
299
381
|
with open(os.path.join(manifest_dir, MAGIC_FILE)) as f:
|
300
382
|
env = json.load(f)[id_][architecture]
|
301
383
|
|
302
|
-
|
303
|
-
architecture, storage, env, prefix,
|
304
|
-
|
384
|
+
if CONDA_USE_FAST_INIT:
|
385
|
+
fast_setup_environment(architecture, storage, env, prefix, pkgs_dir)
|
386
|
+
else:
|
387
|
+
setup_environment(
|
388
|
+
architecture, storage, env, prefix, conda_pkgs_dir, pypi_pkgs_dir
|
389
|
+
)
|
305
390
|
|
306
391
|
except Exception as e:
|
307
392
|
print(f"Error: {str(e)}", file=sys.stderr)
|
@@ -37,7 +37,7 @@ class Micromamba(object):
|
|
37
37
|
_home = os.environ.get("METAFLOW_TOKEN_HOME")
|
38
38
|
else:
|
39
39
|
_home = os.environ.get("METAFLOW_HOME", "~/.metaflowconfig")
|
40
|
-
_path_to_hidden_micromamba = os.path.join(
|
40
|
+
self._path_to_hidden_micromamba = os.path.join(
|
41
41
|
os.path.expanduser(_home),
|
42
42
|
"micromamba",
|
43
43
|
)
|
@@ -47,19 +47,26 @@ class Micromamba(object):
|
|
47
47
|
else:
|
48
48
|
self.logger = lambda *args, **kwargs: None # No-op logger if not provided
|
49
49
|
|
50
|
-
self.
|
50
|
+
self._bin = (
|
51
51
|
which(os.environ.get("METAFLOW_PATH_TO_MICROMAMBA") or "micromamba")
|
52
52
|
or which("./micromamba") # to support remote execution
|
53
53
|
or which("./bin/micromamba")
|
54
|
-
or which(os.path.join(_path_to_hidden_micromamba, "bin/micromamba"))
|
54
|
+
or which(os.path.join(self._path_to_hidden_micromamba, "bin/micromamba"))
|
55
55
|
)
|
56
|
-
if self.bin is None:
|
57
|
-
# Install Micromamba on the fly.
|
58
|
-
# TODO: Make this optional at some point.
|
59
|
-
_install_micromamba(_path_to_hidden_micromamba)
|
60
|
-
self.bin = which(os.path.join(_path_to_hidden_micromamba, "bin/micromamba"))
|
61
56
|
|
62
|
-
|
57
|
+
@property
|
58
|
+
def bin(self):
|
59
|
+
"Defer installing Micromamba until when the binary path is actually requested"
|
60
|
+
if self._bin is not None:
|
61
|
+
return self._bin
|
62
|
+
# Install Micromamba on the fly.
|
63
|
+
# TODO: Make this optional at some point.
|
64
|
+
_install_micromamba(self._path_to_hidden_micromamba)
|
65
|
+
self._bin = which(
|
66
|
+
os.path.join(self._path_to_hidden_micromamba, "bin/micromamba")
|
67
|
+
)
|
68
|
+
|
69
|
+
if self._bin is None:
|
63
70
|
msg = "No installation for *Micromamba* found.\n"
|
64
71
|
msg += "Visit https://mamba.readthedocs.io/en/latest/micromamba-installation.html for installation instructions."
|
65
72
|
raise MetaflowException(msg)
|
@@ -16,7 +16,7 @@ import itertools
|
|
16
16
|
import uuid
|
17
17
|
import json
|
18
18
|
from collections import OrderedDict
|
19
|
-
from typing import Any, Callable, Dict, List, Optional
|
19
|
+
from typing import Any, Callable, Dict, List, Optional, Type
|
20
20
|
from typing import OrderedDict as TOrderedDict
|
21
21
|
from typing import Tuple as TTuple
|
22
22
|
from typing import Union
|
@@ -96,8 +96,13 @@ def _method_sanity_check(
|
|
96
96
|
check_type(supplied_v, annotations[supplied_k])
|
97
97
|
except TypeCheckError:
|
98
98
|
raise TypeError(
|
99
|
-
"Invalid type for '%s', expected: '%s', default is '%s'"
|
100
|
-
% (
|
99
|
+
"Invalid type for '%s' (%s), expected: '%s', default is '%s'"
|
100
|
+
% (
|
101
|
+
supplied_k,
|
102
|
+
type(supplied_k),
|
103
|
+
annotations[supplied_k],
|
104
|
+
defaults[supplied_k],
|
105
|
+
)
|
101
106
|
)
|
102
107
|
|
103
108
|
# Clean up values to make them into what click expects
|
@@ -184,26 +189,35 @@ def _lazy_load_command(
|
|
184
189
|
raise AttributeError()
|
185
190
|
|
186
191
|
|
187
|
-
def get_annotation(param:
|
192
|
+
def get_annotation(param: click.Parameter) -> TTuple[Type, bool]:
|
188
193
|
py_type = click_to_python_types[type(param.type)]
|
194
|
+
if param.nargs == -1:
|
195
|
+
# This is the equivalent of *args effectively
|
196
|
+
# so the type annotation should be the type of the
|
197
|
+
# elements in the list
|
198
|
+
return py_type, True
|
189
199
|
if not param.required:
|
190
|
-
if param.multiple or param.nargs
|
191
|
-
return Optional[List[py_type]]
|
200
|
+
if param.multiple or param.nargs > 1:
|
201
|
+
return Optional[Union[List[py_type], TTuple[py_type]]], False
|
192
202
|
else:
|
193
|
-
return Optional[py_type]
|
203
|
+
return Optional[py_type], False
|
194
204
|
else:
|
195
|
-
if param.multiple or param.nargs
|
196
|
-
return List[py_type]
|
205
|
+
if param.multiple or param.nargs > 1:
|
206
|
+
return Union[List[py_type], TTuple[py_type]], False
|
197
207
|
else:
|
198
|
-
return py_type
|
208
|
+
return py_type, False
|
199
209
|
|
200
210
|
|
201
211
|
def get_inspect_param_obj(p: Union[click.Argument, click.Option], kind: str):
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
212
|
+
annotation, is_vararg = get_annotation(p)
|
213
|
+
return (
|
214
|
+
inspect.Parameter(
|
215
|
+
name="args" if is_vararg else p.name,
|
216
|
+
kind=inspect.Parameter.VAR_POSITIONAL if is_vararg else kind,
|
217
|
+
default=inspect.Parameter.empty if is_vararg else p.default,
|
218
|
+
annotation=annotation,
|
219
|
+
),
|
220
|
+
annotation,
|
207
221
|
)
|
208
222
|
|
209
223
|
|
@@ -224,21 +238,29 @@ def extract_flow_class_from_file(flow_file: str) -> FlowSpec:
|
|
224
238
|
path_was_added = True
|
225
239
|
|
226
240
|
try:
|
241
|
+
# Get module name from the file path
|
242
|
+
module_name = os.path.splitext(os.path.basename(flow_file))[0]
|
243
|
+
|
227
244
|
# Check if the module has already been loaded
|
228
245
|
if flow_file in loaded_modules:
|
229
246
|
module = loaded_modules[flow_file]
|
230
247
|
else:
|
231
248
|
# Load the module if it's not already loaded
|
232
|
-
spec = importlib.util.spec_from_file_location(
|
249
|
+
spec = importlib.util.spec_from_file_location(module_name, flow_file)
|
233
250
|
module = importlib.util.module_from_spec(spec)
|
234
251
|
spec.loader.exec_module(module)
|
235
252
|
# Cache the loaded module
|
236
253
|
loaded_modules[flow_file] = module
|
237
|
-
classes = inspect.getmembers(module, inspect.isclass)
|
238
254
|
|
255
|
+
classes = inspect.getmembers(module, inspect.isclass)
|
239
256
|
flow_cls = None
|
257
|
+
|
240
258
|
for _, kls in classes:
|
241
|
-
if
|
259
|
+
if (
|
260
|
+
kls is not FlowSpec
|
261
|
+
and kls.__module__ == module_name
|
262
|
+
and issubclass(kls, FlowSpec)
|
263
|
+
):
|
242
264
|
if flow_cls is not None:
|
243
265
|
raise MetaflowException(
|
244
266
|
"Multiple FlowSpec classes found in %s" % flow_file
|
@@ -319,7 +341,7 @@ class MetaflowAPI(object):
|
|
319
341
|
defaults,
|
320
342
|
) = extract_all_params(cli_collection)
|
321
343
|
|
322
|
-
def _method(_self, **kwargs):
|
344
|
+
def _method(_self, *args, **kwargs):
|
323
345
|
method_params = _method_sanity_check(
|
324
346
|
possible_arg_params,
|
325
347
|
possible_opt_params,
|
@@ -371,6 +393,8 @@ class MetaflowAPI(object):
|
|
371
393
|
else:
|
372
394
|
components.append(v)
|
373
395
|
for k, v in options.items():
|
396
|
+
if v is None:
|
397
|
+
continue
|
374
398
|
if isinstance(v, list):
|
375
399
|
for i in v:
|
376
400
|
if isinstance(i, tuple):
|
@@ -379,6 +403,9 @@ class MetaflowAPI(object):
|
|
379
403
|
else:
|
380
404
|
components.append("--%s" % k)
|
381
405
|
components.append(str(i))
|
406
|
+
elif v is None:
|
407
|
+
continue # Skip None values -- they are defaults and converting
|
408
|
+
# them to string will not be what the user wants
|
382
409
|
else:
|
383
410
|
components.append("--%s" % k)
|
384
411
|
if v != "flag":
|
@@ -490,17 +517,16 @@ def extract_all_params(cmd_obj: Union[click.Command, click.Group]):
|
|
490
517
|
|
491
518
|
for each_param in cmd_obj.params:
|
492
519
|
if isinstance(each_param, click.Argument):
|
493
|
-
arg_params_sigs[each_param.name] =
|
494
|
-
each_param, inspect.Parameter.POSITIONAL_ONLY
|
520
|
+
arg_params_sigs[each_param.name], annotations[each_param.name] = (
|
521
|
+
get_inspect_param_obj(each_param, inspect.Parameter.POSITIONAL_ONLY)
|
495
522
|
)
|
496
523
|
arg_parameters[each_param.name] = each_param
|
497
524
|
elif isinstance(each_param, click.Option):
|
498
|
-
opt_params_sigs[each_param.name] =
|
499
|
-
each_param, inspect.Parameter.KEYWORD_ONLY
|
525
|
+
opt_params_sigs[each_param.name], annotations[each_param.name] = (
|
526
|
+
get_inspect_param_obj(each_param, inspect.Parameter.KEYWORD_ONLY)
|
500
527
|
)
|
501
528
|
opt_parameters[each_param.name] = each_param
|
502
529
|
|
503
|
-
annotations[each_param.name] = get_annotation(each_param)
|
504
530
|
defaults[each_param.name] = each_param.default
|
505
531
|
|
506
532
|
# first, fill in positional arguments
|
@@ -537,7 +563,7 @@ def extract_group(cmd_obj: click.Group, flow_parameters: List[Parameter]) -> Cal
|
|
537
563
|
defaults,
|
538
564
|
) = extract_all_params(cmd_obj)
|
539
565
|
|
540
|
-
def _method(_self, **kwargs):
|
566
|
+
def _method(_self, *args, **kwargs):
|
541
567
|
method_params = _method_sanity_check(
|
542
568
|
possible_arg_params, possible_opt_params, annotations, defaults, **kwargs
|
543
569
|
)
|
@@ -570,7 +596,7 @@ def extract_command(
|
|
570
596
|
defaults,
|
571
597
|
) = extract_all_params(cmd_obj)
|
572
598
|
|
573
|
-
def _method(_self, **kwargs):
|
599
|
+
def _method(_self, *args, **kwargs):
|
574
600
|
method_params = _method_sanity_check(
|
575
601
|
possible_arg_params, possible_opt_params, annotations, defaults, **kwargs
|
576
602
|
)
|
@@ -63,11 +63,20 @@ class DeployerImpl(object):
|
|
63
63
|
|
64
64
|
from metaflow.parameters import flow_context
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
66
|
+
# Reload the CLI with an "empty" flow -- this will remove any configuration
|
67
|
+
# and parameter options. They are re-added in from_cli (called below).
|
68
|
+
to_reload = [
|
69
|
+
"metaflow.cli",
|
70
|
+
"metaflow.cli_components.run_cmds",
|
71
|
+
"metaflow.cli_components.init_cmd",
|
72
|
+
]
|
73
|
+
with flow_context(None):
|
74
|
+
[
|
75
|
+
importlib.reload(sys.modules[module])
|
76
|
+
for module in to_reload
|
77
|
+
if module in sys.modules
|
78
|
+
]
|
79
|
+
|
71
80
|
from metaflow.cli import start
|
72
81
|
from metaflow.runner.click_api import MetaflowAPI
|
73
82
|
|
@@ -269,11 +269,20 @@ class Runner(metaclass=RunnerMeta):
|
|
269
269
|
|
270
270
|
from metaflow.parameters import flow_context
|
271
271
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
272
|
+
# Reload the CLI with an "empty" flow -- this will remove any configuration
|
273
|
+
# and parameter options. They are re-added in from_cli (called below).
|
274
|
+
to_reload = [
|
275
|
+
"metaflow.cli",
|
276
|
+
"metaflow.cli_components.run_cmds",
|
277
|
+
"metaflow.cli_components.init_cmd",
|
278
|
+
]
|
279
|
+
with flow_context(None):
|
280
|
+
[
|
281
|
+
importlib.reload(sys.modules[module])
|
282
|
+
for module in to_reload
|
283
|
+
if module in sys.modules
|
284
|
+
]
|
285
|
+
|
277
286
|
from metaflow.cli import start
|
278
287
|
from metaflow.runner.click_api import MetaflowAPI
|
279
288
|
|
@@ -169,7 +169,7 @@ class ConfigInput:
|
|
169
169
|
"Please contact support."
|
170
170
|
)
|
171
171
|
cls.loaded_configs = all_configs
|
172
|
-
return cls.loaded_configs
|
172
|
+
return cls.loaded_configs[config_name]
|
173
173
|
|
174
174
|
def process_configs(
|
175
175
|
self,
|
@@ -326,6 +326,8 @@ class ConfigInput:
|
|
326
326
|
for name, val in merged_configs.items():
|
327
327
|
if val is None:
|
328
328
|
missing_configs.add(name)
|
329
|
+
to_return[name] = None
|
330
|
+
flow_cls._flow_state[_FlowState.CONFIGS][name] = None
|
329
331
|
continue
|
330
332
|
if val.startswith(_CONVERTED_DEFAULT_NO_FILE):
|
331
333
|
no_default_file.append(name)
|
@@ -339,15 +341,16 @@ class ConfigInput:
|
|
339
341
|
val = val[len(_DEFAULT_PREFIX) :]
|
340
342
|
if val.startswith("kv."):
|
341
343
|
# This means to load it from a file
|
342
|
-
|
343
|
-
|
344
|
+
try:
|
345
|
+
read_value = self.get_config(val[3:])
|
346
|
+
except KeyError as e:
|
344
347
|
exc = click.UsageError(
|
345
348
|
"Could not find configuration '%s' in INFO file" % val
|
346
349
|
)
|
347
350
|
if click_obj:
|
348
351
|
click_obj.delayed_config_exception = exc
|
349
352
|
return None
|
350
|
-
raise exc
|
353
|
+
raise exc from e
|
351
354
|
flow_cls._flow_state[_FlowState.CONFIGS][name] = read_value
|
352
355
|
to_return[name] = ConfigValue(read_value)
|
353
356
|
else:
|
@@ -290,17 +290,17 @@ class Config(Parameter, collections.abc.Mapping):
|
|
290
290
|
default : Union[str, Callable[[ParameterContext], str], optional, default None
|
291
291
|
Default path from where to read this configuration. A function implies that the
|
292
292
|
value will be computed using that function.
|
293
|
-
You can only specify default or default_value.
|
293
|
+
You can only specify default or default_value, not both.
|
294
294
|
default_value : Union[str, Dict[str, Any], Callable[[ParameterContext, Union[str, Dict[str, Any]]], Any], optional, default None
|
295
295
|
Default value for the parameter. A function
|
296
296
|
implies that the value will be computed using that function.
|
297
|
-
You can only specify default or default_value.
|
297
|
+
You can only specify default or default_value, not both.
|
298
298
|
help : str, optional, default None
|
299
299
|
Help text to show in `run --help`.
|
300
300
|
required : bool, optional, default None
|
301
|
-
Require that the user
|
302
|
-
a default is provided, the required flag is ignored.
|
303
|
-
equivalent to False.
|
301
|
+
Require that the user specifies a value for the configuration. Note that if
|
302
|
+
a default or default_value is provided, the required flag is ignored.
|
303
|
+
A value of None is equivalent to False.
|
304
304
|
parser : Union[str, Callable[[str], Dict[Any, Any]]], optional, default None
|
305
305
|
If a callable, it is a function that can parse the configuration string
|
306
306
|
into an arbitrarily nested dictionary. If a string, the string should refer to
|
@@ -330,13 +330,13 @@ class Config(Parameter, collections.abc.Mapping):
|
|
330
330
|
**kwargs: Dict[str, str]
|
331
331
|
):
|
332
332
|
|
333
|
-
if default and default_value:
|
333
|
+
if default is not None and default_value is not None:
|
334
334
|
raise MetaflowException(
|
335
335
|
"For config '%s', you can only specify default or default_value, not both"
|
336
336
|
% name
|
337
337
|
)
|
338
338
|
self._default_is_file = default is not None
|
339
|
-
kwargs["default"] = default
|
339
|
+
kwargs["default"] = default if default is not None else default_value
|
340
340
|
super(Config, self).__init__(
|
341
341
|
name, required=required, help=help, type=str, **kwargs
|
342
342
|
)
|
@@ -0,0 +1 @@
|
|
1
|
+
metaflow_version = "2.13.8"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: metaflow
|
3
|
-
Version: 2.13.
|
3
|
+
Version: 2.13.8
|
4
4
|
Summary: Metaflow: More Data Science, Less Engineering
|
5
5
|
Author: Metaflow Developers
|
6
6
|
Author-email: help@metaflow.org
|
@@ -26,7 +26,7 @@ License-File: LICENSE
|
|
26
26
|
Requires-Dist: requests
|
27
27
|
Requires-Dist: boto3
|
28
28
|
Provides-Extra: stubs
|
29
|
-
Requires-Dist: metaflow-stubs==2.13.
|
29
|
+
Requires-Dist: metaflow-stubs==2.13.8; extra == "stubs"
|
30
30
|
Dynamic: author
|
31
31
|
Dynamic: author-email
|
32
32
|
Dynamic: classifier
|
@@ -1 +0,0 @@
|
|
1
|
-
metaflow_version = "2.13.6"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|