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