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

Skip to content

Commit 2d7e0fb

Browse files
Added logic for creation of baseline images for both mpl_toolkits directory and matplotlib directory
1 parent f3664a1 commit 2d7e0fb

10 files changed

Lines changed: 89 additions & 53 deletions

File tree

.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,12 @@ lib/z.lib
105105
#########################
106106
lib/matplotlib/backends/web_backend/node_modules/
107107
lib/matplotlib/backends/web_backend/package-lock.json
108+
109+
# Matplotlib tempenv #
110+
######################
111+
temp/testenv
112+
113+
# Baseline Images #
114+
###################
115+
lib/matplotlib/tests/baseline_images
116+
lib/mpl_toolkits/tests/baseline_images/

lib/matplotlib/testing/conftest.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def pytest_configure(config):
1717
("markers", "baseline_images: Compare output against references."),
1818
("markers", "pytz: Tests that require pytz to be installed."),
1919
("markers", "network: Tests that reach out to the network."),
20+
("markers", "matplotlib_baseline_image_generation: Flag to generate matplotlib baseline images."),
2021
("filterwarnings", "error"),
2122
]:
2223
config.addinivalue_line(key, value)
@@ -135,3 +136,23 @@ def pd():
135136
except ImportError:
136137
pass
137138
return pd
139+
140+
141+
def pytest_addoption(parser):
142+
try:
143+
parser.addoption(
144+
"--matplotlib_baseline_image_generation",
145+
action="store_true",
146+
default=False,
147+
help="run matplotlib baseline image generation tests"
148+
)
149+
except:
150+
pass
151+
152+
153+
def pytest_collection_modifyitems(config, items):
154+
if config.getoption("--matplotlib_baseline_image_generation"):
155+
skip_non_matplotlib_baseline_image_generation_tests = pytest.mark.skip(reason="No need to run non image generation tests")
156+
for item in items:
157+
if "matplotlib_baseline_image_generation" not in item.keywords:
158+
item.add_marker(skip_non_matplotlib_baseline_image_generation_tests)

lib/matplotlib/testing/decorators.py

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,15 @@
66
from pathlib import Path
77
import shutil
88
import string
9+
import subprocess
910
import sys
1011
import unittest
1112
import warnings
13+
import pytest
14+
try:
15+
from contextlib import nullcontext
16+
except ImportError:
17+
from contextlib import ExitStack as nullcontext # Py3.6.
1218

1319
import matplotlib.style
1420
import matplotlib.units
@@ -199,7 +205,27 @@ def copy_baseline(self, baseline, extension):
199205
f"{orig_expected_path}") from err
200206
return expected_fname
201207

202-
def compare(self, idx, baseline, extension, *, _lock=False):
208+
209+
def create_baseline(self, baseline, extension):
210+
src_path = self.result_dir / baseline
211+
orig_src_path = src_path.with_suffix(f'.{extension}')
212+
if extension == 'eps' and not orig_src_path.exists():
213+
orig_src_path = orig_src_path.with_suffix('.pdf')
214+
dest_path = Path(self.baseline_dir / orig_src_path.name)
215+
try:
216+
if dest_path.exists():
217+
return dest_path
218+
Path(dest_path).parent.mkdir(parents=True, exist_ok=True)
219+
try:
220+
os.symlink(orig_src_path, dest_path)
221+
except OSError: # On Windows, symlink *may* be unavailable.
222+
shutil.copyfile(orig_src_path, dest_path)
223+
except OSError as err:
224+
raise ValueError("Failed to put the image in the right place")
225+
return dest_path
226+
227+
228+
def compare(self, idx, baseline, extension, *, _lock=False, generating=False):
203229
__tracebackhide__ = True
204230
fignum = plt.get_fignums()[idx]
205231
fig = plt.figure(fignum)
@@ -218,8 +244,12 @@ def compare(self, idx, baseline, extension, *, _lock=False):
218244
if _lock else contextlib.nullcontext())
219245
with lock:
220246
fig.savefig(actual_path, **kwargs)
221-
expected_path = self.copy_baseline(baseline, extension)
222-
_raise_on_image_difference(expected_path, actual_path, self.tol)
247+
if generating:
248+
self.create_baseline(baseline, extension)
249+
else:
250+
expected_path = self.copy_baseline(baseline, extension)
251+
_raise_on_image_difference(expected_path, actual_path, self.tol)
252+
223253

224254

225255
def _pytest_image_comparison(baseline_images, extensions, tol,
@@ -244,12 +274,14 @@ def decorator(func):
244274
@pytest.mark.style(style)
245275
@_checked_on_freetype_version(freetype_version)
246276
@functools.wraps(func)
277+
@pytest.mark.matplotlib_baseline_image_generation
247278
def wrapper(*args, extension, request, **kwargs):
248279
__tracebackhide__ = True
249280
if 'extension' in old_sig.parameters:
250281
kwargs['extension'] = extension
251282
if 'request' in old_sig.parameters:
252283
kwargs['request'] = request
284+
matplotlib_baseline_image_generation = request.config.getoption("--matplotlib_baseline_image_generation")
253285

254286
img = _ImageComparisonBase(func, tol=tol, remove_text=remove_text,
255287
savefig_kwargs=savefig_kwargs)
@@ -275,7 +307,7 @@ def wrapper(*args, extension, request, **kwargs):
275307
"Test generated {} images but there are {} baseline images"
276308
.format(len(plt.get_fignums()), len(our_baseline_images)))
277309
for idx, baseline in enumerate(our_baseline_images):
278-
img.compare(idx, baseline, extension, _lock=needs_lock)
310+
img.compare(idx, baseline, extension, _lock=needs_lock, generating=matplotlib_baseline_image_generation)
279311

280312
parameters = list(old_sig.parameters.values())
281313
if 'extension' not in old_sig.parameters:
@@ -483,25 +515,9 @@ def _image_directories(func):
483515
doesn't exist.
484516
"""
485517
module_path = Path(sys.modules[func.__module__].__file__)
486-
if func.__module__.startswith("matplotlib."):
487-
try:
488-
import matplotlib_baseline_images
489-
except:
490-
raise ImportError("Not able to import matplotlib_baseline_images")
491-
baseline_dir = (Path(matplotlib_baseline_images.__file__).parent /
492-
module_path.stem)
493-
elif func.__module__.startswith("mpl_toolkits."):
494-
try:
495-
import mpl_toolkits_baseline_images
496-
except:
497-
raise ImportError("Not able to import "
498-
"mpl_toolkits_baseline_images")
499-
baseline_dir = (Path(mpl_toolkits_baseline_images.__file__).parent /
500-
module_path.stem)
501-
else:
502-
baseline_dir = (module_path.parent /
503-
"baseline_images" /
504-
module_path.stem)
518+
baseline_dir = (module_path.parent /
519+
"baseline_images" /
520+
module_path.stem)
505521
result_dir = Path().resolve() / "result_images" / module_path.stem
506522
result_dir.mkdir(parents=True, exist_ok=True)
507523
return baseline_dir, result_dir

lib/matplotlib/tests/__init__.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1 @@
11
# Check for the matplotlib_baseline_images.
2-
try:
3-
import matplotlib_baseline_images
4-
except:
5-
raise ImportError(
6-
'The baseline image directory does not exist. '
7-
'This is most likely because the test data is not installed. '
8-
'You may need to install matplotlib_baseline_images to get the '
9-
'test data.')

lib/matplotlib/tests/conftest.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from matplotlib.testing.conftest import (mpl_test_settings,
22
mpl_image_comparison_parameters,
3-
pytest_configure, pytest_unconfigure,
4-
pd)
3+
pytest_configure,
4+
pytest_unconfigure,
5+
pd,
6+
pytest_collection_modifyitems)

lib/matplotlib/tests/test_agg_filter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import numpy as np
2-
2+
import pytest
33
import matplotlib.pyplot as plt
44
from matplotlib.testing.decorators import image_comparison
55

lib/mpl_toolkits/tests/__init__.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +0,0 @@
1-
# Check for the mpl_toolkits_baseline_images.
2-
try:
3-
import mpl_toolkits_baseline_images
4-
except:
5-
raise ImportError(
6-
'The baseline image directory does not exist. '
7-
'This is most likely because the test data is not installed. '
8-
'You may need to install mpl_toolkits_baseline_images to get the '
9-
'test data.')

lib/mpl_toolkits/tests/conftest.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
from matplotlib.testing.conftest import (mpl_test_settings,
22
mpl_image_comparison_parameters,
3-
pytest_configure, pytest_unconfigure)
3+
pytest_configure,
4+
pytest_unconfigure,
5+
pytest_collection_modifyitems,
6+
pytest_addoption)
7+

pytest.ini

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,8 @@ minversion = 3.6
55
testpaths = lib
66
python_files = test_*.py
77
junit_family = xunit2
8+
9+
10+
markers =
11+
matplotlib_baseline_image_generation: marks tests as matplotlib_baseline_image_generation (deselect with '-m "not matplotlib_baseline_image_generation"')
12+
serial

tools/triage_tests.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,11 @@
3737
# order to find the source, we need to search for a match in one of
3838
# these two places.
3939

40-
try:
41-
import matplotlib_baseline_images
42-
import mpl_toolkits_baseline_images
43-
BASELINE_IMAGES = [
44-
(Path(matplotlib_baseline_images.__file__).parent),
45-
(Path(mpl_toolkits_baseline_images.__file__).parent),
46-
]
47-
except:
48-
raise ImportError("Not able to import baseline images packages")
40+
BASELINE_IMAGES = [
41+
Path('lib/matplotlib/tests/baseline_images'),
42+
Path('lib/mpl_toolkits/tests/baseline_images'),
43+
]
44+
4945
# Non-png image extensions
5046

5147
exts = ['pdf', 'svg']

0 commit comments

Comments
 (0)