def check_event_objects_for_compatibility(cls, default_dim, obj_dim, method_dict): """Checks Events for compatibility and sets global method attributes Args: default_dim (dict): Dict representation of SpectralDimension in base method obj_dim (SpectralDimension): User-passed SpectralDimension object to check method_dict (dict): Dict representation of passed method """ required = ["magnetic_flux_density", "rotor_frequency", "rotor_angle"] check_dim = SpectralDimension(**default_dim) for i, (ev_check, ev_obj) in enumerate(zip(check_dim.events, obj_dim.events)): default_obj = SpectralDimension(events=[{}]).events[0] obj_keys = ev_obj.dict(exclude={"property_units"}).keys() check_keys = default_dim["events"][i].keys() for k in obj_keys: # iterate over event attributes fail = False if k in check_keys: obj_attr, default_attr, check_attr = (getattr( _, k) for _ in [ev_obj, default_obj, ev_check]) fail_1 = obj_attr != default_attr # not default (user passed value) fail_2 = obj_attr != check_attr # passed attr does not match base fail_3 = default_attr is not None fail = fail_1 and fail_2 and fail_3 setattr(ev_obj, k, check_attr) elif k in required and k in method_dict: # True if passed attr does not match global attr defined by method fail = getattr(ev_obj, k) != method_dict[k] # Set event attr to global method attr setattr(ev_obj, k, method_dict[k]) if fail: raise ImmutableEventError(cls.__name__)
def check_when_arg_is_object(cls, obj_dict): default_method = cls.update(**obj_dict) py_sp = default_method["spectral_dimensions"] obj_sp = obj_dict["spectral_dimensions"] for py, obj in zip(py_sp, obj_sp): if len(py["events"]) != len(obj.events): raise ImmutableEventError(cls.__name__) cls.check_event_objects_for_compatibility(py, obj, obj_dict)
def check_method_compatibility(cls, py_dict): """Check for events attribute inside the spectral_dimensions. Events are not allowed for NamedMethods.""" if not isinstance(py_dict["spectral_dimensions"][0], dict): return cls.check_when_arg_is_object(py_dict) default_method = cls.update(**py_dict) default_spectral_dimensions = default_method["spectral_dimensions"] for i, item in enumerate(py_dict["spectral_dimensions"]): if item["events"] == [{}]: item["events"] = default_spectral_dimensions[i]["events"] elif item["events"] != default_spectral_dimensions[i]["events"]: raise ImmutableEventError(cls.__name__) for k, v in default_method.items(): if k not in py_dict: py_dict[k] = v
def check_event_objects_for_compatibility(cls, py, obj, obj_dict): required = ["magnetic_flux_density", "rotor_frequency", "rotor_angle"] py_obj = SpectralDimension(**py) for i, (ev_py, ev_obj) in enumerate(zip(py_obj.events, obj.events)): default_obj = SpectralDimension(events=[{}]).events[0] obj_keys = ev_obj.dict(exclude={"property_units"}).keys() py_keys = py["events"][i].keys() for k in obj_keys: a = False if k in py_keys: a1, a2, a3 = [getattr(_, k) for _ in [ev_obj, default_obj, ev_py]] a = a1 != a2 and a1 != a3 and a2 is not None setattr(ev_obj, k, a3) elif k in required and k in obj_dict: a = getattr(ev_obj, k) != obj_dict[k] setattr(ev_obj, k, obj_dict[k]) if a: raise ImmutableEventError(cls.__name__)
def check_when_arg_is_object(cls, method_dict): default_method = cls.update(**method_dict) default_sp = default_method["spectral_dimensions"] obj_sp = method_dict["spectral_dimensions"] for i, (dflt_dim, obj_dim) in enumerate(zip(default_sp, obj_sp)): if len(dflt_dim["events"]) != len( obj_dim.events) and obj_dim.events != []: raise ImmutableEventError(cls.__name__) if obj_dim.events == []: obj_sp[i] = obj_dim.json(units=False) if "events" not in obj_sp[i]: obj_sp[i]["events"] = dflt_dim["events"] obj_sp[i] = SpectralDimension(**obj_sp[i]) cls.check_event_objects_for_compatibility(dflt_dim, obj_dim, method_dict) for k, v in default_method.items(): if k not in method_dict: method_dict[k] = v
def check_method_compatibility(cls, py_dict): """Check for events attribute inside the spectral_dimensions. Events are not allowed for NamedMethods.""" sp_list = py_dict["spectral_dimensions"] check_SD = [isinstance(sp, SpectralDimension) for sp in sp_list] if all(check_SD): return cls.check_when_arg_is_object(py_dict) default_method = cls.update(**py_dict) default_sp_list = default_method["spectral_dimensions"] for i, item in enumerate(sp_list): # If no events in SpectralDimension, set to default events if "events" not in item or item["events"] == [ {} ] or item["events"] == []: item["events"] = default_sp_list[i]["events"] elif item["events"] != default_sp_list[i]["events"]: raise ImmutableEventError(cls.__name__) for k, v in default_method.items(): if k not in py_dict: py_dict[k] = v