aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicardo Wurmus <rekado@elephly.net>2022-01-31 15:41:13 +0100
committerRicardo Wurmus <rekado@elephly.net>2022-01-31 16:07:40 +0100
commit9686c828ed330a23357a8fd53e62ef9cdb7288ef (patch)
treee0d4981dc2157a20c32f8cb0edf52072f36f2607
parentf383aca4086716b07f4e1f06df2aad4d7b796ebc (diff)
downloadguix-9686c828ed330a23357a8fd53e62ef9cdb7288ef.tar
guix-9686c828ed330a23357a8fd53e62ef9cdb7288ef.tar.gz
gnu: python-seaborn: Fix build.
* gnu/packages/python-xyz.scm (python-seaborn)[source]: Add patch. [arguments]: Add build phase 'patch-more-tests. * gnu/packages/patches/python-seaborn-2690.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it.
-rw-r--r--gnu/local.mk3
-rw-r--r--gnu/packages/patches/python-seaborn-2690.patch268
-rw-r--r--gnu/packages/python-xyz.scm19
3 files changed, 288 insertions, 2 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index d0dd972481..9f6966b0cd 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -7,7 +7,7 @@
# Copyright © 2016, 2017, 2018 Kei Kebreau <kkebreau@posteo.net>
# Copyright © 2016, 2017 Rene Saavedra <rennes@openmailbox.org>
# Copyright © 2016 Adonay "adfeno" Felipe Nogueira <https://libreplanet.org/wiki/User:Adfeno> <adfeno@openmailbox.org>
-# Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Ricardo Wurmus <rekado@elephly.net>
+# Copyright © 2016, 2017, 2018, 2019, 2020, 2021, 2022 Ricardo Wurmus <rekado@elephly.net>
# Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
# Copyright © 2016, 2017, 2018, 2019 Alex Vong <alexvong1995@gmail.com>
# Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
@@ -1725,6 +1725,7 @@ dist_patch_DATA = \
%D%/packages/patches/python-pytorch-system-libraries.patch \
%D%/packages/patches/python-robotframework-source-date-epoch.patch \
%D%/packages/patches/python-seaborn-kde-test.patch \
+ %D%/packages/patches/python-seaborn-2690.patch \
%D%/packages/patches/python2-subprocess32-disable-input-test.patch \
%D%/packages/patches/python-unittest2-python3-compat.patch \
%D%/packages/patches/python-unittest2-remove-argparse.patch \
diff --git a/gnu/packages/patches/python-seaborn-2690.patch b/gnu/packages/patches/python-seaborn-2690.patch
new file mode 100644
index 0000000000..4662d19c2d
--- /dev/null
+++ b/gnu/packages/patches/python-seaborn-2690.patch
@@ -0,0 +1,268 @@
+This patch was adapted from the upstream pull request 2690.
+
+From ebd6812d48f5b8ed1ebb7d79bda0b2a7b9ae2812 Mon Sep 17 00:00:00 2001
+From: Michael Waskom <mwaskom@gmail.com>
+Date: Sun, 31 Oct 2021 15:09:27 -0400
+Subject: [PATCH 1/4] Update boxplot tests for mpl3.5 compatability
+
+---
+ seaborn/tests/test_categorical.py | 30 +++++++++++++++++++-----------
+ 1 file changed, 19 insertions(+), 11 deletions(-)
+
+diff --git a/seaborn/tests/test_categorical.py b/seaborn/tests/test_categorical.py
+index d4e09b703..488fad2d6 100644
+--- a/seaborn/tests/test_categorical.py
++++ b/seaborn/tests/test_categorical.py
+@@ -110,6 +110,11 @@ class CategoricalFixture:
+ df = pd.DataFrame(dict(y=y, g=g, h=h, u=u))
+ x_df["W"] = g
+
++ def get_box_artists(self, ax):
++
++ # Exclude labeled patches, which are for the legend
++ return [p for p in ax.patches if not p.get_label()]
++
+
+ class TestCategoricalPlotter(CategoricalFixture):
+
+@@ -855,12 +863,12 @@ def test_hue_offsets(self):
+ def test_axes_data(self):
+
+ ax = cat.boxplot(x="g", y="y", data=self.df)
+- assert len(ax.artists) == 3
++ assert len(self.get_box_artists(ax)) == 3
+
+ plt.close("all")
+
+ ax = cat.boxplot(x="g", y="y", hue="h", data=self.df)
+- assert len(ax.artists) == 6
++ assert len(self.get_box_artists(ax)) == 6
+
+ plt.close("all")
+
+@@ -868,14 +876,14 @@ def test_box_colors(self):
+
+ ax = cat.boxplot(x="g", y="y", data=self.df, saturation=1)
+ pal = palettes.color_palette(n_colors=3)
+- for patch, color in zip(ax.artists, pal):
++ for patch, color in zip(self.get_box_artists(ax), pal):
+ assert patch.get_facecolor()[:3] == color
+
+ plt.close("all")
+
+ ax = cat.boxplot(x="g", y="y", hue="h", data=self.df, saturation=1)
+ pal = palettes.color_palette(n_colors=2)
+- for patch, color in zip(ax.artists, pal * 2):
++ for patch, color in zip(self.get_box_artists(ax), pal * 2):
+ assert patch.get_facecolor()[:3] == color
+
+ plt.close("all")
+@@ -884,7 +892,7 @@ def test_draw_missing_boxes(self):
+
+ ax = cat.boxplot(x="g", y="y", data=self.df,
+ order=["a", "b", "c", "d"])
+- assert len(ax.artists) == 3
++ assert len(self.get_box_artists(ax)) == 3
+
+ def test_missing_data(self):
+
+@@ -894,13 +902,13 @@ def test_missing_data(self):
+ y[-2:] = np.nan
+
+ ax = cat.boxplot(x=x, y=y)
+- assert len(ax.artists) == 3
++ assert len(self.get_box_artists(ax)) == 3
+
+ plt.close("all")
+
+ y[-1] = 0
+ ax = cat.boxplot(x=x, y=y, hue=h)
+- assert len(ax.artists) == 7
++ assert len(self.get_box_artists(ax)) == 7
+
+ plt.close("all")
+
+@@ -2766,11 +2774,11 @@ def test_plot_elements(self):
+
+ g = cat.catplot(x="g", y="y", data=self.df, kind="box")
+ want_artists = self.g.unique().size
+- assert len(g.ax.artists) == want_artists
++ assert len(self.get_box_artists(g.ax)) == want_artists
+
+ g = cat.catplot(x="g", y="y", hue="h", data=self.df, kind="box")
+ want_artists = self.g.unique().size * self.h.unique().size
+- assert len(g.ax.artists) == want_artists
++ assert len(self.get_box_artists(g.ax)) == want_artists
+
+ g = cat.catplot(x="g", y="y", data=self.df,
+ kind="violin", inner=None)
+@@ -3137,14 +3145,14 @@ def test_box_colors(self):
+
+ ax = cat.boxenplot(x="g", y="y", data=self.df, saturation=1)
+ pal = palettes.color_palette(n_colors=3)
+- for patch, color in zip(ax.artists, pal):
++ for patch, color in zip(self.get_box_artists(ax), pal):
+ assert patch.get_facecolor()[:3] == color
+
+ plt.close("all")
+
+ ax = cat.boxenplot(x="g", y="y", hue="h", data=self.df, saturation=1)
+ pal = palettes.color_palette(n_colors=2)
+- for patch, color in zip(ax.artists, pal * 2):
++ for patch, color in zip(self.get_box_artists(ax), pal * 2):
+ assert patch.get_facecolor()[:3] == color
+
+ plt.close("all")
+
+From ff78ed38817a346e760194ab3b03b28d7ea3ba1b Mon Sep 17 00:00:00 2001
+From: Michael Waskom <mwaskom@gmail.com>
+Date: Sun, 31 Oct 2021 15:50:54 -0400
+Subject: [PATCH 2/4] Update kdeplot tests for mpl3.5 compatability
+
+---
+ seaborn/tests/test_distributions.py | 53 ++++++++++++++++++++---------
+ 1 file changed, 37 insertions(+), 16 deletions(-)
+
+diff --git a/seaborn/tests/test_distributions.py b/seaborn/tests/test_distributions.py
+index d241fd978..466efb69e 100644
+--- a/seaborn/tests/test_distributions.py
++++ b/seaborn/tests/test_distributions.py
+@@ -39,6 +39,27 @@
+ )
+
+
++def get_contour_coords(c):
++ """Provide compatability for change in contour artist type in mpl3.5."""
++ # See https://github.com/matplotlib/matplotlib/issues/20906
++ if isinstance(c, mpl.collections.LineCollection):
++ return c.get_segments()
++ elif isinstance(c, mpl.collections.PathCollection):
++ return [p.vertices[:np.argmax(p.codes) + 1] for p in c.get_paths()]
++
++
++def get_contour_color(c):
++ """Provide compatability for change in contour artist type in mpl3.5."""
++ # See https://github.com/matplotlib/matplotlib/issues/20906
++ if isinstance(c, mpl.collections.LineCollection):
++ return c.get_color()
++ elif isinstance(c, mpl.collections.PathCollection):
++ if c.get_facecolor().size:
++ return c.get_facecolor()
++ else:
++ return c.get_edgecolor()
++
++
+ class TestDistPlot(object):
+
+ rs = np.random.RandomState(0)
+@@ -902,7 +923,7 @@ def test_fill_artists(self, long_df):
+ f, ax = plt.subplots()
+ kdeplot(data=long_df, x="x", y="y", hue="c", fill=fill)
+ for c in ax.collections:
+- if fill:
++ if fill or Version(mpl.__version__) >= Version("3.5.0b0"):
+ assert isinstance(c, mpl.collections.PathCollection)
+ else:
+ assert isinstance(c, mpl.collections.LineCollection)
+@@ -918,8 +939,8 @@ def test_common_norm(self, rng):
+ kdeplot(x=x, y=y, hue=hue, common_norm=True, ax=ax1)
+ kdeplot(x=x, y=y, hue=hue, common_norm=False, ax=ax2)
+
+- n_seg_1 = sum([len(c.get_segments()) > 0 for c in ax1.collections])
+- n_seg_2 = sum([len(c.get_segments()) > 0 for c in ax2.collections])
++ n_seg_1 = sum([len(get_contour_coords(c)) > 0 for c in ax1.collections])
++ n_seg_2 = sum([len(get_contour_coords(c)) > 0 for c in ax2.collections])
+ assert n_seg_2 > n_seg_1
+
+ def test_log_scale(self, rng):
+@@ -946,7 +967,7 @@ def test_log_scale(self, rng):
+ ax2.contour(10 ** xx, yy, density, levels=levels)
+
+ for c1, c2 in zip(ax1.collections, ax2.collections):
+- assert_array_equal(c1.get_segments(), c2.get_segments())
++ assert_array_equal(get_contour_coords(c1), get_contour_coords(c2))
+
+ def test_bandwidth(self, rng):
+
+@@ -959,7 +980,7 @@ def test_bandwidth(self, rng):
+ kdeplot(x=x, y=y, bw_adjust=2, ax=ax2)
+
+ for c1, c2 in zip(ax1.collections, ax2.collections):
+- seg1, seg2 = c1.get_segments(), c2.get_segments()
++ seg1, seg2 = get_contour_coords(c1), get_contour_coords(c2)
+ if seg1 + seg2:
+ x1 = seg1[0][:, 0]
+ x2 = seg2[0][:, 0]
+@@ -980,9 +1001,9 @@ def test_weights(self, rng):
+ kdeplot(x=x, y=y, hue=hue, weights=weights, ax=ax2)
+
+ for c1, c2 in zip(ax1.collections, ax2.collections):
+- if c1.get_segments() and c2.get_segments():
+- seg1 = np.concatenate(c1.get_segments(), axis=0)
+- seg2 = np.concatenate(c2.get_segments(), axis=0)
++ if get_contour_coords(c1) and get_contour_coords(c2):
++ seg1 = np.concatenate(get_contour_coords(c1), axis=0)
++ seg2 = np.concatenate(get_contour_coords(c2), axis=0)
+ assert not np.array_equal(seg1, seg2)
+
+ def test_hue_ignores_cmap(self, long_df):
+@@ -1030,7 +1051,7 @@ def test_levels_and_thresh(self, long_df):
+ kdeplot(**plot_kws, levels=np.linspace(thresh, 1, n), ax=ax2)
+
+ for c1, c2 in zip(ax1.collections, ax2.collections):
+- assert_array_equal(c1.get_segments(), c2.get_segments())
++ assert_array_equal(get_contour_coords(c1), get_contour_coords(c2))
+
+ with pytest.raises(ValueError):
+ kdeplot(**plot_kws, levels=[0, 1, 2])
+@@ -1042,7 +1063,7 @@ def test_levels_and_thresh(self, long_df):
+ kdeplot(**plot_kws, levels=n, thresh=0, ax=ax2)
+
+ for c1, c2 in zip(ax1.collections, ax2.collections):
+- assert_array_equal(c1.get_segments(), c2.get_segments())
++ assert_array_equal(get_contour_coords(c1), get_contour_coords(c2))
+ for c1, c2 in zip(ax1.collections, ax2.collections):
+ assert_array_equal(c1.get_facecolors(), c2.get_facecolors())
+
+@@ -2322,13 +2343,13 @@ def test_bivariate_kde_norm(self, rng):
+ z = [0] * 80 + [1] * 20
+
+ g = displot(x=x, y=y, col=z, kind="kde", levels=10)
+- l1 = sum(bool(c.get_segments()) for c in g.axes.flat[0].collections)
+- l2 = sum(bool(c.get_segments()) for c in g.axes.flat[1].collections)
++ l1 = sum(bool(get_contour_coords(c)) for c in g.axes.flat[0].collections)
++ l2 = sum(bool(get_contour_coords(c)) for c in g.axes.flat[1].collections)
+ assert l1 > l2
+
+ g = displot(x=x, y=y, col=z, kind="kde", levels=10, common_norm=False)
+- l1 = sum(bool(c.get_segments()) for c in g.axes.flat[0].collections)
+- l2 = sum(bool(c.get_segments()) for c in g.axes.flat[1].collections)
++ l1 = sum(bool(get_contour_coords(c)) for c in g.axes.flat[0].collections)
++ l2 = sum(bool(get_contour_coords(c)) for c in g.axes.flat[1].collections)
+ assert l1 == l2
+
+ def test_bivariate_hist_norm(self, rng):
+
+From a20ce3fabeb23c97b5827d9fb0c6a96ac109ea64 Mon Sep 17 00:00:00 2001
+From: Michael Waskom <mwaskom@gmail.com>
+Date: Sun, 31 Oct 2021 16:10:47 -0400
+Subject: [PATCH 3/4] Update legend tests for mpl3.5 compatability
+
+---
+ seaborn/tests/test_distributions.py | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/seaborn/tests/test_distributions.py b/seaborn/tests/test_distributions.py
+index 466efb69e..024fe7541 100644
+--- a/seaborn/tests/test_distributions.py
++++ b/seaborn/tests/test_distributions.py
+@@ -872,7 +872,7 @@ def test_legend(self, long_df):
+ for label, level in zip(legend_labels, order):
+ assert label.get_text() == level
+
+- legend_artists = ax.legend_.findobj(mpl.lines.Line2D)[::2]
++ legend_artists = ax.legend_.findobj(mpl.lines.Line2D)
+ palette = color_palette()
+ for artist, color in zip(legend_artists, palette):
+ assert_colors_equal(artist.get_color(), color)
+
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 945f3319f1..cee7dab15a 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -9615,11 +9615,28 @@ SVG, EPS, PNG and terminal output.")
(uri (pypi-uri "seaborn" version))
(sha256
(base32 "1xpl3zb945sihsiwm9q1yyx84sakk1phcg0fprj6i0j0dllfjifg"))
- (patches (search-patches "python-seaborn-kde-test.patch"))))
+ (patches (search-patches "python-seaborn-kde-test.patch"
+ "python-seaborn-2690.patch"))))
(build-system python-build-system)
(arguments
`(#:phases
(modify-phases %standard-phases
+ (add-after 'unpack 'patch-more-tests
+ (lambda _
+ (substitute* "seaborn/tests/test_distributions.py"
+ (("get_contour_color\\(ax\\.collections\\[0\\]\\)")
+ "get_contour_color(ax.collections[0])")
+ (("c\\.get_color\\(\\)") "get_contour_color(c)")
+
+ ;; These three are borked and have been fixed upstream, but
+ ;; there's no simple patch we could apply here, so we just
+ ;; disable them.
+ (("def test_hue_ignores_cmap")
+ "def skip_test_hue_ignores_cmap")
+ (("def test_fill_artists")
+ "def skip_test_fill_artists")
+ (("def test_with_rug")
+ "def skip_test_with_rug"))))
(add-before 'check 'start-xserver
(lambda _
;; There must be a running X server and make check doesn't