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()

Reply via email to