diff options
author | Josselin Poiret <dev@jpoiret.xyz> | 2024-01-16 17:38:00 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2024-08-31 10:44:27 +0200 |
commit | afda4d87afba616f5add11b8d08fc74061e30c1b (patch) | |
tree | e75918ec7df6b23b29a07ce2f1a4c7647a0af923 /gnu/packages | |
parent | ce21952f81ffe7f7674348437535e30e1fcd662b (diff) | |
download | guix-afda4d87afba616f5add11b8d08fc74061e30c1b.tar.gz guix-afda4d87afba616f5add11b8d08fc74061e30c1b.zip |
gnu: python-matplotlib: Fix flaky Legend loc test.
* gnu/packages/patches/python-matplotlib-fix-legend-loc-best-test.patch: New patch.
* gnu/local.mk (dist_patch_DATA): Register it.
* gnu/packages/python-xyz.scm (python-matplotlib): Use it.
Change-Id: I0b488844d7b34a718b7294134b8c954492c9b697
Diffstat (limited to 'gnu/packages')
-rw-r--r-- | gnu/packages/patches/python-matplotlib-fix-legend-loc-best-test.patch | 84 | ||||
-rw-r--r-- | gnu/packages/python-xyz.scm | 3 |
2 files changed, 86 insertions, 1 deletions
diff --git a/gnu/packages/patches/python-matplotlib-fix-legend-loc-best-test.patch b/gnu/packages/patches/python-matplotlib-fix-legend-loc-best-test.patch new file mode 100644 index 0000000000..9046eb2b4c --- /dev/null +++ b/gnu/packages/patches/python-matplotlib-fix-legend-loc-best-test.patch @@ -0,0 +1,84 @@ +From 3cc6610597ee16a0cce39f7b033ae529972177e7 Mon Sep 17 00:00:00 2001 +From: Elliott Sales de Andrade <quantum.analyst@gmail.com> +Date: Thu, 10 Aug 2023 00:09:53 -0400 +Subject: [PATCH] TST: Improve test for Legend(loc='best') warning + +By patching the timer instead of using actually large data, we can both +a) speed up these tests (~7.5s vs <0.2s for both), and b) consistently +trigger the warning even on systems which are fast (such as the M1 +systems on Cirrus.) + +Also, copy the test data from `test_legend_auto3`, which correctly hits +all candidate locations for the 'best' legend locator without having to +fill up the entire Axes with data. +--- + lib/matplotlib/tests/test_legend.py | 38 ++++++++++++++++++++--------- + 1 file changed, 27 insertions(+), 11 deletions(-) + +diff --git a/lib/matplotlib/tests/test_legend.py b/lib/matplotlib/tests/test_legend.py +index 759ac6aadaff..1549354ba56b 100644 +--- a/lib/matplotlib/tests/test_legend.py ++++ b/lib/matplotlib/tests/test_legend.py +@@ -1,5 +1,7 @@ + import collections ++import itertools + import platform ++import time + from unittest import mock + import warnings + +@@ -1109,29 +1111,43 @@ def test_usetex_no_warn(caplog): + assert "Font family ['serif'] not found." not in caplog.text + + +-def test_warn_big_data_best_loc(): ++def test_warn_big_data_best_loc(monkeypatch): ++ # Force _find_best_position to think it took a long time. ++ counter = itertools.count(0, step=1.5) ++ monkeypatch.setattr(time, 'perf_counter', lambda: next(counter)) ++ + fig, ax = plt.subplots() + fig.canvas.draw() # So that we can call draw_artist later. +- for idx in range(1000): +- ax.plot(np.arange(5000), label=idx) ++ ++ # Place line across all possible legend locations. ++ x = [0.9, 0.1, 0.1, 0.9, 0.9, 0.5] ++ y = [0.95, 0.95, 0.05, 0.05, 0.5, 0.5] ++ ax.plot(x, y, 'o-', label='line') ++ + with rc_context({'legend.loc': 'best'}): + legend = ax.legend() +- with pytest.warns(UserWarning) as records: ++ with pytest.warns(UserWarning, ++ match='Creating legend with loc="best" can be slow with large ' ++ 'amounts of data.') as records: + fig.draw_artist(legend) # Don't bother drawing the lines -- it's slow. + # The _find_best_position method of Legend is called twice, duplicating + # the warning message. + assert len(records) == 2 +- for record in records: +- assert str(record.message) == ( +- 'Creating legend with loc="best" can be slow with large ' +- 'amounts of data.') + + +-def test_no_warn_big_data_when_loc_specified(): ++def test_no_warn_big_data_when_loc_specified(monkeypatch): ++ # Force _find_best_position to think it took a long time. ++ counter = itertools.count(0, step=1.5) ++ monkeypatch.setattr(time, 'perf_counter', lambda: next(counter)) ++ + fig, ax = plt.subplots() + fig.canvas.draw() +- for idx in range(1000): +- ax.plot(np.arange(5000), label=idx) ++ ++ # Place line across all possible legend locations. ++ x = [0.9, 0.1, 0.1, 0.9, 0.9, 0.5] ++ y = [0.95, 0.95, 0.05, 0.05, 0.5, 0.5] ++ ax.plot(x, y, 'o-', label='line') ++ + legend = ax.legend('best') + fig.draw_artist(legend) # Check that no warning is emitted. + diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index 1c20631cdb..41ac5fa521 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -9303,7 +9303,8 @@ comparison. (method url-fetch) (uri (pypi-uri "matplotlib" version)) (sha256 - (base32 "18amhxyxa6yzy1nwky4ggdgvvxnbl3qz2lki05vfx0dqf6w7ia81")))) + (base32 "18h78s5ld1i6mz00w258hy29909nfr3ddq6ry9kq18agw468bks8")) + (patches (search-patches "python-matplotlib-fix-legend-loc-best-test.patch")))) (build-system pyproject-build-system) (arguments (list |