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

|
32
32
|
|
@@ -42,14 +42,8 @@ If you have any questions, feel free to post a bug report/question on the
|
|
42
42
|
Metaflow GitHub page.
|
43
43
|
"""
|
44
44
|
|
45
|
-
import
|
45
|
+
import os
|
46
46
|
import sys
|
47
|
-
import types
|
48
|
-
|
49
|
-
from os import path
|
50
|
-
|
51
|
-
CURRENT_DIRECTORY = path.dirname(path.abspath(__file__))
|
52
|
-
INFO_FILE = path.join(path.dirname(CURRENT_DIRECTORY), "INFO")
|
53
47
|
|
54
48
|
from metaflow.extension_support import (
|
55
49
|
alias_submodules,
|
@@ -61,7 +55,6 @@ from metaflow.extension_support import (
|
|
61
55
|
_ext_debug,
|
62
56
|
)
|
63
57
|
|
64
|
-
|
65
58
|
# We load the module overrides *first* explicitly. Non overrides can be loaded
|
66
59
|
# in toplevel as well but these can be loaded first if needed. Note that those
|
67
60
|
# modules should be careful not to include anything in Metaflow at their top-level
|
@@ -79,9 +72,14 @@ try:
|
|
79
72
|
)
|
80
73
|
tl_module = m.module.__dict__.get("toplevel", None)
|
81
74
|
if tl_module is not None:
|
82
|
-
_tl_modules.append(
|
75
|
+
_tl_modules.append(
|
76
|
+
(
|
77
|
+
m.package_name,
|
78
|
+
".".join([EXT_PKG, m.tl_package, "toplevel", tl_module]),
|
79
|
+
)
|
80
|
+
)
|
83
81
|
_ext_debug("Got overrides to load: %s" % _override_modules)
|
84
|
-
_ext_debug("Got top-level imports: %s" % _tl_modules)
|
82
|
+
_ext_debug("Got top-level imports: %s" % str(_tl_modules))
|
85
83
|
except Exception as e:
|
86
84
|
_ext_debug("Error in importing toplevel/overrides: %s" % e)
|
87
85
|
|
@@ -153,9 +151,9 @@ if sys.version_info >= (3, 7):
|
|
153
151
|
from .runner.deployer import Deployer
|
154
152
|
from .runner.nbdeploy import NBDeployer
|
155
153
|
|
156
|
-
|
154
|
+
__ext_tl_modules__ = []
|
157
155
|
_ext_debug("Loading top-level modules")
|
158
|
-
for m in _tl_modules:
|
156
|
+
for pkg_name, m in _tl_modules:
|
159
157
|
extension_module = load_module(m)
|
160
158
|
if extension_module:
|
161
159
|
tl_package = m.split(".")[1]
|
@@ -163,15 +161,7 @@ for m in _tl_modules:
|
|
163
161
|
lazy_load_aliases(
|
164
162
|
alias_submodules(extension_module, tl_package, None, extra_indent=True)
|
165
163
|
)
|
166
|
-
|
167
|
-
if extension_module.__version__:
|
168
|
-
version_info = "%s(%s)" % (version_info, extension_module.__version__)
|
169
|
-
__version_addl__.append(version_info)
|
170
|
-
|
171
|
-
if __version_addl__:
|
172
|
-
__version_addl__ = ";".join(__version_addl__)
|
173
|
-
else:
|
174
|
-
__version_addl__ = None
|
164
|
+
__ext_tl_modules__.append((pkg_name, extension_module))
|
175
165
|
|
176
166
|
# Erase all temporary names to avoid leaking things
|
177
167
|
for _n in [
|
@@ -34,7 +34,7 @@ from metaflow.plugins import ENVIRONMENTS, METADATA_PROVIDERS
|
|
34
34
|
from metaflow.unbounded_foreach import CONTROL_TASK_TAG
|
35
35
|
from metaflow.util import cached_property, is_stringish, resolve_identity, to_unicode
|
36
36
|
|
37
|
-
from .. import INFO_FILE
|
37
|
+
from ..info_file import INFO_FILE
|
38
38
|
from .filecache import FileCache
|
39
39
|
|
40
40
|
try:
|
@@ -84,12 +84,13 @@ def start(ctx):
|
|
84
84
|
|
85
85
|
import metaflow
|
86
86
|
|
87
|
+
version = get_version()
|
87
88
|
echo("Metaflow ", fg="magenta", bold=True, nl=False)
|
88
89
|
|
89
90
|
if ctx.invoked_subcommand is None:
|
90
|
-
echo("(%s): " %
|
91
|
+
echo("(%s): " % version, fg="magenta", bold=False, nl=False)
|
91
92
|
else:
|
92
|
-
echo("(%s)\n" %
|
93
|
+
echo("(%s)\n" % version, fg="magenta", bold=False)
|
93
94
|
|
94
95
|
if ctx.invoked_subcommand is None:
|
95
96
|
echo("More data science, less engineering\n", fg="magenta")
|
@@ -1,7 +1,6 @@
|
|
1
1
|
from __future__ import print_function
|
2
2
|
|
3
3
|
import importlib
|
4
|
-
import json
|
5
4
|
import os
|
6
5
|
import re
|
7
6
|
import sys
|
@@ -11,6 +10,10 @@ from collections import defaultdict, namedtuple
|
|
11
10
|
|
12
11
|
from importlib.abc import MetaPathFinder, Loader
|
13
12
|
from itertools import chain
|
13
|
+
from pathlib import Path
|
14
|
+
|
15
|
+
from metaflow.info_file import read_info_file
|
16
|
+
|
14
17
|
|
15
18
|
#
|
16
19
|
# This file provides the support for Metaflow's extension mechanism which allows
|
@@ -59,6 +62,9 @@ __all__ = (
|
|
59
62
|
"load_module",
|
60
63
|
"get_modules",
|
61
64
|
"dump_module_info",
|
65
|
+
"get_extensions_in_dir",
|
66
|
+
"extension_info",
|
67
|
+
"update_package_info",
|
62
68
|
"get_aliased_modules",
|
63
69
|
"package_mfext_package",
|
64
70
|
"package_mfext_all",
|
@@ -80,9 +86,14 @@ EXT_EXCLUDE_SUFFIXES = [".pyc"]
|
|
80
86
|
# To get verbose messages, set METAFLOW_DEBUG_EXT to 1
|
81
87
|
DEBUG_EXT = os.environ.get("METAFLOW_DEBUG_EXT", False)
|
82
88
|
|
89
|
+
# This is extracted only from environment variable and here separately from
|
90
|
+
# metaflow_config to prevent nasty circular dependencies
|
91
|
+
EXTENSIONS_SEARCH_DIRS = os.environ.get("METAFLOW_EXTENSIONS_SEARCH_DIRS", "").split(
|
92
|
+
os.pathsep
|
93
|
+
)
|
83
94
|
|
84
95
|
MFExtPackage = namedtuple("MFExtPackage", "package_name tl_package config_module")
|
85
|
-
MFExtModule = namedtuple("MFExtModule", "tl_package module")
|
96
|
+
MFExtModule = namedtuple("MFExtModule", "package_name tl_package module")
|
86
97
|
|
87
98
|
|
88
99
|
def load_module(module_name):
|
@@ -113,17 +124,64 @@ def get_modules(extension_point):
|
|
113
124
|
return modules_to_load
|
114
125
|
|
115
126
|
|
116
|
-
def dump_module_info():
|
117
|
-
|
127
|
+
def dump_module_info(all_packages=None, pkgs_per_extension_point=None):
|
128
|
+
if all_packages is None:
|
129
|
+
all_packages = _all_packages
|
130
|
+
if pkgs_per_extension_point is None:
|
131
|
+
pkgs_per_extension_point = _pkgs_per_extension_point
|
132
|
+
|
133
|
+
_filter_files_all(all_packages)
|
118
134
|
sanitized_all_packages = dict()
|
119
135
|
# Strip out root_paths (we don't need it and no need to expose user's dir structure)
|
120
|
-
for k, v in
|
136
|
+
for k, v in all_packages.items():
|
121
137
|
sanitized_all_packages[k] = {
|
122
138
|
"root_paths": None,
|
123
139
|
"meta_module": v["meta_module"],
|
124
140
|
"files": v["files"],
|
141
|
+
"version": v["version"],
|
142
|
+
"package_version": v.get("package_version", "<unk>"),
|
143
|
+
"extension_name": v.get("extension_name", "<unk>"),
|
125
144
|
}
|
126
|
-
return "ext_info", [sanitized_all_packages,
|
145
|
+
return "ext_info", [sanitized_all_packages, pkgs_per_extension_point]
|
146
|
+
|
147
|
+
|
148
|
+
def get_extensions_in_dir(d):
|
149
|
+
if not _mfext_supported:
|
150
|
+
_ext_debug("Not supported for your Python version -- 3.4+ is needed")
|
151
|
+
return None, None
|
152
|
+
return _get_extension_packages(ignore_info_file=True, restrict_to_directories=[d])
|
153
|
+
|
154
|
+
|
155
|
+
def extension_info(packages=None):
|
156
|
+
if packages is None:
|
157
|
+
packages = _all_packages
|
158
|
+
# Returns information about installed extensions so it it can be stored in
|
159
|
+
# _graph_info.
|
160
|
+
return {
|
161
|
+
"installed": {
|
162
|
+
k: {
|
163
|
+
"dist_version": v["version"],
|
164
|
+
"package_version": v.get("package_version", "<unk>"),
|
165
|
+
"extension_name": v.get("extension_name", "<unk>"),
|
166
|
+
}
|
167
|
+
for k, v in packages.items()
|
168
|
+
},
|
169
|
+
}
|
170
|
+
|
171
|
+
|
172
|
+
def update_package_info(pkg_to_update=None, package_name=None, **kwargs):
|
173
|
+
pkg = None
|
174
|
+
if pkg_to_update:
|
175
|
+
pkg = pkg_to_update
|
176
|
+
elif package_name:
|
177
|
+
pkg = _all_packages.get(package_name)
|
178
|
+
for k, v in kwargs.items():
|
179
|
+
if k in pkg:
|
180
|
+
raise ValueError(
|
181
|
+
"Trying to overwrite existing key '%s' for package %s" % (k, str(pkg))
|
182
|
+
)
|
183
|
+
pkg[k] = v
|
184
|
+
return pkg
|
127
185
|
|
128
186
|
|
129
187
|
def get_aliased_modules():
|
@@ -134,8 +192,8 @@ def package_mfext_package(package_name):
|
|
134
192
|
from metaflow.util import to_unicode
|
135
193
|
|
136
194
|
_ext_debug("Packaging '%s'" % package_name)
|
137
|
-
_filter_files_package(package_name)
|
138
195
|
pkg_info = _all_packages.get(package_name, None)
|
196
|
+
_filter_files_package(pkg_info)
|
139
197
|
if pkg_info and pkg_info.get("root_paths", None):
|
140
198
|
single_path = len(pkg_info["root_paths"]) == 1
|
141
199
|
for p in pkg_info["root_paths"]:
|
@@ -296,7 +354,7 @@ def _ext_debug(*args, **kwargs):
|
|
296
354
|
print(init_str, *args, **kwargs)
|
297
355
|
|
298
356
|
|
299
|
-
def _get_extension_packages():
|
357
|
+
def _get_extension_packages(ignore_info_file=False, restrict_to_directories=None):
|
300
358
|
if not _mfext_supported:
|
301
359
|
_ext_debug("Not supported for your Python version -- 3.4+ is needed")
|
302
360
|
return {}, {}
|
@@ -304,20 +362,20 @@ def _get_extension_packages():
|
|
304
362
|
# If we have an INFO file with the appropriate information (if running from a saved
|
305
363
|
# code package for example), we use that directly
|
306
364
|
# Pre-compute on _extension_points
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
365
|
+
info_content = read_info_file()
|
366
|
+
if not ignore_info_file and info_content:
|
367
|
+
all_pkg, ext_to_pkg = info_content.get("ext_info", (None, None))
|
368
|
+
if all_pkg is not None and ext_to_pkg is not None:
|
369
|
+
_ext_debug("Loading pre-computed information from INFO file")
|
370
|
+
# We need to properly convert stuff in ext_to_pkg
|
371
|
+
for k, v in ext_to_pkg.items():
|
372
|
+
v = [MFExtPackage(*d) for d in v]
|
373
|
+
ext_to_pkg[k] = v
|
374
|
+
return all_pkg, ext_to_pkg
|
375
|
+
|
376
|
+
# Late import to prevent some circular nastiness
|
377
|
+
if restrict_to_directories is None and EXTENSIONS_SEARCH_DIRS != [""]:
|
378
|
+
restrict_to_directories = EXTENSIONS_SEARCH_DIRS
|
321
379
|
|
322
380
|
# Check if we even have extensions
|
323
381
|
try:
|
@@ -331,6 +389,11 @@ def _get_extension_packages():
|
|
331
389
|
raise
|
332
390
|
return {}, {}
|
333
391
|
|
392
|
+
if restrict_to_directories:
|
393
|
+
restrict_to_directories = [
|
394
|
+
Path(p).resolve().as_posix() for p in restrict_to_directories
|
395
|
+
]
|
396
|
+
|
334
397
|
# There are two "types" of packages:
|
335
398
|
# - those installed on the system (distributions)
|
336
399
|
# - those present in the PYTHONPATH
|
@@ -343,8 +406,12 @@ def _get_extension_packages():
|
|
343
406
|
# At this point, we look at all the paths and create a set. As we find distributions
|
344
407
|
# that match it, we will remove from the set and then will be left with any
|
345
408
|
# PYTHONPATH "packages"
|
346
|
-
all_paths = set(extensions_module.__path__)
|
409
|
+
all_paths = set(Path(p).resolve().as_posix() for p in extensions_module.__path__)
|
347
410
|
_ext_debug("Found packages present at %s" % str(all_paths))
|
411
|
+
if restrict_to_directories:
|
412
|
+
_ext_debug(
|
413
|
+
"Processed packages will be restricted to %s" % str(restrict_to_directories)
|
414
|
+
)
|
348
415
|
|
349
416
|
list_ext_points = [x.split(".") for x in _extension_points]
|
350
417
|
init_ext_points = [x[0] for x in list_ext_points]
|
@@ -391,9 +458,20 @@ def _get_extension_packages():
|
|
391
458
|
# This is not 100% accurate because it is possible that at the same
|
392
459
|
# location there is a package and a non-package, but this is extremely
|
393
460
|
# unlikely so we are going to ignore this case.
|
394
|
-
dist_root = dist.locate_file(EXT_PKG).as_posix()
|
461
|
+
dist_root = dist.locate_file(EXT_PKG).resolve().as_posix()
|
395
462
|
all_paths.discard(dist_root)
|
396
463
|
dist_name = dist.metadata["Name"]
|
464
|
+
dist_version = dist.metadata["Version"]
|
465
|
+
if restrict_to_directories:
|
466
|
+
parent_dirs = list(
|
467
|
+
p.as_posix() for p in Path(dist_root).resolve().parents
|
468
|
+
)
|
469
|
+
if all(p not in parent_dirs for p in restrict_to_directories):
|
470
|
+
_ext_debug(
|
471
|
+
"Ignoring package at %s as it is not in the considered directories"
|
472
|
+
% dist_root
|
473
|
+
)
|
474
|
+
continue
|
397
475
|
if dist_name in mf_ext_packages:
|
398
476
|
_ext_debug(
|
399
477
|
"Ignoring duplicate package '%s' (duplicate paths in sys.path? (%s))"
|
@@ -537,6 +615,7 @@ def _get_extension_packages():
|
|
537
615
|
"root_paths": [dist_root],
|
538
616
|
"meta_module": meta_module,
|
539
617
|
"files": files_to_include,
|
618
|
+
"version": dist_version,
|
540
619
|
}
|
541
620
|
# At this point, we have all the packages that contribute to EXT_PKG,
|
542
621
|
# we now check to see if there is an order to respect based on dependencies. We will
|
@@ -605,6 +684,16 @@ def _get_extension_packages():
|
|
605
684
|
if len(all_paths_list) > 0:
|
606
685
|
_ext_debug("Non installed packages present at %s" % str(all_paths))
|
607
686
|
for package_count, package_path in enumerate(all_paths_list):
|
687
|
+
if restrict_to_directories:
|
688
|
+
parent_dirs = list(
|
689
|
+
p.as_posix() for p in Path(package_path).resolve().parents
|
690
|
+
)
|
691
|
+
if all(p not in parent_dirs for p in restrict_to_directories):
|
692
|
+
_ext_debug(
|
693
|
+
"Ignoring non-installed package at %s as it is not in "
|
694
|
+
"the considered directories" % package_path
|
695
|
+
)
|
696
|
+
continue
|
608
697
|
# We give an alternate name for the visible package name. It is
|
609
698
|
# not exposed to the end user but used to refer to the package, and it
|
610
699
|
# doesn't provide much additional information to have the full path
|
@@ -740,6 +829,7 @@ def _get_extension_packages():
|
|
740
829
|
"root_paths": [package_path],
|
741
830
|
"meta_module": meta_module,
|
742
831
|
"files": files_to_include,
|
832
|
+
"version": "_local_",
|
743
833
|
}
|
744
834
|
|
745
835
|
# Sanity check that we only have one package per configuration file.
|
@@ -868,12 +958,13 @@ def _get_extension_config(distribution_name, tl_pkg, extension_point, config_mod
|
|
868
958
|
_ext_debug("Package '%s' is rooted at %s" % (distribution_name, root_paths))
|
869
959
|
_all_packages[distribution_name]["root_paths"] = root_paths
|
870
960
|
|
871
|
-
return MFExtModule(
|
961
|
+
return MFExtModule(
|
962
|
+
package_name=distribution_name, tl_package=tl_pkg, module=extension_module
|
963
|
+
)
|
872
964
|
return None
|
873
965
|
|
874
966
|
|
875
|
-
def _filter_files_package(
|
876
|
-
pkg = _all_packages.get(package_name)
|
967
|
+
def _filter_files_package(pkg):
|
877
968
|
if pkg and pkg["root_paths"] and pkg["meta_module"]:
|
878
969
|
meta_module = _attempt_load_module(pkg["meta_module"])
|
879
970
|
if meta_module:
|
@@ -902,8 +993,8 @@ def _filter_files_package(package_name):
|
|
902
993
|
pkg["files"] = new_files
|
903
994
|
|
904
995
|
|
905
|
-
def _filter_files_all():
|
906
|
-
for p in
|
996
|
+
def _filter_files_all(all_packages):
|
997
|
+
for p in all_packages.values():
|
907
998
|
_filter_files_package(p)
|
908
999
|
|
909
1000
|
|
@@ -15,6 +15,9 @@ from .exception import (
|
|
15
15
|
MissingInMergeArtifactsException,
|
16
16
|
UnhandledInMergeArtifactsException,
|
17
17
|
)
|
18
|
+
|
19
|
+
from .extension_support import extension_info
|
20
|
+
|
18
21
|
from .graph import FlowGraph
|
19
22
|
from .unbounded_foreach import UnboundedForeachInput
|
20
23
|
from .util import to_pod
|
@@ -208,6 +211,7 @@ class FlowSpec(metaclass=_FlowSpecMeta):
|
|
208
211
|
for deco in flow_decorators(self)
|
209
212
|
if not deco.name.startswith("_")
|
210
213
|
],
|
214
|
+
"extensions": extension_info(),
|
211
215
|
}
|
212
216
|
self._graph_info = graph_info
|
213
217
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import json
|
2
|
+
|
3
|
+
from os import path
|
4
|
+
|
5
|
+
CURRENT_DIRECTORY = path.dirname(path.abspath(__file__))
|
6
|
+
INFO_FILE = path.join(path.dirname(CURRENT_DIRECTORY), "INFO")
|
7
|
+
|
8
|
+
_info_file_content = None
|
9
|
+
_info_file_present = None
|
10
|
+
|
11
|
+
|
12
|
+
def read_info_file():
|
13
|
+
global _info_file_content
|
14
|
+
global _info_file_present
|
15
|
+
if _info_file_present is None:
|
16
|
+
_info_file_present = path.exists(INFO_FILE)
|
17
|
+
if _info_file_present:
|
18
|
+
try:
|
19
|
+
with open(INFO_FILE, "r", encoding="utf-8") as contents:
|
20
|
+
_info_file_content = json.load(contents)
|
21
|
+
except IOError:
|
22
|
+
pass
|
23
|
+
if _info_file_present:
|
24
|
+
return _info_file_content
|
25
|
+
return None
|
@@ -9,8 +9,6 @@ from metaflow.extension_support import dump_module_info
|
|
9
9
|
from metaflow.mflog import BASH_MFLOG
|
10
10
|
from . import R
|
11
11
|
|
12
|
-
version_cache = None
|
13
|
-
|
14
12
|
|
15
13
|
class InvalidEnvironmentException(MetaflowException):
|
16
14
|
headline = "Incompatible environment"
|
@@ -180,10 +178,6 @@ class MetaflowEnvironment(object):
|
|
180
178
|
return cmds
|
181
179
|
|
182
180
|
def get_environment_info(self, include_ext_info=False):
|
183
|
-
global version_cache
|
184
|
-
if version_cache is None:
|
185
|
-
version_cache = metaflow_version.get_version()
|
186
|
-
|
187
181
|
# note that this dict goes into the code package
|
188
182
|
# so variables here should be relatively stable (no
|
189
183
|
# timestamps) so the hash won't change all the time
|
@@ -197,7 +191,7 @@ class MetaflowEnvironment(object):
|
|
197
191
|
"use_r": R.use_r(),
|
198
192
|
"python_version": sys.version,
|
199
193
|
"python_version_code": "%d.%d.%d" % sys.version_info[:3],
|
200
|
-
"metaflow_version":
|
194
|
+
"metaflow_version": metaflow_version.get_version(),
|
201
195
|
"script": os.path.basename(os.path.abspath(sys.argv[0])),
|
202
196
|
}
|
203
197
|
if R.use_r():
|
@@ -0,0 +1,209 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
"""Get version identification for the package
|
3
|
+
|
4
|
+
See the documentation of get_version for more information
|
5
|
+
|
6
|
+
"""
|
7
|
+
|
8
|
+
# This file is adapted from https://github.com/aebrahim/python-git-version
|
9
|
+
|
10
|
+
import subprocess
|
11
|
+
from os import path, name, environ, listdir
|
12
|
+
|
13
|
+
from metaflow.extension_support import update_package_info
|
14
|
+
from metaflow.info_file import CURRENT_DIRECTORY, read_info_file
|
15
|
+
|
16
|
+
|
17
|
+
# True/False correspond to the value `public`` in get_version
|
18
|
+
_version_cache = {True: None, False: None}
|
19
|
+
|
20
|
+
__all__ = ("get_version",)
|
21
|
+
|
22
|
+
GIT_COMMAND = "git"
|
23
|
+
|
24
|
+
if name == "nt":
|
25
|
+
|
26
|
+
def find_git_on_windows():
|
27
|
+
"""find the path to the git executable on Windows"""
|
28
|
+
# first see if git is in the path
|
29
|
+
try:
|
30
|
+
check_output(["where", "/Q", "git"])
|
31
|
+
# if this command succeeded, git is in the path
|
32
|
+
return "git"
|
33
|
+
# catch the exception thrown if git was not found
|
34
|
+
except CalledProcessError:
|
35
|
+
pass
|
36
|
+
# There are several locations where git.exe may be hiding
|
37
|
+
possible_locations = []
|
38
|
+
# look in program files for msysgit
|
39
|
+
if "PROGRAMFILES(X86)" in environ:
|
40
|
+
possible_locations.append(
|
41
|
+
"%s/Git/cmd/git.exe" % environ["PROGRAMFILES(X86)"]
|
42
|
+
)
|
43
|
+
if "PROGRAMFILES" in environ:
|
44
|
+
possible_locations.append("%s/Git/cmd/git.exe" % environ["PROGRAMFILES"])
|
45
|
+
# look for the GitHub version of git
|
46
|
+
if "LOCALAPPDATA" in environ:
|
47
|
+
github_dir = "%s/GitHub" % environ["LOCALAPPDATA"]
|
48
|
+
if path.isdir(github_dir):
|
49
|
+
for subdir in listdir(github_dir):
|
50
|
+
if not subdir.startswith("PortableGit"):
|
51
|
+
continue
|
52
|
+
possible_locations.append(
|
53
|
+
"%s/%s/bin/git.exe" % (github_dir, subdir)
|
54
|
+
)
|
55
|
+
for possible_location in possible_locations:
|
56
|
+
if path.isfile(possible_location):
|
57
|
+
return possible_location
|
58
|
+
# git was not found
|
59
|
+
return "git"
|
60
|
+
|
61
|
+
GIT_COMMAND = find_git_on_windows()
|
62
|
+
|
63
|
+
|
64
|
+
def call_git_describe(file_to_check, abbrev=7):
|
65
|
+
"""return the string output of git describe"""
|
66
|
+
try:
|
67
|
+
wd = path.dirname(file_to_check)
|
68
|
+
filename = path.basename(file_to_check)
|
69
|
+
|
70
|
+
# First check if the file is tracked in the GIT repository we are in
|
71
|
+
# We do this because in some setups and for some bizarre reason, python files
|
72
|
+
# are installed directly into a git repository (I am looking at you brew). We
|
73
|
+
# don't want to consider this a GIT install in that case.
|
74
|
+
args = [GIT_COMMAND, "ls-files", "--error-unmatch", filename]
|
75
|
+
git_return_code = subprocess.run(
|
76
|
+
args,
|
77
|
+
cwd=wd,
|
78
|
+
stderr=subprocess.DEVNULL,
|
79
|
+
stdout=subprocess.DEVNULL,
|
80
|
+
check=False,
|
81
|
+
).returncode
|
82
|
+
|
83
|
+
if git_return_code != 0:
|
84
|
+
return None
|
85
|
+
|
86
|
+
args = [
|
87
|
+
GIT_COMMAND,
|
88
|
+
"describe",
|
89
|
+
"--tags",
|
90
|
+
"--dirty",
|
91
|
+
"--long",
|
92
|
+
"--abbrev=%d" % abbrev,
|
93
|
+
]
|
94
|
+
return (
|
95
|
+
subprocess.check_output(args, cwd=wd, stderr=subprocess.DEVNULL)
|
96
|
+
.decode("ascii")
|
97
|
+
.strip()
|
98
|
+
)
|
99
|
+
|
100
|
+
except (OSError, subprocess.CalledProcessError):
|
101
|
+
return None
|
102
|
+
|
103
|
+
|
104
|
+
def format_git_describe(git_str, public=False):
|
105
|
+
"""format the result of calling 'git describe' as a python version"""
|
106
|
+
if git_str is None:
|
107
|
+
return None
|
108
|
+
splits = git_str.split("-")
|
109
|
+
if len(splits) == 4:
|
110
|
+
# Formatted as <tag>-<post>-<hash>-dirty
|
111
|
+
tag, post, h = splits[:3]
|
112
|
+
dirty = "-" + splits[3]
|
113
|
+
else:
|
114
|
+
# Formatted as <tag>-<post>-<hash>
|
115
|
+
tag, post, h = splits
|
116
|
+
dirty = ""
|
117
|
+
if post == "0":
|
118
|
+
if public:
|
119
|
+
return tag
|
120
|
+
return tag + dirty
|
121
|
+
|
122
|
+
if public:
|
123
|
+
return "%s.post%s" % (tag, post)
|
124
|
+
|
125
|
+
return "%s.post%s-git%s%s" % (tag, post, h[1:], dirty)
|
126
|
+
|
127
|
+
|
128
|
+
def read_info_version():
|
129
|
+
"""Read version information from INFO file"""
|
130
|
+
info_file = read_info_file()
|
131
|
+
if info_file:
|
132
|
+
return info_file.get("metaflow_version")
|
133
|
+
return None
|
134
|
+
|
135
|
+
|
136
|
+
def get_version(public=False):
|
137
|
+
"""Tracks the version number.
|
138
|
+
|
139
|
+
public: bool
|
140
|
+
When True, this function returns a *public* version specification which
|
141
|
+
doesn't include any local information (dirtiness or hash). See
|
142
|
+
https://packaging.python.org/en/latest/specifications/version-specifiers/#version-scheme
|
143
|
+
|
144
|
+
We first check the INFO file to see if we recorded a version of Metaflow. If there
|
145
|
+
is none, we check if we are in a GIT repository and if so, form the version
|
146
|
+
from that.
|
147
|
+
|
148
|
+
Otherwise, we return the version of Metaflow that was installed.
|
149
|
+
|
150
|
+
"""
|
151
|
+
|
152
|
+
global _version_cache
|
153
|
+
|
154
|
+
# To get the version we do the following:
|
155
|
+
# - Check if we have a cached version. If so, return that
|
156
|
+
# - Then check if we have an INFO file present. If so, use that as it is
|
157
|
+
# the most reliable way to get the version. In particular, when running remotely,
|
158
|
+
# metaflow is installed in a directory and if any extension is using distutils to
|
159
|
+
# determine its version, this would return None and querying the version directly
|
160
|
+
# from the extension would fail to produce the correct result
|
161
|
+
# - Then if we are in the GIT repository and if so, use the git describe
|
162
|
+
# - If we don't have an INFO file, we look at the version information that is
|
163
|
+
# populated by metaflow and the extensions.
|
164
|
+
|
165
|
+
if _version_cache[public] is not None:
|
166
|
+
return _version_cache[public]
|
167
|
+
|
168
|
+
version = (
|
169
|
+
read_info_version()
|
170
|
+
) # Version info is cached in INFO file; includes extension info
|
171
|
+
|
172
|
+
if version:
|
173
|
+
_version_cache[public] = version
|
174
|
+
return version
|
175
|
+
|
176
|
+
# Get the version for Metaflow, favor the GIT version
|
177
|
+
import metaflow
|
178
|
+
|
179
|
+
version = format_git_describe(
|
180
|
+
call_git_describe(file_to_check=metaflow.__file__), public=public
|
181
|
+
)
|
182
|
+
if version is None:
|
183
|
+
version = metaflow.__version__
|
184
|
+
|
185
|
+
# Look for extensions and compute their versions. Properly formed extensions have
|
186
|
+
# a toplevel file which will contain a __mf_extensions__ value and a __version__
|
187
|
+
# value. We already saved the properly formed modules when loading metaflow in
|
188
|
+
# __ext_tl_modules__.
|
189
|
+
ext_versions = []
|
190
|
+
for pkg_name, extension_module in metaflow.__ext_tl_modules__:
|
191
|
+
ext_name = getattr(extension_module, "__mf_extensions__", "<unk>")
|
192
|
+
ext_version = format_git_describe(
|
193
|
+
call_git_describe(file_to_check=extension_module.__file__), public=public
|
194
|
+
)
|
195
|
+
if ext_version is None:
|
196
|
+
ext_version = getattr(extension_module, "__version__", "<unk>")
|
197
|
+
# Update the package information about reported version for the extension
|
198
|
+
update_package_info(
|
199
|
+
package_name=pkg_name,
|
200
|
+
extension_name=ext_name,
|
201
|
+
package_version=ext_version,
|
202
|
+
)
|
203
|
+
ext_versions.append("%s(%s)" % (ext_name, ext_version))
|
204
|
+
|
205
|
+
# We now have all the information about extensions so we can form the final string
|
206
|
+
if ext_versions:
|
207
|
+
version = version + "+" + ";".join(ext_versions)
|
208
|
+
_version_cache[public] = version
|
209
|
+
return version
|