From 6c5b9cef295cf0a7aef3f6d4c4a32b418777d60d Mon Sep 17 00:00:00 2001 From: Gavin Burnell Date: Wed, 3 Jan 2024 17:49:25 +0000 Subject: [PATCH] Few more code fixes, make the widget testing more ropbust for parallel tests. Adjust conda build dependencies --- Stoner/Core.py | 2 +- Stoner/Image/core.py | 3 --- Stoner/core/base.py | 15 +++++++++------ recipe/meta.yaml | 12 ++++++------ tests/Stoner/tools/test_widgets.py | 7 ++++++- 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/Stoner/Core.py b/Stoner/Core.py index 9ac437967..320f34b1f 100755 --- a/Stoner/Core.py +++ b/Stoner/Core.py @@ -147,7 +147,7 @@ class DataFile( def __new__(cls, *args, **kargs): """Prepare the basic DataFile instance before the mixins add their bits.""" - self = metadataObject.__new__(cls, *args) + self = metadataObject.__new__(cls) object.__setattr__(self, "debug", kargs.pop("debug", False)) self._masks = [False] self._filename = None diff --git a/Stoner/Image/core.py b/Stoner/Image/core.py index ba48b21a8..6305b914a 100755 --- a/Stoner/Image/core.py +++ b/Stoner/Image/core.py @@ -774,9 +774,6 @@ class ImageFile(metadataObject): # pylint: disable=no-member _protected_attrs = ["_fromstack"] # these won't be passed through to self.image attrs - _patterns = ["*.png", "*.tif", "*.jpeg", "*.jpg"] - mime_type = ["image/png", "image/jpeg", "image/tiff", "application/octet-stream"] - priority = 32 def __init__(self, *args, **kargs): """Mostly a pass through to ImageArray constructor. diff --git a/Stoner/core/base.py b/Stoner/core/base.py index ee51e46af..830562698 100755 --- a/Stoner/core/base.py +++ b/Stoner/core/base.py @@ -354,7 +354,8 @@ def __init__(self, *args: Any, **kargs: Any) -> None: # _typehint dict value = super().__getitem__(key) super().__delitem__(key) - self[key] = value # __Setitem__ has the logic to handle embedded type hints correctly + # __Setitem__ has the logic to handle embedded type hints correctly + self[key] = value @property def types(self) -> Dict: @@ -425,7 +426,8 @@ def __mungevalue(self, typ: str, value: Any) -> Any: if matched is not None: if isinstance(valuetype, _evaluatable): try: - if isinstance(value, string_types): # we've got a string already don't need repr + # we've got a string already don't need repr + if isinstance(value, string_types): ret = literal_eval(value) else: ret = literal_eval(repr(value)) # pylint: disable=eval-used @@ -765,7 +767,7 @@ def save(self, filename: Filename = None, **kargs: Any): raise NotImplementedError("Save is not implemented in the base class.") @classmethod - def load(self, filename: Filename, *args: Any, **kargs: Any) -> "metadataObject": + def load(cls, filename: Filename, *args: Any, **kargs: Any) -> "metadataObject": """Stub method for a load function.""" raise NotImplementedError("Save is not implemented in the base class.") @@ -775,7 +777,7 @@ class SortedMultivalueDict(OrderedDict): """Implement a simple multivalued dictionary where the values are always sorted lists of elements.""" @classmethod - def _matching(cls, val): + def _matching(cls, val: Tuple[int, str] | List[Tuple[int, str]]) -> List[Tuple[int, str]]: match val: case (int(p), item): return [(p, item)] @@ -793,7 +795,7 @@ def get_value_list(self, name): def __setitem__(self, name: Any, val: Union[List[Tuple[int, Any]], Tuple[int, Any]]) -> None: """Insert or replace a value and then sort the values.""" values = self._matching(val) - for p, value in values: + for p, value in values: # pylint: disable=not-an-iterable for ix, (_, old_value) in enumerate(self.get(name, [])): if old_value == value: # replacing existing value self[name][ix] = (p, value) @@ -803,7 +805,8 @@ def __setitem__(self, name: Any, val: Union[List[Tuple[int, Any]], Tuple[int, An super().__setitem__(name, sorted(self[name], key=lambda item: (item[0], str(item[1])))) -if pd is not None and not hasattr(pd.DataFrame, "metadata"): # Don;t double add metadata +# Don't double add metadata +if pd is not None and not hasattr(pd.DataFrame, "metadata"): @pd.api.extensions.register_dataframe_accessor("metadata") class PandasMetadata(typeHintedDict): diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 340c9ac30..56179984a 100755 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -22,16 +22,16 @@ requirements: - pytest-runner run: - - python >=3.7 - - scipy>1.7 - - numpy >=1.18 - - matplotlib >=3.0 - - scikit-image >=0.17 + - python >=3.10 + - scipy>1.10 + - numpy >=1.22 + - matplotlib >=3.6 + - scikit-image >=0.19 - h5py - cycler >=0.10.0 - filemagic >=1.6 - image-registration >=0.2.1 - - lmfit >=0.9.7 + - lmfit >=1.0 - memoization >=0.1.4 - npTDMS >=0.11 - python-dateutil >=2.7.0 diff --git a/tests/Stoner/tools/test_widgets.py b/tests/Stoner/tools/test_widgets.py index f0a7a09e5..13a300255 100755 --- a/tests/Stoner/tools/test_widgets.py +++ b/tests/Stoner/tools/test_widgets.py @@ -21,7 +21,7 @@ from Stoner import Data, DataFolder -def test_filedialog(): +def _fix_widgets(): def dummy(mode="getOpenFileName"): modes = { "getOpenFileName": ret_pth, @@ -57,6 +57,10 @@ def dummy(mode="getOpenFileName"): widgets = sys.modules["Stoner.tools.widgets"] app = getattr(widgets, "App") setattr(app, "modes", modes) + return widgets + +def test_filedialog(): + widgets=_fix_widgets() assert widgets.fileDialog.openDialog() == ret_pth assert widgets.fileDialog.openDialog(title="Test", start=".") == ret_pth @@ -69,6 +73,7 @@ def dummy(mode="getOpenFileName"): def test_loader(): + _fix_widgets() d = Data(False) assert d.shape == (1676, 3), "Failed to load data with dialog box" with pytest.raises(RuntimeError):