Robot Framework
loggerhelper.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 robot.errors import DataError
17 from robot.model import Message as BaseMessage
18 from robot.utils import get_timestamp, is_string, safe_str
19 
20 
21 LEVELS = {
22  'NONE' : 7,
23  'SKIP' : 6,
24  'FAIL' : 5,
25  'ERROR' : 4,
26  'WARN' : 3,
27  'INFO' : 2,
28  'DEBUG' : 1,
29  'TRACE' : 0,
30 }
31 
32 
34 
35  def __init__(self, level='TRACE'):
36  self._is_logged_is_logged = IsLogged(level)
37 
38  def set_level(self, level):
39  return self._is_logged_is_logged.set_level(level)
40 
41  def trace(self, msg):
42  self.writewrite(msg, 'TRACE')
43 
44  def debug(self, msg):
45  self.writewrite(msg, 'DEBUG')
46 
47  def info(self, msg):
48  self.writewrite(msg, 'INFO')
49 
50  def warn(self, msg):
51  self.writewrite(msg, 'WARN')
52 
53  def fail(self, msg):
54  html = False
55  if msg.startswith("*HTML*"):
56  html = True
57  msg = msg[6:].lstrip()
58  self.writewrite(msg, 'FAIL', html)
59 
60  def skip(self, msg):
61  html = False
62  if msg.startswith("*HTML*"):
63  html = True
64  msg = msg[6:].lstrip()
65  self.writewrite(msg, 'SKIP', html)
66 
67  def error(self, msg):
68  self.writewrite(msg, 'ERROR')
69 
70  def write(self, message, level, html=False):
71  self.messagemessage(Message(message, level, html))
72 
73  def message(self, msg):
74  raise NotImplementedError(self.__class__)
75 
76 
78  __slots__ = ['_message']
79 
80  def __init__(self, message, level='INFO', html=False, timestamp=None):
81  message = self._normalize_message_normalize_message(message)
82  level, html = self._get_level_and_html_get_level_and_html(level, html)
83  timestamp = timestamp or get_timestamp()
84  super().__init__(message, level, html, timestamp)
85 
86  def _normalize_message(self, msg):
87  if callable(msg):
88  return msg
89  if not is_string(msg):
90  msg = safe_str(msg)
91  if '\r\n' in msg:
92  msg = msg.replace('\r\n', '\n')
93  return msg
94 
95  def _get_level_and_html(self, level, html):
96  level = level.upper()
97  if level == 'HTML':
98  return 'INFO', True
99  if level not in LEVELS:
100  raise DataError("Invalid log level '%s'." % level)
101  return level, html
102 
103  @property
104  message = property
105 
106  def message(self):
107  self.resolve_delayed_messageresolve_delayed_message()
108  return self._message_message
109 
110  @message.setter
111 
112  def message(self, message):
113  self._message_message = message
114 
115  def resolve_delayed_message(self):
116  if callable(self._message_message):
117  self._message_message = self._message_message()
118 
119 
120 class IsLogged:
121 
122  def __init__(self, level):
123  self.levellevel = level.upper()
124  self._int_level_int_level = self._level_to_int_level_to_int(level)
125 
126  def __call__(self, level):
127  return self._level_to_int_level_to_int(level) >= self._int_level_int_level
128 
129  def set_level(self, level):
130  old = self.levellevel
131  self.__init____init__(level)
132  return old
133 
134  def _level_to_int(self, level):
135  try:
136  return LEVELS[level.upper()]
137  except KeyError:
138  raise DataError("Invalid log level '%s'." % level)
139 
140 
142 
145  _methods = None
146 
149  _no_method = lambda *args: None
150 
151  def __init__(self, logger, method_names=None, prefix=None):
152  self.loggerlogger = logger
153  for name in method_names or self._methods_methods:
154  # Allow extending classes to implement some of the messages themselves.
155  if hasattr(self, name):
156  if hasattr(logger, name):
157  continue
158  target = logger
159  else:
160  target = self
161  setattr(target, name, self._get_method_get_method(logger, name, prefix))
162 
163  def _get_method(self, logger, name, prefix):
164  for method_name in self._get_method_names_get_method_names(name, prefix):
165  if hasattr(logger, method_name):
166  return getattr(logger, method_name)
167  return self._no_method_no_method
168 
169  def _get_method_names(self, name, prefix):
170  names = [name, self._toCamelCase_toCamelCase(name)] if '_' in name else [name]
171  if prefix:
172  names += [prefix + name for name in names]
173  return names
174 
175  def _toCamelCase(self, name):
176  parts = name.split('_')
177  return ''.join([parts[0]] + [part.capitalize() for part in parts[1:]])
A message created during the test execution.
Definition: message.py:27
def __init__(self, message='', level='INFO', html=False, timestamp=None, parent=None)
Definition: message.py:32
def _get_method(self, logger, name, prefix)
def __init__(self, logger, method_names=None, prefix=None)
def __init__(self, level='TRACE')
Definition: loggerhelper.py:35
def write(self, message, level, html=False)
Definition: loggerhelper.py:70
def _get_level_and_html(self, level, html)
Definition: loggerhelper.py:95
def get_timestamp(daysep='', daytimesep=' ', timesep=':', millissep='.')
Definition: robottime.py:335
def safe_str(item)
Definition: unic.py:21