def parse(cls, string: str) -> Lipid: """ Parse a string represntation of a lipid and create Lipid class. :param string: The input string. :return: An instance of Lipid """ # TODO refactor, too much code repeated in the two if blocks # identify abbreviation type if '(' in string and ')' in string: string = string.strip() if not string.endswith(')'): raise TypeError(f"Cannot parse abbreviation {string}") lipid_class_name = string.split('(', 1)[0] # second part of split at first ( is residue string, add leading ( again! residue_string = '(' + string.split('(', 1)[1] lipidclass = LipidClass.parse(lipid_class_name) residuelist = ResidueList.parse(residue_string) lipid = cls(lipidclass, residuelist) lipid._input = string return lipid # CE 22:4;0 elif ' ' in string: lipid_class_name, residue_string = string.split(' ', 1) lipidclass = LipidClass.parse(lipid_class_name) residuelist = ResidueList.parse(residue_string) lipid = cls(lipidclass, residuelist) lipid._input = string return lipid else: lipid = Lipid(LipidClass(string)) lipid._input = string return lipid
def test_residuelist_parse(): test_string = '18:1;0_19:1;0' residuelist = ResidueList.parse(test_string) assert len(residuelist) == 2 assert residuelist[0].carbon_atoms == 18 assert residuelist[0].double_bonds == 1 assert residuelist[0].oxidation == 0 assert residuelist[1].carbon_atoms == 19 assert residuelist[1].double_bonds == 1 assert residuelist[1].oxidation == 0 test_string = '18:1_19:1' residuelist = ResidueList.parse(test_string) assert len(residuelist) == 2 assert residuelist[0].carbon_atoms == 18 assert residuelist[0].double_bonds == 1 assert residuelist[0].oxidation == None assert residuelist[1].carbon_atoms == 19 assert residuelist[1].double_bonds == 1 assert residuelist[1].oxidation == None test_string = 'O-16:0;0/18:1;0' residuelist = ResidueList.parse(test_string) assert len(residuelist) == 2 assert residuelist[0].carbon_atoms == 16 assert residuelist[0].double_bonds == 0 assert residuelist[0].oxidation == 0 assert residuelist[0].modification.name == 'O-' assert residuelist[1].carbon_atoms == 18 assert residuelist[1].double_bonds == 1 assert residuelist[1].oxidation == 0