From fe63adcca4cbcb2e1c207a3e9e093f0762bae3bb Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 12 Feb 2021 17:04:35 +0100 Subject: [PATCH] mimic python error message and ensure that error is raised --- python/damask/_orientation.py | 49 +++++++++++++++++--------------- python/tests/test_Orientation.py | 17 ++++++++++- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/python/damask/_orientation.py b/python/damask/_orientation.py index 47334d555..f01156903 100644 --- a/python/damask/_orientation.py +++ b/python/damask/_orientation.py @@ -268,30 +268,33 @@ class Orientation(Rotation): def _separate_arguments(parent_dict,function): """ Separate arguments required by Rotation and Orientation objects respectively. - + Parameters ---------- parent_dict : Dictionary Contains all **kwargs function: Method Function whose signature list is required - + Returns ------- ori_dict: dictionary Dictionary consisting of valid keys accepted by Orientation class rot_dict: dictionary Dictionary consisting of valid keys accepted by 'function' in Rotation class - + """ set_ori = set(inspect.signature(Orientation.__init__).parameters.keys()) & set(parent_dict.keys()) set_rot = set(inspect.signature(function).parameters.keys()) & set(parent_dict.keys()) ori_dict = {key: parent_dict[key] for key in set_ori} rot_dict = {key: parent_dict[key] for key in set_rot} - if(set(parent_dict.keys())-(set_ori|set_rot)): - raise KeyError(f'Unknown key {set(parent_dict.keys())-(set_ori|set_rot)} present') + + invalid_keys = set(parent_dict.keys())-(set_ori|set_rot) + if invalid_keys: + raise TypeError(f"{inspect.stack()[1][3]}() got an unexpected keyword argument '{invalid_keys.pop()}'") + return rot_dict,ori_dict - + @classmethod @util.extended_docstring(Rotation.from_random,_parameter_doc) @@ -312,63 +315,63 @@ class Orientation(Rotation): def from_Euler_angles(cls,**kwargs): kwargs_rot,kwargs_ori = Orientation._separate_arguments(kwargs,Rotation.from_Euler_angles) return cls(rotation=Rotation.from_Euler_angles(**kwargs_rot),**kwargs_ori) - - + + @classmethod @util.extended_docstring(Rotation.from_axis_angle,_parameter_doc) def from_axis_angle(cls,**kwargs): kwargs_rot,kwargs_ori = Orientation._separate_arguments(kwargs,Rotation.from_axis_angle) return cls(rotation=Rotation.from_axis_angle(**kwargs_rot),**kwargs_ori) - - + + @classmethod @util.extended_docstring(Rotation.from_basis,_parameter_doc) def from_basis(cls,**kwargs): kwargs_rot,kwargs_ori = Orientation._separate_arguments(kwargs,Rotation.from_basis) return cls(rotation=Rotation.from_basis(**kwargs_rot),**kwargs_ori) - - + + @classmethod @util.extended_docstring(Rotation.from_matrix,_parameter_doc) def from_matrix(cls,**kwargs): kwargs_rot,kwargs_ori = Orientation._separate_arguments(kwargs,Rotation.from_matrix) return cls(rotation=Rotation.from_matrix(**kwargs_rot),**kwargs_ori) - - + + @classmethod @util.extended_docstring(Rotation.from_Rodrigues_vector,_parameter_doc) def from_Rodrigues_vector(cls,**kwargs): kwargs_rot,kwargs_ori = Orientation._separate_arguments(kwargs,Rotation.from_Rodrigues_vector) return cls(rotation=Rotation.from_Rodrigues_vector(**kwargs_rot),**kwargs_ori) - - + + @classmethod @util.extended_docstring(Rotation.from_homochoric,_parameter_doc) def from_homochoric(cls,**kwargs): kwargs_rot,kwargs_ori = Orientation._separate_arguments(kwargs,Rotation.from_homochoric) return cls(rotation=Rotation.from_homochoric(**kwargs_rot),**kwargs_ori) - - + + @classmethod @util.extended_docstring(Rotation.from_cubochoric,_parameter_doc) def from_cubochoric(cls,**kwargs): kwargs_rot,kwargs_ori = Orientation._separate_arguments(kwargs,Rotation.from_cubochoric) return cls(rotation=Rotation.from_cubochoric(**kwargs_rot),**kwargs_ori) - - + + @classmethod @util.extended_docstring(Rotation.from_spherical_component,_parameter_doc) def from_spherical_component(cls,**kwargs): kwargs_rot,kwargs_ori = Orientation._separate_arguments(kwargs,Rotation.from_spherical_component) return cls(rotation=Rotation.from_spherical_component(**kwargs_rot),**kwargs_ori) - - + + @classmethod @util.extended_docstring(Rotation.from_fiber_component,_parameter_doc) def from_fiber_component(cls,**kwargs): kwargs_rot,kwargs_ori = Orientation._separate_arguments(kwargs,Rotation.from_fiber_component) return cls(rotation=Rotation.from_fiber_component(**kwargs_rot),**kwargs_ori) - + @classmethod @util.extend_docstring(_parameter_doc) diff --git a/python/tests/test_Orientation.py b/python/tests/test_Orientation.py index 92c3f63ab..e4174f795 100644 --- a/python/tests/test_Orientation.py +++ b/python/tests/test_Orientation.py @@ -141,7 +141,7 @@ class TestOrientation: dict(lattice='hP',a=1.0 ), dict(lattice='cI',a=1.0, ), ]) - def test_from_direction(self,kwargs): + def test_from_directions(self,kwargs): for a,b in np.random.random((10,2,3)): c = np.cross(b,a) if np.all(np.isclose(c,0)): continue @@ -151,6 +151,21 @@ class TestOrientation: assert np.isclose(np.dot(x/np.linalg.norm(x),np.array([1,0,0])),1) \ and np.isclose(np.dot(z/np.linalg.norm(z),np.array([0,0,1])),1) + @pytest.mark.parametrize('function',[Orientation.from_random, + Orientation.from_quaternion, + Orientation.from_Euler_angles, + Orientation.from_axis_angle, + Orientation.from_basis, + Orientation.from_matrix, + Orientation.from_Rodrigues_vector, + Orientation.from_homochoric, + Orientation.from_cubochoric, + Orientation.from_spherical_component, + Orientation.from_fiber_component, + Orientation.from_directions]) + def test_invalid_from(self,function): + with pytest.raises(TypeError): + function(c=.1,degrees=True,invalid=66) def test_negative_angle(self): with pytest.raises(ValueError):