+"""Handle XML data with Python objects"""
+
import re
import xml.sax.handler
import os
non_id_char = re.compile('[^_0-9a-zA-Z]')
def _name_mangle(name):
+ """Split name though regular expressions"""
return non_id_char.sub('_', name)
class DataNode(object):
+ """A custom class used to wrap XML attributes and child elements"""
def __init__(self):
self._attrs = {} # XML attributes and child elements
self.data = None # child text data
def __len__(self):
# treat single element as a list of 1
return 1
+ def __setitem__(self, key, value):
+ self._attrs[key] = value
def __getitem__(self, key):
if isinstance(key, basestring):
- return self._attrs.get(key,None)
+ return self._attrs.get(key, None)
else:
return [self][key]
+ def __delitem__(self, key):
+ self._attrs.pop(key)
def __contains__(self, name):
- return self._attrs.has_key(name)
+ return name in self._attrs
def __nonzero__(self):
return bool(self._attrs or self.data)
def __getattr__(self, name):
if name.startswith('__'):
# need to do this for Python special methods???
raise AttributeError(name)
- return self._attrs.get(name,None)
+ return self._attrs.get(name, None)
def _add_xml_attr(self, name, value):
+ """Add XML attribute"""
if name in self._attrs:
# multiple attribute of the same name are represented by a list
children = self._attrs[name]
items = sorted(self._attrs.items())
if self.data:
items.append(('data', self.data))
- return u'{%s}' % ', '.join([u'%s:%s' % (k,repr(v)) for k,v in items])
+ return u'{%s}' % ', '.join([u'%s:%s' % (k, repr(v)) for k, v in items])
class TreeBuilder(xml.sax.handler.ContentHandler):
+ """A wrapper class of ContentHandler"""
def __init__(self):
+ xml.sax.handler.ContentHandler.__init__(self)
self.stack = []
self.root = DataNode()
self.current = self.root
self.text_parts = []
+ # pylint: disable-msg=C0103
def startElement(self, name, attrs):
self.stack.append((self.current, self.text_parts))
self.current = DataNode()
obj = text or ''
self.current, self.text_parts = self.stack.pop()
self.current._add_xml_attr(_name_mangle(name), obj)
+ # pylint: enable-msg=C0103
def characters(self, content):
self.text_parts.append(content)
builder = TreeBuilder()
- if isinstance(src,basestring):
+ if isinstance(src, basestring):
xml.sax.parseString(src, builder)
else:
xml.sax.parse(src, builder)
class Mapping():
- """ class to handle mapping xml file """
+ """A class to handle mapping xml file """
def __init__(self, mapping_file):
""" convert xml to git obj """
if not os.path.isfile(mapping_file):
- raise Exception, "Fatal: %s is not a regular file" %(mapping_file)
+ raise Exception, "Fatal: %s is not a regular file" % mapping_file
- with open(mapping_file) as fh:
- self.mapping_obj = xml2obj(''.join(fh.readlines()))
+ with open(mapping_file) as filei:
+ self.mapping_obj = xml2obj(''.join(filei.readlines()))
if not self.mapping_obj:
raise Exception, "Fatal: parser xml file %s failed"
- def __encode_to_ascii(self, source):
+ @staticmethod
+ def __encode_to_ascii(source):
""" encode unicode list element to ascii """
dest = []
for i in source:
# <project name="public/tools/ext4-utils" submission="N"/>
return None
elif branch:
- # <project name="public/pkgs/s/shadow-utils">
- # <branch name="master" submission="N"/>
- # or <branch name="master" OBS_project="Base" OBS_staging_project="Base:build"/>
- # </project>
for brch in obj.branch:
# Search the match branch
if brch.name == branch:
if brch.submission == 'N':
return None
else:
- mapping.append(self.__encode_to_ascii([brch.OBS_project,
- brch.OBS_staging_project,
- brch.OBS_package]))
+ mapping.append(self.__encode_to_ascii(\
+ [brch.OBS_project,
+ brch.OBS_staging_project,
+ brch.OBS_package]))
else:
for brch in obj.branch:
if brch.submission == 'N':
continue
else:
- mapping.append(self.__encode_to_ascii([brch.OBS_project,
- brch.OBS_staging_project,
- brch.OBS_package]))
+ mapping.append(self.__encode_to_ascii(\
+ [brch.OBS_project,
+ brch.OBS_staging_project,
+ brch.OBS_package]))
return mapping
def get_submit_mapping(self, project, branch = None):
- # Search in project list first
+ """Get submit mapping though project or branch"""
for prj in self.mapping_obj.project:
if prj.name == project or prj.name == '/' + project:
- # <project name="public/pkgs/s/shadow-utils">
- # <branch name="master" submission="N"/>
- # or <branch name="master" OBS_project="Base" OBS_staging_project="Base:build"/>
- # </project>
- mapping = self.__get_mapping(prj, branch)
- if mapping == None:
- # submission is blocked, return empty list
- return []
- elif mapping:
- # retrun if already found matched OBS target project
- return mapping
+ # submission is blocked, return empty list, otherwise
+ # return matched OBS target project
+ return self.__get_mapping(prj, branch) or []
# Search in path list
prj_path = project
# parent directory of project/directory
prj_path = os.path.dirname(os.path.join('/', prj_path))
- # Match with default '/', of no branch match, return NULL
- # <path name="/">
- # <branch name="master" OBS_project="Main" OBS_staging_project="Main:build"/>
- # <branch name="2.0_beta" OBS_project="Main:2.0" OBS_staging_project="Main:2.0:build"/>
- # </path>
if prj_path == '/':
for path in self.mapping_obj.default.path:
if path.name == '/':
- mapping = self.__get_mapping(path, branch)
- if not mapping:
- # does not map to any obs project, return empty list
- return []
- else:
- # retrun if already found matched OBS target project
- return mapping
+ return self.__get_mapping(path, branch) or []
# No branch match, return NULL
return []
# <path name="/apps/">
# <branch name="master" submission="N"/>
# </path>
- mapping = self.__get_mapping(path, branch)
- if mapping == None:
- # submission is blocked, return empty list
- return []
- elif mapping:
- # retrun if already found matched OBS target project
- return mapping
+ return self.__get_mapping(path, branch) or []
def get_integration_mapping(self, project, branch):
+ """Get integration mapping of project and branch"""
# Search in project list
for prj in self.mapping_obj.integration_testing.project:
if prj.name == project:
if prj.branch:
for brch in prj.branch:
if brch.name == branch:
- # temporary project default is ${brch.OBS_project}:review
+ # temporary project default is
+ # ${brch.OBS_project}:review
if brch.Temp_project:
temp_project = brch.Temp_project
else:
- temp_project = "%s:review" %(brch.OBS_project)
+ temp_project = "%s:review" % brch.OBS_project
if brch.OBS_package and brch.OBS_project:
return [ brch.OBS_project,
- "%s:%s" %(temp_project, brch.OBS_package)]
+ "%s:%s" % (temp_project, \
+ brch.OBS_package)]
elif brch.OBS_project:
return [ brch.OBS_project,
- "%s:%s" %(temp_project, os.path.basename(project))]
+ "%s:%s" % (temp_project, \
+ os.path.basename(project))]
# No branch match in project define, search default
prj_path = project
while True:
if brch.Temp_project:
temp_project = brch.Temp_project
else:
- temp_project = "%s:review" %(brch.OBS_project)
+ temp_project = "%s:review" % brch.OBS_project
return [brch.OBS_project,
- "%s:%s" %(temp_project, os.path.basename(project))]
+ "%s:%s" % (temp_project, \
+ os.path.basename(project))]
return []
return []
return []