From 116dedbbe20f0f5cbed6450815579dedafa56fc8 Mon Sep 17 00:00:00 2001 From: Talley Lambert Date: Tue, 27 Apr 2021 14:41:11 -0400 Subject: [PATCH] Fix reuse of magic factory (#224) * fix reuse of magic factory * add test * skip persistence test on Win CI --- magicgui/_magicgui.py | 5 +++-- tests/test_factory.py | 17 ++++++++++++++++- tests/test_persistence.py | 5 +++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/magicgui/_magicgui.py b/magicgui/_magicgui.py index 04978944e..560d6bfb6 100644 --- a/magicgui/_magicgui.py +++ b/magicgui/_magicgui.py @@ -198,9 +198,10 @@ def __call__(self, *args, **kwargs): if args: raise ValueError("MagicFactory instance only accept keyword arguments") params = inspect.signature(magicgui).parameters - prm_options = self.keywords.pop("param_options", {}) + factory_kwargs = self.keywords.copy() + prm_options = factory_kwargs.pop("param_options", {}) prm_options.update({k: kwargs.pop(k) for k in list(kwargs) if k not in params}) - widget = self.func(param_options=prm_options, **{**self.keywords, **kwargs}) + widget = self.func(param_options=prm_options, **{**factory_kwargs, **kwargs}) if self._widget_init is not None: self._widget_init(widget) return widget diff --git a/tests/test_factory.py b/tests/test_factory.py index 63004801c..411e0ee41 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -2,7 +2,7 @@ from magicgui import magic_factory from magicgui._magicgui import MagicFactory -from magicgui.widgets import FunctionGui, Slider +from magicgui.widgets import ComboBox, FunctionGui, Slider def test_magic_factory(): @@ -32,6 +32,21 @@ def factory(x: int = 1): assert widget1(3) == 3 +def test_magic_factory_reuse(): + """Test magic_factory can be reused.""" + + @magic_factory(x={"choices": ["a", "b"]}) + def factory(x="a"): + return x + + # there was an earlier bug that overrode widget parameters. this tests for that + widget_a = factory() + assert isinstance(widget_a.x, ComboBox) + + widget_b = factory() + assert isinstance(widget_b.x, ComboBox) + + def test_magic_factory_repr(): """Test basic magic_factory behavior.""" diff --git a/tests/test_persistence.py b/tests/test_persistence.py index 65d85d237..2a7c99c8b 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -1,4 +1,5 @@ import os +import sys import time from unittest.mock import patch @@ -22,6 +23,10 @@ def test_user_cache_dir(): assert str(ucd) == str(home / ".cache" / "magicgui") +@pytest.mark.skipif( + bool(sys.platform == "win32" and sys.version_info >= (3, 9)), + reason="persistence test failing on CI", +) def test_persistence(tmp_path): """Test that we can persist values across instances."""