4 new revisions:
Revision: d36d2429f26b
Author: Mikko Korpela <[email protected]>
Date: Wed Jun 8 04:19:42 2011
Log: webcontent: expand failed before navigating to hash source
http://code.google.com/p/robotframework/source/detail?r=d36d2429f26b
Revision: 1b521a35d0eb
Author: Mikko Korpela <[email protected]>
Date: Wed Jun 8 04:21:18 2011
Log: merge
http://code.google.com/p/robotframework/source/detail?r=1b521a35d0eb
Revision: beba41bb43f5
Author: Mikko Korpela <[email protected]>
Date: Wed Jun 8 04:44:13 2011
Log: remove keywords before generating report
http://code.google.com/p/robotframework/source/detail?r=beba41bb43f5
Revision: 8d3c6664b245
Author: Mikko Korpela <[email protected]>
Date: Wed Jun 8 05:26:16 2011
Log: remove unneeded keyword information from report
http://code.google.com/p/robotframework/source/detail?r=8d3c6664b245
==============================================================================
Revision: d36d2429f26b
Author: Mikko Korpela <[email protected]>
Date: Wed Jun 8 04:19:42 2011
Log: webcontent: expand failed before navigating to hash source
http://code.google.com/p/robotframework/source/detail?r=d36d2429f26b
Modified:
/src/robot/webcontent/log.html
=======================================
--- /src/robot/webcontent/log.html Wed Jun 8 03:28:50 2011
+++ /src/robot/webcontent/log.html Wed Jun 8 04:19:42 2011
@@ -320,11 +320,11 @@
addStatistics();
addErrors();
addTestExecutionLog(main);
+ expandFailed(main);
if (window.location.hash) {
makeElementVisible(window.location.hash.substring(1));
window.location.hash = window.location.hash.substring(1);
};
- expandFailed(main);
});
function addHeader() {
==============================================================================
Revision: 1b521a35d0eb
Author: Mikko Korpela <[email protected]>
Date: Wed Jun 8 04:21:18 2011
Log: merge
http://code.google.com/p/robotframework/source/detail?r=1b521a35d0eb
Modified:
/src/robot/webcontent/log.html
=======================================
--- /src/robot/webcontent/log.html Wed Jun 8 04:19:42 2011
+++ /src/robot/webcontent/log.html Wed Jun 8 04:21:18 2011
@@ -338,14 +338,10 @@
}
function addErrors() {
- if(window.testdata.error(0)){
- var errors = $.tmpl(window.templates.errors, {});
- errors.appendTo($('body'));
- for (var i = 0; window.testdata.error(i) !== undefined; i++) {
- var message = window.testdata.error(i);
- var err = $.tmpl((message.link === undefined) ?
window.templates.errorElement : window.templates.linkableErrorElement,
message);
- err.appendTo($('#errors_list'));
- }
+ var errors = window.testdata.errors();
+ if (errors.length) {
+ $.tmpl(window.templates.errorHeader).appendTo($('body'));
+ $.tmpl(window.templates.error, errors).appendTo($('#error_table'));
}
}
@@ -388,20 +384,12 @@
tagStatRow: $('#tag_statistics_row').template(),
suiteStatRow: $('#suite_statistics_row').template(),
noTagsRow: $('#no_tags_row').template(),
+ errorHeader: $('#error_header_template').template(),
+ error: $('#error_template').template(),
suite: $('#suite_template').template(),
- metadata: $('#metadata_template').template(),
test: $('#test_template').template(),
keyword: $('#keyword_template').template(),
message: $('#message_template').template(),
- metadataElement: $('#metadata_element_template').template(),
- documentationElement:
$('#documentation_element_template').template(),
- failureAndStatsMessageElement:
$('#failure_and_stats_message_template').template(),
- statsMessageElement: $('#stats_message_template').template(),
- sourceElement: $('#source_element_template').template(),
- statusElement: $('#status_element_template').template(),
- errors: $('#errors_template').template(),
- linkableErrorElement:
$('#linkable_error_element_template').template(),
- errorElement: $('#error_element_template').template()
};
};
</script>
@@ -482,24 +470,20 @@
</tr>
</script>
-<script type="text/html" id="errors_template">
+<script type="text/html" id="error_header_template">
<h2>Test Execution Errors</h2>
- <table class="errors" id="errors_list"></table>
+ <table class="errors" id="error_table"></table>
</script>
-<script type="text/html" id="error_element_template">
- <tr>
- <td class="time">${date()}</td>
- <td class="${level} level">${levelText}</td>
- <td class="msg">{{html text}}</td>
- </tr>
-</script>
-
-<script type="text/html" id="linkable_error_element_template">
+<script type="text/html" id="error_template">
<tr>
<td class="time">
+ {{if link}}
<a onclick="makeElementVisible('${link}')"
href="#${link}" title="Link to details.">${date}</a>
+ {{else}}
+ ${date}
+ {{/if}}
</td>
<td class="${level} level">${levelText}</td>
<td class="msg">{{html text}}</td>
==============================================================================
Revision: beba41bb43f5
Author: Mikko Korpela <[email protected]>
Date: Wed Jun 8 04:44:13 2011
Log: remove keywords before generating report
http://code.google.com/p/robotframework/source/detail?r=beba41bb43f5
Modified:
/src/robot/serializing/jsparser.py
/src/robot/serializing/testoutput.py
/utest/serializing/test_js_serializer.py
=======================================
--- /src/robot/serializing/jsparser.py Wed Jun 8 02:54:43 2011
+++ /src/robot/serializing/jsparser.py Wed Jun 8 04:44:13 2011
@@ -558,6 +558,17 @@
json_dump(self._texts, output)
output.write(';\n')
+ def remove_keywords(self):
+ self._robot_data = self._remove_keywords_from(self._robot_data)
+
+ def _remove_keywords_from(self, data):
+ if not isinstance(data, list):
+ return data
+ return [self._remove_keywords_from(item) for item in data if not
self._is_keyword(item)]
+
+ def _is_keyword(self, item):
+ return isinstance(item, list) and item and item[0] in
['kw', 'setup', 'teardown']
+
def encode_basestring(string):
def get_matching_char(c):
val = ord(c)
=======================================
--- /src/robot/serializing/testoutput.py Sun Jun 5 10:31:11 2011
+++ /src/robot/serializing/testoutput.py Wed Jun 8 04:44:13 2011
@@ -76,8 +76,9 @@
data_model = jsparser.create_datamodel_from(data_sources[0])
report_path = self._parse_file(settings['Report'])
log_path = self._parse_file(settings['Log'])
- self._make_report(report_path, log_path, data_model, settings)
self._make_log(log_path, data_model, settings)
+ data_model.remove_keywords()
+ self._make_report(report_path, log_path, data_model, settings)
xunit_path = self._parse_file(settings['XUnitFile'])
self._make_xunit(xunit_path, data_sources, settings)
if self._temp_file:
=======================================
--- /utest/serializing/test_js_serializer.py Wed Jun 8 02:54:43 2011
+++ /utest/serializing/test_js_serializer.py Wed Jun 8 04:44:13 2011
@@ -10,6 +10,23 @@
class TestJsSerializer(unittest.TestCase):
+ SUITE_XML = """<suite source="/tmp/verysimple.txt" name="Verysimple">
+ <doc></doc>
+ <metadata></metadata>
+ <test name="Test" timeout="">
+ <doc></doc>
+ <kw type="kw" name="BuiltIn.Log" timeout="">
+ <doc>Logs the given message with the given
level.</doc>
+ <arguments><arg>simple</arg></arguments>
+ <msg timestamp="20110601 12:01:51.353"
level="WARN">simple</msg>
+ <status status="PASS" endtime="20110601
12:01:51.353" starttime="20110601 12:01:51.353"></status>
+ </kw>
+ <tags></tags>
+ <status status="PASS" endtime="20110601
12:01:51.354" critical="yes" starttime="20110601 12:01:51.353"></status>
+ </test>
+ <status status="PASS" endtime="20110601 12:01:51.354"
starttime="20110601 12:01:51.329"></status>
+ </suite>"""
+
def setUp(self):
self._context = Context()
self._handler = _RobotOutputHandler(self._context)
@@ -96,23 +113,7 @@
assert_equals(data_model._texts,
['*', '*Test', '*Log', '*Logging', '*simple'])
def test_suite_xml_parsing(self):
- suite_xml = """<suite source="/tmp/verysimple.txt"
name="Verysimple">
- <doc></doc>
- <metadata></metadata>
- <test name="Test" timeout="">
- <doc></doc>
- <kw type="kw" name="BuiltIn.Log" timeout="">
- <doc>Logs the given message with the given
level.</doc>
- <arguments><arg>simple</arg></arguments>
- <msg timestamp="20110601 12:01:51.353"
level="WARN">simple</msg>
- <status status="PASS" endtime="20110601
12:01:51.353" starttime="20110601 12:01:51.353"></status>
- </kw>
- <tags></tags>
- <status status="PASS" endtime="20110601
12:01:51.354" critical="yes" starttime="20110601 12:01:51.353"></status>
- </test>
- <status status="PASS" endtime="20110601 12:01:51.354"
starttime="20110601 12:01:51.329"></status>
- </suite>"""
- data_model = self._get_data_model(suite_xml)
+ data_model = self._get_data_model(self.SUITE_XML)
assert_equals(data_model._basemillis, 1306918911353)
assert_equals(data_model._robot_data,
['suite', '/tmp/verysimple.txt', 'Verysimple',
0, {},
@@ -122,6 +123,17 @@
assert_equals(data_model._texts,
['*', '*Test', '*BuiltIn.Log', '*Logs the given message with the given
level.', '*simple'])
assert_equals(self._context.link_to([0, 'W',
4]), 'keyword_Verysimple.Test.0')
+ def test_suite_data_model_keywords_clearing(self):
+ data_model = self._get_data_model(self.SUITE_XML)
+ data_model.remove_keywords()
+ assert_equals(data_model._basemillis, 1306918911353)
+ assert_equals(data_model._robot_data,
['suite', '/tmp/verysimple.txt', 'Verysimple',
+ 0, {},
+ ['test', 1, 0, 'Y', 0, [],
['P', 0, 1]],
+ ['P', -24, 25], [1, 1, 1,
1]])
+ assert_equals(data_model._texts,
['*', '*Test', '*BuiltIn.Log', '*Logs the given message with the given
level.', '*simple'])
+
+
def test_metadata_xml_parsing(self):
meta_xml = """<metadata>
<item name="meta"><b>escaped</b></item>
==============================================================================
Revision: 8d3c6664b245
Author: Mikko Korpela <[email protected]>
Date: Wed Jun 8 05:26:16 2011
Log: remove unneeded keyword information from report
http://code.google.com/p/robotframework/source/detail?r=8d3c6664b245
Modified:
/src/robot/serializing/jsparser.py
/utest/serializing/test_js_serializer.py
=======================================
--- /src/robot/serializing/jsparser.py Wed Jun 8 04:44:13 2011
+++ /src/robot/serializing/jsparser.py Wed Jun 8 05:26:16 2011
@@ -124,7 +124,12 @@
child.fail_all()
+class _TextIndex(int):
+ pass
+
+
class TextCache(object):
+ _zero_index = _TextIndex(0)
def __init__(self):
self.texts = {}
@@ -132,7 +137,7 @@
def add(self, text):
if not text:
- return 0
+ return self._zero_index
raw = self._raw(text)
if raw in self.texts:
return self.texts[raw]
@@ -140,7 +145,7 @@
if text not in self.texts:
self.texts[text] = self.index
self.index +=1
- return self.texts[text]
+ return _TextIndex(self.texts[text])
def _encode(self, text):
encoded = base64.b64encode(zlib.compress(text.encode('utf-8'), 9))
@@ -560,6 +565,7 @@
def remove_keywords(self):
self._robot_data = self._remove_keywords_from(self._robot_data)
+ self._prune_unused_texts()
def _remove_keywords_from(self, data):
if not isinstance(data, list):
@@ -569,6 +575,21 @@
def _is_keyword(self, item):
return isinstance(item, list) and item and item[0] in
['kw', 'setup', 'teardown']
+ def _prune_unused_texts(self):
+ used = self._collect_used_text_indices(self._robot_data, set())
+ self._texts = [text if index in used else '' for index, text in
enumerate(self._texts)]
+
+ def _collect_used_text_indices(self, data, result):
+ for item in data:
+ if isinstance(item, _TextIndex):
+ result.add(item)
+ elif isinstance(item, list):
+ self._collect_used_text_indices(item, result)
+ elif isinstance(item, dict):
+ self._collect_used_text_indices(item.values(), result)
+ return result
+
+
def encode_basestring(string):
def get_matching_char(c):
val = ord(c)
=======================================
--- /utest/serializing/test_js_serializer.py Wed Jun 8 04:44:13 2011
+++ /utest/serializing/test_js_serializer.py Wed Jun 8 05:26:16 2011
@@ -12,7 +12,9 @@
SUITE_XML = """<suite source="/tmp/verysimple.txt" name="Verysimple">
<doc></doc>
- <metadata></metadata>
+ <metadata>
+ <item name="key">val</item>
+ </metadata>
<test name="Test" timeout="">
<doc></doc>
<kw type="kw" name="BuiltIn.Log" timeout="">
@@ -116,22 +118,22 @@
data_model = self._get_data_model(self.SUITE_XML)
assert_equals(data_model._basemillis, 1306918911353)
assert_equals(data_model._robot_data,
['suite', '/tmp/verysimple.txt', 'Verysimple',
- 0, {},
- ['test', 1, 0, 'Y', 0,
- ['kw', 2, 0, 3, 4,
[0, 'W', 4], ['P', 0, 0]], [], ['P', 0, 1]],
- ['P', -24, 25], [1, 1, 1,
1]])
- assert_equals(data_model._texts,
['*', '*Test', '*BuiltIn.Log', '*Logs the given message with the given
level.', '*simple'])
- assert_equals(self._context.link_to([0, 'W',
4]), 'keyword_Verysimple.Test.0')
+ 0, {'key': 1},
+ ['test', 2, 0, 'Y', 0,
+ ['kw', 3, 0, 4, 5,
[0, 'W', 5], ['P', 0, 0]], [],
+ ['P', 0, 1]], ['P',
-24, 25], [1, 1, 1, 1]])
+ assert_equals(data_model._texts,
['*', '*val', '*Test', '*BuiltIn.Log', '*Logs the given message with the
given level.', '*simple'])
+ assert_equals(self._context.link_to([0, 'W',
5]), 'keyword_Verysimple.Test.0')
def test_suite_data_model_keywords_clearing(self):
data_model = self._get_data_model(self.SUITE_XML)
data_model.remove_keywords()
assert_equals(data_model._basemillis, 1306918911353)
assert_equals(data_model._robot_data,
['suite', '/tmp/verysimple.txt', 'Verysimple',
- 0, {},
- ['test', 1, 0, 'Y', 0, [],
['P', 0, 1]],
- ['P', -24, 25], [1, 1, 1,
1]])
- assert_equals(data_model._texts,
['*', '*Test', '*BuiltIn.Log', '*Logs the given message with the given
level.', '*simple'])
+ 0, {'key': 1},
+ ['test', 2, 0, 'Y', 0, [],
+ ['P', 0, 1]], ['P',
-24, 25], [1, 1, 1, 1]])
+ assert_equals(data_model._texts,
['*', '*val', '*Test', '', '', ''])
def test_metadata_xml_parsing(self):