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

|
32
32
|
|
@@ -287,126 +287,6 @@ def dump(obj, input_path, private=None, max_value_size=None, include=None, file=
|
|
287
287
|
echo("Artifacts written to *%s*" % file)
|
288
288
|
|
289
289
|
|
290
|
-
@cli.command(
|
291
|
-
help="Show stdout/stderr produced by a task or all tasks in a step. "
|
292
|
-
"The format for input-path is either <run_id>/<step_name> or "
|
293
|
-
"<run_id>/<step_name>/<task_id>."
|
294
|
-
)
|
295
|
-
@click.argument("input-path")
|
296
|
-
@click.option(
|
297
|
-
"--stdout/--no-stdout",
|
298
|
-
default=False,
|
299
|
-
show_default=True,
|
300
|
-
help="Show stdout of the task.",
|
301
|
-
)
|
302
|
-
@click.option(
|
303
|
-
"--stderr/--no-stderr",
|
304
|
-
default=False,
|
305
|
-
show_default=True,
|
306
|
-
help="Show stderr of the task.",
|
307
|
-
)
|
308
|
-
@click.option(
|
309
|
-
"--both/--no-both",
|
310
|
-
default=True,
|
311
|
-
show_default=True,
|
312
|
-
help="Show both stdout and stderr of the task.",
|
313
|
-
)
|
314
|
-
@click.option(
|
315
|
-
"--timestamps/--no-timestamps",
|
316
|
-
default=False,
|
317
|
-
show_default=True,
|
318
|
-
help="Show timestamps.",
|
319
|
-
)
|
320
|
-
@click.pass_obj
|
321
|
-
def logs(obj, input_path, stdout=None, stderr=None, both=None, timestamps=False):
|
322
|
-
types = set()
|
323
|
-
if stdout:
|
324
|
-
types.add("stdout")
|
325
|
-
both = False
|
326
|
-
if stderr:
|
327
|
-
types.add("stderr")
|
328
|
-
both = False
|
329
|
-
if both:
|
330
|
-
types.update(("stdout", "stderr"))
|
331
|
-
|
332
|
-
streams = list(sorted(types, reverse=True))
|
333
|
-
|
334
|
-
# Pathspec can either be run_id/step_name or run_id/step_name/task_id.
|
335
|
-
parts = input_path.split("/")
|
336
|
-
if len(parts) == 2:
|
337
|
-
run_id, step_name = parts
|
338
|
-
task_id = None
|
339
|
-
elif len(parts) == 3:
|
340
|
-
run_id, step_name, task_id = parts
|
341
|
-
else:
|
342
|
-
raise CommandException(
|
343
|
-
"input_path should either be run_id/step_name "
|
344
|
-
"or run_id/step_name/task_id"
|
345
|
-
)
|
346
|
-
|
347
|
-
datastore_set = TaskDataStoreSet(
|
348
|
-
obj.flow_datastore, run_id, steps=[step_name], allow_not_done=True
|
349
|
-
)
|
350
|
-
if task_id:
|
351
|
-
ds_list = [
|
352
|
-
TaskDataStore(
|
353
|
-
obj.flow_datastore,
|
354
|
-
run_id=run_id,
|
355
|
-
step_name=step_name,
|
356
|
-
task_id=task_id,
|
357
|
-
mode="r",
|
358
|
-
allow_not_done=True,
|
359
|
-
)
|
360
|
-
]
|
361
|
-
else:
|
362
|
-
ds_list = list(datastore_set) # get all tasks
|
363
|
-
|
364
|
-
if ds_list:
|
365
|
-
|
366
|
-
def echo_unicode(line, **kwargs):
|
367
|
-
click.secho(line.decode("UTF-8", errors="replace"), **kwargs)
|
368
|
-
|
369
|
-
# old style logs are non mflog-style logs
|
370
|
-
maybe_old_style = True
|
371
|
-
for ds in ds_list:
|
372
|
-
echo(
|
373
|
-
"Dumping logs of run_id=*{run_id}* "
|
374
|
-
"step=*{step}* task_id=*{task_id}*".format(
|
375
|
-
run_id=ds.run_id, step=ds.step_name, task_id=ds.task_id
|
376
|
-
),
|
377
|
-
fg="magenta",
|
378
|
-
)
|
379
|
-
|
380
|
-
for stream in streams:
|
381
|
-
echo(stream, bold=True)
|
382
|
-
logs = ds.load_logs(LOG_SOURCES, stream)
|
383
|
-
if any(data for _, data in logs):
|
384
|
-
# attempt to read new, mflog-style logs
|
385
|
-
for line in mflog.merge_logs([blob for _, blob in logs]):
|
386
|
-
if timestamps:
|
387
|
-
ts = mflog.utc_to_local(line.utc_tstamp)
|
388
|
-
tstamp = ts.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
|
389
|
-
click.secho(tstamp + " ", fg=LOGGER_TIMESTAMP, nl=False)
|
390
|
-
echo_unicode(line.msg)
|
391
|
-
maybe_old_style = False
|
392
|
-
elif maybe_old_style:
|
393
|
-
# if they are not available, we may be looking at
|
394
|
-
# a legacy run (unless we have seen new-style data already
|
395
|
-
# for another stream). This return an empty string if
|
396
|
-
# nothing is found
|
397
|
-
log = ds.load_log_legacy(stream)
|
398
|
-
if log and timestamps:
|
399
|
-
raise CommandException(
|
400
|
-
"We can't show --timestamps for old runs. Sorry!"
|
401
|
-
)
|
402
|
-
echo_unicode(log, nl=False)
|
403
|
-
else:
|
404
|
-
raise CommandException(
|
405
|
-
"No Tasks found at the given path -- "
|
406
|
-
"either none exist or none have started yet"
|
407
|
-
)
|
408
|
-
|
409
|
-
|
410
290
|
# TODO - move step and init under a separate 'internal' subcommand
|
411
291
|
|
412
292
|
|
@@ -22,7 +22,7 @@ class TaskDataStoreSet(object):
|
|
22
22
|
prefetch_data_artifacts=None,
|
23
23
|
allow_not_done=False,
|
24
24
|
):
|
25
|
-
self.task_datastores = flow_datastore.
|
25
|
+
self.task_datastores = flow_datastore.get_task_datastores(
|
26
26
|
run_id, steps=steps, pathspecs=pathspecs, allow_not_done=allow_not_done
|
27
27
|
)
|
28
28
|
|
@@ -67,8 +67,15 @@ class FlowDataStore(object):
|
|
67
67
|
def datastore_root(self):
|
68
68
|
return self._storage_impl.datastore_root
|
69
69
|
|
70
|
-
def
|
71
|
-
self,
|
70
|
+
def get_task_datastores(
|
71
|
+
self,
|
72
|
+
run_id=None,
|
73
|
+
steps=None,
|
74
|
+
pathspecs=None,
|
75
|
+
allow_not_done=False,
|
76
|
+
attempt=None,
|
77
|
+
include_prior=False,
|
78
|
+
mode="r",
|
72
79
|
):
|
73
80
|
"""
|
74
81
|
Return a list of TaskDataStore for a subset of the tasks.
|
@@ -93,6 +100,12 @@ class FlowDataStore(object):
|
|
93
100
|
allow_not_done : bool, optional
|
94
101
|
If True, returns the latest attempt of a task even if that attempt
|
95
102
|
wasn't marked as done, by default False
|
103
|
+
attempt : int, optional
|
104
|
+
Attempt number of the tasks to return. If not provided, returns latest attempt.
|
105
|
+
include_prior : boolean, default False
|
106
|
+
If True, returns all attempts up to and including attempt.
|
107
|
+
mode : str, default "r"
|
108
|
+
Mode to initialize the returned TaskDataStores in.
|
96
109
|
|
97
110
|
Returns
|
98
111
|
-------
|
@@ -126,8 +139,13 @@ class FlowDataStore(object):
|
|
126
139
|
if task.is_file is False
|
127
140
|
]
|
128
141
|
urls = []
|
142
|
+
# parse content urls for specific attempt only, or for all attempts in max range
|
143
|
+
attempt_range = range(metaflow_config.MAX_ATTEMPTS)
|
144
|
+
# we have no reason to check for attempts greater than MAX_ATTEMPTS, as they do not exist.
|
145
|
+
if attempt is not None and attempt <= metaflow_config.MAX_ATTEMPTS - 1:
|
146
|
+
attempt_range = range(attempt + 1) if include_prior else [attempt]
|
129
147
|
for task_url in task_urls:
|
130
|
-
for attempt in
|
148
|
+
for attempt in attempt_range:
|
131
149
|
for suffix in [
|
132
150
|
TaskDataStore.METADATA_DATA_SUFFIX,
|
133
151
|
TaskDataStore.METADATA_ATTEMPT_SUFFIX,
|
@@ -168,11 +186,19 @@ class FlowDataStore(object):
|
|
168
186
|
for (run, step, task), attempt in latest_started_attempts.items()
|
169
187
|
)
|
170
188
|
if allow_not_done:
|
171
|
-
latest_to_fetch =
|
189
|
+
latest_to_fetch = (
|
190
|
+
done_attempts.union(latest_started_attempts)
|
191
|
+
if include_prior
|
192
|
+
else latest_started_attempts
|
193
|
+
)
|
172
194
|
else:
|
173
|
-
latest_to_fetch =
|
195
|
+
latest_to_fetch = (
|
196
|
+
done_attempts
|
197
|
+
if include_prior
|
198
|
+
else (latest_started_attempts & done_attempts)
|
199
|
+
)
|
174
200
|
latest_to_fetch = [
|
175
|
-
(v[0], v[1], v[2], v[3], data_objs.get(v),
|
201
|
+
(v[0], v[1], v[2], v[3], data_objs.get(v), mode, allow_not_done)
|
176
202
|
for v in latest_to_fetch
|
177
203
|
]
|
178
204
|
return list(itertools.starmap(self.get_task_datastore, latest_to_fetch))
|
@@ -173,6 +173,26 @@ class TaskDataStore(object):
|
|
173
173
|
if data_obj is not None:
|
174
174
|
self._objects = data_obj.get("objects", {})
|
175
175
|
self._info = data_obj.get("info", {})
|
176
|
+
elif self._mode == "d":
|
177
|
+
self._objects = {}
|
178
|
+
self._info = {}
|
179
|
+
|
180
|
+
if self._attempt is None:
|
181
|
+
for i in range(metaflow_config.MAX_ATTEMPTS):
|
182
|
+
check_meta = self._metadata_name_for_attempt(
|
183
|
+
self.METADATA_ATTEMPT_SUFFIX, i
|
184
|
+
)
|
185
|
+
if self.has_metadata(check_meta, add_attempt=False):
|
186
|
+
self._attempt = i
|
187
|
+
|
188
|
+
# Do not allow destructive operations on the datastore if attempt is still in flight
|
189
|
+
# and we explicitly did not allow operating on running tasks.
|
190
|
+
if not allow_not_done and not self.has_metadata(self.METADATA_DONE_SUFFIX):
|
191
|
+
raise DataException(
|
192
|
+
"No completed attempts of the task was found for task '%s'"
|
193
|
+
% self._path
|
194
|
+
)
|
195
|
+
|
176
196
|
else:
|
177
197
|
raise DataException("Unknown datastore mode: '%s'" % self._mode)
|
178
198
|
|
@@ -750,6 +770,36 @@ class TaskDataStore(object):
|
|
750
770
|
to_store_dict[n] = data
|
751
771
|
self._save_file(to_store_dict)
|
752
772
|
|
773
|
+
@require_mode("d")
|
774
|
+
def scrub_logs(self, logsources, stream, attempt_override=None):
|
775
|
+
path_logsources = {
|
776
|
+
self._metadata_name_for_attempt(
|
777
|
+
self._get_log_location(s, stream),
|
778
|
+
attempt_override=attempt_override,
|
779
|
+
): s
|
780
|
+
for s in logsources
|
781
|
+
}
|
782
|
+
|
783
|
+
# Legacy log paths
|
784
|
+
legacy_log = self._metadata_name_for_attempt(
|
785
|
+
"%s.log" % stream, attempt_override
|
786
|
+
)
|
787
|
+
path_logsources[legacy_log] = stream
|
788
|
+
|
789
|
+
existing_paths = [
|
790
|
+
path
|
791
|
+
for path in path_logsources.keys()
|
792
|
+
if self.has_metadata(path, add_attempt=False)
|
793
|
+
]
|
794
|
+
|
795
|
+
# Replace log contents with [REDACTED source stream]
|
796
|
+
to_store_dict = {
|
797
|
+
path: bytes("[REDACTED %s %s]" % (path_logsources[path], stream), "utf-8")
|
798
|
+
for path in existing_paths
|
799
|
+
}
|
800
|
+
|
801
|
+
self._save_file(to_store_dict, add_attempt=False, allow_overwrite=True)
|
802
|
+
|
753
803
|
@require_mode("r")
|
754
804
|
def load_log_legacy(self, stream, attempt_override=None):
|
755
805
|
"""
|
@@ -10,7 +10,7 @@ from metaflow.exception import CommandException, METAFLOW_EXIT_DISALLOW_RETRY
|
|
10
10
|
from metaflow.metadata.util import sync_local_metadata_from_datastore
|
11
11
|
from metaflow.metaflow_config import DATASTORE_LOCAL_DIR
|
12
12
|
from metaflow.mflog import TASK_LOG_SOURCE
|
13
|
-
|
13
|
+
from metaflow.unbounded_foreach import UBF_CONTROL, UBF_TASK
|
14
14
|
from .batch import Batch, BatchKilledException
|
15
15
|
|
16
16
|
|
@@ -150,8 +150,10 @@ def kill(ctx, run_id, user, my_runs):
|
|
150
150
|
@click.option("--tmpfs-tempdir", is_flag=True, help="tmpfs requirement for AWS Batch.")
|
151
151
|
@click.option("--tmpfs-size", help="tmpfs requirement for AWS Batch.")
|
152
152
|
@click.option("--tmpfs-path", help="tmpfs requirement for AWS Batch.")
|
153
|
-
#
|
154
|
-
@click.option(
|
153
|
+
# NOTE: ubf-context is not explicitly used, but @parallel decorator tries to pass this so keep it for now
|
154
|
+
@click.option(
|
155
|
+
"--ubf-context", default=None, type=click.Choice(["none", UBF_CONTROL, UBF_TASK])
|
156
|
+
)
|
155
157
|
@click.option("--host-volumes", multiple=True)
|
156
158
|
@click.option("--efs-volumes", multiple=True)
|
157
159
|
@click.option(
|
@@ -344,7 +346,7 @@ def step(
|
|
344
346
|
log_options=log_options,
|
345
347
|
num_parallel=num_parallel,
|
346
348
|
)
|
347
|
-
except Exception
|
349
|
+
except Exception:
|
348
350
|
traceback.print_exc()
|
349
351
|
_sync_metadata()
|
350
352
|
sys.exit(METAFLOW_EXIT_DISALLOW_RETRY)
|
@@ -1245,12 +1245,12 @@ class S3(object):
|
|
1245
1245
|
|
1246
1246
|
def _store():
|
1247
1247
|
for key_obj in key_objs:
|
1248
|
-
if isinstance(key_obj,
|
1249
|
-
key = key_obj[0]
|
1250
|
-
obj = key_obj[1]
|
1251
|
-
else:
|
1248
|
+
if isinstance(key_obj, S3PutObject):
|
1252
1249
|
key = key_obj.key
|
1253
1250
|
obj = key_obj.value
|
1251
|
+
else:
|
1252
|
+
key = key_obj[0]
|
1253
|
+
obj = key_obj[1]
|
1254
1254
|
store_info = {
|
1255
1255
|
"key": key,
|
1256
1256
|
"content_type": getattr(key_obj, "content_type", None),
|
@@ -1319,12 +1319,12 @@ class S3(object):
|
|
1319
1319
|
|
1320
1320
|
def _check():
|
1321
1321
|
for key_path in key_paths:
|
1322
|
-
if isinstance(key_path,
|
1323
|
-
key = key_path[0]
|
1324
|
-
path = key_path[1]
|
1325
|
-
else:
|
1322
|
+
if isinstance(key_path, S3PutObject):
|
1326
1323
|
key = key_path.key
|
1327
1324
|
path = key_path.path
|
1325
|
+
else:
|
1326
|
+
key = key_path[0]
|
1327
|
+
path = key_path[1]
|
1328
1328
|
store_info = {
|
1329
1329
|
"key": key,
|
1330
1330
|
"content_type": getattr(key_path, "content_type", None),
|