import sys from lxml import etree from collections import namedtuple RepoFlag = namedtuple('RepoFlag', 'flag status repository arch') valid_flag_types = ('build', 'publish', 'useforbuild', 'debuginfo') if sys.version_info >= (3, 0): unicode = str class RepoFlags(): def __init__(self, xml): self.root = None if isinstance(xml, (str, unicode, bytes)): try: self.import_xml(xml) except Exception: raise Exception('Failed to import xml') elif isinstance(xml, etree._Element): self.root = xml def __str__(self): lines = [] for flag_type in self.flag_types: lines.append('{}:'.format(flag_type)) for flag in self.get_flag(flag_type): line = '' for attribute in [flag.status, flag.repository, flag.arch]: if attribute is not None: line = ' '.join([line, attribute]) lines.append(line) return '\n'.join(lines) def import_xml(self, xml): try: self.root = etree.fromstring(xml) except Exception as e: raise e @property def flags(self): for element in self.root: for sub in element: if sub.tag in ['enable', 'disable']: flag = element.tag status = sub.tag repo = sub.get('repository', None) arch = sub.get('arch', None) yield(RepoFlag(flag=flag, status=status, repository=repo, arch=arch)) def get_flag(self, flag_type): return [f for f in self.flags if f.flag == flag_type] @property def flag_types(self): return set([f.flag for f in self.flags])