From 43b2527bcf20a58c2cb9e3d956e46e5a6c883649 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 11 Sep 2024 12:26:57 +0200 Subject: [PATCH 1/7] pyproject --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1bb784ef..de3943c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ ] requires-python = ">=3.9,<3.12" dependencies = [ - "easyscience>=1.0.1", + 'easyscience @ git+https://github.com/EasyScience/EasyScience.git@adjustments-to-fit-app', "scipp>=23.12.0", "refnx>=0.1.15", "refl1d>=0.8.14", From d4ffc633b49de549634fcb9331cb800ef1e7fe4d Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 12 Sep 2024 08:53:25 +0200 Subject: [PATCH 2/7] consistent use of as_dict --- src/easyreflectometry/experiment/model.py | 5 +++-- .../experiment/model_collection.py | 2 +- .../experiment/resolution_functions.py | 18 ++++++++++++------ .../sample/assemblies/gradient_layer.py | 2 +- .../sample/assemblies/surfactant_layer.py | 2 +- .../elements/layers/layer_area_per_molecule.py | 8 ++++---- .../elements/materials/material_mixture.py | 8 ++++---- .../elements/materials/material_solvated.py | 8 ++++---- 8 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/easyreflectometry/experiment/model.py b/src/easyreflectometry/experiment/model.py index 681ad2bd..e340fb82 100644 --- a/src/easyreflectometry/experiment/model.py +++ b/src/easyreflectometry/experiment/model.py @@ -4,6 +4,7 @@ import copy from numbers import Number +from typing import Optional from typing import Union import numpy as np @@ -189,7 +190,7 @@ def __repr__(self) -> str: """String representation of the layer.""" return yaml_dump(self._dict_repr) - def as_dict(self, skip: list = None) -> dict: + def as_dict(self, skip: Optional[list[str]] = None) -> dict: """Produces a cleaned dict using a custom as_dict method to skip necessary things. The resulting dict matches the parameters in __init__ @@ -200,7 +201,7 @@ def as_dict(self, skip: list = None) -> dict: skip.extend(['sample', 'resolution_function', 'interface']) this_dict = super().as_dict(skip=skip) this_dict['sample'] = self.sample.as_dict(skip=skip) - this_dict['resolution_function'] = self.resolution_function.as_dict() + this_dict['resolution_function'] = self.resolution_function.as_dict(skip=skip) if self.interface is None: this_dict['interface'] = None else: diff --git a/src/easyreflectometry/experiment/model_collection.py b/src/easyreflectometry/experiment/model_collection.py index 7f8def28..83aea55e 100644 --- a/src/easyreflectometry/experiment/model_collection.py +++ b/src/easyreflectometry/experiment/model_collection.py @@ -52,7 +52,7 @@ def remove_model(self, idx: int): del self[idx] def as_dict(self, skip: List[str] | None = None) -> dict: - this_dict = super().as_dict(skip) + this_dict = super().as_dict(skip=skip) this_dict['populate_if_none'] = self.populate_if_none return this_dict diff --git a/src/easyreflectometry/experiment/resolution_functions.py b/src/easyreflectometry/experiment/resolution_functions.py index f6bcc56b..da276078 100644 --- a/src/easyreflectometry/experiment/resolution_functions.py +++ b/src/easyreflectometry/experiment/resolution_functions.py @@ -8,6 +8,8 @@ from __future__ import annotations from abc import abstractmethod +from typing import List +from typing import Optional from typing import Union import numpy as np @@ -17,10 +19,10 @@ class ResolutionFunction: @abstractmethod - def smearing(q: Union[np.array, float]) -> np.array: ... + def smearing(self, q: Union[np.array, float]) -> np.array: ... @abstractmethod - def as_dict() -> dict: ... + def as_dict(self, skip: Optional[List[str]] = None) -> dict: ... @classmethod def from_dict(cls, data: dict) -> ResolutionFunction: @@ -31,7 +33,7 @@ def from_dict(cls, data: dict) -> ResolutionFunction: raise ValueError('Unknown resolution function type') -class PercentageFhwm: +class PercentageFhwm(ResolutionFunction): def __init__(self, constant: Union[None, float] = None): if constant is None: constant = DEFAULT_RESOLUTION_FWHM_PERCENTAGE @@ -40,11 +42,13 @@ def __init__(self, constant: Union[None, float] = None): def smearing(self, q: Union[np.array, float]) -> np.array: return np.ones(np.array(q).size) * self.constant - def as_dict(self) -> dict: + def as_dict( + self, skip: Optional[List[str]] = None + ) -> dict[str, str]: # skip is kept for consistency of the as_dict signature return {'smearing': 'PercentageFhwm', 'constant': self.constant} -class LinearSpline: +class LinearSpline(ResolutionFunction): def __init__(self, q_data_points: np.array, fwhm_values: np.array): self.q_data_points = q_data_points self.fwhm_values = fwhm_values @@ -52,5 +56,7 @@ def __init__(self, q_data_points: np.array, fwhm_values: np.array): def smearing(self, q: Union[np.array, float]) -> np.array: return np.interp(q, self.q_data_points, self.fwhm_values) - def as_dict(self) -> dict: + def as_dict( + self, skip: Optional[List[str]] = None + ) -> dict[str, str]: # skip is kept for consistency of the as_dict signature return {'smearing': 'LinearSpline', 'q_data_points': self.q_data_points, 'fwhm_values': self.fwhm_values} diff --git a/src/easyreflectometry/sample/assemblies/gradient_layer.py b/src/easyreflectometry/sample/assemblies/gradient_layer.py index 05800a8a..4f5a29bb 100644 --- a/src/easyreflectometry/sample/assemblies/gradient_layer.py +++ b/src/easyreflectometry/sample/assemblies/gradient_layer.py @@ -107,7 +107,7 @@ def _dict_repr(self) -> dict[str, str]: 'front_layer': self.front_layer._dict_repr, } - def as_dict(self, skip: list = None) -> dict: + def as_dict(self, skip: Optional[list[str]] = None) -> dict: """Produces a cleaned dict using a custom as_dict method to skip necessary things. The resulting dict matches the parameters in __init__ diff --git a/src/easyreflectometry/sample/assemblies/surfactant_layer.py b/src/easyreflectometry/sample/assemblies/surfactant_layer.py index 56a7cb0c..e7ff92f9 100644 --- a/src/easyreflectometry/sample/assemblies/surfactant_layer.py +++ b/src/easyreflectometry/sample/assemblies/surfactant_layer.py @@ -230,7 +230,7 @@ def _dict_repr(self) -> dict: } } - def as_dict(self, skip: list = None) -> dict: + def as_dict(self, skip: Optional[list[str]] = None) -> dict: """Produces a cleaned dict using a custom as_dict method to skip necessary things. The resulting dict matches the parameters in __init__ diff --git a/src/easyreflectometry/sample/elements/layers/layer_area_per_molecule.py b/src/easyreflectometry/sample/elements/layers/layer_area_per_molecule.py index 230c4709..4fb20436 100644 --- a/src/easyreflectometry/sample/elements/layers/layer_area_per_molecule.py +++ b/src/easyreflectometry/sample/elements/layers/layer_area_per_molecule.py @@ -262,16 +262,16 @@ def _dict_repr(self) -> dict[str, str]: dict_repr['area_per_molecule'] = f'{self.area_per_molecule:.2f} ' f'{self._area_per_molecule.unit}' return dict_repr - def as_dict(self, skip: list = None) -> dict[str, str]: + def as_dict(self, skip: Optional[list[str]] = None) -> dict[str, str]: """Produces a cleaned dict using a custom as_dict method to skip necessary things. The resulting dict matches the parameters in __init__ :param skip: List of keys to skip, defaults to `None`. """ this_dict = super().as_dict(skip=skip) - this_dict['solvent_fraction'] = self.material._fraction.as_dict() - this_dict['area_per_molecule'] = self._area_per_molecule.as_dict() - this_dict['solvent'] = self.solvent.as_dict() + this_dict['solvent_fraction'] = self.material._fraction.as_dict(skip=skip) + this_dict['area_per_molecule'] = self._area_per_molecule.as_dict(skip=skip) + this_dict['solvent'] = self.solvent.as_dict(skip=skip) del this_dict['material'] del this_dict['_scattering_length_real'] del this_dict['_scattering_length_imag'] diff --git a/src/easyreflectometry/sample/elements/materials/material_mixture.py b/src/easyreflectometry/sample/elements/materials/material_mixture.py index 487b64e3..d066b23d 100644 --- a/src/easyreflectometry/sample/elements/materials/material_mixture.py +++ b/src/easyreflectometry/sample/elements/materials/material_mixture.py @@ -201,14 +201,14 @@ def _dict_repr(self) -> dict[str, str]: } } - def as_dict(self, skip: list = None) -> dict[str, str]: + def as_dict(self, skip: Optional[list[str]] = None) -> dict[str, str]: """Produces a cleaned dict using a custom as_dict method to skip necessary things. The resulting dict matches the parameters in __init__ :param skip: List of keys to skip, defaults to `None`. """ this_dict = super().as_dict(skip=skip) - this_dict['material_a'] = self._material_a.as_dict() - this_dict['material_b'] = self._material_b.as_dict() - this_dict['fraction'] = self._fraction.as_dict() + this_dict['material_a'] = self._material_a.as_dict(skip=skip) + this_dict['material_b'] = self._material_b.as_dict(skip=skip) + this_dict['fraction'] = self._fraction.as_dict(skip=skip) return this_dict diff --git a/src/easyreflectometry/sample/elements/materials/material_solvated.py b/src/easyreflectometry/sample/elements/materials/material_solvated.py index bef267ed..2de796c1 100644 --- a/src/easyreflectometry/sample/elements/materials/material_solvated.py +++ b/src/easyreflectometry/sample/elements/materials/material_solvated.py @@ -138,16 +138,16 @@ def _dict_repr(self) -> dict[str, str]: } } - def as_dict(self, skip: list = None) -> dict[str, str]: + def as_dict(self, skip: Optional[list[str]] = None) -> dict[str, str]: """Produces a cleaned dict using a custom as_dict method to skip necessary things. The resulting dict matches the parameters in __init__ :param skip: List of keys to skip, defaults to `None`. """ this_dict = super().as_dict(skip=skip) - this_dict['material'] = self.material.as_dict() - this_dict['solvent'] = self.solvent.as_dict() - this_dict['solvent_fraction'] = self._fraction.as_dict() + this_dict['material'] = self.material.as_dict(skip=skip) + this_dict['solvent'] = self.solvent.as_dict(skip=skip) + this_dict['solvent_fraction'] = self._fraction.as_dict(skip=skip) # Property and protected varible from material_mixture del this_dict['material_a'] del this_dict['_material_a'] From 20fa247f69712bb5d2a12b1408f53f81acee30f6 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 12 Sep 2024 13:40:17 +0200 Subject: [PATCH 3/7] update collections --- .../experiment/model_collection.py | 4 +- .../elements/materials/material_collection.py | 15 +++++-- tests/experiment/test_model.py | 44 ++++++++++++++++++- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/easyreflectometry/experiment/model_collection.py b/src/easyreflectometry/experiment/model_collection.py index 83aea55e..cdf610a4 100644 --- a/src/easyreflectometry/experiment/model_collection.py +++ b/src/easyreflectometry/experiment/model_collection.py @@ -3,7 +3,7 @@ __author__ = 'github.com/arm61' from typing import List -from typing import Optional +from typing import Tuple from easyreflectometry.sample.base_element_collection import SIZE_DEFAULT_COLLECTION from easyreflectometry.sample.base_element_collection import BaseElementCollection @@ -17,7 +17,7 @@ class ModelCollection(BaseElementCollection): def __init__( self, - *models: Optional[tuple[Model]], + *models: Tuple[Model], name: str = 'EasyModels', interface=None, populate_if_none: bool = True, diff --git a/src/easyreflectometry/sample/elements/materials/material_collection.py b/src/easyreflectometry/sample/elements/materials/material_collection.py index 5952d865..7901327b 100644 --- a/src/easyreflectometry/sample/elements/materials/material_collection.py +++ b/src/easyreflectometry/sample/elements/materials/material_collection.py @@ -1,4 +1,5 @@ __author__ = 'github.com/arm61' +from typing import Tuple from typing import Union from ...base_element_collection import SIZE_DEFAULT_COLLECTION @@ -13,13 +14,21 @@ class MaterialCollection(BaseElementCollection): def __init__( self, - *materials: Union[list[Union[Material, MaterialMixture]], None], + *materials: Tuple[Union[Material, MaterialMixture]], name: str = 'EasyMaterials', interface=None, + populate_if_none: bool = True, **kwargs, ): - if not materials: - materials = [Material(interface=interface) for _ in range(SIZE_DEFAULT_COLLECTION)] + if not materials: # Empty tuple if no materials are provided + if populate_if_none: + materials = [Material(interface=interface) for _ in range(SIZE_DEFAULT_COLLECTION)] + else: + materials = [] + # Needed to ensure an empty list is created when saving and instatiating the object as_dict -> from_dict + # Else collisions might occur in global_object.map + self.populate_if_none = False + super().__init__( name, interface, diff --git a/tests/experiment/test_model.py b/tests/experiment/test_model.py index c1386f8a..52dcbd4e 100644 --- a/tests/experiment/test_model.py +++ b/tests/experiment/test_model.py @@ -6,6 +6,7 @@ __version__ = '0.0.1' import unittest +from copy import copy from unittest.mock import MagicMock import numpy as np @@ -391,11 +392,37 @@ def test_repr_resolution_function(self): ) +def test_copy(): + # When + resolution_function = LinearSpline([0, 10], [0, 10]) + model = Model(interface=CalculatorFactory()) + model.resolution_function = resolution_function + for additional_layer in [SurfactantLayer(), Multilayer(), RepeatingMultilayer()]: + model.add_item(additional_layer) + + # Then + model_copy = copy(model) + + # Expect + assert sorted(model.as_data_dict()) == sorted(model_copy.as_data_dict()) + assert model._resolution_function.smearing(5.5) == model_copy._resolution_function.smearing(5.5) + assert model.interface().name == model_copy.interface().name + assert_almost_equal( + model.interface().fit_func([0.3], model.unique_name), + model_copy.interface().fit_func([0.3], model_copy.unique_name), + ) + assert model.unique_name != model_copy.unique_name + assert model.name == model_copy.name + assert model.as_data_dict(skip=['interface', 'unique_name', 'resolution_function']) == model_copy.as_data_dict( + skip=['interface', 'unique_name', 'resolution_function'] + ) + + @pytest.mark.parametrize( 'interface', [None, CalculatorFactory()], ) -def test_dict_round_trip(interface): # , additional_layer): +def test_dict_round_trip(interface): # When resolution_function = LinearSpline([0, 10], [0, 10]) model = Model(interface=interface) @@ -419,3 +446,18 @@ def test_dict_round_trip(interface): # , additional_layer): model.interface().fit_func([0.3], model.unique_name), model_from_dict.interface().fit_func([0.3], model_from_dict.unique_name), ) + + +def test_dict_skip_unique_name(): + # When + resolution_function = LinearSpline([0, 10], [0, 10]) + model = Model(interface=CalculatorFactory()) + model.resolution_function = resolution_function + for additional_layer in [SurfactantLayer(), Multilayer(), RepeatingMultilayer()]: + model.add_item(additional_layer) + + # Then + dict_no_unique_name = model.as_dict(skip=['unique_name']) + + # Expect + assert 'unique_name' not in dict_no_unique_name From 7649d6bc99a4da340e0e744ff90be41f7d7d6cf3 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Mon, 16 Sep 2024 09:17:29 +0200 Subject: [PATCH 4/7] extracted two test to outmost level --- tests/experiment/test_model.py | 42 ------------------------- tests/test_topmost_nesting.py | 56 ++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 42 deletions(-) create mode 100644 tests/test_topmost_nesting.py diff --git a/tests/experiment/test_model.py b/tests/experiment/test_model.py index 52dcbd4e..8ec73309 100644 --- a/tests/experiment/test_model.py +++ b/tests/experiment/test_model.py @@ -6,7 +6,6 @@ __version__ = '0.0.1' import unittest -from copy import copy from unittest.mock import MagicMock import numpy as np @@ -392,32 +391,6 @@ def test_repr_resolution_function(self): ) -def test_copy(): - # When - resolution_function = LinearSpline([0, 10], [0, 10]) - model = Model(interface=CalculatorFactory()) - model.resolution_function = resolution_function - for additional_layer in [SurfactantLayer(), Multilayer(), RepeatingMultilayer()]: - model.add_item(additional_layer) - - # Then - model_copy = copy(model) - - # Expect - assert sorted(model.as_data_dict()) == sorted(model_copy.as_data_dict()) - assert model._resolution_function.smearing(5.5) == model_copy._resolution_function.smearing(5.5) - assert model.interface().name == model_copy.interface().name - assert_almost_equal( - model.interface().fit_func([0.3], model.unique_name), - model_copy.interface().fit_func([0.3], model_copy.unique_name), - ) - assert model.unique_name != model_copy.unique_name - assert model.name == model_copy.name - assert model.as_data_dict(skip=['interface', 'unique_name', 'resolution_function']) == model_copy.as_data_dict( - skip=['interface', 'unique_name', 'resolution_function'] - ) - - @pytest.mark.parametrize( 'interface', [None, CalculatorFactory()], @@ -446,18 +419,3 @@ def test_dict_round_trip(interface): model.interface().fit_func([0.3], model.unique_name), model_from_dict.interface().fit_func([0.3], model_from_dict.unique_name), ) - - -def test_dict_skip_unique_name(): - # When - resolution_function = LinearSpline([0, 10], [0, 10]) - model = Model(interface=CalculatorFactory()) - model.resolution_function = resolution_function - for additional_layer in [SurfactantLayer(), Multilayer(), RepeatingMultilayer()]: - model.add_item(additional_layer) - - # Then - dict_no_unique_name = model.as_dict(skip=['unique_name']) - - # Expect - assert 'unique_name' not in dict_no_unique_name diff --git a/tests/test_topmost_nesting.py b/tests/test_topmost_nesting.py new file mode 100644 index 00000000..585dc8da --- /dev/null +++ b/tests/test_topmost_nesting.py @@ -0,0 +1,56 @@ +""" +Tests exercising the methods of the topmost classes for nested structure. +To ensure that the parameters are relayed. +""" + +from copy import copy + +from numpy.testing import assert_almost_equal + +from easyreflectometry.calculators import CalculatorFactory +from easyreflectometry.experiment import LinearSpline +from easyreflectometry.experiment import Model +from easyreflectometry.sample import Multilayer +from easyreflectometry.sample import RepeatingMultilayer +from easyreflectometry.sample import SurfactantLayer + + +def test_dict_skip_unique_name(): + # When + resolution_function = LinearSpline([0, 10], [0, 10]) + model = Model(interface=CalculatorFactory()) + model.resolution_function = resolution_function + for additional_layer in [SurfactantLayer(), Multilayer(), RepeatingMultilayer()]: + model.add_item(additional_layer) + + # Then + dict_no_unique_name = model.as_dict(skip=['unique_name']) + + # Expect + assert 'unique_name' not in dict_no_unique_name + + +def test_copy(): + # When + resolution_function = LinearSpline([0, 10], [0, 10]) + model = Model(interface=CalculatorFactory()) + model.resolution_function = resolution_function + for additional_layer in [SurfactantLayer(), Multilayer(), RepeatingMultilayer()]: + model.add_item(additional_layer) + + # Then + model_copy = copy(model) + + # Expect + assert sorted(model.as_data_dict()) == sorted(model_copy.as_data_dict()) + assert model._resolution_function.smearing(5.5) == model_copy._resolution_function.smearing(5.5) + assert model.interface().name == model_copy.interface().name + assert_almost_equal( + model.interface().fit_func([0.3], model.unique_name), + model_copy.interface().fit_func([0.3], model_copy.unique_name), + ) + assert model.unique_name != model_copy.unique_name + assert model.name == model_copy.name + assert model.as_data_dict(skip=['interface', 'unique_name', 'resolution_function']) == model_copy.as_data_dict( + skip=['interface', 'unique_name', 'resolution_function'] + ) From b3bbd6d8aa785ad583012cddf9b1f626236ba04b Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Tue, 17 Sep 2024 13:12:41 +0200 Subject: [PATCH 5/7] new module path for Constraints --- src/easyreflectometry/sample/assemblies/base_assembly.py | 2 +- src/easyreflectometry/sample/assemblies/surfactant_layer.py | 2 +- .../sample/elements/layers/layer_area_per_molecule.py | 2 +- .../sample/elements/materials/material_density.py | 2 +- .../sample/elements/materials/material_mixture.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/easyreflectometry/sample/assemblies/base_assembly.py b/src/easyreflectometry/sample/assemblies/base_assembly.py index bf408c50..1c0f2807 100644 --- a/src/easyreflectometry/sample/assemblies/base_assembly.py +++ b/src/easyreflectometry/sample/assemblies/base_assembly.py @@ -1,7 +1,7 @@ from typing import Any from typing import Optional -from easyscience.fitting.Constraints import ObjConstraint +from easyscience.Constraints import ObjConstraint from ..base_core import BaseCore from ..elements.layers.layer import Layer diff --git a/src/easyreflectometry/sample/assemblies/surfactant_layer.py b/src/easyreflectometry/sample/assemblies/surfactant_layer.py index e7ff92f9..7dfcda5b 100644 --- a/src/easyreflectometry/sample/assemblies/surfactant_layer.py +++ b/src/easyreflectometry/sample/assemblies/surfactant_layer.py @@ -2,7 +2,7 @@ from typing import Optional -from easyscience.fitting.Constraints import ObjConstraint +from easyscience.Constraints import ObjConstraint from easyscience.Objects.new_variable import Parameter from ..elements.layers.layer_area_per_molecule import LayerAreaPerMolecule diff --git a/src/easyreflectometry/sample/elements/layers/layer_area_per_molecule.py b/src/easyreflectometry/sample/elements/layers/layer_area_per_molecule.py index 4fb20436..00737aa1 100644 --- a/src/easyreflectometry/sample/elements/layers/layer_area_per_molecule.py +++ b/src/easyreflectometry/sample/elements/layers/layer_area_per_molecule.py @@ -3,7 +3,7 @@ import numpy as np from easyscience import global_object -from easyscience.fitting.Constraints import FunctionalConstraint +from easyscience.Constraints import FunctionalConstraint from easyscience.Objects.new_variable import Parameter from easyreflectometry.parameter_utils import get_as_parameter diff --git a/src/easyreflectometry/sample/elements/materials/material_density.py b/src/easyreflectometry/sample/elements/materials/material_density.py index fee6168a..a584ed19 100644 --- a/src/easyreflectometry/sample/elements/materials/material_density.py +++ b/src/easyreflectometry/sample/elements/materials/material_density.py @@ -3,7 +3,7 @@ import numpy as np from easyscience import global_object -from easyscience.fitting.Constraints import FunctionalConstraint +from easyscience.Constraints import FunctionalConstraint from easyscience.Objects.new_variable import Parameter from easyreflectometry.parameter_utils import get_as_parameter diff --git a/src/easyreflectometry/sample/elements/materials/material_mixture.py b/src/easyreflectometry/sample/elements/materials/material_mixture.py index d066b23d..0c87b74a 100644 --- a/src/easyreflectometry/sample/elements/materials/material_mixture.py +++ b/src/easyreflectometry/sample/elements/materials/material_mixture.py @@ -2,7 +2,7 @@ from typing import Union from easyscience import global_object -from easyscience.fitting.Constraints import FunctionalConstraint +from easyscience.Constraints import FunctionalConstraint from easyscience.Objects.new_variable import Parameter from easyreflectometry.parameter_utils import get_as_parameter From 919b0363b6b9e70f251987d8e6e81a72b1be5676 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 18 Sep 2024 15:31:43 +0200 Subject: [PATCH 6/7] update to pyproject.toml --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index de3943c7..6699841c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,9 +27,9 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Development Status :: 3 - Alpha" ] -requires-python = ">=3.9,<3.12" +requires-python = ">=3.9,<3.13" dependencies = [ - 'easyscience @ git+https://github.com/EasyScience/EasyScience.git@adjustments-to-fit-app', + 'easyscience>=1.1.0', "scipp>=23.12.0", "refnx>=0.1.15", "refl1d>=0.8.14", From 90c4a643e4c476630813714d674ebece8a7048bd Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 18 Sep 2024 15:45:11 +0200 Subject: [PATCH 7/7] support python 3.12 --- .github/workflows/python-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 91ddbd07..1eed04bb 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -30,7 +30,7 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: ['3.9', '3.10', '3.11'] + python-version: ['3.9', '3.10', '3.11', '3.12'] os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }}