Skip to content

Commit 8041ef6

Browse files
Snooz82aaltat
authored andcommitted
added automatic listener detection
Signed-off-by: René <[email protected]>
1 parent c086ef3 commit 8041ef6

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed

atest/ListenerCore.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from robot.api import logger
2+
3+
4+
from robotlibcore import DynamicCore, keyword
5+
6+
7+
class ListenerCore(DynamicCore):
8+
9+
ROBOT_LIBRARY_SCOPE = 'GLOBAL'
10+
11+
def __init__(self):
12+
self.keyword_name = None
13+
self.keyword_args = {}
14+
self.ROBOT_LISTENER_API_VERSION = 2
15+
second_comp = SecondComponent()
16+
self.ROBOT_LIBRARY_LISTENER = second_comp.listener
17+
components = [FirstComponent(), second_comp]
18+
super().__init__(components)
19+
20+
@keyword
21+
def listener_core(self, arg: str):
22+
logger.info(arg)
23+
assert arg == self.keyword_args.get("args", [None])[0], "First argument should be detected by listener, but was not."
24+
25+
def start_keyword(self, name, args):
26+
self.keyword_name = name
27+
self.keyword_args = args
28+
logger.info(f"start: {name}")
29+
30+
31+
class FirstComponent:
32+
33+
def __init__(self):
34+
self.ROBOT_LISTENER_API_VERSION = 2
35+
self.suite_name = ''
36+
37+
def _start_suite(self, name, attrs):
38+
self.suite_name = name
39+
logger.console(f"start suite: {name}")
40+
41+
@keyword
42+
def first_component(self, arg: str):
43+
logger.info(arg)
44+
assert arg == self.suite_name, f"Suite name '{self.suite_name}' should be detected by listener, but was not."
45+
46+
47+
class SecondComponent:
48+
49+
def __init__(self):
50+
self.listener = ExternalListener()
51+
52+
@keyword
53+
def second_component(self, arg: str):
54+
logger.info(arg)
55+
assert self.listener.test.name == arg, "Test case name should be detected by listener, but was not."
56+
57+
58+
class ExternalListener:
59+
60+
ROBOT_LISTENER_API_VERSION = 3
61+
62+
def __init__(self):
63+
self.test = None
64+
65+
def start_test(self, test, _):
66+
self.test = test

atest/tests_listener.robot

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
*** Settings ***
2+
Library ListenerCore.py
3+
4+
5+
*** Test Cases ***
6+
Automatic Listener
7+
Listener Core This is the first Argument
8+
9+
External Listener
10+
Second Component External Listener
11+
12+
No Listener
13+
First Component Tests Listener

src/robotlibcore.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def __init__(self, library_components):
4545
self.attributes = {}
4646
self.add_library_components(library_components)
4747
self.add_library_components([self])
48+
self._set_library_listeners(library_components)
4849

4950
def add_library_components(self, library_components):
5051
self.keywords_spec["__init__"] = KeywordBuilder.build(self.__init__)
@@ -59,6 +60,39 @@ def add_library_components(self, library_components):
5960
# method names as well as possible custom names.
6061
self.attributes[name] = self.attributes[kw_name] = kw
6162

63+
def _set_library_listeners(self, library_components):
64+
listeners = self._get_component_listeners(library_components)
65+
listeners = self._insert_manually_registered_listeners(listeners)
66+
listeners = self._insert_self_to_listeners(listeners)
67+
if listeners:
68+
self.ROBOT_LIBRARY_LISTENER = listeners
69+
70+
def _insert_self_to_listeners(self, component_listeners):
71+
if self not in component_listeners:
72+
try:
73+
getattr(self, "ROBOT_LISTENER_API_VERSION")
74+
return [self, *component_listeners]
75+
except AttributeError:
76+
pass
77+
return component_listeners
78+
79+
def _insert_manually_registered_listeners(self, component_listeners: list) -> list:
80+
try:
81+
manually_registered_listener = getattr(self, "ROBOT_LIBRARY_LISTENER")
82+
try:
83+
return [*manually_registered_listener, *component_listeners]
84+
except TypeError:
85+
return [manually_registered_listener, *component_listeners]
86+
except AttributeError:
87+
return component_listeners
88+
89+
def _get_component_listeners(self, library_listeners):
90+
return [
91+
component
92+
for component in library_listeners
93+
if hasattr(component, "ROBOT_LISTENER_API_VERSION")
94+
]
95+
6296
def __get_members(self, component):
6397
if inspect.ismodule(component):
6498
return inspect.getmembers(component)

0 commit comments

Comments
 (0)