diff --git a/dvc/repo/live.py b/dvc/repo/live.py index 9a7521395a..a349a65671 100644 --- a/dvc/repo/live.py +++ b/dvc/repo/live.py @@ -1,6 +1,11 @@ import logging +import webbrowser +from pathlib import Path +from platform import uname from typing import TYPE_CHECKING, List, Optional +from funcy import once_per_args + from dvc.render.utils import render logger = logging.getLogger(__name__) @@ -10,15 +15,27 @@ from dvc.path_info import PathInfo from dvc.repo import Repo +webbrowser_open = once_per_args(webbrowser.open) + def create_summary(out): + assert out.live and out.live["html"] metrics, plots = out.repo.live.show(str(out.path_info)) html_path = out.path_info.fspath + "_dvc_plots" - render(out.repo, plots, metrics=metrics, path=html_path, refresh_seconds=5) + index_path = render( + out.repo, plots, metrics=metrics, path=html_path, refresh_seconds=5 + ) + + url = index_path.as_uri() + + if "Microsoft" in uname().release: + url = Path(index_path) / "index.html" + + webbrowser_open(url) def summary_path_info(out: "Output") -> Optional["PathInfo"]: diff --git a/tests/func/test_live.py b/tests/func/test_live.py index 8c66cd870b..4610f585f9 100644 --- a/tests/func/test_live.py +++ b/tests/func/test_live.py @@ -237,6 +237,7 @@ def test_live_checkpoints_resume( def test_dvc_generates_html_during_run(tmp_dir, dvc, mocker, live_stage): show_spy = mocker.spy(dvc.live, "show") + webbrowser_open = mocker.patch("dvc.repo.live.webbrowser_open") # make sure script takes more time to execute than one monitor sleep cycle monitor_await_time = 0.01 @@ -258,6 +259,7 @@ def test_dvc_generates_html_during_run(tmp_dir, dvc, mocker, live_stage): live_stage(summary=True, live="logs", code=script) assert show_spy.call_count == 2 + assert webbrowser_open.call_count == 2 def test_dvclive_stage_with_different_wdir(tmp_dir, scm, dvc):