5 new revisions:
Revision: 1c7523c7ada4
Author: Pekka Klärck
Date: Tue Nov 29 14:03:34 2011
Log: log.html and report.html: reordered content coming from external
files...
http://code.google.com/p/robotframework/source/detail?r=1c7523c7ada4
Revision: c0b642035247
Author: Pekka Klärck
Date: Tue Nov 29 14:07:11 2011
Log: todo
http://code.google.com/p/robotframework/source/detail?r=c0b642035247
Revision: c88bf95c9986
Author: Pekka Klärck
Date: Tue Nov 29 14:39:51 2011
Log: todos
http://code.google.com/p/robotframework/source/detail?r=c88bf95c9986
Revision: 683bcfc42287
Author: Pekka Klärck
Date: Wed Nov 30 03:11:56 2011
Log: fixed writing stats to log/report. tests are missing but in
progress.
http://code.google.com/p/robotframework/source/detail?r=683bcfc42287
Revision: 5cabdc1a5be3
Author: Pekka Klärck
Date: Wed Nov 30 03:12:50 2011
Log: Automated merge with https://code.google.com/p/robotframework/
http://code.google.com/p/robotframework/source/detail?r=5cabdc1a5be3
==============================================================================
Revision: 1c7523c7ada4
Author: Pekka Klärck
Date: Tue Nov 29 14:03:34 2011
Log: log.html and report.html: reordered content coming from external
files to ease reading generared files
http://code.google.com/p/robotframework/source/detail?r=1c7523c7ada4
Modified:
/src/robot/webcontent/log.html
/src/robot/webcontent/report.html
=======================================
--- /src/robot/webcontent/log.html Sun Nov 20 14:03:25 2011
+++ /src/robot/webcontent/log.html Tue Nov 29 14:03:34 2011
@@ -6,20 +6,20 @@
<meta http-equiv="Expires" content="-1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="Generator" content="[Robot Framework template]">
+<link rel="icon" type="image/x-icon"
href="data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAEAAAAAAAAAAAAAAAJEBoACtnfgA5cYYAERsiAEx2lAAbKkQAcazBACZCVwAcM1cAK0ucAAMDBQAnQncASG+FABkoVQAyWmgA6f8SgvH/Ij99+GLyIinyJfn/Yi//KSLzUy9iZogpIld3/4JVVTkid7vyUjNVNVJEAGOZ6Z7pXwAABpmZkRiLAAAGiJZpmGAAAEEt3SXdxAAATC7o/u3EAAC8MRZpjasAAAY1VVVTYAAABKqqqqpAAAAADKqq4AAAAAAAv4sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMADAADgAwAA4AcAAOAHAADgBwAAwAcAAOAHAADgDwAA8A8AAPg/AAD+fwAA">
<link rel="stylesheet" type="text/css" href="log.css" media="all">
<link rel="stylesheet" type="text/css" href="common.css" media="all">
<link rel="stylesheet" type="text/css" href="print.css" media="print">
-<link rel="icon" type="image/x-icon"
href="data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAEAAAAAAAAAAAAAAAJEBoACtnfgA5cYYAERsiAEx2lAAbKkQAcazBACZCVwAcM1cAK0ucAAMDBQAnQncASG+FABkoVQAyWmgA6f8SgvH/Ij99+GLyIinyJfn/Yi//KSLzUy9iZogpIld3/4JVVTkid7vyUjNVNVJEAGOZ6Z7pXwAABpmZkRiLAAAGiJZpmGAAAEEt3SXdxAAATC7o/u3EAAC8MRZpjasAAAY1VVVTYAAABKqqqqpAAAAADKqq4AAAAAAAv4sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMADAADgAwAA4AcAAOAHAADgBwAAwAcAAOAHAADgDwAA8A8AAPg/AAD+fwAA">
<script type="text/javascript" src="log.js"></script>
<script type="text/javascript" src="lib/jquery.min.js"></script>
<script type="text/javascript" src="lib/jquery.tmpl.min.js"></script>
-<!-- OUTPUT JS --><script type="text/javascript"
src="testdata/data.js"></script>
<script type="text/javascript" src="lib/jsxcompressor.js"></script>
<script type="text/javascript" src="fileloading.js"></script>
<script type="text/javascript" src="model.js"></script>
<script type="text/javascript" src="util.js"></script>
<script type="text/javascript" src="testdata.js"></script>
<script type="text/javascript" src="view.js"></script>
+<!-- OUTPUT JS --><script type="text/javascript"
src="testdata/data.js"></script>
<title></title>
</head>
<body>
=======================================
--- /src/robot/webcontent/report.html Sun Nov 20 14:03:25 2011
+++ /src/robot/webcontent/report.html Tue Nov 29 14:03:34 2011
@@ -6,20 +6,20 @@
<meta http-equiv="Expires" content="-1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="Generator" content="[Robot Framework template]">
+<link rel="icon" type="image/x-icon"
href="data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAEAAAAAAAAAAAAAAAJEBoACtnfgA5cYYAERsiAEx2lAAbKkQAcazBACZCVwAcM1cAK0ucAAMDBQAnQncASG+FABkoVQAyWmgA6f8SgvH/Ij99+GLyIinyJfn/Yi//KSLzUy9iZogpIld3/4JVVTkid7vyUjNVNVJEAGOZ6Z7pXwAABpmZkRiLAAAGiJZpmGAAAEEt3SXdxAAATC7o/u3EAAC8MRZpjasAAAY1VVVTYAAABKqqqqpAAAAADKqq4AAAAAAAv4sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMADAADgAwAA4AcAAOAHAADgBwAAwAcAAOAHAADgDwAA8A8AAPg/AAD+fwAA">
<link rel="stylesheet" type="text/css" href="common.css" media="all">
<link rel="stylesheet" type="text/css" href="report.css" media="all">
<link rel="stylesheet" type="text/css" href="print.css" media="print">
-<link rel="icon" type="image/x-icon"
href="data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAEAAAAAAAAAAAAAAAJEBoACtnfgA5cYYAERsiAEx2lAAbKkQAcazBACZCVwAcM1cAK0ucAAMDBQAnQncASG+FABkoVQAyWmgA6f8SgvH/Ij99+GLyIinyJfn/Yi//KSLzUy9iZogpIld3/4JVVTkid7vyUjNVNVJEAGOZ6Z7pXwAABpmZkRiLAAAGiJZpmGAAAEEt3SXdxAAATC7o/u3EAAC8MRZpjasAAAY1VVVTYAAABKqqqqpAAAAADKqq4AAAAAAAv4sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMADAADgAwAA4AcAAOAHAADgBwAAwAcAAOAHAADgDwAA8A8AAPg/AAD+fwAA">
<script type="text/javascript" src="lib/jquery.min.js"></script>
<script type="text/javascript" src="lib/jquery.tmpl.min.js"></script>
<script type="text/javascript"
src="lib/jquery.tablesorter.min.js"></script>
-<!-- OUTPUT JS --><script type="text/javascript"
src="testdata/data.js"></script>
<script type="text/javascript" src="lib/jsxcompressor.js"></script>
<script type="text/javascript" src="fileloading.js"></script>
<script type="text/javascript" src="model.js"></script>
<script type="text/javascript" src="util.js"></script>
<script type="text/javascript" src="testdata.js"></script>
<script type="text/javascript" src="view.js"></script>
+<!-- OUTPUT JS --><script type="text/javascript"
src="testdata/data.js"></script>
<title></title>
</head>
<body>
==============================================================================
Revision: c0b642035247
Author: Pekka Klärck
Date: Tue Nov 29 14:07:11 2011
Log: todo
http://code.google.com/p/robotframework/source/detail?r=c0b642035247
Modified:
/src/robot/writer/htmltemplate.py
=======================================
--- /src/robot/writer/htmltemplate.py Fri Oct 21 03:56:57 2011
+++ /src/robot/writer/htmltemplate.py Tue Nov 29 14:07:11 2011
@@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+# TODO: Generator below isn't correct when this is used outside RIDE.
TEMPLATE = """
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
==============================================================================
Revision: c88bf95c9986
Author: Pekka Klärck
Date: Tue Nov 29 14:39:51 2011
Log: todos
http://code.google.com/p/robotframework/source/detail?r=c88bf95c9986
Modified:
/src/robot/result/combiningvisitor.py
=======================================
--- /src/robot/result/combiningvisitor.py Wed Nov 16 01:00:34 2011
+++ /src/robot/result/combiningvisitor.py Tue Nov 29 14:39:51 2011
@@ -11,8 +11,15 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
+
from robot.result.visitor import ResultVisitor
+# TODO:
+# 1) Why is visit_statistics handled specially?
+# 2) Why aren't visit_xxx generally handled?
+# 3) CombiningVisitor should probably be moved to robot.result.visitor
+# 4) KeywordRemovingVisitor should be moved somewhere else
+
class CombiningVisitor(ResultVisitor):
def __init__(self, *visitors):
==============================================================================
Revision: 683bcfc42287
Author: Pekka Klärck
Date: Wed Nov 30 03:11:56 2011
Log: fixed writing stats to log/report. tests are missing but in
progress.
http://code.google.com/p/robotframework/source/detail?r=683bcfc42287
Modified:
/src/robot/conf/settings.py
/src/robot/model/stats.py
/src/robot/reporting/resultwriter.py
/src/robot/result/jsondatamodelhandlers.py
=======================================
--- /src/robot/conf/settings.py Mon Nov 28 04:16:17 2011
+++ /src/robot/conf/settings.py Wed Nov 30 03:11:56 2011
@@ -301,3 +301,9 @@
('endtime', 'EndTime')])
opts['metadata'] = dict(opts['metadata'])
return opts
+
+ def statistics_configuration(self):
+ return (self['SuiteStatLevel'], self['TagStatInclude'],
+ self['TagStatExclude'], self['TagStatCombine'],
+ self['TagDoc'], self['TagStatLink'])
+
=======================================
--- /src/robot/model/stats.py Fri Nov 18 13:37:31 2011
+++ /src/robot/model/stats.py Wed Nov 30 03:11:56 2011
@@ -22,12 +22,20 @@
self.passed = 0
self.failed = 0
+ # TODO: Combine attrs and js_attrs propertys into get_attrs method
+
@property
def attrs(self):
attrs = {'pass': str(self.passed), 'fail': str(self.failed)}
attrs.update(self._get_custom_attrs())
return attrs
+ @property
+ def js_attrs(self):
+ attrs = {'label': self.name, 'pass': self.passed, 'fail':
self.failed}
+ attrs.update(self._get_custom_attrs())
+ return attrs
+
def _get_custom_attrs(self):
return {}
=======================================
--- /src/robot/reporting/resultwriter.py Tue Nov 29 01:04:30 2011
+++ /src/robot/reporting/resultwriter.py Wed Nov 30 03:11:56 2011
@@ -48,9 +48,11 @@
if self._xml_result is None:
#TODO: RFX and ResultFromXML name conflict
execution_result = RFX(*self._data_sources)
+ # TODO: configure and configure_statistics really should be
combined somehow
+
execution_result.configure_statistics(*self.settings.statistics_configuration())
execution_result.configure(status_rc=not
self.settings['NoStatusRC'],
**self.settings.result_configuration())
- self._xml_result = ResultFromXML(execution_result,
self.settings)
+ self._xml_result = ResultFromXML(execution_result)
return self._xml_result
@property
@@ -80,22 +82,14 @@
class ResultFromXML(object):
- def __init__(self, execution_result, settings=None):
+ def __init__(self, execution_result):
self.result = execution_result
- self._settings = settings
self._generator = 'Robot'
def serialize_output(self, path, log=True):
+ # TODO: Can `log` be False??
if path == 'NONE':
return
- if self._settings:
- settings = self._settings
- params = (settings['SuiteStatLevel'],
settings['TagStatInclude'],
- settings['TagStatExclude'],
settings['TagStatCombine'],
- settings['TagDoc'], settings['TagStatLink'])
- else:
- params = ()
- self.result.configure_statistics(*params)
serializer = RebotXMLWriter(path)
self.result.visit(serializer)
if log:
=======================================
--- /src/robot/result/jsondatamodelhandlers.py Tue Nov 29 01:53:28 2011
+++ /src/robot/result/jsondatamodelhandlers.py Wed Nov 30 03:11:56 2011
@@ -14,7 +14,6 @@
from robot import utils
from robot.output import LEVELS
-from robot.result.visitor import ResultVisitor
class _Handler(object):
@@ -98,49 +97,16 @@
return self._messages
-class SuiteStatVisitor(ResultVisitor):
-
- def __init__(self, collection):
- self.collection = collection
-
- def visit_stat(self, stats):
- stat = self._create_stat(stats)
- stat['id'] = stats.attrs['idx']
- stat['name'] = stats.attrs['name']
- self.collection += [stat]
-
- def _create_stat(self, stat_elem):
- return {'pass':stat_elem.passed,
- 'fail':stat_elem.failed,
- 'label':stat_elem.name}
-
-
+ # TODO: This should also be Handler
class StatisticsHandler(object):
- def __init__(self, stats_list, stats):
- self._result = stats_list
- self._result.append(self._parse_totals(stats.total))
- self._result.append(self._parse_tag(stats.tags))
- self._result.append(self._parse_suite(stats.suite))
-
- def _parse_totals(self, total):
- return [self._create_stat(total.critical),
self._create_stat(total.all)]
-
- def _parse_tag(self, tags):
- return [self._create_stat(tag) for tag in tags]
-
- def _parse_suite(self, suite):
- stats = []
- suite.visit(SuiteStatVisitor(stats))
- return stats
-
- def _create_stat(self, stat_elem):
- return {'pass':stat_elem.passed,
- 'fail':stat_elem.failed,
- 'label':stat_elem.name}
-
- def end_element(self, _):
- return self._result
+ def __init__(self, result, stats):
+ result.append(self._get_stats(stats.total))
+ result.append(self._get_stats(stats.tags))
+ result.append(self._get_stats(stats.suite))
+
+ def _get_stats(self, stats):
+ return [stat.js_attrs for stat in stats]
class SuiteHandler(_Handler):
==============================================================================
Revision: 5cabdc1a5be3
Author: Pekka Klärck
Date: Wed Nov 30 03:12:50 2011
Log: Automated merge with https://code.google.com/p/robotframework/
http://code.google.com/p/robotframework/source/detail?r=5cabdc1a5be3
Modified:
/src/robot/reporting/resultwriter.py
/src/robot/result/jsondatamodelhandlers.py
=======================================
--- /src/robot/reporting/resultwriter.py Wed Nov 30 01:40:01 2011
+++ /src/robot/reporting/resultwriter.py Wed Nov 30 03:12:50 2011
@@ -47,9 +47,11 @@
if self._xml_result is None:
#TODO: RFX and ResultFromXML name conflict
execution_result = RFX(*self._data_sources)
+ # TODO: configure and configure_statistics really should be
combined somehow
+
execution_result.configure_statistics(*self.settings.statistics_configuration())
execution_result.configure(status_rc=not
self.settings['NoStatusRC'],
**self.settings.result_configuration())
- self._xml_result = ResultFromXML(execution_result,
self.settings)
+ self._xml_result = ResultFromXML(execution_result)
return self._xml_result
@property
@@ -79,22 +81,14 @@
class ResultFromXML(object):
- def __init__(self, execution_result, settings=None):
+ def __init__(self, execution_result):
self.result = execution_result
- self._settings = settings
self._generator = 'Robot'
def serialize_output(self, path, log=True):
+ # TODO: Can `log` be False??
if path == 'NONE':
return
- if self._settings:
- settings = self._settings
- params = (settings['SuiteStatLevel'],
settings['TagStatInclude'],
- settings['TagStatExclude'],
settings['TagStatCombine'],
- settings['TagDoc'], settings['TagStatLink'])
- else:
- params = ()
- self.result.configure_statistics(*params)
serializer = RebotXMLWriter(path)
self.result.visit(serializer)
if log:
=======================================
--- /src/robot/result/jsondatamodelhandlers.py Wed Nov 30 01:40:01 2011
+++ /src/robot/result/jsondatamodelhandlers.py Wed Nov 30 03:12:50 2011
@@ -14,7 +14,6 @@
from robot import utils
from robot.output import LEVELS
-from robot.result.visitor import ResultVisitor
class _Handler(object):
@@ -93,49 +92,16 @@
return self._messages
-class SuiteStatVisitor(ResultVisitor):
-
- def __init__(self, collection):
- self.collection = collection
-
- def visit_stat(self, stats):
- stat = self._create_stat(stats)
- stat['id'] = stats.attrs['idx']
- stat['name'] = stats.attrs['name']
- self.collection += [stat]
-
- def _create_stat(self, stat_elem):
- return {'pass':stat_elem.passed,
- 'fail':stat_elem.failed,
- 'label':stat_elem.name}
-
-
+ # TODO: This should also be Handler
class StatisticsHandler(object):
- def __init__(self, stats_list, stats):
- self._result = stats_list
- self._result.append(self._parse_totals(stats.total))
- self._result.append(self._parse_tag(stats.tags))
- self._result.append(self._parse_suite(stats.suite))
-
- def _parse_totals(self, total):
- return [self._create_stat(total.critical),
self._create_stat(total.all)]
-
- def _parse_tag(self, tags):
- return [self._create_stat(tag) for tag in tags]
-
- def _parse_suite(self, suite):
- stats = []
- suite.visit(SuiteStatVisitor(stats))
- return stats
-
- def _create_stat(self, stat_elem):
- return {'pass':stat_elem.passed,
- 'fail':stat_elem.failed,
- 'label':stat_elem.name}
-
- def end_element(self, _):
- return self._result
+ def __init__(self, result, stats):
+ result.append(self._get_stats(stats.total))
+ result.append(self._get_stats(stats.tags))
+ result.append(self._get_stats(stats.suite))
+
+ def _get_stats(self, stats):
+ return [stat.js_attrs for stat in stats]
class SuiteHandler(_Handler):