def parse_error(name): """ Instanciate a subtype of :class:`BaseError`, depending on the format of ``name``. We currently understand the following formats:: x -> InitTwiss Δax_b3mu1 -> ElemAttr δax_b3mu1 -> ScaleAttr Δg3mu1->angle -> Param δg3mu1->angle -> ScaleParam g3mu1<dx> -> Ealign """ mult = name.startswith('δ') name = name.lstrip('δΔ \t') if name in ('x', 'y', 'px', 'py'): return InitTwiss(name) if '->' in name: elem, attr = name.split('->') if mult: return ScaleAttr(elem, attr) return ElemAttr(elem, attr) if '<' in name: elem, attr = re.match(r'(.*)\<(.*)\>', name).groups() return Ealign({'range': elem}, attr) if is_identifier(name): if mult: return ScaleParam(name) return Param(name) # TODO: efcomp field errors! raise ValueError("{!r} is not a valid error specification!".format(name))
def _get_property_lval(elem, attr): """ Return lvalue name for a given element attribute from MAD-X. >>> get_element_attribute(elements['r1qs1'], 'k1') 'r1qs1->k1' """ expr = elem[attr] if isinstance(expr, list): names = [_get_identifier(v) for v in expr] if not any(names): raise api.UnknownElement return names else: name = _get_identifier(expr) if is_identifier(name): return name return elem['name'] + '->' + attr
def test_is_identifier(self): self.assertTrue(util.is_identifier('hdr23_oei')) self.assertTrue(util.is_identifier('_hdr23_oei')) self.assertFalse(util.is_identifier('2_hdr23_oei')) self.assertFalse(util.is_identifier('hdr oei')) self.assertFalse(util.is_identifier('hdr@oei'))
def test_is_identifier(): assert util.is_identifier('hdr23_oei') assert util.is_identifier('_hdr23_oei') assert not util.is_identifier('2_hdr23_oei') assert not util.is_identifier('hdr oei') assert not util.is_identifier('hdr@oei')