Revision: 4579
Author: janne.t.harkonen
Date: Wed Feb 2 01:28:44 2011
Log: Merge branch 'issue501/xmloptimizing'
http://code.google.com/p/robotframework/source/detail?r=4579
Modified:
/trunk/src/robot/output/readers.py
/trunk/utest/output/test_readers.py
=======================================
--- /trunk/src/robot/output/readers.py Tue Dec 28 05:54:00 2010
+++ /trunk/src/robot/output/readers.py Wed Feb 2 01:28:44 2011
@@ -46,7 +46,7 @@
raise DataError("Output file '%s' does not exist." % path)
LOGGER.info("Processing output file '%s'." % path)
try:
- root = utils.DomWrapper(path)
+ root = utils.etreewrapper.get_root(path)
except:
err = utils.get_error_message()
raise DataError("Opening XML file '%s' failed: %s" % (path, err))
@@ -55,54 +55,51 @@
return TestSuite(suite, read_level, log_level=log_level),
ExecutionErrors(errors)
def _get_suite_node(root, path):
- if root.name != 'robot':
+ if root.tag != 'robot':
raise DataError("File '%s' is not Robot Framework output file." %
path)
- node = root.get_node('suite')
- node.generator =
root.get_attr('generator', 'notset').split()[0].lower()
+ node = root.find('suite')
+ node.set('generator',
root.get('generator', 'notset').split()[0].lower())
+ node.set('path', path)
return node
def _get_errors_node(root):
- try:
- try:
- return root.get_node('errors')
- except AttributeError:
- return root.get_node('syslog') # Compatibility for RF 2.0.x
outputs
- except AttributeError:
- return None
+ return root.find('errors')
class _MissingStatus:
"""If XML was fixed for example by fixml.py, status tag may be
missing"""
text = 'Could not find status.'
- get_attr = lambda self, name, default: name == 'status' and 'FAIL'
or 'N/A'
+ get = lambda self, name, default: name == 'status' and 'FAIL' or 'N/A'
class _BaseReader:
def __init__(self, node):
- try:
- self.doc = node.get_node('doc').text
- except AttributeError:
- self.doc = ''
- try:
- status = node.get_node('status')
- except AttributeError:
- status = _MissingStatus()
- self.status = status.get_attr('status','').upper()
+ self.doc = self._get_doc(node)
+ stnode = node.find('status')
+ if stnode is None:
+ stnode = _MissingStatus()
+ self.status = stnode.get('status','').upper()
if self.status not in ['PASS','FAIL', 'NOT_RUN']:
raise DataError("Item '%s' has invalid status '%s'"
- % (self.name, status))
- self.message = status.text
- self.starttime = status.get_attr('starttime', 'N/A')
- self.endtime = status.get_attr('endtime', 'N/A')
+ % (self.name, self.status))
+ self.message = stnode.text or ''
+ self.starttime = stnode.get('starttime', 'N/A')
+ self.endtime = stnode.get('endtime', 'N/A')
self.elapsedtime = utils.get_elapsed_time(self.starttime,
self.endtime)
+ def _get_doc(self, node):
+ docnode = node.find('doc')
+ if docnode is not None:
+ return docnode.text or ''
+ return ''
+
class _TestAndSuiteReader(_BaseReader):
def __init__(self, node, log_level=None):
_BaseReader.__init__(self, node)
- self.keywords = [Keyword(kw, log_level) for kw in
node.get_nodes('kw')]
+ self.keywords = [Keyword(kw, log_level) for kw in
node.findall('kw')]
if self.keywords and self.keywords[0].type == 'setup':
self.setup = self.keywords.pop(0)
if self.keywords and self.keywords[-1].type == 'teardown':
@@ -114,19 +111,19 @@
def __init__(self, node, log_level=None):
_TestAndSuiteReader.__init__(self, node, log_level)
del(self.keywords)
- for metanode in node.get_nodes('metadata/item'):
- self.metadata[metanode.get_attr('name')] = metanode.text
+ for metanode in node.findall('metadata/item'):
+ self.metadata[metanode.get('name')] = metanode.text
def _get_texts(self, node, path):
- return [item.text for item in node.get_nodes(path)]
+ return [item.text for item in node.findall(path)]
class _TestReader(_TestAndSuiteReader):
def __init__(self, node, log_level=None):
_TestAndSuiteReader.__init__(self, node, log_level)
- self.tags = [tag.text for tag in node.get_nodes('tags/tag')]
- self.timeout = node.get_attr('timeout', '')
+ self.tags = [tag.text for tag in node.findall('tags/tag')]
+ self.timeout = node.get('timeout', '')
class _KeywordReader(_BaseReader):
@@ -134,19 +131,19 @@
def __init__(self, node, log_level=None):
_BaseReader.__init__(self, node)
del(self.message)
- self.args = [arg.text for arg in node.get_nodes('arguments/arg')]
- self.type = node.get_attr('type', 'kw')
- self.timeout = node.get_attr('timeout', '')
+ self.args = [(arg.text or '') for arg in
node.findall('arguments/arg')]
+ self.type = node.get('type', 'kw')
+ self.timeout = node.get('timeout', '')
self.keywords = []
self.messages = []
self.children = []
log_filter = IsLogged(log_level or 'TRACE')
- for child in node.children:
- if child.name == 'kw':
+ for child in node:
+ if child.tag == 'kw':
kw = Keyword(child, log_level)
self.keywords.append(kw)
self.children.append(kw)
- elif child.name == 'msg' and
log_filter(child.get_attr('level', 'INFO')):
+ elif child.tag == 'msg' and
log_filter(child.get('level', 'INFO')):
msg = MessageFromXml(child)
self.messages.append(msg)
self.children.append(msg)
@@ -156,29 +153,30 @@
def __init__(self, node, read_level=-1, level=1, parent=None,
log_level=None):
node = self._get_node(node, read_level, level)
- BaseTestSuite.__init__(self, node.attrs.get('name'),
- node.attrs.get('source', None), parent)
+ BaseTestSuite.__init__(self, node.get('name'),
+ node.get('source', None), parent)
_SuiteReader.__init__(self, node, log_level=log_level)
- for snode in node.get_nodes('suite'):
- snode.generator = node.generator
+ for snode in node.findall('suite'):
+ snode.set('generator', node.get('generator'))
+ snode.set('path', node.get('path'))
TestSuite(snode, read_level, level+1, parent=self,
log_level=log_level)
- for tnode in node.get_nodes('test'):
+ for tnode in node.findall('test'):
TestCase(tnode, parent=self, log_level=log_level)
self.set_status()
- if node.generator == 'robot' and \
+ if node.get('generator') == 'robot' and \
self.teardown is not None and self.teardown.status
== 'FAIL':
self.suite_teardown_failed()
def _get_node(self, orignode, read_level, level):
if read_level > 0 and level > read_level:
return orignode
- try:
- src = orignode.get_attr('src')
- except AttributeError:
+ src = orignode.get('src')
+ if src is None:
return orignode
- path = os.path.join(os.path.dirname(orignode.source), src)
- node = utils.DomWrapper(path).get_node('suite')
- node.generator = orignode.generator
+ path = os.path.join(os.path.dirname(orignode.get('path')), src)
+ node = utils.etreewrapper.get_root(path).find('suite')
+ node.set('generator', orignode.get('generator'))
+ node.set('path', path)
return node
def set_status(self):
@@ -251,7 +249,7 @@
class TestCase(BaseTestCase, _TestReader):
def __init__(self, node, parent, log_level=None):
- BaseTestCase.__init__(self, node.get_attr('name'), parent)
+ BaseTestCase.__init__(self, node.get('name'), parent)
_TestReader.__init__(self, node, log_level=log_level)
self.set_criticality(parent.critical)
@@ -266,7 +264,7 @@
def __init__(self, node, log_level=None):
self._init_data()
- BaseKeyword.__init__(self, node.get_attr('name'))
+ BaseKeyword.__init__(self, node.get('name'))
_KeywordReader.__init__(self, node, log_level)
def _init_data(self):
@@ -294,10 +292,10 @@
def __init__(self, node):
Message.__init__(self, node.text,
- level=node.get_attr('level', 'INFO'),
- html=node.get_attr('html', 'no') == 'yes',
- timestamp=node.get_attr('timestamp', 'N/A'),
- linkable=node.get_attr('linkable', 'no') == 'yes')
+ level=node.get('level', 'INFO'),
+ html=node.get('html', 'no') == 'yes',
+ timestamp=node.get('timestamp', 'N/A'),
+ linkable=node.get('linkable', 'no') == 'yes')
def serialize(self, serializer):
serializer.message(self)
@@ -317,7 +315,7 @@
if node is None:
self.messages = []
else:
- self.messages = [MessageFromXml(msg) for msg in
node.get_nodes('msg')]
+ self.messages = [MessageFromXml(msg) for msg in
node.findall('msg')]
def serialize(self, serializer):
serializer.start_errors(self)
=======================================
--- /trunk/utest/output/test_readers.py Fri Feb 19 02:20:00 2010
+++ /trunk/utest/output/test_readers.py Wed Feb 2 01:28:44 2011
@@ -1,7 +1,7 @@
import unittest
from robot.output.readers import _BaseReader
-from robot.utils import DomWrapper
+from robot.utils import etreewrapper
from robot.utils.asserts import assert_equals
@@ -13,7 +13,7 @@
class TestBaseReader(unittest.TestCase):
def test_missing_status_tag(self):
- reader = _BaseReader(DomWrapper(string=data))
+ reader = _BaseReader(etreewrapper.get_root(path='', string=data))
assert_equals(reader.status, 'FAIL')
assert_equals(reader.starttime, 'N/A')
assert_equals(reader.endtime, 'N/A')