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

|
32
32
|
|
@@ -3,6 +3,7 @@ import sys
|
|
3
3
|
from importlib import util as imp_util, machinery as imp_machinery
|
4
4
|
from tempfile import NamedTemporaryFile
|
5
5
|
|
6
|
+
from . import parameters
|
6
7
|
from .util import to_bytes
|
7
8
|
|
8
9
|
R_FUNCTIONS = {}
|
@@ -125,15 +126,17 @@ def run(
|
|
125
126
|
flow = module.FLOW(use_cli=False)
|
126
127
|
|
127
128
|
from . import exception
|
128
|
-
from . import cli
|
129
129
|
|
130
130
|
try:
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
131
|
+
with parameters.flow_context(flow.__class__) as _:
|
132
|
+
from . import cli
|
133
|
+
|
134
|
+
cli.main(
|
135
|
+
flow,
|
136
|
+
args=metaflow_args,
|
137
|
+
handle_exceptions=False,
|
138
|
+
entrypoint=full_cmdline[: -len(metaflow_args)],
|
139
|
+
)
|
137
140
|
except exception.MetaflowException as e:
|
138
141
|
cli.print_metaflow_exception(e)
|
139
142
|
os.remove(tmp.name)
|
@@ -946,7 +946,7 @@ def start(
|
|
946
946
|
ctx.obj.environment = [
|
947
947
|
e for e in ENVIRONMENTS + [MetaflowEnvironment] if e.TYPE == environment
|
948
948
|
][0](ctx.obj.flow)
|
949
|
-
ctx.obj.environment.validate_environment(
|
949
|
+
ctx.obj.environment.validate_environment(ctx.obj.logger, datastore)
|
950
950
|
|
951
951
|
ctx.obj.event_logger = LOGGING_SIDECARS[event_logger](
|
952
952
|
flow=ctx.obj.flow, env=ctx.obj.environment
|
@@ -268,11 +268,13 @@ class MetaflowObject(object):
|
|
268
268
|
_object: Optional["MetaflowObject"] = None,
|
269
269
|
_parent: Optional["MetaflowObject"] = None,
|
270
270
|
_namespace_check: bool = True,
|
271
|
+
_current_namespace: Optional[str] = None,
|
271
272
|
):
|
272
273
|
self._metaflow = Metaflow()
|
273
274
|
self._parent = _parent
|
274
275
|
self._path_components = None
|
275
276
|
self._attempt = attempt
|
277
|
+
self._current_namespace = _current_namespace or get_namespace()
|
276
278
|
self._namespace_check = _namespace_check
|
277
279
|
|
278
280
|
if self._attempt is not None:
|
@@ -339,8 +341,8 @@ class MetaflowObject(object):
|
|
339
341
|
self._user_tags = frozenset(self._object.get("tags") or [])
|
340
342
|
self._system_tags = frozenset(self._object.get("system_tags") or [])
|
341
343
|
|
342
|
-
if self._namespace_check and not self.
|
343
|
-
raise MetaflowNamespaceMismatch(
|
344
|
+
if self._namespace_check and not self._is_in_namespace(self._current_namespace):
|
345
|
+
raise MetaflowNamespaceMismatch(self._current_namespace)
|
344
346
|
|
345
347
|
def _get_object(self, *path_components):
|
346
348
|
result = self._metaflow.metadata.get_object(
|
@@ -365,8 +367,8 @@ class MetaflowObject(object):
|
|
365
367
|
query_filter = {}
|
366
368
|
|
367
369
|
# skip namespace filtering if _namespace_check is unset.
|
368
|
-
if self._namespace_check and
|
369
|
-
query_filter = {"any_tags":
|
370
|
+
if self._namespace_check and self._current_namespace:
|
371
|
+
query_filter = {"any_tags": self._current_namespace}
|
370
372
|
|
371
373
|
unfiltered_children = self._metaflow.metadata.get_object(
|
372
374
|
self._NAME,
|
@@ -383,7 +385,10 @@ class MetaflowObject(object):
|
|
383
385
|
attempt=self._attempt,
|
384
386
|
_object=obj,
|
385
387
|
_parent=self,
|
386
|
-
_namespace_check=
|
388
|
+
_namespace_check=self._namespace_check,
|
389
|
+
_current_namespace=self._current_namespace
|
390
|
+
if self._namespace_check
|
391
|
+
else None,
|
387
392
|
)
|
388
393
|
for obj in unfiltered_children
|
389
394
|
),
|
@@ -422,6 +427,23 @@ class MetaflowObject(object):
|
|
422
427
|
|
423
428
|
If the current namespace is None, this will always return True.
|
424
429
|
|
430
|
+
Returns
|
431
|
+
-------
|
432
|
+
bool
|
433
|
+
Whether or not the object is in the current namespace
|
434
|
+
"""
|
435
|
+
return self._is_in_namespace(current_namespace)
|
436
|
+
|
437
|
+
def _is_in_namespace(self, ns: str) -> bool:
|
438
|
+
"""
|
439
|
+
Returns whether this object is in namespace passed in.
|
440
|
+
|
441
|
+
If the current namespace is None, this will always return True.
|
442
|
+
|
443
|
+
Parameters
|
444
|
+
----------
|
445
|
+
ns : str
|
446
|
+
Namespace to check if the object is in.
|
425
447
|
Returns
|
426
448
|
-------
|
427
449
|
bool
|
@@ -430,7 +452,7 @@ class MetaflowObject(object):
|
|
430
452
|
if self._NAME == "flow":
|
431
453
|
return any(True for _ in self)
|
432
454
|
else:
|
433
|
-
return
|
455
|
+
return ns is None or ns in self._tags
|
434
456
|
|
435
457
|
def __str__(self):
|
436
458
|
if self._attempt is not None:
|
@@ -479,6 +501,9 @@ class MetaflowObject(object):
|
|
479
501
|
_object=obj,
|
480
502
|
_parent=self,
|
481
503
|
_namespace_check=self._namespace_check,
|
504
|
+
_current_namespace=self._current_namespace
|
505
|
+
if self._namespace_check
|
506
|
+
else None,
|
482
507
|
)
|
483
508
|
else:
|
484
509
|
raise KeyError(id)
|
@@ -509,7 +534,20 @@ class MetaflowObject(object):
|
|
509
534
|
pathspec=pathspec, attempt=attempt, _namespace_check=namespace_check
|
510
535
|
)
|
511
536
|
|
512
|
-
|
537
|
+
def _unpickle_2124(self, data):
|
538
|
+
if len(data) != 4:
|
539
|
+
raise MetaflowInternalError(
|
540
|
+
"Unexpected size of array: {}".format(len(data))
|
541
|
+
)
|
542
|
+
pathspec, attempt, ns, namespace_check = data
|
543
|
+
self.__init__(
|
544
|
+
pathspec=pathspec,
|
545
|
+
attempt=attempt,
|
546
|
+
_namespace_check=namespace_check,
|
547
|
+
_current_namespace=ns,
|
548
|
+
)
|
549
|
+
|
550
|
+
_UNPICKLE_FUNC = {"2.8.4": _unpickle_284, "2.12.4": _unpickle_2124}
|
513
551
|
|
514
552
|
def __setstate__(self, state):
|
515
553
|
"""
|
@@ -529,12 +567,13 @@ class MetaflowObject(object):
|
|
529
567
|
self._UNPICKLE_FUNC[version](self, state["data"])
|
530
568
|
else:
|
531
569
|
# For backward compatibility: handles pickled objects that were serialized without a __getstate__ override
|
532
|
-
# We set namespace_check to False if it doesn't exist
|
533
|
-
#
|
570
|
+
# We set namespace_check to False if it doesn't exist so that the user can
|
571
|
+
# continue accessing this object once unpickled.
|
534
572
|
self.__init__(
|
535
573
|
pathspec=state.get("_pathspec", None),
|
536
574
|
attempt=state.get("_attempt", None),
|
537
575
|
_namespace_check=state.get("_namespace_check", False),
|
576
|
+
_current_namespace=None,
|
538
577
|
)
|
539
578
|
|
540
579
|
def __getstate__(self):
|
@@ -546,16 +585,17 @@ class MetaflowObject(object):
|
|
546
585
|
from this object) are pickled (serialized) in a later version of Metaflow, it may not be possible
|
547
586
|
to unpickle (deserialize) them in a previous version of Metaflow.
|
548
587
|
"""
|
549
|
-
# Note that we
|
550
|
-
#
|
551
|
-
#
|
552
|
-
#
|
588
|
+
# Note that we now record the namespace at the time of the object creation so
|
589
|
+
# we don't need to force namespace_check to be False and can properly continue
|
590
|
+
# checking for the namespace even after unpickling since we will know which
|
591
|
+
# namespace to check.
|
553
592
|
return {
|
554
|
-
"version": "2.
|
593
|
+
"version": "2.12.4",
|
555
594
|
"data": [
|
556
595
|
self.pathspec,
|
557
596
|
self._attempt,
|
558
|
-
|
597
|
+
self._current_namespace,
|
598
|
+
self._namespace_check,
|
559
599
|
],
|
560
600
|
}
|
561
601
|
|
@@ -11,6 +11,8 @@ from .exception import (
|
|
11
11
|
InvalidDecoratorAttribute,
|
12
12
|
)
|
13
13
|
|
14
|
+
from .parameters import current_flow
|
15
|
+
|
14
16
|
from metaflow._vendor import click
|
15
17
|
|
16
18
|
try:
|
@@ -174,13 +176,9 @@ class Decorator(object):
|
|
174
176
|
|
175
177
|
|
176
178
|
class FlowDecorator(Decorator):
|
177
|
-
_flow_decorators = []
|
178
179
|
options = {}
|
179
180
|
|
180
181
|
def __init__(self, *args, **kwargs):
|
181
|
-
# Note that this assumes we are executing one flow per process, so we have a global list of
|
182
|
-
# _flow_decorators. A similar setup is used in parameters.
|
183
|
-
self._flow_decorators.append(self)
|
184
182
|
super(FlowDecorator, self).__init__(*args, **kwargs)
|
185
183
|
|
186
184
|
def flow_init(
|
@@ -206,7 +204,10 @@ class FlowDecorator(Decorator):
|
|
206
204
|
# compare this to parameters.add_custom_parameters
|
207
205
|
def add_decorator_options(cmd):
|
208
206
|
seen = {}
|
209
|
-
|
207
|
+
flow_cls = getattr(current_flow, "flow_cls", None)
|
208
|
+
if flow_cls is None:
|
209
|
+
return cmd
|
210
|
+
for deco in flow_decorators(flow_cls):
|
210
211
|
for option, kwargs in deco.options.items():
|
211
212
|
if option in seen:
|
212
213
|
msg = (
|
@@ -222,8 +223,8 @@ def add_decorator_options(cmd):
|
|
222
223
|
return cmd
|
223
224
|
|
224
225
|
|
225
|
-
def flow_decorators():
|
226
|
-
return
|
226
|
+
def flow_decorators(flow_cls):
|
227
|
+
return [d for deco_list in flow_cls._flow_decorators.values() for d in deco_list]
|
227
228
|
|
228
229
|
|
229
230
|
class StepDecorator(Decorator):
|
@@ -53,7 +53,18 @@ class ParallelUBF(UnboundedForeachInput):
|
|
53
53
|
return item or 0 # item is None for the control task, but it is also split 0
|
54
54
|
|
55
55
|
|
56
|
-
class
|
56
|
+
class _FlowSpecMeta(type):
|
57
|
+
def __new__(cls, name, bases, dct):
|
58
|
+
f = super().__new__(cls, name, bases, dct)
|
59
|
+
# This makes sure to give _flow_decorators to each
|
60
|
+
# child class (and not share it with the FlowSpec base
|
61
|
+
# class). This is important to not make a "global"
|
62
|
+
# _flow_decorators
|
63
|
+
f._flow_decorators = {}
|
64
|
+
return f
|
65
|
+
|
66
|
+
|
67
|
+
class FlowSpec(metaclass=_FlowSpecMeta):
|
57
68
|
"""
|
58
69
|
Main class from which all Flows should inherit.
|
59
70
|
|
@@ -83,8 +94,6 @@ class FlowSpec(object):
|
|
83
94
|
# names starting with `_` as those are already excluded from `_get_parameters`.
|
84
95
|
_NON_PARAMETERS = {"cmd", "foreach_stack", "index", "input", "script_name", "name"}
|
85
96
|
|
86
|
-
_flow_decorators = {}
|
87
|
-
|
88
97
|
def __init__(self, use_cli=True):
|
89
98
|
"""
|
90
99
|
Construct a FlowSpec
|
@@ -104,15 +113,11 @@ class FlowSpec(object):
|
|
104
113
|
self._graph = FlowGraph(self.__class__)
|
105
114
|
self._steps = [getattr(self, node.name) for node in self._graph]
|
106
115
|
|
107
|
-
# This must be set before calling cli.main() below (or specifically, add_custom_parameters)
|
108
|
-
parameters.parameters = [p for _, p in self._get_parameters()]
|
109
|
-
|
110
116
|
if use_cli:
|
111
|
-
|
112
|
-
|
113
|
-
from . import cli
|
117
|
+
with parameters.flow_context(self.__class__) as _:
|
118
|
+
from . import cli
|
114
119
|
|
115
|
-
|
120
|
+
cli.main(self)
|
116
121
|
|
117
122
|
@property
|
118
123
|
def script_name(self) -> str:
|
@@ -192,18 +197,19 @@ class FlowSpec(object):
|
|
192
197
|
"attributes": deco.attributes,
|
193
198
|
"statically_defined": deco.statically_defined,
|
194
199
|
}
|
195
|
-
for deco in flow_decorators()
|
200
|
+
for deco in flow_decorators(self)
|
196
201
|
if not deco.name.startswith("_")
|
197
202
|
],
|
198
203
|
}
|
199
204
|
self._graph_info = graph_info
|
200
205
|
|
201
|
-
|
202
|
-
|
203
|
-
|
206
|
+
@classmethod
|
207
|
+
def _get_parameters(cls):
|
208
|
+
for var in dir(cls):
|
209
|
+
if var[0] == "_" or var in cls._NON_PARAMETERS:
|
204
210
|
continue
|
205
211
|
try:
|
206
|
-
val = getattr(
|
212
|
+
val = getattr(cls, var)
|
207
213
|
except:
|
208
214
|
continue
|
209
215
|
if isinstance(val, Parameter):
|
@@ -1,4 +1,8 @@
|
|
1
1
|
import json
|
2
|
+
|
3
|
+
from contextlib import contextmanager
|
4
|
+
from threading import local
|
5
|
+
|
2
6
|
from typing import Any, Callable, Dict, NamedTuple, Optional, Type, Union
|
3
7
|
|
4
8
|
from metaflow._vendor import click
|
@@ -31,7 +35,40 @@ ParameterContext = NamedTuple(
|
|
31
35
|
],
|
32
36
|
)
|
33
37
|
|
34
|
-
|
38
|
+
|
39
|
+
# When we launch a flow, we need to know the parameters so we can
|
40
|
+
# attach them with add_custom_parameters to commands. This used to be a global
|
41
|
+
# but causes problems when multiple FlowSpec are loaded (as can happen when using
|
42
|
+
# the Runner or just if multiple Flows are defined and instantiated). To minimally
|
43
|
+
# impact code, we now create the CLI with a thread local value of the FlowSpec
|
44
|
+
# that is being used to create the CLI which enables us to extract the parameters
|
45
|
+
# directly from the Flow.
|
46
|
+
current_flow = local()
|
47
|
+
|
48
|
+
|
49
|
+
@contextmanager
|
50
|
+
def flow_context(flow_cls):
|
51
|
+
"""
|
52
|
+
Context manager to set the current flow for the thread. This is used
|
53
|
+
to extract the parameters from the FlowSpec that is being used to create
|
54
|
+
the CLI.
|
55
|
+
"""
|
56
|
+
# Use a stack because with the runner this can get called multiple times in
|
57
|
+
# a nested fashion
|
58
|
+
current_flow.flow_cls_stack = getattr(current_flow, "flow_cls_stack", [])
|
59
|
+
current_flow.flow_cls_stack.insert(0, flow_cls)
|
60
|
+
current_flow.flow_cls = current_flow.flow_cls_stack[0]
|
61
|
+
try:
|
62
|
+
yield
|
63
|
+
finally:
|
64
|
+
current_flow.flow_cls_stack = current_flow.flow_cls_stack[1:]
|
65
|
+
if len(current_flow.flow_cls_stack) == 0:
|
66
|
+
del current_flow.flow_cls_stack
|
67
|
+
del current_flow.flow_cls
|
68
|
+
else:
|
69
|
+
current_flow.flow_cls = current_flow.flow_cls_stack[0]
|
70
|
+
|
71
|
+
|
35
72
|
context_proto = None
|
36
73
|
|
37
74
|
|
@@ -391,6 +428,10 @@ def add_custom_parameters(deploy_mode=False):
|
|
391
428
|
cmd.has_flow_params = True
|
392
429
|
# Iterate over parameters in reverse order so cmd.params lists options
|
393
430
|
# in the order they are defined in the FlowSpec subclass
|
431
|
+
flow_cls = getattr(current_flow, "flow_cls", None)
|
432
|
+
if flow_cls is None:
|
433
|
+
return cmd
|
434
|
+
parameters = [p for _, p in flow_cls._get_parameters()]
|
394
435
|
for arg in parameters[::-1]:
|
395
436
|
kwargs = arg.option_kwargs(deploy_mode)
|
396
437
|
cmd.params.insert(0, click.Option(("--" + arg.name,), **kwargs))
|
@@ -539,7 +539,7 @@ class Airflow(object):
|
|
539
539
|
# FlowDecorators can define their own top-level options. They are
|
540
540
|
# responsible for adding their own top-level options and values through
|
541
541
|
# the get_top_level_options() hook. See similar logic in runtime.py.
|
542
|
-
for deco in flow_decorators():
|
542
|
+
for deco in flow_decorators(self.flow):
|
543
543
|
top_opts_dict.update(deco.get_top_level_options())
|
544
544
|
|
545
545
|
top_opts = list(dict_to_cli_options(top_opts_dict))
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import uuid
|
2
|
-
from metaflow.decorators import FlowDecorator
|
2
|
+
from metaflow.decorators import FlowDecorator, flow_decorators
|
3
3
|
from ..exception import AirflowException
|
4
4
|
from ..airflow_utils import AirflowTask, id_creator, TASK_ID_HASH_LEN
|
5
5
|
|
@@ -49,7 +49,7 @@ class AirflowSensorDecorator(FlowDecorator):
|
|
49
49
|
operator_type=self.operator_type,
|
50
50
|
).set_operator_args(**{k: v for k, v in task_args.items() if v is not None})
|
51
51
|
|
52
|
-
def validate(self):
|
52
|
+
def validate(self, flow):
|
53
53
|
"""
|
54
54
|
Validate if the arguments for the sensor are correct.
|
55
55
|
"""
|
@@ -58,7 +58,7 @@ class AirflowSensorDecorator(FlowDecorator):
|
|
58
58
|
if self.attributes["name"] is None:
|
59
59
|
deco_index = [
|
60
60
|
d._id
|
61
|
-
for d in
|
61
|
+
for d in flow_decorators(flow)
|
62
62
|
if issubclass(d.__class__, AirflowSensorDecorator)
|
63
63
|
].index(self._id)
|
64
64
|
self._airflow_task_name = "%s-%s" % (
|
@@ -71,4 +71,4 @@ class AirflowSensorDecorator(FlowDecorator):
|
|
71
71
|
def flow_init(
|
72
72
|
self, flow, graph, environment, flow_datastore, metadata, logger, echo, options
|
73
73
|
):
|
74
|
-
self.validate()
|
74
|
+
self.validate(flow)
|
{metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/sensors/external_task_sensor.py
RENAMED
@@ -85,7 +85,7 @@ class ExternalTaskSensorDecorator(AirflowSensorDecorator):
|
|
85
85
|
)
|
86
86
|
return task_args
|
87
87
|
|
88
|
-
def validate(self):
|
88
|
+
def validate(self, flow):
|
89
89
|
if self.attributes["external_dag_id"] is None:
|
90
90
|
raise AirflowException(
|
91
91
|
"`%s` argument of `@%s`cannot be `None`."
|
@@ -131,4 +131,4 @@ class ExternalTaskSensorDecorator(AirflowSensorDecorator):
|
|
131
131
|
self.name,
|
132
132
|
)
|
133
133
|
)
|
134
|
-
super().validate()
|
134
|
+
super().validate(flow)
|
@@ -58,9 +58,9 @@ class S3KeySensorDecorator(AirflowSensorDecorator):
|
|
58
58
|
# `verify` is a airflow variable.
|
59
59
|
)
|
60
60
|
|
61
|
-
def validate(self):
|
61
|
+
def validate(self, flow):
|
62
62
|
if self.attributes["bucket_key"] is None:
|
63
63
|
raise AirflowException(
|
64
64
|
"`bucket_key` for `@%s`cannot be empty." % (self.name)
|
65
65
|
)
|
66
|
-
super().validate()
|
66
|
+
super().validate(flow)
|
@@ -1237,7 +1237,7 @@ class ArgoWorkflows(object):
|
|
1237
1237
|
# FlowDecorators can define their own top-level options. They are
|
1238
1238
|
# responsible for adding their own top-level options and values through
|
1239
1239
|
# the get_top_level_options() hook. See similar logic in runtime.py.
|
1240
|
-
for deco in flow_decorators():
|
1240
|
+
for deco in flow_decorators(self.flow):
|
1241
1241
|
top_opts_dict.update(deco.get_top_level_options())
|
1242
1242
|
|
1243
1243
|
top_level = list(dict_to_cli_options(top_opts_dict)) + [
|
@@ -881,7 +881,7 @@ class StepFunctions(object):
|
|
881
881
|
# FlowDecorators can define their own top-level options. They are
|
882
882
|
# responsible for adding their own top-level options and values through
|
883
883
|
# the get_top_level_options() hook. See similar logic in runtime.py.
|
884
|
-
for deco in flow_decorators():
|
884
|
+
for deco in flow_decorators(self.flow):
|
885
885
|
top_opts_dict.update(deco.get_top_level_options())
|
886
886
|
|
887
887
|
top_opts = list(dict_to_cli_options(top_opts_dict))
|
@@ -388,6 +388,22 @@ def card_read_options_and_arguments(func):
|
|
388
388
|
return wrapper
|
389
389
|
|
390
390
|
|
391
|
+
def _extract_reload_token(data, task, mf_card):
|
392
|
+
if "render_seq" not in data:
|
393
|
+
return "never"
|
394
|
+
|
395
|
+
if data["render_seq"] == "final":
|
396
|
+
# final data update should always trigger a card reload to show
|
397
|
+
# the final card, hence a different token for the final update
|
398
|
+
return "final"
|
399
|
+
elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_ALWAYS:
|
400
|
+
return "render-seq-%s" % data["render_seq"]
|
401
|
+
elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_NEVER:
|
402
|
+
return "never"
|
403
|
+
elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_ONCHANGE:
|
404
|
+
return mf_card.reload_content_token(task, data)
|
405
|
+
|
406
|
+
|
391
407
|
def update_card(mf_card, mode, task, data, timeout_value=None):
|
392
408
|
"""
|
393
409
|
This method will be responsible for creating a card/data-update based on the `mode`.
|
@@ -432,31 +448,21 @@ def update_card(mf_card, mode, task, data, timeout_value=None):
|
|
432
448
|
- `timeout_stack_trace` : stack trace of the function if it timed out.
|
433
449
|
"""
|
434
450
|
|
435
|
-
def _reload_token():
|
436
|
-
if "render_seq" not in data:
|
437
|
-
return "never"
|
438
|
-
|
439
|
-
if data["render_seq"] == "final":
|
440
|
-
# final data update should always trigger a card reload to show
|
441
|
-
# the final card, hence a different token for the final update
|
442
|
-
return "final"
|
443
|
-
elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_ALWAYS:
|
444
|
-
return "render-seq-%s" % data["render_seq"]
|
445
|
-
elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_NEVER:
|
446
|
-
return "never"
|
447
|
-
elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_ONCHANGE:
|
448
|
-
return mf_card.reload_content_token(task, data)
|
449
|
-
|
450
451
|
def _add_token_html(html):
|
451
452
|
if html is None:
|
452
453
|
return None
|
453
|
-
return html.replace(
|
454
|
+
return html.replace(
|
455
|
+
mf_card.RELOAD_POLICY_TOKEN,
|
456
|
+
_extract_reload_token(data=data, task=task, mf_card=mf_card),
|
457
|
+
)
|
454
458
|
|
455
459
|
def _add_token_json(json_msg):
|
456
460
|
if json_msg is None:
|
457
461
|
return None
|
458
462
|
return {
|
459
|
-
"reload_token":
|
463
|
+
"reload_token": _extract_reload_token(
|
464
|
+
data=data, task=task, mf_card=mf_card
|
465
|
+
),
|
460
466
|
"data": json_msg,
|
461
467
|
"created_on": time.time(),
|
462
468
|
}
|
@@ -740,8 +746,16 @@ def create(
|
|
740
746
|
# 3. `refresh` is implemented but it raises an exception. (We do nothing. Don't store anything.)
|
741
747
|
# 4. `refresh` is implemented but it times out. (We do nothing. Don't store anything.)
|
742
748
|
|
749
|
+
def _render_error_card(stack_trace):
|
750
|
+
_card = error_card()
|
751
|
+
token = _extract_reload_token(data, task, _card)
|
752
|
+
return _card.render(
|
753
|
+
task,
|
754
|
+
stack_trace=stack_trace,
|
755
|
+
).replace(mf_card.RELOAD_POLICY_TOKEN, token)
|
756
|
+
|
743
757
|
if error_stack_trace is not None and mode != "refresh":
|
744
|
-
rendered_content =
|
758
|
+
rendered_content = _render_error_card(error_stack_trace)
|
745
759
|
elif (
|
746
760
|
rendered_info.is_implemented
|
747
761
|
and rendered_info.timed_out
|
@@ -753,18 +767,15 @@ def create(
|
|
753
767
|
"To increase the timeout duration for card rendering, please set the `timeout` parameter in the @card decorator. "
|
754
768
|
"\nStack Trace : \n%s"
|
755
769
|
) % (timeout, rendered_info.timeout_stack_trace)
|
756
|
-
rendered_content =
|
757
|
-
task,
|
758
|
-
stack_trace=timeout_stack_trace,
|
759
|
-
)
|
770
|
+
rendered_content = _render_error_card(timeout_stack_trace)
|
760
771
|
elif (
|
761
772
|
rendered_info.is_implemented
|
762
773
|
and rendered_info.data is None
|
763
774
|
and render_error_card
|
764
775
|
and mode != "refresh"
|
765
776
|
):
|
766
|
-
rendered_content =
|
767
|
-
|
777
|
+
rendered_content = _render_error_card(
|
778
|
+
"No information rendered from card of type %s" % type
|
768
779
|
)
|
769
780
|
elif (
|
770
781
|
not rendered_info.is_implemented
|
@@ -775,7 +786,7 @@ def create(
|
|
775
786
|
"Card of type %s is a runtime time card with no `render_runtime` implemented. "
|
776
787
|
"Please implement `render_runtime` method to allow rendering this card at runtime."
|
777
788
|
) % type
|
778
|
-
rendered_content =
|
789
|
+
rendered_content = _render_error_card(message)
|
779
790
|
|
780
791
|
# todo : should we save native type for error card or error type ?
|
781
792
|
if type is not None and re.match(CARD_ID_PATTERN, type) is not None:
|
@@ -542,11 +542,24 @@ class ErrorCard(MetaflowCard):
|
|
542
542
|
|
543
543
|
type = "error"
|
544
544
|
|
545
|
+
RELOAD_POLICY = MetaflowCard.RELOAD_POLICY_ONCHANGE
|
546
|
+
|
545
547
|
def __init__(self, options={}, components=[], graph=None):
|
546
548
|
self._only_repr = True
|
547
549
|
self._graph = None if graph is None else transform_flow_graph(graph)
|
548
550
|
self._components = components
|
549
551
|
|
552
|
+
def reload_content_token(self, task, data):
|
553
|
+
"""
|
554
|
+
The reload token will change when the component array has changed in the Metaflow card.
|
555
|
+
The change in the component array is signified by the change in the component_update_ts.
|
556
|
+
"""
|
557
|
+
if task.finished:
|
558
|
+
return "final"
|
559
|
+
# `component_update_ts` will never be None. It is set to a default value when the `ComponentStore` is instantiated
|
560
|
+
# And it is updated when components added / removed / changed from the `ComponentStore`.
|
561
|
+
return "runtime-%s" % (str(data["component_update_ts"]))
|
562
|
+
|
550
563
|
def render(self, task, stack_trace=None):
|
551
564
|
RENDER_TEMPLATE = read_file(RENDER_TEMPLATE_PATH)
|
552
565
|
JS_DATA = read_file(JS_PATH)
|
@@ -146,7 +146,7 @@ class Stub(with_metaclass(StubMetaClass, object)):
|
|
146
146
|
return object.__getattribute__(self, name)
|
147
147
|
|
148
148
|
def __getattr__(self, name):
|
149
|
-
if name in DELETED_ATTRS:
|
149
|
+
if name in DELETED_ATTRS or self.___is_returned_exception___:
|
150
150
|
raise AttributeError()
|
151
151
|
return fwd_request(self, OP_GETATTR, name)
|
152
152
|
|
@@ -166,6 +166,8 @@ class Stub(with_metaclass(StubMetaClass, object)):
|
|
166
166
|
):
|
167
167
|
object.__setattr__(self, name, value)
|
168
168
|
else:
|
169
|
+
if self.___is_returned_exception___:
|
170
|
+
raise AttributeError()
|
169
171
|
fwd_request(self, OP_SETATTR, name, value)
|
170
172
|
|
171
173
|
def __dir__(self):
|
@@ -123,7 +123,7 @@ if __name__ == "__main__":
|
|
123
123
|
[
|
124
124
|
f"""set -e;
|
125
125
|
export PATH=$PATH:$(pwd)/micromamba;
|
126
|
-
micromamba run --prefix {prefix} pip --disable-pip-version-check install --root-user-action=ignore --no-compile {pypi_pkgs_dir}/*.whl"""
|
126
|
+
micromamba run --prefix {prefix} python -m pip --disable-pip-version-check install --root-user-action=ignore --no-compile {pypi_pkgs_dir}/*.whl --no-user"""
|
127
127
|
]
|
128
128
|
)
|
129
129
|
|