3 new revisions:
Revision: fbd03502ede6
Author: Mikko Korpela <[email protected]>
Date: Wed Nov 16 02:00:49 2011
Log: cleanup
http://code.google.com/p/robotframework/source/detail?r=fbd03502ede6
Revision: 4d4137b88540
Author: Mikko Korpela <[email protected]>
Date: Wed Nov 16 02:03:43 2011
Log: JSONDataModel: No need to handle suite teardown failures anymore
on th...
http://code.google.com/p/robotframework/source/detail?r=4d4137b88540
Revision: 4e70f3cb6a75
Author: Mikko Korpela <[email protected]>
Date: Wed Nov 16 02:04:47 2011
Log: 1) Renamed DatamodelVisitor -> JSModelCreator, 2) Little cleanup
http://code.google.com/p/robotframework/source/detail?r=4e70f3cb6a75
==============================================================================
Revision: fbd03502ede6
Author: Mikko Korpela <[email protected]>
Date: Wed Nov 16 02:00:49 2011
Log: cleanup
http://code.google.com/p/robotframework/source/detail?r=fbd03502ede6
Modified:
/src/robot/reporting/builders.py
=======================================
--- /src/robot/reporting/builders.py Mon Nov 14 03:57:35 2011
+++ /src/robot/reporting/builders.py Wed Nov 16 02:00:49 2011
@@ -43,6 +43,10 @@
self._path = self._parse_file(self._type)
def build(self):
+ if self._path:
+ self._build()
+
+ def _build(self):
raise NotImplementedError(self.__class__.__name__)
def _parse_file(self, name):
@@ -53,29 +57,26 @@
class OutputBuilder(_Builder):
_type = 'Output'
- def build(self):
- if self._path:
- self._context.result_from_xml.serialize_output(self._path)
+ def _build(self):
+ self._context.result_from_xml.serialize_output(self._path)
class XUnitBuilder(_Builder):
_type = 'XUnitFile'
- def build(self):
- if self._path:
- self._context.result_from_xml.serialize_xunit(self._path)
+ def _build(self):
+ self._context.result_from_xml.serialize_xunit(self._path)
class _HTMLFileBuilder(_Builder):
_type = NotImplemented
_template = NotImplemented
- def build(self):
- if self._path:
- self._context.data_model.set_settings(self._get_settings())
- self._format_data()
- if self._write_file():
- LOGGER.output_file(self._type, self._path)
+ def _build(self):
+ self._context.data_model.set_settings(self._get_settings())
+ self._format_data()
+ if self._write_file():
+ LOGGER.output_file(self._type, self._path)
def _url_from_path(self, source, destination):
if not destination:
==============================================================================
Revision: 4d4137b88540
Author: Mikko Korpela <[email protected]>
Date: Wed Nov 16 02:03:43 2011
Log: JSONDataModel: No need to handle suite teardown failures anymore
on this level. Also few other smaller cleanups.
http://code.google.com/p/robotframework/source/detail?r=4d4137b88540
Modified:
/src/robot/result/jsondatamodelhandlers.py
=======================================
--- /src/robot/result/jsondatamodelhandlers.py Wed Nov 16 00:29:29 2011
+++ /src/robot/result/jsondatamodelhandlers.py Wed Nov 16 02:03:43 2011
@@ -64,6 +64,7 @@
def _last_child_status(self):
return self._data_from_children[-1][0]
+
class ExecutionResultHandler(_Handler):
def __init__(self, context, execution_result):
@@ -74,7 +75,7 @@
self._current_children = self._stats
return StatisticsHandler(self._stats, stats)
- def end_element(self, text):
+ def end_element(self, _):
return {'generator': self._generator,
'suite': self._data_from_children[0],
'stats': self._stats,
@@ -133,12 +134,11 @@
def __init__(self, context, suite):
_Handler.__init__(self, context)
self._current_children = None
- self._teardown_failed = False
self._context.start_suite()
self._data_from_children.append(self._get_id(utils.html_format(suite.doc)))
self._metadata = []
- self._in_setup_or_teardown = False
- for i in [self._get_ids(key, utils.html_format(value)) for key,
value in suite.metadata.items()]:
+ for i in [self._get_ids(key, utils.html_format(value))
+ for key, value in suite.metadata.items()]:
self._metadata.extend(i)
self._data_from_children.append(self._metadata)
@@ -146,9 +146,6 @@
return self._get_ids(suite.name, suite.source,
self._context.get_rel_log_path(suite.source))
- def _set_teardown_failed(self):
- self._teardown_failed = True
-
def add_child_data(self, data):
self._current_children.append(data)
@@ -162,16 +159,15 @@
if suite.message != '':
status.append(self._get_id(suite.message))
self._data_from_children.append(status)
+ # TODO: 0 is Teardown failure. It should be removed from JS
return self._get_name_and_sources(suite) +
self._data_from_children + \
- [self._suites, self._tests, self._keywords,
- int(self._teardown_failed), stats]
+ [self._suites, self._tests, self._keywords, 0, stats]
class TestHandler(_Handler):
def __init__(self, context, test):
_Handler.__init__(self, context)
- self._keywords = []
self._current_children = None
self._context.start_test()
self._data_from_children.append(self._get_id(utils.html_format(test.doc)))
@@ -238,7 +234,6 @@
class _StatusHandler(_Handler):
-
_statuses = {'FAIL': 0, 'PASS': 1, 'NOT_RUN': 2}
def __init__(self, context, item):
==============================================================================
Revision: 4e70f3cb6a75
Author: Mikko Korpela <[email protected]>
Date: Wed Nov 16 02:04:47 2011
Log: 1) Renamed DatamodelVisitor -> JSModelCreator, 2) Little cleanup
http://code.google.com/p/robotframework/source/detail?r=4e70f3cb6a75
Modified:
/src/robot/reporting/resultwriter.py
/src/robot/result/datamodel.py
/utest/result/test_jsoning.py
/utest/result/test_resultserializer.py
/utest/webcontent/spec/data/create_jsdata_for_specs.py
=======================================
--- /src/robot/reporting/resultwriter.py Wed Nov 16 00:35:41 2011
+++ /src/robot/reporting/resultwriter.py Wed Nov 16 02:04:47 2011
@@ -17,7 +17,7 @@
from robot.reporting.jsondatamodel import DataModelWriter
from robot.result.builders import ResultFromXML as RFX
from robot.result.combiningvisitor import CombiningVisitor,
KeywordRemovingVisitor
-from robot.result.datamodel import DatamodelVisitor
+from robot.result.datamodel import JSModelCreator
from robot.result.serializer import RebotXMLWriter
from robot import utils
@@ -37,12 +37,17 @@
@property
def result_from_xml(self):
if self._xml_result is None:
+ #TODO: RFX and ResultFromXML name conflict
execution_result = RFX(*self._data_sources)
execution_result.configure(status_rc=not
self.settings['NoStatusRC'],
**self._create_opts())
self._xml_result = ResultFromXML(execution_result,
self.settings)
return self._xml_result
+ @property
+ def result(self):
+ return self._xml_result.result
+
def _create_opts(self):
opts = {}
for opt_name, settings_name in [
@@ -88,15 +93,11 @@
@property
def data_model(self):
if self._data_model is None:
- visitor = DatamodelVisitor(self.result_from_xml.result,
- log_path=self.settings['Log'],
- split_log=self.settings['SplitLog'])
- # Remove keywords while visiting as JSON datamodel visitor is
the last
- # thing that needs keywords from the model
- # this saves memory -- possibly a lot.
- self.result_from_xml.result.visit(CombiningVisitor(visitor,
- KeywordRemovingVisitor()))
- self._data_model = DataModelWriter(visitor.datamodel,
visitor.split_results)
+ creator = JSModelCreator(self.result_from_xml.result,
+ log_path=self.settings['Log'],
+ split_log=self.settings['SplitLog'])
+ self.result.visit(CombiningVisitor(creator,
KeywordRemovingVisitor()))
+ self._data_model = DataModelWriter(creator.datamodel,
creator.split_results)
return self._data_model
=======================================
--- /src/robot/result/datamodel.py Tue Nov 15 06:20:39 2011
+++ /src/robot/result/datamodel.py Wed Nov 16 02:04:47 2011
@@ -13,50 +13,51 @@
# limitations under the License.
from robot.reporting.parsingcontext import Context
-from robot.result.jsondatamodelhandlers import ExecutionResultHandler
-
-from robot.result.visitor import ResultVisitor
-
-class DatamodelVisitor(ResultVisitor):
+from .jsondatamodelhandlers import ExecutionResultHandler
+from .visitor import ResultVisitor
+
+
+class JSModelCreator(ResultVisitor):
def __init__(self, result, log_path='NONE', split_log=False):
- self._elements = []
self._context = Context(log_path=log_path, split_log=split_log)
- self._elements.append(ExecutionResultHandler(self._context,
result))
+ self._elements = [ExecutionResultHandler(self._context, result)]
+
+ @property
+ def datamodel(self):
+ #TODO: End element should not require argument in this case
+ return self._top.end_element(None)
+
+ @property
+ def _top(self):
+ return self._elements[-1]
@property
def split_results(self):
return self._context.split_results
- def _start(self, func):
- next = func(self._elements[-1])
- self._elements.append(next)
-
def start_suite(self, suite):
- self._start(lambda p: p.start_suite(suite))
+ self._elements.append(self._top.start_suite(suite))
def start_keyword(self, keyword):
- self._start(lambda p: p.start_keyword(keyword))
+ self._elements.append(self._top.start_keyword(keyword))
def start_test(self, test):
- self._start(lambda p: p.start_test(test))
+ self._elements.append(self._top.start_test(test))
def start_errors(self, errors):
- self._start(lambda p: p.start_errors(errors))
+ self._elements.append(self._top.start_errors(errors))
def visit_statistics(self, stats):
- self._start(lambda p: p.visit_statistics(stats))
+ self._elements.append(self._top.visit_statistics(stats))
self._end(stats)
+ #TODO: end_elements should also work in similar as starts
def _end(self, item):
- item_datamodel = self._elements.pop().end_element(item)
- self._elements[-1].add_child_data(item_datamodel)
+ submodel = self._elements.pop().end_element(item)
+ self._top.add_child_data(submodel)
end_suite = end_keyword = end_test = end_errors = _end
def end_message(self, msg):
- self._elements[-1].message(msg)
-
- @property
- def datamodel(self):
- return self._elements[-1].end_element('')
+ self._top.message(msg)
=======================================
--- /utest/result/test_jsoning.py Tue Nov 15 06:40:46 2011
+++ /utest/result/test_jsoning.py Wed Nov 16 02:04:47 2011
@@ -5,14 +5,14 @@
from robot.model.message import Message
from robot.output.loggerhelper import LEVELS
from robot.reporting.parsingcontext import Context
-from robot.result.datamodel import DatamodelVisitor
+from robot.result.datamodel import JSModelCreator
from robot.result.jsondatamodelhandlers import _Handler, KeywordHandler,
_StatusHandler
from robot.result.testcase import TestCase
from robot.result.testsuite import TestSuite
from robot.utils.asserts import assert_equals
-class _PartialDatamodelVisitor(DatamodelVisitor):
+class _PartialJSModelCreator(JSModelCreator):
def __init__(self):
self._elements = []
@@ -23,7 +23,7 @@
class TestJsoning(unittest.TestCase):
def setUp(self):
- self._visitor = _PartialDatamodelVisitor()
+ self._visitor = _PartialJSModelCreator()
self._context = self._visitor._context
@property
@@ -205,7 +205,7 @@
result.generator = 'unit test'
result.suite.suites.create(name='Urho').tests.create(status='FAIL',
name='moi', tags=['tagi']).keywords.create(name='FAILING',
status='FAIL').messages.create(message='FAIL', level='WARN',
timestamp='20110101 01:01:01.111')
result.errors.messages.create(message='FAIL', level='WARN',
timestamp='20110101 01:01:01.111', linkable=True)
- self._visitor = DatamodelVisitor(result)
+ self._visitor = JSModelCreator(result)
self._context = self._visitor._context
result.visit(self._visitor)
self._verify_message(self.datamodel['errors'][0],
result.errors.messages[0])
=======================================
--- /utest/result/test_resultserializer.py Tue Nov 15 06:41:37 2011
+++ /utest/result/test_resultserializer.py Wed Nov 16 02:04:47 2011
@@ -7,7 +7,7 @@
from robot.result.builders import ResultFromXML
from robot.result.combiningvisitor import KeywordRemovingVisitor,
CombiningVisitor
from robot.result.serializer import RebotXMLWriter
-from robot.result.datamodel import DatamodelVisitor
+from robot.result.datamodel import JSModelCreator
from robot.utils.asserts import assert_equals
from test_resultbuilder import GOLDEN_XML, GOLDEN_XML_TWICE
@@ -43,7 +43,7 @@
output_parser._parse_fileobj(StringIO(GOLDEN_XML))
self._expected = output_parser._get_data_model()._robot_data
result = ResultFromXML(StringIO(GOLDEN_XML))
- visitor = DatamodelVisitor(result)
+ visitor = JSModelCreator(result)
result.visit(CombiningVisitor(visitor,
KeywordRemovingVisitor()))
self._datamodel = visitor.datamodel
=======================================
--- /utest/webcontent/spec/data/create_jsdata_for_specs.py Wed Nov 9
04:59:48 2011
+++ /utest/webcontent/spec/data/create_jsdata_for_specs.py Wed Nov 16
02:04:47 2011
@@ -4,7 +4,7 @@
from os.path import join, dirname, abspath
import sys
import os
-from robot.result.datamodel import DatamodelVisitor
+from robot.result.datamodel import JSModelCreator
BASEDIR = dirname(abspath(__file__))
@@ -29,7 +29,7 @@
def create_jsdata(outxml, target, split_log):
result = robot.result.builders.ResultFromXML(outxml)
- visitor = DatamodelVisitor(result, split_log=split_log)
+ visitor = JSModelCreator(result, split_log=split_log)
model = DataModelWriter(visitor.datamodel,
visitor._context.split_results)
model.set_settings({'logURL': 'log.html',
'reportURL': 'report.html',