Hello community, here is the log from the commit of package python-mplcursors for openSUSE:Factory checked in at 2020-07-24 09:57:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-mplcursors (Old) and /work/SRC/openSUSE:Factory/.python-mplcursors.new.3592 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-mplcursors" Fri Jul 24 09:57:55 2020 rev:4 rq:822354 version:0.3 Changes: -------- --- /work/SRC/openSUSE:Factory/python-mplcursors/python-mplcursors.changes 2020-06-10 00:49:39.419139749 +0200 +++ /work/SRC/openSUSE:Factory/.python-mplcursors.new.3592/python-mplcursors.changes 2020-07-24 09:59:32.421619803 +0200 @@ -1,0 +2,18 @@ +Thu Jul 23 09:54:39 UTC 2020 - Benjamin Greiner <c...@bnavigator.de> + +- moved Pillow requirement to matplotlib package + +------------------------------------------------------------------- +Tue Jul 21 22:23:22 UTC 2020 - Benjamin Greiner <c...@bnavigator.de> + +- allow newest pytest again +- require Pillow +- apply upstream patches to allow newest matplotlib and numpy + gh#anntzer/mplcursors#26 + * mplcursors-unicodeminus.patch + * mplcursors-newstem.patch + * mplcursors-parse_annotation.patch + * mplcursors-fix-LineCollection.patch + * mplcursors-unicodeminus2.patch + +------------------------------------------------------------------- New: ---- mplcursors-fix-LineCollection.patch mplcursors-newstem.patch mplcursors-parse_annotation.patch mplcursors-unicodeminus.patch mplcursors-unicodeminus2.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-mplcursors.spec ++++++ --- /var/tmp/diff_new_pack.Ew3Bmc/_old 2020-07-24 09:59:33.161620492 +0200 +++ /var/tmp/diff_new_pack.Ew3Bmc/_new 2020-07-24 09:59:33.165620496 +0200 @@ -25,6 +25,12 @@ License: MIT URL: https://github.com/anntzer/mplcursors Source: https://files.pythonhosted.org/packages/source/m/mplcursors/mplcursors-%{version}.tar.gz +# PATCH-FIX-UPSTREAM gh#anntzer/mplcursors#26 +Patch0: mplcursors-unicodeminus.patch +Patch1: mplcursors-newstem.patch +Patch2: mplcursors-parse_annotation.patch +Patch3: mplcursors-fix-LineCollection.patch +Patch4: mplcursors-unicodeminus2.patch BuildRequires: %{python_module setuptools_scm} BuildRequires: %{python_module setuptools} BuildRequires: fdupes @@ -33,7 +39,7 @@ BuildArch: noarch # SECTION test requirements BuildRequires: %{python_module matplotlib >= 2.1} -BuildRequires: %{python_module pytest < 5} +BuildRequires: %{python_module pytest} # /SECTION %python_subpackages @@ -42,6 +48,7 @@ %prep %setup -q -n mplcursors-%{version} +%autopatch -p1 %build %python_build @@ -56,6 +63,8 @@ %files %{python_files} %doc CHANGELOG.rst README.rst %license LICENSE.txt -%{python_sitelib}/* +%{python_sitelib}/mplcursors +%{python_sitelib}/mplcursors.pth +%{python_sitelib}/mplcursors-%{version}-py*.egg-info %changelog ++++++ mplcursors-fix-LineCollection.patch ++++++ >From 1913149cceb0275f6b8f8bf7ad6e49ab61f5d736 Mon Sep 17 00:00:00 2001 From: Antony Lee <anntzer....@gmail.com> Date: Thu, 30 Apr 2020 20:14:43 +0200 Subject: [PATCH] Don't use Matplotlib's incorrect LineCollection contains() check. --- lib/mplcursors/_pick_info.py | 32 ++++++++++++++++---------------- tests/test_mplcursors.py | 3 ++- 2 files changed, 18 insertions(+), 17 deletions(-) Index: mplcursors-0.3/lib/mplcursors/_pick_info.py =================================================================== --- mplcursors-0.3.orig/lib/mplcursors/_pick_info.py +++ mplcursors-0.3/lib/mplcursors/_pick_info.py @@ -332,13 +332,15 @@ def _(artist, event): @compute_pick.register(PatchCollection) @compute_pick.register(PathCollection) def _(artist, event): - # Use the C implementation to prune the list of segments. - contains, info = artist.contains(event) - if not contains: - return offsets = artist.get_offsets() paths = artist.get_paths() if _is_scatter(artist): + # Use the C implementation to prune the list of segments -- but only + # for scatter plots as that implementation is inconsistent with Line2D + # for segment-like collections (matplotlib/matplotlib#17279). + contains, info = artist.contains(event) + if not contains: + return inds = info["ind"] offsets = artist.get_offsets()[inds] offsets_screen = artist.get_offset_transform().transform(offsets) @@ -350,23 +352,21 @@ def _(artist, event): return Selection(artist, target, ds[argmin], None, None) else: # Note that this won't select implicitly closed paths. - sels = [ + sels = [*filter(None, [ _compute_projection_pick( artist, Affine2D().translate(*offsets[ind % len(offsets)]) .transform_path(paths[ind % len(paths)]), (event.x, event.y)) - for ind in info["ind"]] - sel, index = min( - ((sel, info["ind"][idx]) for idx, sel in enumerate(sels) if sel), - key=lambda sel_idx: sel_idx[0].dist, - default=(None, None)) - if sel: - sel = sel._replace(artist=artist) - sel.target.index = (index, sel.target.index) - if (isinstance(artist, PatchCollection) - and sel.dist >= PATCH_PICKRADIUS): - sel = None + for ind in range(max(len(offsets), len(paths)))])] + if not sels: + return None + idx = min(range(len(sels)), key=lambda idx: sels[idx].dist) + sel = sels[idx] + if sel.dist >= artist.get_pickradius(): + return None + sel = sel._replace(artist=artist) + sel.target.index = (idx, sel.target.index) return sel Index: mplcursors-0.3/tests/test_mplcursors.py =================================================================== --- mplcursors-0.3.orig/tests/test_mplcursors.py +++ mplcursors-0.3/tests/test_mplcursors.py @@ -316,7 +316,8 @@ def test_image_subclass(ax): def test_linecollection(ax): ax.eventplot([0, 1]) cursor = mplcursors.cursor() - _process_event("__mouse_click__", ax, (0, .5), 1) + _process_event("__mouse_click__", ax, (0, 0), 1) + _process_event("__mouse_click__", ax, (.5, 1), 1) assert len(cursor.selections) == 0 _process_event("__mouse_click__", ax, (0, 1), 1) assert cursor.selections[0].target.index == approx((0, .5)) ++++++ mplcursors-newstem.patch ++++++ >From 6dbf40796b9774ae988fc650596880d31cbc0e89 Mon Sep 17 00:00:00 2001 From: Antony Lee <anntzer....@gmail.com> Date: Thu, 16 Apr 2020 13:01:50 +0200 Subject: [PATCH] Switch to supporting new-style stem plots. --- CHANGELOG.rst | 5 +++-- lib/mplcursors/_pick_info.py | 20 +++++++++++--------- tests/test_mplcursors.py | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) Index: mplcursors-0.3/CHANGELOG.rst =================================================================== --- mplcursors-0.3.orig/CHANGELOG.rst +++ mplcursors-0.3/CHANGELOG.rst @@ -1,3 +1,7 @@ +Patches +====== +- Switch to supporting only "new-style" (`LineCollection`) `stem` plots. + 0.3 === @@ -39,8 +43,8 @@ Miscellaneous bugfixes. - Selections on images now have an index as well. - Selections created on `scatter` plots, `errorbar` plots, and `polar` plots can now be moved. -- `PathCollection`\s not created by `plt.scatter` are now picked as paths, not - as collections of points. +- `PathCollection`\s not created by `scatter` are now picked as paths, not as + collections of points. - `Patch`\es now pick on their borders, not their interior. - Improved picking of `Container`\s. - In hover mode, annotations can still be removed by right-clicking. Index: mplcursors-0.3/lib/mplcursors/_pick_info.py =================================================================== --- mplcursors-0.3.orig/lib/mplcursors/_pick_info.py +++ mplcursors-0.3/lib/mplcursors/_pick_info.py @@ -464,14 +464,16 @@ def _(container, event): sel = compute_pick(container.markerline, event) if sel: return sel - idx_sel = min(filter(lambda idx_sel: idx_sel[1] is not None, - ((idx, compute_pick(line, event)) - for idx, line in enumerate(container.stemlines))), - key=lambda idx_sel: idx_sel[1].dist, default=None) - if idx_sel: - idx, _ = idx_sel + if not isinstance(container.stemlines, LineCollection): + warnings.warn("Only stem plots created with use_line_collection=True " + "are supported.") + return + sel = compute_pick(container.stemlines, event) + if sel: + idx, _ = sel.target.index target = _with_attrs( - container.stemlines[idx].get_xydata()[-1], index=idx) + container.stemlines.get_segments()[idx][-1], + index=sel.target.index) return Selection(container, target, 0, None, None) @@ -520,7 +522,7 @@ def get_ann_text(sel): classes follow. """ warnings.warn( - f"Annotation support for {type(sel.artist).__name__} is missing") + f"Annotation support for {type(sel.artist).__name__} is missing.") return "" @@ -753,7 +755,7 @@ def make_highlight(sel, *, highlight_kwa classes follow. """ warnings.warn( - f"Highlight support for {type(sel.artist).__name__} is missing") + f"Highlight support for {type(sel.artist).__name__} is missing.") def _set_valid_props(artist, kwargs): Index: mplcursors-0.3/tests/test_mplcursors.py =================================================================== --- mplcursors-0.3.orig/tests/test_mplcursors.py +++ mplcursors-0.3/tests/test_mplcursors.py @@ -384,7 +384,7 @@ def test_dataless_errorbar(ax): def test_stem(ax): with pytest.warns(None): # stem use_line_collection API change. - ax.stem([1, 2, 3]) + ax.stem([1, 2, 3], use_line_collection=True) cursor = mplcursors.cursor() assert len(cursor.artists) == 1 _process_event("__mouse_click__", ax, (.5, .5), 1) ++++++ mplcursors-parse_annotation.patch ++++++ >From ef2a5a5e81c1a6dfd9c253032f003c45aec39431 Mon Sep 17 00:00:00 2001 From: Antony Lee <anntzer....@gmail.com> Date: Thu, 16 Apr 2020 13:28:23 +0200 Subject: [PATCH] More _parse_annotations in tests given change in mpl's value formatting. --- tests/test_mplcursors.py | 49 ++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/tests/test_mplcursors.py b/tests/test_mplcursors.py index 3ccbfcf..e2b9678 100644 --- a/tests/test_mplcursors.py +++ b/tests/test_mplcursors.py @@ -124,8 +124,8 @@ def test_line(ax, plotter): # On the line. _process_event("__mouse_click__", ax, (.1, .4), 1) assert len(cursor.selections) == len(ax.texts) == 1 - assert (_parse_annotation(cursor.selections[0], "foo\nx=(.*)\ny=(.*)") - == approx((.1, .4))) + assert _parse_annotation( + cursor.selections[0], "foo\nx=(.*)\ny=(.*)") == approx((.1, .4)) # Not removing it. _process_event("__mouse_click__", ax, (0, 1), 3) assert len(cursor.selections) == len(ax.texts) == 1 @@ -133,8 +133,8 @@ def test_line(ax, plotter): artist.set_label(None) _process_event("__mouse_click__", ax, (.6, .9), 1) assert len(cursor.selections) == len(ax.texts) == 2 - assert (_parse_annotation(cursor.selections[1], "x=(.*)\ny=(.*)") - == approx((.6, .9))) + assert _parse_annotation( + cursor.selections[1], "x=(.*)\ny=(.*)") == approx((.6, .9)) # Remove both of them (first removing the second one, to test # `Selection.__eq__` -- otherwise it is bypassed as `list.remove` # checks identity first). @@ -163,7 +163,8 @@ def test_scatter_text(ax): ax.scatter([0, 1], [0, 1], c=[2, 3]) cursor = mplcursors.cursor() _process_event("__mouse_click__", ax, (0, 0), 1) - assert cursor.selections[0].annotation.get_text() == "x=0\ny=0\n[2]" + assert _parse_annotation( + cursor.selections[0], "x=(.*)\ny=(.*)\n\[(.*)\]") == (0, 0, 2) def test_steps_index(): @@ -260,25 +261,25 @@ def test_image(ax, origin): # Annotation text includes image value. _process_event("__mouse_click__", ax, (.25, .25), 1) sel, = cursor.selections - assert (_parse_annotation(sel, r"x=(.*)\ny=(.*)\n\[0\]") - == approx((.25, .25))) + assert _parse_annotation( + sel, r"x=(.*)\ny=(.*)\n\[0\]") == approx((.25, .25)) # Moving around. _process_event("key_press_event", ax, (.123, .456), "shift+right") sel, = cursor.selections - assert sel.annotation.get_text() == "x=1\ny=0\n[1]" + assert _parse_annotation(sel, r"x=(.*)\ny=(.*)\n\[1\]") == (1, 0) assert array[sel.target.index] == 1 _process_event("key_press_event", ax, (.123, .456), "shift+right") sel, = cursor.selections - assert sel.annotation.get_text() == "x=0\ny=0\n[0]" + assert _parse_annotation(sel, r"x=(.*)\ny=(.*)\n\[0\]") == (0, 0) assert array[sel.target.index] == 0 _process_event("key_press_event", ax, (.123, .456), "shift+up") sel, = cursor.selections - assert (sel.annotation.get_text() - == {"upper": "x=0\ny=2\n[4]", "lower": "x=0\ny=1\n[2]"}[origin]) + assert (_parse_annotation(sel, r"x=(.*)\ny=(.*)\n\[(.*)\]") + == {"upper": (0, 2, 4), "lower": (0, 1, 2)}[origin]) assert array[sel.target.index] == {"upper": 4, "lower": 2}[origin] _process_event("key_press_event", ax, (.123, .456), "shift+down") sel, = cursor.selections - assert sel.annotation.get_text() == "x=0\ny=0\n[0]" + assert _parse_annotation(sel, r"x=(.*)\ny=(.*)\n\[0\]") == (0, 0) assert array[sel.target.index] == 0 cursor = mplcursors.cursor() @@ -295,12 +296,12 @@ def test_image_rgb(ax): cursor = mplcursors.cursor() _process_event("__mouse_click__", ax, (0, 0), 1) sel, = cursor.selections - assert (_parse_annotation(sel, r"x=(.*)\ny=(.*)\n\[0.1, 0.2, 0.3\]") - == approx((0, 0))) + assert _parse_annotation( + sel, r"x=(.*)\ny=(.*)\n\[0.1, 0.2, 0.3\]") == approx((0, 0)) _process_event("key_press_event", ax, (.123, .456), "shift+right") sel, = cursor.selections - assert (_parse_annotation(sel, r"x=(.*)\ny=(.*)\n\[0.4, 0.5, 0.6\]") - == approx((1, 0))) + assert _parse_annotation( + sel, r"x=(.*)\ny=(.*)\n\[0.4, 0.5, 0.6\]") == approx((1, 0)) def test_image_subclass(ax): @@ -339,7 +340,8 @@ def test_quiver_and_barbs(ax, plotter): _process_event("__mouse_click__", ax, (.5, 0), 1) assert len(cursor.selections) == 0 _process_event("__mouse_click__", ax, (1, 0), 1) - assert cursor.selections[0].annotation.get_text() == "x=1\ny=0\n(1, 1)" + assert _parse_annotation( + cursor.selections[0], r"x=(.*)\ny=(.*)\n\(1, 1\)") == (1, 0) @pytest.mark.parametrize("plotter,order", @@ -363,14 +365,17 @@ def test_errorbar(ax): assert len(cursor.selections) == 0 _process_event("__mouse_click__", ax, (.5, .5), 1) assert cursor.selections[0].target == approx((.5, .5)) - assert (_parse_annotation(cursor.selections[0], "x=(.*)\ny=(.*)") - == approx((.5, .5))) + assert _parse_annotation( + cursor.selections[0], "x=(.*)\ny=(.*)") == approx((.5, .5)) _process_event("__mouse_click__", ax, (0, 1), 1) assert cursor.selections[0].target == approx((0, 0)) - assert cursor.selections[0].annotation.get_text() == "x=0\ny=$0\\pm1$" + assert _parse_annotation( + cursor.selections[0], r"x=(.*)\ny=\$(.*)\\pm(.*)\$") == (0, 0, 1) _process_event("__mouse_click__", ax, (1, 2), 1) - assert cursor.selections[0].target == approx((1, 1)) - assert cursor.selections[0].annotation.get_text() == "x=1\ny=$1_{-1}^{+2}$" + sel, = cursor.selections + assert sel.target == approx((1, 1)) + assert _parse_annotation( + sel, r"x=(.*)\ny=\$(.*)_\{(.*)\}\^\{(.*)\}\$") == (1, 1, -1, 2) def test_dataless_errorbar(ax): ++++++ mplcursors-unicodeminus.patch ++++++ >From b12a791f6f8fc8a2b920e2ccb2d8ae2dae79dba0 Mon Sep 17 00:00:00 2001 From: Antony Lee <anntzer....@gmail.com> Date: Mon, 20 Jan 2020 08:47:58 +0100 Subject: [PATCH] Fix against use of unicode minus in mpl3.2. --- lib/mplcursors/_pick_info.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) Index: mplcursors-0.3/lib/mplcursors/_pick_info.py =================================================================== --- mplcursors-0.3.orig/lib/mplcursors/_pick_info.py +++ mplcursors-0.3/lib/mplcursors/_pick_info.py @@ -632,10 +632,16 @@ def _(sel): for e in err] # We'd normally want to check err.sum() == 0, but that can run # into fp inaccuracies. - if len({s.lstrip("+-") for s in err_s}) == 1: + signs = "+-\N{MINUS SIGN}" + if len({s.lstrip(signs) for s in err_s}) == 1: repl = rf"\1=$\2\\pm{err_s[1]}$\3" else: - err_s = [("+" if not s.startswith(("+", "-")) else "") + s + # Replacing unicode minus by ascii minus don't change the + # rendering as the string is mathtext, but allows keeping + # the same tests across Matplotlib versions that use + # unicode minus and those that don't. + err_s = [("+" if not s.startswith(tuple(signs)) else "") + + s.replace("\N{MINUS SIGN}", "-") for s in err_s] repl = r"\1=$\2_{%s}^{%s}$\3" % tuple(err_s) ann_text = re.sub(f"({dir})=(.*)(\n?)", repl, ann_text) ++++++ mplcursors-unicodeminus2.patch ++++++ Index: mplcursors-0.3/tests/test_mplcursors.py =================================================================== --- mplcursors-0.3.orig/tests/test_mplcursors.py +++ mplcursors-0.3/tests/test_mplcursors.py @@ -26,6 +26,7 @@ approx = functools.partial(pytest.approx @pytest.fixture def fig(): + plt.rcParams["axes.unicode_minus"] = False fig = plt.figure(1) fig.canvas.callbacks.exception_handler = None return fig