Robot Framework
listenermethods.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 TimeoutError
17 from robot.utils import get_error_details
18 
19 from .listenerarguments import ListenerArguments
20 from .logger import LOGGER
21 
22 
24 
25  def __init__(self, method_name, listeners):
26  self._methods_methods = []
27  self._method_name_method_name = method_name
28  if listeners:
29  self._register_methods_register_methods(method_name, listeners)
30 
31  def _register_methods(self, method_name, listeners):
32  for listener in listeners:
33  method = getattr(listener, method_name)
34  if method:
35  self._methods_methods.append(ListenerMethod(method, listener))
36 
37  def __call__(self, *args):
38  if self._methods_methods:
39  args = ListenerArguments.by_method_name(self._method_name_method_name, args)
40  for method in self._methods_methods:
41  method(args.get_arguments(method.version))
42 
43  def __bool__(self):
44  return bool(self._methods_methods)
45 
46 
48 
49  def __init__(self, method_name):
50  self._method_stack_method_stack = []
51  self._method_name_method_name = method_name
52 
53  def new_suite_scope(self):
54  self._method_stack_method_stack.append([])
55 
57  self._method_stack_method_stack.pop()
58 
59  def register(self, listeners, library):
60  methods = self._method_stack_method_stack[-1]
61  for listener in listeners:
62  method = getattr(listener, self._method_name_method_name)
63  if method:
64  info = ListenerMethod(method, listener, library)
65  methods.append(info)
66 
67  def unregister(self, library):
68  methods = [m for m in self._method_stack_method_stack[-1] if m.library is not library]
69  self._method_stack_method_stack[-1] = methods
70 
71  def __call__(self, *args, **conf):
72  methods = self._get_methods_get_methods(**conf)
73  if methods:
74  args = ListenerArguments.by_method_name(self._method_name_method_name, args)
75  for method in methods:
76  method(args.get_arguments(method.version))
77 
78  def _get_methods(self, library=None):
79  if not (self._method_stack_method_stack and self._method_stack_method_stack[-1]):
80  return []
81  methods = self._method_stack_method_stack[-1]
82  if library:
83  return [m for m in methods if m.library is library]
84  return methods
85 
86 
88  # Flag to avoid recursive listener calls.
89  called = False
90 
91  def __init__(self, method, listener, library=None):
92  self.methodmethod = method
93  self.listener_namelistener_name = listener.name
94  self.versionversion = listener.version
95  self.librarylibrary = library
96 
97  def __call__(self, args):
98  if self.calledcalled:
99  return
100  try:
101  ListenerMethod.called = True
102  self.methodmethod(*args)
103  except TimeoutError:
104  # Propagate possible timeouts:
105  # https://github.com/robotframework/robotframework/issues/2763
106  raise
107  except:
108  message, details = get_error_details()
109  LOGGER.error("Calling method '%s' of listener '%s' failed: %s"
110  % (self.methodmethod.__name__, self.listener_namelistener_name, message))
111  LOGGER.info("Details:\n%s" % details)
112  finally:
113  ListenerMethod.called = False
def __init__(self, method, listener, library=None)
def _register_methods(self, method_name, listeners)
def __init__(self, method_name, listeners)
def get_error_details(full_traceback=True, exclude_robot_traces=EXCLUDE_ROBOT_TRACES)
Returns error message and details of the last occurred exception.
Definition: error.py:39