Robot Framework Integrated Development Environment (RIDE)
xmllogger.py
Go to the documentation of this file.
1 # Copyright 2008-2015 Nokia Networks
2 # Copyright 2016- Robot Framework Foundation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 
16 from robotide.lib.robot.errors import DataError
17 from robotide.lib.robot.utils import XmlWriter, NullMarkupWriter, get_timestamp, unic
18 from robotide.lib.robot.version import get_full_version
19 from robotide.lib.robot.result.visitor import ResultVisitor
20 
21 from .loggerhelper import IsLogged
22 
23 
25 
26  def __init__(self, path, log_level='TRACE', rpa=False, generator='Robot'):
27  self._log_message_is_logged_log_message_is_logged = IsLogged(log_level)
28  self._error_message_is_logged_error_message_is_logged = IsLogged('WARN')
29  self._writer_writer = self._get_writer_get_writer(path, rpa, generator)
30  self._errors_errors = []
31 
32  def _get_writer(self, path, rpa, generator):
33  if not path:
34  return NullMarkupWriter()
35  try:
36  writer = XmlWriter(path, write_empty=False)
37  except EnvironmentError as err:
38  raise DataError("Opening output file '%s' failed: %s" %
39  (path, err.strerror))
40  writer.start('robot', {'generator': get_full_version(generator),
41  'generated': get_timestamp(),
42  'rpa': 'true' if rpa else 'false'})
43  return writer
44 
45  def close(self):
46  self.start_errorsstart_errorsstart_errors()
47  for msg in self._errors_errors:
48  self._write_message_write_message(msg)
49  self.end_errorsend_errorsend_errors()
50  self._writer_writer.end('robot')
51  self._writer_writer.close()
52 
53  def set_log_level(self, level):
54  return self._log_message_is_logged_log_message_is_logged.set_level(level)
55 
56  def message(self, msg):
57  if self._error_message_is_logged_error_message_is_logged(msg.level):
58  self._errors_errors.append(msg)
59 
60  def log_message(self, msg):
61  if self._log_message_is_logged_log_message_is_logged(msg.level):
62  self._write_message_write_message(msg)
63 
64  def _write_message(self, msg):
65  attrs = {'timestamp': msg.timestamp or 'N/A', 'level': msg.level}
66  if msg.html:
67  attrs['html'] = 'yes'
68  self._writer_writer.element('msg', msg.message, attrs)
69 
70  def start_keyword(self, kw):
71  attrs = {'name': kw.kwname, 'library': kw.libname}
72  if kw.type != 'kw':
73  attrs['type'] = kw.type
74  self._writer_writer.start('kw', attrs)
75  self._write_list_write_list('tags', 'tag', [unic(t) for t in kw.tags])
76  self._writer_writer.element('doc', kw.doc)
77  self._write_list_write_list('arguments', 'arg', [unic(a) for a in kw.args])
78  self._write_list_write_list('assign', 'var', kw.assign)
79 
80  def end_keyword(self, kw):
81  if kw.timeout:
82  self._writer_writer.element('timeout', attrs={'value': unic(kw.timeout)})
83  self._write_status_write_status(kw)
84  self._writer_writer.end('kw')
85 
86  def start_test(self, test):
87  self._writer_writer.start('test', {'id': test.id, 'name': test.name})
88 
89  def end_test(self, test):
90  self._writer_writer.element('doc', test.doc)
91  self._write_list_write_list('tags', 'tag', test.tags)
92  if test.timeout:
93  self._writer_writer.element('timeout', attrs={'value': unic(test.timeout)})
94  self._write_status_write_status(test, {'critical': 'yes' if test.critical else 'no'})
95  self._writer_writer.end('test')
96 
97  def start_suite(self, suite):
98  attrs = {'id': suite.id, 'name': suite.name, 'source': suite.source}
99  self._writer_writer.start('suite', attrs)
100 
101  def end_suite(self, suite):
102  self._writer_writer.element('doc', suite.doc)
103  if suite.metadata:
104  self._write_metadata_write_metadata(suite.metadata)
105  self._write_status_write_status(suite)
106  self._writer_writer.end('suite')
107 
108  def _write_metadata(self, metadata):
109  self._writer_writer.start('metadata')
110  for name, value in metadata.items():
111  self._writer_writer.element('item', value, {'name': name})
112  self._writer_writer.end('metadata')
113 
114  def start_statistics(self, stats):
115  self._writer_writer.start('statistics')
116 
117  def end_statistics(self, stats):
118  self._writer_writer.end('statistics')
119 
120  def start_total_statistics(self, total_stats):
121  self._writer_writer.start('total')
122 
123  def end_total_statistics(self, total_stats):
124  self._writer_writer.end('total')
125 
126  def start_tag_statistics(self, tag_stats):
127  self._writer_writer.start('tag')
128 
129  def end_tag_statistics(self, tag_stats):
130  self._writer_writer.end('tag')
131 
132  def start_suite_statistics(self, tag_stats):
133  self._writer_writer.start('suite')
134 
135  def end_suite_statistics(self, tag_stats):
136  self._writer_writer.end('suite')
137 
138  def visit_stat(self, stat):
139  self._writer_writer.element('stat', stat.name,
140  stat.get_attributes(values_as_strings=True))
141 
142  def start_errors(self, errors=None):
143  self._writer_writer.start('errors')
144 
145  def end_errors(self, errors=None):
146  self._writer_writer.end('errors')
147 
148  def _write_list(self, container_tag, item_tag, items):
149  if items:
150  self._writer_writer.start(container_tag)
151  for item in items:
152  self._writer_writer.element(item_tag, item)
153  self._writer_writer.end(container_tag)
154 
155  def _write_status(self, item, extra_attrs=None):
156  attrs = {'status': item.status, 'starttime': item.starttime or 'N/A',
157  'endtime': item.endtime or 'N/A'}
158  if not (item.starttime and item.endtime):
159  attrs['elapsedtime'] = str(item.elapsedtime)
160  if extra_attrs:
161  attrs.update(extra_attrs)
162  self._writer_writer.element('status', item.message, attrs)
Used when variable does not exist.
Definition: errors.py:67
def _write_list(self, container_tag, item_tag, items)
Definition: xmllogger.py:148
def __init__(self, path, log_level='TRACE', rpa=False, generator='Robot')
Definition: xmllogger.py:26
def _write_status(self, item, extra_attrs=None)
Definition: xmllogger.py:155
def start_keyword(self, kw)
Called when keyword starts.
Definition: xmllogger.py:70
def start_test(self, test)
Called when test starts.
Definition: xmllogger.py:86
def start_suite(self, suite)
Called when suite starts.
Definition: xmllogger.py:97
def end_keyword(self, kw)
Called when keyword ends.
Definition: xmllogger.py:80
def end_test(self, test)
Called when test ends.
Definition: xmllogger.py:89
def end_suite(self, suite)
Called when suite ends.
Definition: xmllogger.py:101
def end_total_statistics(self, total_stats)
Definition: xmllogger.py:123
def start_total_statistics(self, total_stats)
Definition: xmllogger.py:120
def _get_writer(self, path, rpa, generator)
Definition: xmllogger.py:32
Abstract class to conveniently travel :class:~robot.result.executionresult.Result objects.
Definition: visitor.py:41
def get_timestamp(daysep='', daytimesep=' ', timesep=':', millissep='.')
Definition: robottime.py:296
def get_full_version(program=None, naked=False)
Definition: version.py:30