summaryrefslogtreecommitdiffstats
path: root/layman/overlays/overlay.py
diff options
context:
space:
mode:
authorChristian Groschupp <christian@groschupp.org>2009-12-28 01:43:18 +0100
committerChristian Groschupp <christian@groschupp.org>2009-12-28 21:01:57 +0100
commit507e8f4451e53de613228761b9bbf1a5d82f25cb (patch)
tree86613eeb26fe2430ed4bb0a139049eccaac0c126 /layman/overlays/overlay.py
parent63b1dff9da3df8a63708a4ecb5f646af6951ecfd (diff)
downloadlayman-507e8f4451e53de613228761b9bbf1a5d82f25cb.tar.gz
layman-507e8f4451e53de613228761b9bbf1a5d82f25cb.tar.bz2
layman-507e8f4451e53de613228761b9bbf1a5d82f25cb.zip
Migrate XML handling to ElementTree
Diffstat (limited to 'layman/overlays/overlay.py')
-rw-r--r--layman/overlays/overlay.py134
1 files changed, 86 insertions, 48 deletions
diff --git a/layman/overlays/overlay.py b/layman/overlays/overlay.py
index bee7529..f1e38a3 100644
--- a/layman/overlays/overlay.py
+++ b/layman/overlays/overlay.py
@@ -15,6 +15,7 @@
# Author(s):
# Gunnar Wrobel <wrobel@gentoo.org>
# Sebastian Pipping <sebastian@pipping.org>
+# Christian Groschupp <christian@groschupp.org>
#
''' Basic overlay class.'''
@@ -27,8 +28,9 @@ __version__ = "$Id: overlay.py 273 2006-12-30 15:54:50Z wrobel $"
#-------------------------------------------------------------------------------
import sys, types, re, os, os.path, shutil, subprocess
+import elementtree.ElementTree as ET
-from layman.utils import node_to_dict, dict_to_node, path
+from layman.utils import path, ensure_unicode
from layman.debug import OUT
@@ -46,10 +48,9 @@ class Overlay:
def __init__(self, xml, ignore = 0, quiet = False):
'''
>>> here = os.path.dirname(os.path.realpath(__file__))
- >>> document = open(here + '/../tests/testfiles/global-overlays.xml').read()
- >>> import xml.dom.minidom
- >>> document = xml.dom.minidom.parseString(document)
- >>> overlays = document.getElementsByTagName('overlay')
+ >>> import elementtree.ElementTree as ET
+ >>> document = ET.parse(here + '/../tests/testfiles/global-overlays.xml')
+ >>> overlays = document.findall('overlay') + document.findall('repo')
>>> a = Overlay(overlays[0])
>>> a.name
u'wrobel'
@@ -69,32 +70,36 @@ class Overlay:
'''
self.quiet = quiet
- self.data = node_to_dict(xml)
-
- if '<name>1' in self.data.keys():
- self.name = self.data['<name>1']['@'].strip()
- elif '&name' in self.data.keys():
- self.name = self.data['&name']
+ _name = xml.find('name')
+ if _name != None:
+ self.name = ensure_unicode(_name.text)
+ elif 'name' in xml.attrib:
+ self.name = ensure_unicode(xml.attrib['name'])
else:
raise Exception('Overlay is missing a "name" entry!')
- if '<source>1' in self.data.keys():
- self.src = self.data['<source>1']['@'].strip()
- elif '&src' in self.data.keys():
- self.src = self.data['&src']
+ _source = xml.find('source')
+ if _source != None:
+ self.src = ensure_unicode(_source.text.strip())
+ elif 'src' in xml.attrib:
+ self.src = ensure_unicode(xml.attrib['src'])
+ else:
+ raise Exception('Overlay "' + self.name + '" is missing a "source" entry!')
+
+ _owner = xml.find('owner')
+ if _owner == None:
+ _email = None
else:
- raise Exception('Overlay "' + self.name + '" is missing a "source" '
- 'entry!')
-
- if '<owner>1' in self.data.keys() and \
- '<email>1' in self.data['<owner>1']:
- self.owner_email = self.data['<owner>1']['<email>1']['@'].strip()
- if '<name>1' in self.data['<owner>1']:
- self.owner_name = self.data['<owner>1']['<name>1']['@'].strip()
+ _email = _owner.find('email')
+ if _owner != None and _email != None:
+ self.owner_email = ensure_unicode(_email.text.strip())
+ _name = _owner.find('name')
+ if _name != None:
+ self.owner_name = ensure_unicode(_name.text.strip())
else:
self.owner_name = None
- elif '&contact' in self.data.keys():
- self.owner_email = self.data['&contact']
+ elif 'contact' in xml.attrib:
+ self.owner_email = ensure_unicode(xml.attrib['contact'])
self.owner_name = None
else:
self.owner_email = ''
@@ -106,37 +111,73 @@ class Overlay:
OUT.warn('Overlay "' + self.name + '" is missing a '
'"owner.email" entry!', 4)
- if '<description>1' in self.data.keys():
- self.description = self.data['<description>1']['@'].strip()
+
+ _desc = xml.find('description')
+ if _desc != None:
+ self.description = ensure_unicode(_desc.text.strip())
else:
self.description = ''
if not ignore:
raise Exception('Overlay "' + self.name + '" is missing a '
- '"description" entry!')
+ '"description" entry!')
elif ignore == 1:
OUT.warn('Overlay "' + self.name + '" is missing a '
- '"description" entry!', 4)
+ '"description" entry!', 4)
- if '&status' in self.data.keys():
- self.status = self.data['&status']
+ if 'status' in xml.attrib:
+ self.status = ensure_unicode(xml.attrib['status'])
else:
- self.status = ''
+ self.status = None
- if '&priority' in self.data.keys():
- self.priority = int(self.data['&priority'])
+ if 'priority' in xml.attrib:
+ self.priority = int(xml.attrib['priority'])
else:
self.priority = 50
+ h = xml.find('homepage')
+ l = xml.find('link')
+ if h != None:
+ self.homepage = ensure_unicode(h.text.strip())
+ elif l != None:
+ self.homepage = ensure_unicode(l.text.strip())
+ else:
+ self.homepage = None
+
def set_priority(self, priority):
'''Set the priority of this overlay.'''
- self.data['&priority'] = str(priority)
self.priority = int(priority)
- def to_minidom(self, document):
+ def to_minidom(self):
'''Convert to xml.'''
- return dict_to_node(self.data, document, 'overlay')
+ repo = ET.Element('repo')
+ if self.status != None:
+ repo.attrib['status'] = self.status
+ repo.attrib['priority'] = str(self.priority)
+ name = ET.Element('name')
+ name.text = self.name
+ repo.append(name)
+ desc = ET.Element('description')
+ desc.text = self.description
+ repo.append(desc)
+ if self.homepage != None:
+ homepage = ET.Element('homepage')
+ homepage.text = self.homepage
+ repo.append(homepage)
+ owner = ET.Element('owner')
+ repo.append(owner)
+ owner_email = ET.Element('email')
+ owner_email.text = self.owner_email
+ owner.append(owner_email)
+ if self.owner_name != None:
+ owner_name = ET.Element('name')
+ owner_name.text = self.owner_name
+ owner.append(owner_name)
+ source = ET.Element('source', type=self.__class__.type_key)
+ source.text = self.src
+ repo.append(source)
+ return repo
def add(self, base, quiet = False):
'''Add the overlay.'''
@@ -186,10 +227,9 @@ class Overlay:
def __str__(self):
'''
>>> here = os.path.dirname(os.path.realpath(__file__))
- >>> document = open(here + '/../tests/testfiles/global-overlays.xml').read()
- >>> import xml.dom.minidom
- >>> document = xml.dom.minidom.parseString(document)
- >>> overlays = document.getElementsByTagName('overlay')
+ >>> import elementtree.ElementTree as ET
+ >>> document = ET.parse(here + '/../tests/testfiles/global-overlays.xml')
+ >>> overlays = document.findall('overlay') + document.findall('repo')
>>> a = Overlay(overlays[0])
>>> print str(a)
wrobel
@@ -222,24 +262,22 @@ class Overlay:
result += u'\n '.join((u'\n' + description).split(u'\n'))
result += u'\n'
- for key in (e for e in ('<homepage>1', '<link>1') if e in self.data.keys()):
- link = self.data[key]['@'].strip()
+ if self.homepage != None:
+ link = self.homepage
link = re.compile(u' +').sub(u' ', link)
link = re.compile(u'\n ').sub(u'\n', link)
result += u'\nLink:\n'
result += u'\n '.join((u'\n' + link).split(u'\n'))
result += u'\n'
- break
return result
def short_list(self, width = 0):
'''
>>> here = os.path.dirname(os.path.realpath(__file__))
- >>> document = open(here + '/../tests/testfiles/global-overlays.xml').read()
- >>> import xml.dom.minidom
- >>> document = xml.dom.minidom.parseString(document)
- >>> overlays = document.getElementsByTagName('overlay')
+ >>> import elementtree.ElementTree as ET
+ >>> document = ET.parse(here + '/../tests/testfiles/global-overlays.xml')
+ >>> overlays = document.findall('repo') + document.findall('overlay')
>>> a = Overlay(overlays[0])
>>> print a.short_list(80)
wrobel [None ] (https://o.g.o/svn/dev/wrobel )