From a521d3b4f2cacbdc36fe101e0053b3facd8c37a7 Mon Sep 17 00:00:00 2001 From: David de la Iglesia Castro Date: Fri, 29 Oct 2021 21:30:47 +0200 Subject: [PATCH] live: Call `webbrowser.open`. Use `funcy.once_per_args` decorator to prevent opening the html multiple times if user closes first time. Closes iterative/dvclive#180 --- dvc/repo/live.py | 19 ++++++++++++++++++- tests/func/test_live.py | 2 ++ 2 files changed, 20 insertions(+), 1 deletion(-) 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):