metaflow 2.10.9__tar.gz → 2.10.11__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.10.9 → metaflow-2.10.11}/MANIFEST.in +2 -1
- {metaflow-2.10.9/metaflow.egg-info → metaflow-2.10.11}/PKG-INFO +1 -1
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/basic.py +8 -1
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/components.py +32 -14
- metaflow-2.10.11/metaflow/plugins/cards/card_viewer/viewer.html +344 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/pypi/conda_environment.py +31 -8
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/pypi/pip.py +88 -9
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/pypi/utils.py +11 -8
- metaflow-2.10.11/metaflow/version.py +1 -0
- {metaflow-2.10.9 → metaflow-2.10.11/metaflow.egg-info}/PKG-INFO +1 -1
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow.egg-info/SOURCES.txt +1 -0
- metaflow-2.10.9/metaflow/version.py +0 -1
- {metaflow-2.10.9 → metaflow-2.10.11}/LICENSE +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/README.md +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/R.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/_bashcomplete.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/_compat.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/_termui_impl.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/_textwrap.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/_unicodefun.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/_winconsole.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/core.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/decorators.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/exceptions.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/formatting.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/globals.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/parser.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/termui.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/testing.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/types.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/click/utils.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/_elffile.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/_manylinux.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/_musllinux.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/_parser.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/_structures.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/markers.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/py.typed +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/requirements.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/specifiers.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/tags.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/utils.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/packaging/version.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_5/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_5/zipp.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_6/zipp.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_7/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/_vendor/v3_7/zipp.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/cards.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/cli.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/cli_args.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/client/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/client/core.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/client/filecache.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/cmd/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/cmd/configure_cmd.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/cmd/main_cli.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/cmd/tutorials_cmd.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/cmd/util.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/cmd_with_io.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/current.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/datastore/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/datastore/content_addressed_store.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/datastore/datastore_set.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/datastore/datastore_storage.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/datastore/exceptions.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/datastore/flow_datastore.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/datastore/inputs.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/datastore/task_datastore.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/debug.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/decorators.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/event_logger.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/events.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/exception.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/extension_support/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/extension_support/_empty_file.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/extension_support/cmd.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/extension_support/integrations.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/extension_support/plugins.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/flowspec.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/graph.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/includefile.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/integrations.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/lint.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/metadata/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/metadata/heartbeat.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/metadata/metadata.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/metadata/util.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/metaflow_config.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/metaflow_config_funcs.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/metaflow_environment.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/metaflow_profile.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/metaflow_version.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/mflog/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/mflog/mflog.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/mflog/save_logs.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/mflog/save_logs_periodically.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/mflog/tee.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/monitor.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/multicore_utils.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/package.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/parameters.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/airflow.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/airflow_cli.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/airflow_utils.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/dag.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/exception.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/argo/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/argo/argo_client.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/argo/argo_events.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/argo/argo_workflows.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/argo/process_input_paths.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/aws_client.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/aws_utils.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/batch/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/batch/batch.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/batch/batch_client.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/azure/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/azure/azure_exceptions.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/azure/azure_tail.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/azure/azure_utils.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/azure/includefile_support.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_cli.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_client.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_creator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_datastore.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/base.html +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/card.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/main.js +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_resolver.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/card_server.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/component_serializer.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/cards/exception.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/catch_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datastores/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datastores/azure_storage.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datastores/gs_storage.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datastores/local_storage.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datastores/s3_storage.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datatools/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datatools/local.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datatools/s3/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datatools/s3/s3.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datatools/s3/s3op.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/datatools/s3/s3util.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/debug_logger.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/debug_monitor.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/client.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/client_modules.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/communication/channel.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/communication/utils.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/consts.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/data_transferer.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/override_decorators.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/server.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/stub.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/env_escape/utils.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/environment_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/events_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/frameworks/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/frameworks/pytorch.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/gcp/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/gcp/gs_tail.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/gcp/gs_utils.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/gcp/includefile_support.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/kubernetes/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/kubernetes/kubernetes_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/metadata/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/metadata/local.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/metadata/service.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/package_cli.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/parallel_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/project_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/pypi/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/pypi/bootstrap.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/pypi/conda_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/pypi/micromamba.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/pypi/pypi_environment.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/resources_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/retry_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/secrets/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/storage_executor.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/tag_cli.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/plugins/timeout_decorator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/procpoll.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/py.typed +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/pylint_wrapper.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/runtime.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/sidecar/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/sidecar/sidecar.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/sidecar/sidecar_messages.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/sidecar/sidecar_subprocess.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/sidecar/sidecar_worker.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tagging_util.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/task.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tracing/__init__.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tracing/propagator.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tracing/span_exporter.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tracing/tracing_modules.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/00-helloworld/README.md +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/01-playlist/README.md +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/01-playlist/movies.csv +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/01-playlist/playlist.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/02-statistics/README.md +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/02-statistics/movies.csv +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/02-statistics/stats.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/07-worldview/README.md +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/08-autopilot/README.md +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/unbounded_foreach.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/util.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow/vendor.py +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow.egg-info/dependency_links.txt +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow.egg-info/entry_points.txt +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow.egg-info/requires.txt +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/metaflow.egg-info/top_level.txt +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/setup.cfg +0 -0
- {metaflow-2.10.9 → metaflow-2.10.11}/setup.py +0 -0
@@ -1,4 +1,5 @@
|
|
1
1
|
include LICENSE
|
2
2
|
include metaflow/plugins/cards/card_modules/*.html
|
3
3
|
include metaflow/plugins/cards/card_modules/*.js
|
4
|
-
include metaflow/plugins/cards/card_modules/*.css
|
4
|
+
include metaflow/plugins/cards/card_modules/*.css
|
5
|
+
include metaflow/plugins/cards/card_viewer/*.html
|
@@ -313,7 +313,14 @@ class MarkdownComponent(DefaultComponent):
|
|
313
313
|
|
314
314
|
def render(self):
|
315
315
|
datadict = super().render()
|
316
|
-
|
316
|
+
_text = self._text
|
317
|
+
# When we have a markdown text that doesn't start with a `#`,
|
318
|
+
# we need to add a newline to make sure that the markdown
|
319
|
+
# is rendered correctly. Otherwise `svelte-markdown` will render
|
320
|
+
# the empty `<p>` tags during re-renders on card data updates.
|
321
|
+
if self._text is not None and not self._text.startswith("#"):
|
322
|
+
_text = "\n" + _text
|
323
|
+
datadict["source"] = _text
|
317
324
|
if self.component_id is not None:
|
318
325
|
datadict["id"] = self.component_id
|
319
326
|
return datadict
|
@@ -712,8 +712,16 @@ class ProgressBar(UserComponent):
|
|
712
712
|
|
713
713
|
Parameters
|
714
714
|
----------
|
715
|
-
|
716
|
-
|
715
|
+
max : int
|
716
|
+
The maximum value of the progress bar.
|
717
|
+
label : str, optional
|
718
|
+
Optional label for the progress bar.
|
719
|
+
value : int, optional
|
720
|
+
Optional initial value of the progress bar.
|
721
|
+
unit : str, optional
|
722
|
+
Optional unit for the progress bar.
|
723
|
+
metadata : str, optional
|
724
|
+
Optional additional information to show on the progress bar.
|
717
725
|
"""
|
718
726
|
|
719
727
|
type = "progressBar"
|
@@ -762,31 +770,41 @@ class VegaChart(UserComponent):
|
|
762
770
|
|
763
771
|
REALTIME_UPDATABLE = True
|
764
772
|
|
765
|
-
def __init__(self, spec: dict, show_controls=False):
|
773
|
+
def __init__(self, spec: dict, show_controls: bool = False):
|
766
774
|
self._spec = spec
|
767
775
|
self._show_controls = show_controls
|
768
776
|
self._chart_inside_table = False
|
769
777
|
|
770
778
|
def update(self, spec=None):
|
771
|
-
|
772
|
-
|
779
|
+
"""
|
780
|
+
Update the chart.
|
773
781
|
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
782
|
+
Parameters
|
783
|
+
----------
|
784
|
+
spec : dict or altair.Chart
|
785
|
+
The updated chart spec or an altair Chart Object.
|
786
|
+
"""
|
787
|
+
_spec = spec
|
788
|
+
if self._object_is_altair_chart(spec):
|
789
|
+
_spec = spec.to_dict()
|
790
|
+
if _spec is not None:
|
791
|
+
self._spec = _spec
|
779
792
|
|
793
|
+
@staticmethod
|
794
|
+
def _object_is_altair_chart(altair_chart):
|
780
795
|
# This will feel slightly hacky but I am unable to find a natural way of determining the class
|
781
|
-
# name of the Altair chart. The only way
|
796
|
+
# name of the Altair chart. The only way simple way is to extract the full class name and then
|
782
797
|
# match with heuristics
|
783
|
-
|
784
798
|
fulclsname = _full_classname(altair_chart)
|
785
799
|
if not all([x in fulclsname for x in ["altair", "vegalite", "Chart"]]):
|
786
|
-
|
800
|
+
return False
|
801
|
+
return True
|
787
802
|
|
803
|
+
@classmethod
|
804
|
+
def from_altair_chart(cls, altair_chart):
|
805
|
+
if not cls._object_is_altair_chart(altair_chart):
|
806
|
+
raise ValueError(_full_classname(altair_chart) + " is not an altair chart")
|
788
807
|
altair_chart_dict = altair_chart.to_dict()
|
789
|
-
|
790
808
|
cht = cls(spec=altair_chart_dict)
|
791
809
|
return cht
|
792
810
|
|
@@ -0,0 +1,344 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
6
|
+
<title>Metaflow Run</title>
|
7
|
+
<style>
|
8
|
+
@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap");
|
9
|
+
|
10
|
+
body {
|
11
|
+
font-size: 14px;
|
12
|
+
font-family: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI",
|
13
|
+
"Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans",
|
14
|
+
"Helvetica Neue", sans-serif;
|
15
|
+
padding: 0;
|
16
|
+
margin: 0;
|
17
|
+
display: flex;
|
18
|
+
flex-direction: column;
|
19
|
+
height: 100vh;
|
20
|
+
width: 100%;
|
21
|
+
overflow: hidden;
|
22
|
+
color: #31302f;
|
23
|
+
}
|
24
|
+
|
25
|
+
header {
|
26
|
+
height: 65px;
|
27
|
+
flex: 0 1 auto;
|
28
|
+
flex-grow: none;
|
29
|
+
background: #f9f9f9;
|
30
|
+
display: flex;
|
31
|
+
justify-content: space-evenly;
|
32
|
+
}
|
33
|
+
|
34
|
+
h1,
|
35
|
+
h2,
|
36
|
+
h3,
|
37
|
+
h4 {
|
38
|
+
font-size: inherit;
|
39
|
+
font-weight: 500;
|
40
|
+
margin: 0;
|
41
|
+
padding: 0;
|
42
|
+
}
|
43
|
+
|
44
|
+
header > * {
|
45
|
+
padding: 20px 25px;
|
46
|
+
flex: 1;
|
47
|
+
display: flex;
|
48
|
+
align-items: center;
|
49
|
+
}
|
50
|
+
|
51
|
+
header > div:nth-child(2) {
|
52
|
+
text-align: center;
|
53
|
+
flex: 1;
|
54
|
+
justify-content: center;
|
55
|
+
}
|
56
|
+
|
57
|
+
header > div:nth-child(3) {
|
58
|
+
text-align: right;
|
59
|
+
justify-content: flex-end;
|
60
|
+
font-weight: 400;
|
61
|
+
}
|
62
|
+
|
63
|
+
.taskStatus {
|
64
|
+
color: #6a6867;
|
65
|
+
}
|
66
|
+
|
67
|
+
.taskStatus.error {
|
68
|
+
color: #e67058;
|
69
|
+
}
|
70
|
+
|
71
|
+
.content {
|
72
|
+
flex: 1 1 auto;
|
73
|
+
overflow-y: scroll;
|
74
|
+
}
|
75
|
+
|
76
|
+
iframe {
|
77
|
+
width: 100%;
|
78
|
+
height: calc(100vh - 65px);
|
79
|
+
outline: none;
|
80
|
+
border: 0;
|
81
|
+
display: flex;
|
82
|
+
justify-content: center;
|
83
|
+
align-items: center;
|
84
|
+
}
|
85
|
+
|
86
|
+
header select {
|
87
|
+
width: 100%;
|
88
|
+
border: 0;
|
89
|
+
outline: none;
|
90
|
+
font-size: inherit;
|
91
|
+
font-family: inherit;
|
92
|
+
background: transparent;
|
93
|
+
padding: 0 1rem;
|
94
|
+
}
|
95
|
+
|
96
|
+
.selectorContainer {
|
97
|
+
border: 0;
|
98
|
+
outline: none;
|
99
|
+
font-size: inherit;
|
100
|
+
font-family: inherit;
|
101
|
+
border-radius: 8px;
|
102
|
+
background: #ebeaea;
|
103
|
+
padding: 0 1rem;
|
104
|
+
margin: 1rem;
|
105
|
+
}
|
106
|
+
|
107
|
+
.logoContainer {
|
108
|
+
display: none !important;
|
109
|
+
}
|
110
|
+
|
111
|
+
.errorContainer svg {
|
112
|
+
position: relative;
|
113
|
+
top: 3px;
|
114
|
+
}
|
115
|
+
</style>
|
116
|
+
</head>
|
117
|
+
<body>
|
118
|
+
<header>
|
119
|
+
<h1 id="header-title">Metaflow Run</h1>
|
120
|
+
<div class="selectorContainer">
|
121
|
+
<select id="selector">
|
122
|
+
<option value="" disabled selected>
|
123
|
+
Select a card
|
124
|
+
</option>
|
125
|
+
</select>
|
126
|
+
</div>
|
127
|
+
<div>
|
128
|
+
<div id="task-status" class="taskStatus">Initializing</div>
|
129
|
+
<div id="task-action" class="" style="display: none">Pause</div>
|
130
|
+
</div>
|
131
|
+
</header>
|
132
|
+
<div class="content">
|
133
|
+
<iframe id="card-frame"></iframe>
|
134
|
+
</div>
|
135
|
+
|
136
|
+
<script type="application/javascript">
|
137
|
+
(() => {
|
138
|
+
// setup constants
|
139
|
+
let DATA_UPDATE_POLL_INTERVAL = 5000;
|
140
|
+
let RUN_UPDATE_POLL_INTERVAL = 10000;
|
141
|
+
|
142
|
+
// setup state
|
143
|
+
let currentCardsLength = 0;
|
144
|
+
let currentRunId = "";
|
145
|
+
let selectedCard = "";
|
146
|
+
|
147
|
+
// setup selector
|
148
|
+
const selector = document.getElementById("selector");
|
149
|
+
selector?.addEventListener("change", (event) => {
|
150
|
+
selectedCard = event.target.value;
|
151
|
+
handleLoadCard(event.target.name, event.target.value);
|
152
|
+
});
|
153
|
+
|
154
|
+
/**
|
155
|
+
* Handle any changes to the status of the page
|
156
|
+
*/
|
157
|
+
function handleStatus(status, isComplete = false) {
|
158
|
+
const statusDiv = document.getElementById("task-status");
|
159
|
+
|
160
|
+
// change the text of the status depending if its in progress or not
|
161
|
+
if (statusDiv) {
|
162
|
+
// complete
|
163
|
+
if (isComplete && status === "ok") {
|
164
|
+
statusDiv.innerText = "Task Is Complete";
|
165
|
+
// running
|
166
|
+
} else if (!isComplete && status === "ok") {
|
167
|
+
statusDiv.innerText = "Task Is Running";
|
168
|
+
// error
|
169
|
+
} else {
|
170
|
+
statusDiv.innerHTML = `<div class="errorContainer"><svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
171
|
+
<g clip-path="url(#clip0_164_815)"> <circle cx="8.5" cy="8.5" r="8" fill="#E67058"/> <path d="M11.6475 6.0575C11.8422 5.86282 11.8422 5.54718 11.6475 5.3525C11.4528 5.15782 11.1372 5.15782 10.9425 5.3525L8.5 7.795L6.0575 5.3525C5.86282 5.15782 5.54718 5.15782 5.3525 5.3525C5.15782 5.54718 5.15782 5.86282 5.3525 6.0575L7.795 8.5L5.3525 10.9425C5.15782 11.1372 5.15782 11.4528 5.3525 11.6475C5.54718 11.8422 5.86282 11.8422 6.0575 11.6475L8.5 9.205L10.9425 11.6475C11.1372 11.8422 11.4528 11.8422 11.6475 11.6475C11.8422 11.4528 11.8422 11.1372 11.6475 10.9425L9.205 8.5L11.6475 6.0575Z" fill="white"/> </g><defs><clipPath id="clip0_164_815"><rect width="16" height="16" fill="white" transform="translate(0.5 0.5)"/></clipPath></defs></svg>
|
172
|
+
<span>${status}</span></div>
|
173
|
+
`;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
|
178
|
+
/**
|
179
|
+
* Handle any changes to the cards
|
180
|
+
*/
|
181
|
+
function onCardsLoaded(runInfo) {
|
182
|
+
const { cards, flow, run_id } = runInfo;
|
183
|
+
if (!Array.isArray(cards) || !flow || !run_id) {
|
184
|
+
console.log("Data was not in the correct format");
|
185
|
+
return;
|
186
|
+
}
|
187
|
+
// console.log("Running ON CARDS LOADED", cards, flow, run_id)
|
188
|
+
|
189
|
+
// reset
|
190
|
+
currentCardsLength = cards.length;
|
191
|
+
selector.innerHTML = "";
|
192
|
+
// if the task has finished, change to the next card
|
193
|
+
changeToNewCardIfTaskHasFinished(runInfo);
|
194
|
+
|
195
|
+
// create select options for each card
|
196
|
+
cards.reverse().forEach((card) => {
|
197
|
+
const option = document.createElement("option");
|
198
|
+
option.value = card.card;
|
199
|
+
option.innerText = card.label.split(" ")?.[0] || card.label;
|
200
|
+
option.selected = card.card === selectedCard;
|
201
|
+
selector.appendChild(option);
|
202
|
+
});
|
203
|
+
|
204
|
+
// get card-title element and change it to name
|
205
|
+
const title = document.getElementById("header-title");
|
206
|
+
title.innerText = `${flow}/${run_id}`;
|
207
|
+
}
|
208
|
+
|
209
|
+
/**
|
210
|
+
* This function will determine if changes need to be made to the
|
211
|
+
* card and if so, will we do it by push or by reload
|
212
|
+
*/
|
213
|
+
|
214
|
+
async function watchForCardChanges(iframe) {
|
215
|
+
// replace the /card/ url with the data url
|
216
|
+
const dataUri = iframe.src.replace(/.*\/card\//, "/data/");
|
217
|
+
let resp;
|
218
|
+
try {
|
219
|
+
const req = await fetch(dataUri);
|
220
|
+
resp = await req.json();
|
221
|
+
// setup UI to show complete and status
|
222
|
+
handleStatus(resp.status, resp?.is_complete);
|
223
|
+
|
224
|
+
// grab update fn from iframe
|
225
|
+
const update = iframe.contentWindow?.metaflow_card_update;
|
226
|
+
// make sure we're able to update the card
|
227
|
+
if (resp.status !== "ok" || !update || !resp.payload?.data) {
|
228
|
+
console.log(
|
229
|
+
"Data-updates not taking place because either : status is not `ok` or update function is not available or data is not available",
|
230
|
+
resp,
|
231
|
+
update
|
232
|
+
);
|
233
|
+
} else {
|
234
|
+
// make appropriate updates by pushing if the reload token matches
|
235
|
+
update &&
|
236
|
+
resp.payload?.reload_token ===
|
237
|
+
iframe.contentWindow.METAFLOW_RELOAD_TOKEN
|
238
|
+
? update(resp.payload.data)
|
239
|
+
: iframe.contentWindow.location.reload();
|
240
|
+
}
|
241
|
+
// If there is no Update function than we don't need to wire the
|
242
|
+
// periodic updates
|
243
|
+
if (!update) {
|
244
|
+
console.log(
|
245
|
+
"No metaflow_card_update function available. So not running any periodic updates"
|
246
|
+
);
|
247
|
+
return;
|
248
|
+
}
|
249
|
+
} catch (error) {
|
250
|
+
console.error(error);
|
251
|
+
}
|
252
|
+
// if this update is not the last one, run it again!
|
253
|
+
if (!(resp.payload?.reload_token === "final")) {
|
254
|
+
setTimeout(
|
255
|
+
() => watchForCardChanges(iframe),
|
256
|
+
DATA_UPDATE_POLL_INTERVAL
|
257
|
+
);
|
258
|
+
}
|
259
|
+
}
|
260
|
+
|
261
|
+
/**
|
262
|
+
* Setup a new card and start the watcher
|
263
|
+
*/
|
264
|
+
function handleLoadCard(name, value) {
|
265
|
+
document.getElementsByTagName("title").innerHTML = name;
|
266
|
+
const iframe = document.getElementById("card-frame");
|
267
|
+
iframe.src = `/card/${value}?embed=true`;
|
268
|
+
iframe.onload = () => {
|
269
|
+
watchForCardChanges(iframe);
|
270
|
+
};
|
271
|
+
}
|
272
|
+
|
273
|
+
function changeToNewCardIfTaskHasFinished(runInfo) {
|
274
|
+
// search for the selectedCard in the runInfo
|
275
|
+
const card = runInfo.cards.find((card) => card.card === selectedCard);
|
276
|
+
// if the card object contains `finished` === True, then change to the next card that has not finished
|
277
|
+
if (card?.finished) {
|
278
|
+
// find the index of the current card
|
279
|
+
const currentCardIndex = runInfo.cards.findIndex(
|
280
|
+
(card) => card.card === selectedCard
|
281
|
+
);
|
282
|
+
// find the next card that has not finished
|
283
|
+
const nextCard = runInfo.cards.find((card) => !card.finished);
|
284
|
+
// if there is a next card, change to it
|
285
|
+
|
286
|
+
console.log("nextCard", nextCard);
|
287
|
+
if (nextCard) {
|
288
|
+
selectedCard = nextCard.card;
|
289
|
+
handleLoadCard(nextCard.label, nextCard.card);
|
290
|
+
}
|
291
|
+
}
|
292
|
+
}
|
293
|
+
|
294
|
+
/**
|
295
|
+
* Main loop function
|
296
|
+
*/
|
297
|
+
async function main() {
|
298
|
+
try {
|
299
|
+
// get info on the entire run
|
300
|
+
const runInfoRequest = await fetch("/runinfo");
|
301
|
+
const runInfo = await runInfoRequest.json();
|
302
|
+
|
303
|
+
// reset the state if the run_id changes or on first time
|
304
|
+
if (currentRunId !== runInfo.run_id) {
|
305
|
+
currentRunId = runInfo.run_id;
|
306
|
+
currentCardsLength = 0;
|
307
|
+
selectedCard = "";
|
308
|
+
console.log("runInfo", runInfo);
|
309
|
+
}
|
310
|
+
if (runInfo.poll_interval * 1000 !== DATA_UPDATE_POLL_INTERVAL) {
|
311
|
+
DATA_UPDATE_POLL_INTERVAL = runInfo.poll_interval * 1000;
|
312
|
+
}
|
313
|
+
if (runInfo.poll_interval * 1000 !== RUN_UPDATE_POLL_INTERVAL) {
|
314
|
+
RUN_UPDATE_POLL_INTERVAL = runInfo.poll_interval * 1000;
|
315
|
+
}
|
316
|
+
if (runInfo?.status === "ok") {
|
317
|
+
// only make changes if the cards length has changed
|
318
|
+
if (runInfo?.cards.length !== currentCardsLength) {
|
319
|
+
onCardsLoaded(runInfo);
|
320
|
+
}
|
321
|
+
// if there is no selected card, select the first one
|
322
|
+
if (!selectedCard) {
|
323
|
+
selectedCard = runInfo.cards[0].card;
|
324
|
+
handleLoadCard(runInfo.cards[0].label, runInfo.cards[0].card);
|
325
|
+
}
|
326
|
+
} else {
|
327
|
+
handleStatus(runInfo?.status, false);
|
328
|
+
}
|
329
|
+
} catch (error) {
|
330
|
+
console.error(error);
|
331
|
+
}
|
332
|
+
// always run the main loop, because a user can start a new run,
|
333
|
+
// or restart the web server, and we want the page to continue working
|
334
|
+
setTimeout(main, RUN_UPDATE_POLL_INTERVAL);
|
335
|
+
}
|
336
|
+
|
337
|
+
// start the main loop
|
338
|
+
window.onload = () => {
|
339
|
+
main();
|
340
|
+
};
|
341
|
+
})();
|
342
|
+
</script>
|
343
|
+
</body>
|
344
|
+
</html>
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import copy
|
1
2
|
import errno
|
2
3
|
import fcntl
|
3
4
|
import functools
|
@@ -10,17 +11,17 @@ from concurrent.futures import ThreadPoolExecutor
|
|
10
11
|
from hashlib import sha256
|
11
12
|
from io import BufferedIOBase
|
12
13
|
from itertools import chain
|
13
|
-
from urllib.parse import urlparse
|
14
|
+
from urllib.parse import unquote, urlparse
|
14
15
|
|
15
16
|
import requests
|
16
17
|
|
17
|
-
from metaflow.metaflow_config import get_pinned_conda_libs
|
18
18
|
from metaflow.exception import MetaflowException
|
19
|
+
from metaflow.metaflow_config import get_pinned_conda_libs
|
19
20
|
from metaflow.metaflow_environment import MetaflowEnvironment
|
20
21
|
from metaflow.metaflow_profile import profile
|
21
22
|
|
22
23
|
from . import MAGIC_FILE, _datastore_packageroot
|
23
|
-
from .utils import conda_platform
|
24
|
+
from .utils import conda_platform
|
24
25
|
|
25
26
|
|
26
27
|
class CondaEnvironmentException(MetaflowException):
|
@@ -104,10 +105,24 @@ class CondaEnvironment(MetaflowEnvironment):
|
|
104
105
|
)
|
105
106
|
|
106
107
|
def cache(storage, results, type_):
|
108
|
+
def _path(url, local_path):
|
109
|
+
# Special handling for VCS packages
|
110
|
+
if url.startswith("git+"):
|
111
|
+
base, _ = os.path.split(urlparse(url).path)
|
112
|
+
_, file = os.path.split(local_path)
|
113
|
+
prefix = url.split("@")[-1]
|
114
|
+
return urlparse(url).netloc + os.path.join(
|
115
|
+
unquote(base), prefix, file
|
116
|
+
)
|
117
|
+
else:
|
118
|
+
return urlparse(url).netloc + urlparse(url).path
|
119
|
+
|
107
120
|
local_packages = {
|
108
121
|
url: {
|
109
122
|
# Path to package in datastore.
|
110
|
-
"path":
|
123
|
+
"path": _path(
|
124
|
+
url, local_path
|
125
|
+
), # urlparse(url).netloc + urlparse(url).path,
|
111
126
|
# Path to package on local disk.
|
112
127
|
"local_path": local_path,
|
113
128
|
}
|
@@ -116,22 +131,26 @@ class CondaEnvironment(MetaflowEnvironment):
|
|
116
131
|
}
|
117
132
|
dirty = set()
|
118
133
|
# Prune list of packages to cache.
|
134
|
+
|
135
|
+
_meta = copy.deepcopy(local_packages)
|
119
136
|
for id_, packages, _, _ in results:
|
120
137
|
for package in packages:
|
121
138
|
if package.get("path"):
|
122
139
|
# Cache only those packages that manifest is unaware of
|
123
140
|
local_packages.pop(package["url"], None)
|
124
141
|
else:
|
125
|
-
package["path"] =
|
126
|
-
package["url"], parse_filename_from_url(package["url"])
|
127
|
-
)
|
142
|
+
package["path"] = _meta[package["url"]]["path"]
|
128
143
|
dirty.add(id_)
|
129
144
|
|
130
145
|
list_of_path_and_filehandle = [
|
131
146
|
(
|
132
147
|
package["path"],
|
133
148
|
# Lazily fetch package from the interweb if needed.
|
134
|
-
LazyOpen(
|
149
|
+
LazyOpen(
|
150
|
+
package["local_path"],
|
151
|
+
"rb",
|
152
|
+
url,
|
153
|
+
),
|
135
154
|
)
|
136
155
|
for url, package in local_packages.items()
|
137
156
|
]
|
@@ -393,6 +412,10 @@ class LazyOpen(BufferedIOBase):
|
|
393
412
|
if self.filename and os.path.exists(self.filename):
|
394
413
|
self._file = open(self.filename, self.mode)
|
395
414
|
elif self.url:
|
415
|
+
if self.url.startswith("git+"):
|
416
|
+
raise ValueError(
|
417
|
+
"LazyOpen doesn't support VCS url %s yet!" % self.url
|
418
|
+
)
|
396
419
|
self._buffer = self._download_to_buffer()
|
397
420
|
self._file = io.BytesIO(self._buffer)
|
398
421
|
else:
|