Revision: d665a6b4d086
Author: Janne Härkönen <[email protected]>
Date: Fri Nov 18 00:40:53 2011
Log: resutbuilder: support for XML string literals
http://code.google.com/p/robotframework/source/detail?r=d665a6b4d086
Modified:
/src/robot/result/builders.py
/utest/result/test_resultbuilder.py
=======================================
--- /src/robot/result/builders.py Thu Nov 10 06:42:09 2011
+++ /src/robot/result/builders.py Fri Nov 18 00:40:53 2011
@@ -13,6 +13,7 @@
# limitations under the License.
import os
+from StringIO import StringIO
from robot.errors import DataError
from robot.utils.etreewrapper import ET
@@ -27,8 +28,7 @@
raise DataError('One or more data source needed.')
if len(sources) > 1:
return CombinedExecutionResult(*[ResultFromXML(src) for src in
sources])
- source = sources[0]
- _validate_source(source)
+ source = XmlSource(sources[0])
try:
return ExecutionResultBuilder(source).build(ExecutionResult())
# TODO: handle source in errors messages when it's a file object
@@ -38,10 +38,23 @@
raise DataError("Opening XML file '%s' failed: %s"
% (source, utils.get_error_message()))
-def _validate_source(source):
- # TODO: add support for xml strings.
- if isinstance(source, basestring) and not os.path.isfile(source):
- raise DataError("Output file '%s' does not exist." % source)
+
+class XmlSource(object):
+
+ def __init__(self, source):
+ self._source = source
+
+ @property
+ def source(self):
+ if not isinstance(self._source, basestring):
+ return self._source
+ if os.path.isfile(self._source):
+ return self._source
+ try:
+ ET.XML(self._source)
+ return StringIO(self._source)
+ except ET.ParseError:
+ raise DataError("Output file '%s' does not exist." %
self._source)
class ExecutionResultBuilder(object):
@@ -51,7 +64,7 @@
def build(self, result):
elements = ElementStack(RootElement())
- for action, elem in ET.iterparse(self._source,
events=('start', 'end')):
+ for action, elem in ET.iterparse(self._source.source,
events=('start', 'end')):
result = getattr(elements, action)(elem, result)
SuiteTeardownFailureHandler(result.generator).visit_suite(result.suite)
return result
=======================================
--- /utest/result/test_resultbuilder.py Wed Nov 9 09:21:57 2011
+++ /utest/result/test_resultbuilder.py Fri Nov 18 00:40:53 2011
@@ -169,6 +169,21 @@
assert_equals(tc2.message, 'Message')
+class TestBuildingFromXmlString(unittest.TestCase):
+
+ def test_result_is_built(self):
+ xml = """
+<robot>
+ <suite name="foo">
+ <test name="some name">
+ <status status="PASS"></status>
+ </test>
+ <status status="PASS"></status>
+ </suite>
+</robot>
+""".strip()
+ result = ResultFromXML(xml)
+
if __name__ == '__main__':
unittest.main()