Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 795176d

Browse files
committed
Simplify/pathlibify image_comparison.
There's no public class that inherits from _ImageComparisonBase anymore, so we can improve it by getting rid of the delayed_init mechanism and by pathlibifying its internals without worrying about API breaks. The changes in compare.py are necessary to make these functions also support Path (now passed by _ImageComparisonBase) as arguments.
1 parent 569204b commit 795176d

File tree

2 files changed

+32
-47
lines changed

2 files changed

+32
-47
lines changed

lib/matplotlib/testing/compare.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ def convert(filename, cache):
264264
hash of the exact contents of the input file. There is no limit on the
265265
size of the cache, so it may need to be manually cleared periodically.
266266
"""
267-
base, extension = filename.rsplit('.', 1)
267+
base, extension = os.fspath(filename).rsplit('.', 1)
268268
if extension not in converter:
269269
import pytest
270270
pytest.skip(f"Don't know how to convert {extension} files to png")
@@ -369,18 +369,17 @@ def compare_images(expected, actual, tol, in_decorator=False):
369369
"""
370370
from matplotlib import _png
371371

372+
actual = os.fspath(actual)
372373
if not os.path.exists(actual):
373374
raise Exception("Output image %s does not exist." % actual)
374-
375375
if os.stat(actual).st_size == 0:
376376
raise Exception("Output image file %s is empty." % actual)
377377

378378
# Convert the image to png
379-
extension = expected.split('.')[-1]
380-
379+
expected = os.fspath(expected)
381380
if not os.path.exists(expected):
382381
raise IOError('Baseline image %r does not exist.' % expected)
383-
382+
extension = expected.split('.')[-1]
384383
if extension != 'png':
385384
actual = convert(actual, False)
386385
expected = convert(expected, True)

lib/matplotlib/testing/decorators.py

Lines changed: 28 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,6 @@ def _raise_on_image_difference(expected, actual, tol):
127127
__tracebackhide__ = True
128128

129129
err = compare_images(expected, actual, tol, in_decorator=True)
130-
131-
if not os.path.exists(expected):
132-
raise ImageComparisonFailure('image does not exist: %s' % expected)
133-
134130
if err:
135131
for key in ["actual", "expected"]:
136132
err[key] = os.path.relpath(err[key])
@@ -172,34 +168,28 @@ class _ImageComparisonBase:
172168
This class provides *just* the comparison-related functionality and avoids
173169
any code that would be specific to any testing framework.
174170
"""
175-
def __init__(self, tol, remove_text, savefig_kwargs):
176-
self.func = self.baseline_dir = self.result_dir = None
177-
self.tol = tol
178-
self.remove_text = remove_text
179-
self.savefig_kwargs = savefig_kwargs
180171

181-
def delayed_init(self, func):
182-
assert self.func is None, "it looks like same decorator used twice"
172+
def __init__(self, func, tol, remove_text, savefig_kwargs):
183173
self.func = func
184174
self.baseline_dir, self.result_dir = _image_directories(func)
175+
self.tol = tol
176+
self.remove_text = remove_text
177+
self.savefig_kwargs = savefig_kwargs
185178

186179
def copy_baseline(self, baseline, extension):
187-
baseline_path = os.path.join(self.baseline_dir, baseline)
188-
orig_expected_fname = baseline_path + '.' + extension
189-
if extension == 'eps' and not os.path.exists(orig_expected_fname):
190-
orig_expected_fname = baseline_path + '.pdf'
191-
expected_fname = make_test_filename(
192-
os.path.join(self.result_dir,
193-
os.path.basename(orig_expected_fname)),
194-
'expected')
195-
if os.path.exists(orig_expected_fname):
196-
shutil.copyfile(orig_expected_fname, expected_fname)
197-
else:
198-
reason = ("Do not have baseline image {} because this "
199-
"file does not exist: {}".format(expected_fname,
200-
orig_expected_fname))
201-
raise ImageComparisonFailure(reason)
202-
return expected_fname
180+
baseline_path = self.baseline_dir / baseline
181+
orig_expected_path = baseline_path.with_suffix(f'.{extension}')
182+
if extension == 'eps' and not orig_expected_path.exists():
183+
orig_expected_path = baseline_path.with_suffix('.pdf')
184+
expected_path = make_test_filename(
185+
self.result_dir / orig_expected_path.name, 'expected')
186+
try:
187+
shutil.copyfile(orig_expected_path, expected_path)
188+
except IOError as exc:
189+
raise ImageComparisonFailure(
190+
f"Failed to copy baseline image {orig_expected_path} to "
191+
f"{expected_path}") from exc
192+
return expected_path
203193

204194
def compare(self, idx, baseline, extension):
205195
__tracebackhide__ = True
@@ -209,17 +199,16 @@ def compare(self, idx, baseline, extension):
209199
if self.remove_text:
210200
remove_ticks_and_titles(fig)
211201

212-
actual_fname = (
213-
os.path.join(self.result_dir, baseline) + '.' + extension)
202+
actual_path = (self.result_dir / baseline).with_suffix(f'.{extension}')
214203
kwargs = self.savefig_kwargs.copy()
215204
if extension == 'pdf':
216205
kwargs.setdefault('metadata',
217206
{'Creator': None, 'Producer': None,
218207
'CreationDate': None})
219-
fig.savefig(actual_fname, **kwargs)
208+
fig.savefig(actual_path, **kwargs)
220209

221-
expected_fname = self.copy_baseline(baseline, extension)
222-
_raise_on_image_difference(expected_fname, actual_fname, self.tol)
210+
expected_path = self.copy_baseline(baseline, extension)
211+
_raise_on_image_difference(expected_path, actual_path, self.tol)
223212

224213

225214
def _pytest_image_comparison(baseline_images, extensions, tol,
@@ -249,9 +238,8 @@ def decorator(func):
249238
@functools.wraps(func)
250239
def wrapper(*args, **kwargs):
251240
__tracebackhide__ = True
252-
img = _ImageComparisonBase(tol=tol, remove_text=remove_text,
241+
img = _ImageComparisonBase(func, tol=tol, remove_text=remove_text,
253242
savefig_kwargs=savefig_kwargs)
254-
img.delayed_init(func)
255243
matplotlib.testing.set_font_settings_for_testing()
256244
func(*args, **kwargs)
257245

@@ -390,7 +378,7 @@ def test_plot(fig_test, fig_ref):
390378
def decorator(func):
391379
import pytest
392380

393-
_, result_dir = map(Path, _image_directories(func))
381+
_, result_dir = _image_directories(func)
394382

395383
if len(inspect.signature(func).parameters) == 2:
396384
# Free-standing function.
@@ -399,9 +387,8 @@ def wrapper(ext):
399387
fig_test = plt.figure("test")
400388
fig_ref = plt.figure("reference")
401389
func(fig_test, fig_ref)
402-
test_image_path = str(
403-
result_dir / (func.__name__ + "." + ext))
404-
ref_image_path = str(
390+
test_image_path = result_dir / (func.__name__ + "." + ext)
391+
ref_image_path = (
405392
result_dir / (func.__name__ + "-expected." + ext))
406393
fig_test.savefig(test_image_path)
407394
fig_ref.savefig(ref_image_path)
@@ -415,9 +402,8 @@ def wrapper(self, ext):
415402
fig_test = plt.figure("test")
416403
fig_ref = plt.figure("reference")
417404
func(self, fig_test, fig_ref)
418-
test_image_path = str(
419-
result_dir / (func.__name__ + "." + ext))
420-
ref_image_path = str(
405+
test_image_path = result_dir / (func.__name__ + "." + ext)
406+
ref_image_path = (
421407
result_dir / (func.__name__ + "-expected." + ext))
422408
fig_test.savefig(test_image_path)
423409
fig_ref.savefig(ref_image_path)
@@ -442,7 +428,7 @@ def _image_directories(func):
442428
baseline_dir = module_path.parent / "baseline_images" / module_path.stem
443429
result_dir = Path().resolve() / "result_images" / module_path.stem
444430
result_dir.mkdir(parents=True, exist_ok=True)
445-
return str(baseline_dir), str(result_dir)
431+
return baseline_dir, result_dir
446432

447433

448434
@cbook.deprecated("3.1", alternative="pytest.mark.backend")

0 commit comments

Comments
 (0)