3 new revisions:
Revision: aba4fefe62a5
Author: Pekka Klärck
Date: Thu Dec 1 12:51:44 2011
Log: XML reading: renamed Element -> Handler to separate actual XML
element...
http://code.google.com/p/robotframework/source/detail?r=aba4fefe62a5
Revision: c409df813e76
Author: Pekka Klärck
Date: Thu Dec 1 13:10:10 2011
Log: XML reading: Initialize handlers only once. This may save a
little mem...
http://code.google.com/p/robotframework/source/detail?r=c409df813e76
Revision: 059e1db89abb
Author: Pekka Klärck
Date: Thu Dec 1 13:24:48 2011
Log: cleanup
http://code.google.com/p/robotframework/source/detail?r=059e1db89abb
==============================================================================
Revision: aba4fefe62a5
Author: Pekka Klärck
Date: Thu Dec 1 12:51:44 2011
Log: XML reading: renamed Element -> Handler to separate actual XML
elements emitted by ET from classes processing them.
http://code.google.com/p/robotframework/source/detail?r=aba4fefe62a5
Modified:
/src/robot/result/executionresult.py
/src/robot/result/xmlelementhandlers.py
=======================================
--- /src/robot/result/executionresult.py Thu Dec 1 12:48:02 2011
+++ /src/robot/result/executionresult.py Thu Dec 1 12:51:44 2011
@@ -22,7 +22,7 @@
from .configurer import SuiteConfigurer
from .suiteteardownfailed import SuiteTeardownFailureHandler
from .testsuite import TestSuite
-from .xmlelementhandlers import ElementStack
+from .xmlelementhandlers import XmlHandler
def ResultFromXml(*sources):
@@ -45,10 +45,10 @@
if isinstance(source, XmlSource) else XmlSource(source)
def build(self, result):
- elements = ElementStack(result)
+ handler = XmlHandler(result)
with self._source as source:
for action, elem in ET.iterparse(source,
events=('start', 'end')):
- getattr(elements, action)(elem)
+ getattr(handler, action)(elem)
SuiteTeardownFailureHandler(result.generator).visit_suite(result.suite)
return result
=======================================
--- /src/robot/result/xmlelementhandlers.py Thu Dec 1 12:48:02 2011
+++ /src/robot/result/xmlelementhandlers.py Thu Dec 1 12:51:44 2011
@@ -15,30 +15,30 @@
from robot.errors import DataError
-class ElementStack(object):
-
- def __init__(self, result, root_element=None):
+class XmlHandler(object):
+
+ def __init__(self, result, root_handler=None):
self._results = [result]
- self._elements = [root_element or RootElement()]
+ self._handlers = [root_handler or RootHandler()]
@property
def _result(self):
return self._results[-1]
@property
- def _element(self):
- return self._elements[-1]
+ def _handler(self):
+ return self._handlers[-1]
def start(self, elem):
- self._elements.append(self._element.child_element(elem.tag))
- self._results.append(self._element.start(elem, self._result))
+ self._handlers.append(self._handler.child_handler(elem.tag))
+ self._results.append(self._handler.start(elem, self._result))
def end(self, elem):
- self._elements.pop().end(elem, self._results.pop())
+ self._handlers.pop().end(elem, self._results.pop())
elem.clear()
-class _Element(object):
+class _Handler(object):
tag = ''
def start(self, elem, result):
@@ -47,24 +47,24 @@
def end(self, elem, result):
pass
- def child_element(self, tag):
+ def child_handler(self, tag):
# TODO: replace _children() list with dict
for child_type in self._children():
if child_type.tag == tag:
return child_type()
- raise DataError("Incompatible XML element '%s'" % tag)
+ raise DataError("Incompatible XML handler '%s'" % tag)
def _children(self):
return []
-class RootElement(_Element):
+class RootHandler(_Handler):
def _children(self):
- return [RobotElement]
+ return [RobotHandler]
-class RobotElement(_Element):
+class RobotHandler(_Handler):
tag = 'robot'
def start(self, elem, result):
@@ -72,10 +72,10 @@
return result
def _children(self):
- return [RootSuiteElement, StatisticsElement, ErrorsElement]
+ return [RootSuiteHandler, StatisticsHandler, ErrorsHandler]
-class SuiteElement(_Element):
+class SuiteHandler(_Handler):
tag = 'suite'
def start(self, elem, result):
@@ -83,11 +83,11 @@
source=elem.get('source'))
def _children(self):
- return [SuiteElement, DocElement, SuiteStatusElement,
- KeywordElement, TestCaseElement, MetadataElement]
+ return [SuiteHandler, DocHandler, SuiteStatusHandler,
+ KeywordHandler, TestCaseHandler, MetadataHandler]
-class RootSuiteElement(SuiteElement):
+class RootSuiteHandler(SuiteHandler):
def start(self, elem, result):
result.suite.name = elem.get('name')
@@ -95,7 +95,7 @@
return result.suite
-class TestCaseElement(_Element):
+class TestCaseHandler(_Handler):
tag = 'test'
def start(self, elem, result):
@@ -103,10 +103,10 @@
timeout=elem.get('timeout'))
def _children(self):
- return [KeywordElement, TagsElement, DocElement, TestStatusElement]
+ return [KeywordHandler, TagsHandler, DocHandler, TestStatusHandler]
-class KeywordElement(_Element):
+class KeywordHandler(_Handler):
tag = 'kw'
def start(self, elem, result):
@@ -115,11 +115,11 @@
type=elem.get('type'))
def _children(self):
- return [DocElement, ArgumentsElement, KeywordElement,
MessageElement,
- KeywordStatusElement]
+ return [DocHandler, ArgumentsHandler, KeywordHandler,
MessageHandler,
+ KeywordStatusHandler]
-class MessageElement(_Element):
+class MessageHandler(_Handler):
tag = 'msg'
def end(self, elem, result):
@@ -129,7 +129,7 @@
html, elem.get('timestamp'), linkable)
-class _StatusElement(_Element):
+class _StatusHandler(_Handler):
tag = 'status'
def _set_status(self, elem, result):
@@ -143,21 +143,21 @@
result.endtime = elem.get('endtime', 'N/A')
-class KeywordStatusElement(_StatusElement):
+class KeywordStatusHandler(_StatusHandler):
def end(self, elem, result):
self._set_status(elem, result)
self._set_times(elem, result)
-class SuiteStatusElement(_StatusElement):
+class SuiteStatusHandler(_StatusHandler):
def end(self, elem, result):
self._set_message(elem, result)
self._set_times(elem, result)
-class TestStatusElement(_StatusElement):
+class TestStatusHandler(_StatusHandler):
def end(self, elem, result):
self._set_status(elem, result)
@@ -165,70 +165,70 @@
self._set_times(elem, result)
-class DocElement(_Element):
+class DocHandler(_Handler):
tag = 'doc'
def end(self, elem, result):
result.doc = elem.text or ''
-class MetadataElement(_Element):
+class MetadataHandler(_Handler):
tag = 'metadata'
def _children(self):
- return [MetadataItemElement]
+ return [MetadataItemHandler]
-class MetadataItemElement(_Element):
+class MetadataItemHandler(_Handler):
tag = 'item'
def _children(self):
- return [MetadataItemElement]
+ return [MetadataItemHandler]
def end(self, elem, result):
result.metadata[elem.get('name')] = elem.text or ''
-class TagsElement(_Element):
+class TagsHandler(_Handler):
tag = 'tags'
def _children(self):
- return [TagElement]
+ return [TagHandler]
-class TagElement(_Element):
+class TagHandler(_Handler):
tag = 'tag'
def end(self, elem, result):
result.tags.add(elem.text or '')
-class ArgumentsElement(_Element):
+class ArgumentsHandler(_Handler):
tag = 'arguments'
def _children(self):
- return [ArgumentElement]
+ return [ArgumentHandler]
-class ArgumentElement(_Element):
+class ArgumentHandler(_Handler):
tag = 'arg'
def end(self, elem, result):
result.args.append(elem.text or '')
-class ErrorsElement(_Element):
+class ErrorsHandler(_Handler):
tag = 'errors'
def start(self, elem, result):
return result.errors
def _children(self):
- return [MessageElement]
+ return [MessageHandler]
-class StatisticsElement(_Element):
+class StatisticsHandler(_Handler):
tag = 'statistics'
- def child_element(self, tag):
+ def child_handler(self, tag):
return self
==============================================================================
Revision: c409df813e76
Author: Pekka Klärck
Date: Thu Dec 1 13:10:10 2011
Log: XML reading: Initialize handlers only once. This may save a
little memory and time but also allow further refactoring.
http://code.google.com/p/robotframework/source/detail?r=c409df813e76
Modified:
/src/robot/result/xmlelementhandlers.py
=======================================
--- /src/robot/result/xmlelementhandlers.py Thu Dec 1 12:51:44 2011
+++ /src/robot/result/xmlelementhandlers.py Thu Dec 1 13:10:10 2011
@@ -41,6 +41,16 @@
class _Handler(object):
tag = ''
+ def __init__(self):
+ self._children = dict((c.tag, c) for c in self._child_handlers())
+
+ def _child_handlers(self):
+ for child_class in self._child_classes():
+ yield child_class() if type(self) is not child_class else self
+
+ def _child_classes(self):
+ return []
+
def start(self, elem, result):
return result
@@ -48,19 +58,15 @@
pass
def child_handler(self, tag):
- # TODO: replace _children() list with dict
- for child_type in self._children():
- if child_type.tag == tag:
- return child_type()
- raise DataError("Incompatible XML handler '%s'" % tag)
-
- def _children(self):
- return []
+ try:
+ return self._children[tag]
+ except KeyError:
+ raise DataError("Incompatible XML handler '%s'" % tag)
class RootHandler(_Handler):
- def _children(self):
+ def _child_classes(self):
return [RobotHandler]
@@ -71,7 +77,7 @@
result.generator =
elem.get('generator', 'unknown').split()[0].upper()
return result
- def _children(self):
+ def _child_classes(self):
return [RootSuiteHandler, StatisticsHandler, ErrorsHandler]
@@ -82,7 +88,7 @@
return result.suites.create(name=elem.get('name'),
source=elem.get('source'))
- def _children(self):
+ def _child_classes(self):
return [SuiteHandler, DocHandler, SuiteStatusHandler,
KeywordHandler, TestCaseHandler, MetadataHandler]
@@ -102,7 +108,7 @@
return result.tests.create(name=elem.get('name'),
timeout=elem.get('timeout'))
- def _children(self):
+ def _child_classes(self):
return [KeywordHandler, TagsHandler, DocHandler, TestStatusHandler]
@@ -114,7 +120,7 @@
timeout=elem.get('timeout'),
type=elem.get('type'))
- def _children(self):
+ def _child_classes(self):
return [DocHandler, ArgumentsHandler, KeywordHandler,
MessageHandler,
KeywordStatusHandler]
@@ -175,14 +181,14 @@
class MetadataHandler(_Handler):
tag = 'metadata'
- def _children(self):
+ def _child_classes(self):
return [MetadataItemHandler]
class MetadataItemHandler(_Handler):
tag = 'item'
- def _children(self):
+ def _child_classes(self):
return [MetadataItemHandler]
def end(self, elem, result):
@@ -192,7 +198,7 @@
class TagsHandler(_Handler):
tag = 'tags'
- def _children(self):
+ def _child_classes(self):
return [TagHandler]
@@ -206,7 +212,7 @@
class ArgumentsHandler(_Handler):
tag = 'arguments'
- def _children(self):
+ def _child_classes(self):
return [ArgumentHandler]
@@ -223,7 +229,7 @@
def start(self, elem, result):
return result.errors
- def _children(self):
+ def _child_classes(self):
return [MessageHandler]
==============================================================================
Revision: 059e1db89abb
Author: Pekka Klärck
Date: Thu Dec 1 13:24:48 2011
Log: cleanup
http://code.google.com/p/robotframework/source/detail?r=059e1db89abb
Modified:
/src/robot/result/executionresult.py
/src/robot/result/xmlelementhandlers.py
=======================================
--- /src/robot/result/executionresult.py Thu Dec 1 12:51:44 2011
+++ /src/robot/result/executionresult.py Thu Dec 1 13:24:48 2011
@@ -22,7 +22,7 @@
from .configurer import SuiteConfigurer
from .suiteteardownfailed import SuiteTeardownFailureHandler
from .testsuite import TestSuite
-from .xmlelementhandlers import XmlHandler
+from .xmlelementhandlers import XmlElementHandler
def ResultFromXml(*sources):
@@ -45,7 +45,7 @@
if isinstance(source, XmlSource) else XmlSource(source)
def build(self, result):
- handler = XmlHandler(result)
+ handler = XmlElementHandler(result)
with self._source as source:
for action, elem in ET.iterparse(source,
events=('start', 'end')):
getattr(handler, action)(elem)
=======================================
--- /src/robot/result/xmlelementhandlers.py Thu Dec 1 13:10:10 2011
+++ /src/robot/result/xmlelementhandlers.py Thu Dec 1 13:24:48 2011
@@ -15,7 +15,7 @@
from robot.errors import DataError
-class XmlHandler(object):
+class XmlElementHandler(object):
def __init__(self, result, root_handler=None):
self._results = [result]
@@ -39,7 +39,6 @@
class _Handler(object):
- tag = ''
def __init__(self):
self._children = dict((c.tag, c) for c in self._child_handlers())
@@ -51,18 +50,18 @@
def _child_classes(self):
return []
- def start(self, elem, result):
- return result
-
- def end(self, elem, result):
- pass
-
def child_handler(self, tag):
try:
return self._children[tag]
except KeyError:
raise DataError("Incompatible XML handler '%s'" % tag)
+ def start(self, elem, result):
+ return result
+
+ def end(self, elem, result):
+ pass
+
class RootHandler(_Handler):
@@ -129,10 +128,11 @@
tag = 'msg'
def end(self, elem, result):
- html = elem.get('html', 'no') == 'yes'
- linkable = elem.get('linkable', 'no') == 'yes'
- result.messages.create(elem.text or '', elem.get('level'),
- html, elem.get('timestamp'), linkable)
+ result.messages.create(elem.text or '',
+ elem.get('level'),
+ elem.get('html', 'no') == 'yes',
+ elem.get('timestamp'),
+ elem.get('linkable', 'no') == 'yes')
class _StatusHandler(_Handler):