19 from robot.utils import Importer, is_string, split_args_from_name_or_path, type_name
21 from .listenermethods
import ListenerMethods, LibraryListenerMethods
22 from .loggerhelper
import AbstractLoggerProxy, IsLogged
23 from .logger
import LOGGER
30 _method_names = (
'start_suite',
'end_suite',
'start_test',
'end_test',
31 'start_keyword',
'end_keyword',
'log_message',
'message',
32 'output_file',
'report_file',
'log_file',
'debug_file',
33 'xunit_file',
'library_import',
'resource_import',
34 'variables_import',
'close')
36 def __init__(self, listeners, log_level='INFO'):
38 listeners = ListenerProxy.import_listeners(listeners,
42 if name.endswith((
'_keyword',
'_file',
'_import',
'log_message')):
44 setattr(self, name, method)
50 if kw.type
not in (kw.IF_ELSE_ROOT, kw.TRY_EXCEPT_ROOT):
51 self._start_keyword(kw)
54 if kw.type
not in (kw.IF_ELSE_ROOT, kw.TRY_EXCEPT_ROOT):
59 self._log_message(msg)
62 method = getattr(self,
'_%s_import' % import_type.lower())
66 method = getattr(self,
'_%s_file' % file_type.lower())
70 return any(isinstance(method, ListenerMethods)
and method
71 for method
in self.__dict__.values())
78 _method_names = (
'start_suite',
'end_suite',
'start_test',
'end_test',
79 'start_keyword',
'end_keyword',
'log_message',
'message',
86 if name ==
'log_message':
88 setattr(self, name, method)
91 listeners = ListenerProxy.import_listeners(listeners,
96 method.register(listeners, library)
99 return [method
for method
in self.__dict__.values()
100 if isinstance(method, LibraryListenerMethods)]
104 self.close(library=library)
106 method.unregister(library)
110 method.new_suite_scope()
114 method.discard_suite_scope()
121 self._log_message(msg)
130 class ListenerProxy(AbstractLoggerProxy):
136 def __init__(self, listener, method_names, prefix=None):
138 AbstractLoggerProxy.__init__(self, listener, method_names, prefix)
148 name = getattr(listener,
'__name__',
None)
or type_name(listener)
149 return listener, name
151 importer = Importer(
'listener', logger=LOGGER)
152 listener = importer.import_class_or_module(os.path.normpath(name),
153 instantiate_with_args=args)
154 return listener, name
158 version = int(listener.ROBOT_LISTENER_API_VERSION)
159 if version
not in (2, 3):
161 except AttributeError:
162 raise DataError(
"Listener '%s' does not have mandatory "
163 "'ROBOT_LISTENER_API_VERSION' attribute."
165 except (ValueError, TypeError):
166 raise DataError(
"Listener '%s' uses unsupported API version '%s'."
167 % (self.
namename, listener.ROBOT_LISTENER_API_VERSION))
172 raise_on_error=False):
174 for listener
in listeners:
176 imported.append(cls(listener, method_names, prefix))
177 except DataError
as err:
179 msg =
"Taking listener '%s' into use failed: %s" % (name, err)
def log_message(self, msg)
def imported(self, import_type, name, attrs)
def output_file(self, file_type, path)
def _listener_methods(self)
def unregister(self, library, close=False)
def new_suite_scope(self)
def discard_suite_scope(self)
def set_log_level(self, level)
def register(self, listeners, library)
def __init__(self, log_level='INFO')
def _get_version(self, listener)
def __init__(self, listener, method_names, prefix=None)
def import_listeners(cls, listeners, method_names, prefix=None, raise_on_error=False)
def _import_listener(self, listener)
def start_keyword(self, kw)
def output_file(self, file_type, path)
def set_log_level(self, level)
def log_message(self, msg)
def __init__(self, listeners, log_level='INFO')
def end_keyword(self, kw)
def imported(self, import_type, name, attrs)
def type_name(item, capitalize=False)
Return "non-technical" type name for objects and types.
def split_args_from_name_or_path(name)
Split arguments embedded to name or path like Example:arg1:arg2.