summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam James <sam@gentoo.org>2023-08-30 05:02:15 +0100
committerSam James <sam@gentoo.org>2023-08-30 05:02:15 +0100
commit5fccefacc5c9c11f2f31559d2d3edbb643b0b7cb (patch)
tree2097ff15a322d07866e19c72ee87597cd995f733 /dev-python/matplotlib
parentpackage.mask: Last rite dev-python/tweedledum (diff)
downloadgentoo-5fccefacc5c9c11f2f31559d2d3edbb643b0b7cb.tar.gz
gentoo-5fccefacc5c9c11f2f31559d2d3edbb643b0b7cb.tar.bz2
gentoo-5fccefacc5c9c11f2f31559d2d3edbb643b0b7cb.zip
dev-python/matplotlib: backport pyparsing-3.1 fix
Closes: https://bugs.gentoo.org/911127 Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'dev-python/matplotlib')
-rw-r--r--dev-python/matplotlib/files/matplotlib-3.7.2-pyparsing-3.1.patch274
-rw-r--r--dev-python/matplotlib/matplotlib-3.7.2-r1.ebuild334
2 files changed, 608 insertions, 0 deletions
diff --git a/dev-python/matplotlib/files/matplotlib-3.7.2-pyparsing-3.1.patch b/dev-python/matplotlib/files/matplotlib-3.7.2-pyparsing-3.1.patch
new file mode 100644
index 000000000000..44082b5c0227
--- /dev/null
+++ b/dev-python/matplotlib/files/matplotlib-3.7.2-pyparsing-3.1.patch
@@ -0,0 +1,274 @@
+https://bugs.gentoo.org/911127
+https://github.com/matplotlib/matplotlib/issues/26152
+https://github.com/matplotlib/matplotlib/pull/26432
+
+From c5183789d7d0cd151c201eeb2ce4fc786b6e43c2 Mon Sep 17 00:00:00 2001
+From: Jody Klymak <jklymak@gmail.com>
+Date: Tue, 1 Aug 2023 13:41:44 -0700
+Subject: [PATCH 1/2] Backport PR #26431: MNT: Unpin pyparsing, xfail error
+ message tests for pyparsing 3.1.0
+
+--- a/environment.yml
++++ b/environment.yml
+@@ -19,7 +19,7 @@ dependencies:
+ - pillow>=6.2
+ - pybind11>=2.6.0
+ - pygobject
+- - pyparsing!=3.1.0
++ - pyparsing>=2.3.1
+ - pyqt
+ - python-dateutil>=2.1
+ - setuptools
+--- a/lib/matplotlib/tests/test_mathtext.py
++++ b/lib/matplotlib/tests/test_mathtext.py
+@@ -6,13 +6,18 @@
+ from xml.etree import ElementTree as ET
+
+ import numpy as np
++from packaging.version import parse as parse_version
++import pyparsing
+ import pytest
+
++
+ import matplotlib as mpl
+ from matplotlib.testing.decorators import check_figures_equal, image_comparison
+ import matplotlib.pyplot as plt
+ from matplotlib import mathtext, _mathtext
+
++pyparsing_version = parse_version(pyparsing.__version__)
++
+
+ # If test is removed, use None as placeholder
+ math_tests = [
+@@ -270,6 +275,9 @@ def test_fontinfo():
+ assert table['version'] == (1, 0)
+
+
++# See gh-26152 for more context on this xfail
++@pytest.mark.xfail(pyparsing_version.release == (3, 1, 0),
++ reason="Error messages are incorrect for this version")
+ @pytest.mark.parametrize(
+ 'math, msg',
+ [
+--- a/lib/matplotlib/tests/test_text.py
++++ b/lib/matplotlib/tests/test_text.py
+@@ -4,6 +4,8 @@
+
+ import numpy as np
+ from numpy.testing import assert_almost_equal
++from packaging.version import parse as parse_version
++import pyparsing
+ import pytest
+
+ import matplotlib as mpl
+@@ -16,6 +18,8 @@
+ from matplotlib.testing._markers import needs_usetex
+ from matplotlib.text import Text
+
++pyparsing_version = parse_version(pyparsing.__version__)
++
+
+ @image_comparison(['font_styles'])
+ def test_font_styles():
+@@ -809,6 +813,9 @@ def test_unsupported_script(recwarn):
+ (r"Matplotlib currently does not support Bengali natively.",)])
+
+
++# See gh-26152 for more information on this xfail
++@pytest.mark.xfail(pyparsing_version.release == (3, 1, 0),
++ reason="Error messages are incorrect with pyparsing 3.1.0")
+ def test_parse_math():
+ fig, ax = plt.subplots()
+ ax.text(0, 0, r"$ \wrong{math} $", parse_math=False)
+@@ -819,6 +826,9 @@ def test_parse_math():
+ fig.canvas.draw()
+
+
++# See gh-26152 for more information on this xfail
++@pytest.mark.xfail(pyparsing_version.release == (3, 1, 0),
++ reason="Error messages are incorrect with pyparsing 3.1.0")
+ def test_parse_math_rcparams():
+ # Default is True
+ fig, ax = plt.subplots()
+--- a/setup.py
++++ b/setup.py
+@@ -325,7 +325,7 @@ def make_release_tree(self, base_dir, files):
+ "numpy>=1.20",
+ "packaging>=20.0",
+ "pillow>=6.2.0",
+- "pyparsing>=2.3.1,<3.1",
++ "pyparsing>=2.3.1",
+ "python-dateutil>=2.7",
+ ] + (
+ # Installing from a git checkout that is not producing a wheel.
+
+From 7f475c5088a826adffac2885d027d4f8b3cba218 Mon Sep 17 00:00:00 2001
+From: Kyle Sunden <git@ksunden.space>
+Date: Mon, 26 Jun 2023 22:17:27 -0500
+Subject: [PATCH 2/2] Manual backport of #26198
+
+Cherry picked and fixed up, ignored changes to the pyi file (which doesn't exist on this branch).
+--- a/lib/matplotlib/_mathtext.py
++++ b/lib/matplotlib/_mathtext.py
+@@ -1802,8 +1802,11 @@ def __init__(self):
+ def set_names_and_parse_actions():
+ for key, val in vars(p).items():
+ if not key.startswith('_'):
+- # Set names on everything -- very useful for debugging
+- val.setName(key)
++ # Set names on (almost) everything -- very useful for debugging
++ # token, placeable, and auto_delim are forward references which
++ # are left without names to ensure useful error messages
++ if key not in ("token", "placeable", "auto_delim"):
++ val.setName(key)
+ # Set actions
+ if hasattr(self, key):
+ val.setParseAction(getattr(self, key))
+@@ -1840,63 +1843,39 @@ def csnames(group, names):
+ p.unknown_symbol = Regex(r"\\[A-Za-z]*")("name")
+
+ p.font = csnames("font", self._fontnames)
+- p.start_group = (
+- Optional(r"\math" + oneOf(self._fontnames)("font")) + "{")
++ p.start_group = Optional(r"\math" + oneOf(self._fontnames)("font")) + "{"
+ p.end_group = Literal("}")
+
+ p.delim = oneOf(self._delims)
+
+- set_names_and_parse_actions() # for root definitions.
+-
+ # Mutually recursive definitions. (Minimizing the number of Forward
+ # elements is important for speed.)
+- p.accent = Forward()
+ p.auto_delim = Forward()
+- p.binom = Forward()
+- p.customspace = Forward()
+- p.frac = Forward()
+- p.dfrac = Forward()
+- p.function = Forward()
+- p.genfrac = Forward()
+- p.group = Forward()
+- p.operatorname = Forward()
+- p.overline = Forward()
+- p.overset = Forward()
+ p.placeable = Forward()
+ p.required_group = Forward()
+- p.simple = Forward()
+ p.optional_group = Forward()
+- p.sqrt = Forward()
+- p.subsuper = Forward()
+ p.token = Forward()
+- p.underset = Forward()
+
+ set_names_and_parse_actions() # for mutually recursive definitions.
+
+- p.customspace <<= cmd(r"\hspace", "{" + p.float_literal("space") + "}")
++ p.optional_group <<= "{" + ZeroOrMore(p.token)("group") + "}"
++ p.required_group <<= "{" + OneOrMore(p.token)("group") + "}"
+
+- p.accent <<= (
++ p.customspace = cmd(r"\hspace", "{" + p.float_literal("space") + "}")
++
++ p.accent = (
+ csnames("accent", [*self._accent_map, *self._wide_accents])
+ - p.placeable("sym"))
+
+- p.function <<= csnames("name", self._function_names)
+- p.operatorname <<= cmd(
+- r"\operatorname",
+- "{" + ZeroOrMore(p.simple | p.unknown_symbol)("name") + "}")
++ p.function = csnames("name", self._function_names)
+
+- p.group <<= p.start_group + ZeroOrMore(p.token)("group") + p.end_group
++ p.group = p.start_group + ZeroOrMore(p.token)("group") + p.end_group
+
+- p.optional_group <<= "{" + ZeroOrMore(p.token)("group") + "}"
+- p.required_group <<= "{" + OneOrMore(p.token)("group") + "}"
+-
+- p.frac <<= cmd(
+- r"\frac", p.required_group("num") + p.required_group("den"))
+- p.dfrac <<= cmd(
+- r"\dfrac", p.required_group("num") + p.required_group("den"))
+- p.binom <<= cmd(
+- r"\binom", p.required_group("num") + p.required_group("den"))
++ p.frac = cmd(r"\frac", p.required_group("num") + p.required_group("den"))
++ p.dfrac = cmd(r"\dfrac", p.required_group("num") + p.required_group("den"))
++ p.binom = cmd(r"\binom", p.required_group("num") + p.required_group("den"))
+
+- p.genfrac <<= cmd(
++ p.genfrac = cmd(
+ r"\genfrac",
+ "{" + Optional(p.delim)("ldelim") + "}"
+ + "{" + Optional(p.delim)("rdelim") + "}"
+@@ -1905,20 +1884,38 @@ def csnames(group, names):
+ + p.required_group("num")
+ + p.required_group("den"))
+
+- p.sqrt <<= cmd(
++ p.sqrt = cmd(
+ r"\sqrt{value}",
+ Optional("[" + OneOrMore(NotAny("]") + p.token)("root") + "]")
+ + p.required_group("value"))
+
+- p.overline <<= cmd(r"\overline", p.required_group("body"))
++ p.overline = cmd(r"\overline", p.required_group("body"))
+
+- p.overset <<= cmd(
++ p.overset = cmd(
+ r"\overset",
+ p.optional_group("annotation") + p.optional_group("body"))
+- p.underset <<= cmd(
++ p.underset = cmd(
+ r"\underset",
+ p.optional_group("annotation") + p.optional_group("body"))
+
++ p.subsuper = (
++ (Optional(p.placeable)("nucleus")
++ + OneOrMore(oneOf(["_", "^"]) - p.placeable)("subsuper")
++ + Regex("'*")("apostrophes"))
++ | Regex("'+")("apostrophes")
++ | (p.placeable("nucleus") + Regex("'*")("apostrophes"))
++ )
++
++ p.simple = p.space | p.customspace | p.font | p.subsuper
++
++ p.token <<= (
++ p.simple
++ | p.auto_delim
++ | p.unknown_symbol # Must be last
++ )
++
++ p.operatorname = cmd(r"\operatorname", "{" + ZeroOrMore(p.simple)("name") + "}")
++
+ p.placeable <<= (
+ p.accent # Must be before symbol as all accents are symbols
+ | p.symbol # Must be second to catch all named symbols and single
+@@ -1936,27 +1933,6 @@ def csnames(group, names):
+ | p.overline
+ )
+
+- p.simple <<= (
+- p.space
+- | p.customspace
+- | p.font
+- | p.subsuper
+- )
+-
+- p.subsuper <<= (
+- (Optional(p.placeable)("nucleus")
+- + OneOrMore(oneOf(["_", "^"]) - p.placeable)("subsuper")
+- + Regex("'*")("apostrophes"))
+- | Regex("'+")("apostrophes")
+- | (p.placeable("nucleus") + Regex("'*")("apostrophes"))
+- )
+-
+- p.token <<= (
+- p.simple
+- | p.auto_delim
+- | p.unknown_symbol # Must be last
+- )
+-
+ p.auto_delim <<= (
+ r"\left" - (p.delim("left") | Error("Expected a delimiter"))
+ + ZeroOrMore(p.simple | p.auto_delim)("mid")
+
diff --git a/dev-python/matplotlib/matplotlib-3.7.2-r1.ebuild b/dev-python/matplotlib/matplotlib-3.7.2-r1.ebuild
new file mode 100644
index 000000000000..c9db102721f2
--- /dev/null
+++ b/dev-python/matplotlib/matplotlib-3.7.2-r1.ebuild
@@ -0,0 +1,334 @@
+# Copyright 1999-2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_EXT=1
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{10..11} )
+PYTHON_REQ_USE='tk?,threads(+)'
+
+inherit distutils-r1 flag-o-matic multiprocessing prefix pypi
+inherit toolchain-funcs virtualx
+
+FT_PV=2.6.1
+DESCRIPTION="Pure python plotting library with matlab like syntax"
+HOMEPAGE="
+ https://matplotlib.org/
+ https://github.com/matplotlib/matplotlib/
+ https://pypi.org/project/matplotlib/
+"
+SRC_URI+="
+ test? (
+ https://downloads.sourceforge.net/project/freetype/freetype2/${FT_PV}/freetype-${FT_PV}.tar.gz
+ )
+"
+
+# Main license: matplotlib
+# Some modules: BSD
+# matplotlib/backends/qt4_editor: MIT
+# Fonts: BitstreamVera, OFL-1.1
+LICENSE="BitstreamVera BSD matplotlib MIT OFL-1.1"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~arm64-macos ~x64-macos"
+IUSE="cairo doc excel examples gtk3 latex qt5 tk webagg wxwidgets"
+
+# internal copy of pycxx highly patched
+# dev-python/pycxx
+RDEPEND="
+ dev-python/certifi[${PYTHON_USEDEP}]
+ >=dev-python/contourpy-1.0.1[${PYTHON_USEDEP}]
+ >=dev-python/cycler-0.10.0-r1[${PYTHON_USEDEP}]
+ >=dev-python/fonttools-4.22.0[${PYTHON_USEDEP}]
+ >=dev-python/kiwisolver-1.2.0[${PYTHON_USEDEP}]
+ >=dev-python/numpy-1.20[${PYTHON_USEDEP}]
+ >=dev-python/packaging-20.0[${PYTHON_USEDEP}]
+ >=dev-python/pillow-7.1.1[jpeg,webp,${PYTHON_USEDEP}]
+ >=dev-python/pyparsing-2.3.1[${PYTHON_USEDEP}]
+ >=dev-python/python-dateutil-2.7[${PYTHON_USEDEP}]
+ >=dev-python/pytz-2019.3[${PYTHON_USEDEP}]
+ media-fonts/dejavu
+ media-fonts/stix-fonts
+ media-libs/freetype:2
+ media-libs/libpng:0
+ >=media-libs/qhull-2013:=
+ virtual/imagemagick-tools[jpeg,tiff]
+ cairo? (
+ dev-python/cairocffi[${PYTHON_USEDEP}]
+ )
+ excel? (
+ dev-python/xlwt[${PYTHON_USEDEP}]
+ )
+ gtk3? (
+ >=dev-python/pygobject-3.40.1-r1:3[cairo?,${PYTHON_USEDEP}]
+ x11-libs/gtk+:3[introspection]
+ )
+ latex? (
+ virtual/latex-base
+ app-text/dvipng
+ app-text/ghostscript-gpl
+ app-text/poppler[utils]
+ dev-texlive/texlive-fontsrecommended
+ dev-texlive/texlive-latexextra
+ dev-texlive/texlive-luatex
+ dev-texlive/texlive-xetex
+ )
+ qt5? (
+ dev-python/PyQt5[gui,widgets,${PYTHON_USEDEP}]
+ )
+ webagg? (
+ >=dev-python/tornado-6.0.4[${PYTHON_USEDEP}]
+ )
+ wxwidgets? (
+ $(python_gen_cond_dep '
+ dev-python/wxpython:*[${PYTHON_USEDEP}]
+ ' python3_{8..10})
+ )
+"
+
+BDEPEND="
+ ${RDEPEND}
+ dev-python/pybind11[${PYTHON_USEDEP}]
+ >=dev-python/setuptools-scm-7[${PYTHON_USEDEP}]
+ virtual/pkgconfig
+ doc? (
+ >=app-text/dvipng-1.15-r1
+ >=dev-python/colorspacious-1.1.2[${PYTHON_USEDEP}]
+ >=dev-python/ipython-1.18.2[${PYTHON_USEDEP}]
+ >=dev-python/numpydoc-0.9.2[${PYTHON_USEDEP}]
+ >=dev-python/scipy-1.4.1[${PYTHON_USEDEP}]
+ >=dev-python/sphinx-1.3.1[${PYTHON_USEDEP}]
+ >=dev-python/sphinx-gallery-0.3.1-r1[${PYTHON_USEDEP}]
+ >=dev-python/xlwt-1.3.0-r1[${PYTHON_USEDEP}]
+ virtual/latex-base
+ dev-texlive/texlive-latexextra
+ dev-texlive/texlive-fontsrecommended
+ dev-texlive/texlive-latexrecommended
+ dev-texlive/texlive-luatex
+ dev-texlive/texlive-xetex
+ >=media-gfx/graphviz-2.42.3[cairo]
+ )
+ test? (
+ dev-python/mock[${PYTHON_USEDEP}]
+ dev-python/psutil[${PYTHON_USEDEP}]
+ dev-python/pytest-xdist[${PYTHON_USEDEP}]
+ >=dev-python/tornado-6.0.4[${PYTHON_USEDEP}]
+ gtk3? (
+ >=dev-python/pygobject-3.40.1-r1:3[cairo?,${PYTHON_USEDEP}]
+ x11-libs/gtk+:3[introspection]
+ )
+ )
+"
+
+distutils_enable_tests pytest
+
+use_setup() {
+ local uword="${2:-${1}}"
+ if use "${1}"; then
+ echo "${uword} = True"
+ echo "${uword}agg = True"
+ else
+ echo "${uword} = False"
+ echo "${uword}agg = False"
+ fi
+}
+
+python_prepare_all() {
+# Generates test failures, but fedora does it
+# local PATCHES=(
+# "${FILESDIR}"/${P}-unbundle-pycxx.patch
+# "${FILESDIR}"/${P}-unbundle-agg.patch
+# )
+# rm -r agg24 CXX || die
+# rm -r agg24 || die
+
+ # Affects installed _version.py, bug #854600
+ export SETUPTOOLS_SCM_PRETEND_VERSION=${PV}
+
+ local PATCHES=(
+ "${FILESDIR}"/matplotlib-3.3.3-disable-lto.patch
+ "${FILESDIR}"/matplotlib-3.7.1-test.patch
+ "${FILESDIR}"/matplotlib-3.7.2-macOS_no-Cocoa.patch
+ "${FILESDIR}"/matplotlib-3.7.2-pyparsing-3.1.patch
+ )
+
+ sed \
+ -e 's/matplotlib.pyparsing_py[23]/pyparsing/g' \
+ -i lib/matplotlib/{mathtext,fontconfig_pattern}.py \
+ || die "sed pyparsing failed"
+ sed -i -e '/setuptools_scm/s:,<7::' setup.py || die
+
+ hprefixify setupext.py
+
+ rm -rf libqhull || die
+
+ distutils-r1_python_prepare_all
+}
+
+python_configure_all() {
+ append-flags -fno-strict-aliasing
+ append-cppflags -DNDEBUG # or get old trying to do triangulation
+ tc-export PKG_CONFIG
+
+ unset DISPLAY # bug #278524
+ export XDG_RUNTIME_DIR="${T}/runtime-dir"
+ mkdir "${XDG_RUNTIME_DIR}" || die
+ chmod 0700 "${XDG_RUNTIME_DIR}" || die
+}
+
+python_configure() {
+ mkdir -p "${BUILD_DIR}" || die
+
+ # create setup.cfg (see setup.cfg.template for any changes).
+
+ # common switches.
+ cat > "${BUILD_DIR}"/setup.cfg <<- EOF || die
+ [directories]
+ basedirlist = ${EPREFIX}/usr
+ [provide_packages]
+ pytz = False
+ dateutil = False
+ [libs]
+ system_freetype = True
+ system_qhull = True
+ [packages]
+ tests = True
+ [gui_support]
+ agg = True
+ gtk = False
+ gtkagg = False
+ macosx = False
+ pyside = False
+ pysideagg = False
+ qt4 = False
+ qt4agg = False
+ $(use_setup cairo)
+ $(use_setup gtk3)
+ $(use_setup qt5)
+ $(use_setup tk)
+ $(use_setup wxwidgets wx)
+ EOF
+
+ if use gtk3 && use cairo; then
+ echo "gtk3cairo = True" >> "${BUILD_DIR}"/setup.cfg || die
+ else
+ echo "gtk3cairo = False" >> "${BUILD_DIR}"/setup.cfg || die
+ fi
+}
+
+wrap_setup() {
+ local MAKEOPTS=-j1
+ local -x MPLSETUPCFG="${BUILD_DIR}"/setup.cfg
+ "$@"
+}
+
+python_compile() {
+ wrap_setup distutils-r1_python_compile
+ find "${BUILD_DIR}" -name '*.pth' -delete || die
+}
+
+python_compile_all() {
+ if use doc; then
+ cd doc || die
+
+ VARTEXFONTS="${T}"/fonts \
+ emake SPHINXOPTS= O=-Dplot_formats=png:100 html
+ fi
+}
+
+src_test() {
+ mkdir build || die
+ ln -s "${WORKDIR}/freetype-${FT_PV}" build/ || die
+ virtx distutils-r1_src_test
+}
+
+python_test() {
+ local EPYTEST_DESELECT=(
+ # broken by -Wdefault
+ "tests/test_rcparams.py::test_validator_invalid[validate_strlist-arg6-MatplotlibDeprecationWarning]"
+ "tests/test_rcparams.py::test_validator_invalid[validate_strlist-arg7-MatplotlibDeprecationWarning]"
+ tests/test_testing.py::test_warn_to_fail
+ # TODO?
+ tests/test_backend_qt.py::test_fig_sigint_override
+ # unhappy about xdist
+ tests/test_widgets.py::test_span_selector_animated_artists_callback
+ )
+
+ [[ ${EPYTHON} == python3.11 ]] && EPYTEST_DESELECT+=(
+ # https://github.com/matplotlib/matplotlib/issues/23384
+ "tests/test_backends_interactive.py::test_figure_leak_20490[time_mem1-{'MPLBACKEND': 'qtagg', 'QT_API': 'PyQt5'}]"
+ "tests/test_backends_interactive.py::test_figure_leak_20490[time_mem1-{'MPLBACKEND': 'qtcairo', 'QT_API': 'PyQt5'}]"
+ )
+
+ case "${ABI}" in
+ alpha|arm|hppa|m68k|o32|ppc|s390|sh|sparc|x86)
+ EPYTEST_DESELECT+=(
+ # too large for 32-bit platforms
+ 'tests/test_axes.py::test_psd_csd[png]'
+ )
+ ;;
+ *)
+ ;;
+ esac
+
+ if use hppa ; then
+ EPYTEST_DESELECT+=(
+ 'tests/test_mathtext.py::test_mathtext_exceptions[hspace without value]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[hspace with invalid value]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[function without space]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[accent without space]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[frac without parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[frac with empty parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[binom without parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[binom with empty parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[genfrac without parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[genfrac with empty parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[sqrt without parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[sqrt with invalid value]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[overline without parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[overline with empty parameter]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[left with invalid delimiter]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[right with invalid delimiter]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[unclosed parentheses with sizing]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[unclosed parentheses without sizing]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[dfrac without parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[dfrac with empty parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[overset without parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[underset without parameters]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[unknown symbol]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[double superscript]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[double subscript]'
+ 'tests/test_mathtext.py::test_mathtext_exceptions[super on sub without braces]'
+ 'tests/test_quiver.py::test_barbs[png]'
+ 'tests/test_quiver.py::test_barbs_pivot[png]'
+ 'tests/test_quiver.py::test_barbs_flip[png]'
+ 'tests/test_text.py::test_parse_math'
+ 'tests/test_text.py::test_parse_math_rcparams'
+ )
+ fi
+
+ # we need to rebuild mpl against bundled freetype, otherwise
+ # over 1000 tests will fail because of mismatched font rendering
+ grep -v system_freetype "${BUILD_DIR}"/setup.cfg \
+ > "${BUILD_DIR}"/test-setup.cfg || die
+ local -x MPLSETUPCFG="${BUILD_DIR}"/test-setup.cfg
+
+ esetup.py build -j1 --build-lib="${BUILD_DIR}"/test-lib
+ local -x PYTHONPATH=${BUILD_DIR}/test-lib:${PYTHONPATH}
+
+ # speed tests up
+ local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
+ nonfatal epytest --pyargs matplotlib -m "not network" \
+ -p xdist.plugin -n "$(makeopts_jobs)" || die
+}
+
+python_install_all() {
+ use doc && local HTML_DOCS=( doc/build/html/. )
+
+ distutils-r1_python_install_all
+
+ if use examples; then
+ dodoc -r examples
+ docompress -x /usr/share/doc/${PF}/examples
+ fi
+}