Skip to content

Commit 6d045d7

Browse files
authored
Order image per step plots (#143)
1 parent cad3a3f commit 6d045d7

File tree

2 files changed

+78
-2
lines changed

2 files changed

+78
-2
lines changed

src/dvc_render/html.py

+28-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import os
12
from pathlib import Path
23
from typing import TYPE_CHECKING, List, Optional
34

5+
from dvc_render.image import ImageRenderer
6+
47
from .exceptions import DvcRenderException
58

69
if TYPE_CHECKING:
@@ -76,6 +79,25 @@ def embed(self) -> str:
7679
return self.template
7780

7881

82+
def _order_image_per_step(renderer: "Renderer") -> tuple:
83+
is_image_renderer = isinstance(renderer, ImageRenderer)
84+
85+
if not is_image_renderer:
86+
return (is_image_renderer, None, None, None)
87+
88+
path = renderer.name
89+
basename = os.path.basename(path)
90+
filename = os.path.splitext(basename)[0]
91+
image_number = int(filename) if filename.isdigit() else None
92+
93+
return (
94+
is_image_renderer,
95+
os.path.dirname(path),
96+
image_number,
97+
basename,
98+
)
99+
100+
79101
def render_html(
80102
renderers: List["Renderer"],
81103
output_file: "StrPath",
@@ -94,7 +116,12 @@ def render_html(
94116

95117
document = HTML(page_html, refresh_seconds=refresh_seconds)
96118

97-
for renderer in renderers:
119+
sorted_renderers = sorted(
120+
renderers,
121+
key=_order_image_per_step,
122+
)
123+
124+
for renderer in sorted_renderers:
98125
document.with_scripts(renderer.SCRIPTS)
99126
document.with_element(renderer.generate_html(html_path=output_path))
100127

tests/test_html.py

+50-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
# pylint: disable=missing-function-docstring, R0801
2+
import os
3+
24
import pytest
35

4-
from dvc_render.html import HTML, PAGE_HTML, MissingPlaceholderError, render_html
6+
from dvc_render.html import (
7+
HTML,
8+
PAGE_HTML,
9+
MissingPlaceholderError,
10+
_order_image_per_step,
11+
render_html,
12+
)
13+
from dvc_render.image import ImageRenderer
14+
from dvc_render.vega import VegaRenderer
515

616
CUSTOM_PAGE_HTML = """<!DOCTYPE html>
717
<html>
@@ -83,6 +93,45 @@ def test_render_html_with_custom_template(mocker, tmp_dir):
8393
assert output_file.read_text() == CUSTOM_PAGE_HTML.format(plot_divs="")
8494

8595

96+
def test_order_image_per_step():
97+
image_per_step_dir = "dvclive"
98+
other_image_dir = "static"
99+
100+
def create_renderer(filename: str) -> ImageRenderer:
101+
return ImageRenderer(
102+
[
103+
{
104+
"filename": filename,
105+
"rev": "workspace",
106+
"src": filename,
107+
}
108+
],
109+
filename,
110+
)
111+
112+
r1 = VegaRenderer([], "dvc.yaml::Loss")
113+
r2 = VegaRenderer([], "dvc.yaml::Accuracy")
114+
r3 = create_renderer(os.path.join(image_per_step_dir, "0.jpg"))
115+
r4 = create_renderer(os.path.join(image_per_step_dir, "1.jpg"))
116+
r5 = create_renderer(os.path.join(image_per_step_dir, "2.jpg"))
117+
r6 = create_renderer(os.path.join(image_per_step_dir, "10.jpg"))
118+
r7 = create_renderer(os.path.join(other_image_dir, "a_file.jpg"))
119+
r8 = create_renderer(os.path.join(other_image_dir, "z_file.jpg"))
120+
121+
renderers = [r7, r3, r5, r8, r1, r6, r4, r2]
122+
123+
assert sorted(renderers, key=_order_image_per_step) == [
124+
r1,
125+
r2,
126+
r3,
127+
r4,
128+
r5,
129+
r6,
130+
r7,
131+
r8,
132+
]
133+
134+
86135
def test_no_placeholder():
87136
template = "<head></head><body></body>"
88137

0 commit comments

Comments
 (0)