82 lines
2.2 KiB
Python
82 lines
2.2 KiB
Python
"""
|
|
Helper functions for testing.
|
|
"""
|
|
|
|
import locale
|
|
import logging
|
|
import subprocess
|
|
from pathlib import Path
|
|
from tempfile import TemporaryDirectory
|
|
|
|
import matplotlib as mpl
|
|
from matplotlib import _api
|
|
|
|
_log = logging.getLogger(__name__)
|
|
|
|
|
|
def set_font_settings_for_testing():
|
|
mpl.rcParams['font.family'] = 'DejaVu Sans'
|
|
mpl.rcParams['text.hinting'] = 'none'
|
|
mpl.rcParams['text.hinting_factor'] = 8
|
|
|
|
|
|
def set_reproducibility_for_testing():
|
|
mpl.rcParams['svg.hashsalt'] = 'matplotlib'
|
|
|
|
|
|
def setup():
|
|
# The baseline images are created in this locale, so we should use
|
|
# it during all of the tests.
|
|
|
|
try:
|
|
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
|
|
except locale.Error:
|
|
try:
|
|
locale.setlocale(locale.LC_ALL, 'English_United States.1252')
|
|
except locale.Error:
|
|
_log.warning(
|
|
"Could not set locale to English/United States. "
|
|
"Some date-related tests may fail.")
|
|
|
|
mpl.use('Agg')
|
|
|
|
with _api.suppress_matplotlib_deprecation_warning():
|
|
mpl.rcdefaults() # Start with all defaults
|
|
|
|
# These settings *must* be hardcoded for running the comparison tests and
|
|
# are not necessarily the default values as specified in rcsetup.py.
|
|
set_font_settings_for_testing()
|
|
set_reproducibility_for_testing()
|
|
|
|
|
|
def _check_for_pgf(texsystem):
|
|
"""
|
|
Check if a given TeX system + pgf is available
|
|
|
|
Parameters
|
|
----------
|
|
texsystem : str
|
|
The executable name to check
|
|
"""
|
|
with TemporaryDirectory() as tmpdir:
|
|
tex_path = Path(tmpdir, "test.tex")
|
|
tex_path.write_text(r"""
|
|
\documentclass{minimal}
|
|
\usepackage{pgf}
|
|
\begin{document}
|
|
\typeout{pgfversion=\pgfversion}
|
|
\makeatletter
|
|
\@@end
|
|
""")
|
|
try:
|
|
subprocess.check_call(
|
|
[texsystem, "-halt-on-error", str(tex_path)], cwd=tmpdir,
|
|
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
except (OSError, subprocess.CalledProcessError):
|
|
return False
|
|
return True
|
|
|
|
|
|
def _has_tex_package(package):
|
|
return bool(mpl.dviread.find_tex_file(f"{package}.sty"))
|