Skip to content

Commit cbb3b8f

Browse files
committed
Remote: Cleanup getting all library info.
Related to issue robotframework#3362 and PR robotframework#3802.
1 parent db0519c commit cbb3b8f

File tree

4 files changed

+67
-54
lines changed

4 files changed

+67
-54
lines changed

atest/robot/standard_libraries/remote/library_info.robot

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,19 @@ Resource remote_resource.robot
55
*** Test Cases ***
66
Load large library
77
Check Test Case ${TESTNAME}
8+
9+
Arguments
10+
Check Test Case ${TESTNAME}
11+
12+
Types
13+
Check Test Case ${TESTNAME}
14+
15+
Documentation
16+
${tc} = Check Test Case Types
17+
Should Be Equal ${tc.body[0].doc} Documentation for 'some_keyword'.
18+
Should Be Equal ${tc.body[4].doc} Documentation for 'keyword_42'.
19+
20+
Tags
21+
${tc} = Check Test Case Types
22+
Should Be Equal As Strings ${tc.body[0].tags} [some_keyword, tag]
23+
Should Be Equal As Strings ${tc.body[4].tags} [keyword_42, tag]

atest/testdata/standard_libraries/remote/library_info.robot

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,25 @@ ${PORT} 8270
77

88
*** Test Cases ***
99
Load large library
10-
${ret}= some keyword
11-
Should be equal ${ret} some
12-
${ret}= keyword 7777
13-
Should be equal ${ret} 7777
10+
${ret} = Keyword 0
11+
Should be equal ${ret} 0
12+
${ret} = Keyword 9999
13+
Should be equal ${ret} 9999
14+
15+
Arguments
16+
[Documentation] FAIL Keyword 'Remote.Keyword 0' expected 0 to 1 arguments, got 2.
17+
Some Keyword
18+
Some Keyword a
19+
Some Keyword a b
20+
Some Keyword a b c d e
21+
Keyword 0
22+
Keyword 0 1
23+
Keyword 0 1 2
24+
25+
Types
26+
${ret} = Some keyword true
27+
Should be equal ${ret} yes
28+
${ret} = Some keyword false
29+
Should be equal ${ret} no
30+
${ret} = Keyword 42 -42
31+
Should be equal ${ret} ${-42}

atest/testdata/standard_libraries/remote/libraryinfo.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,21 @@ def _register_functions(self):
1616
def get_library_information(self):
1717
info_dict = dict()
1818
for kw in self.get_keyword_names():
19-
info_dict[kw] = dict(args=self.get_keyword_arguments(kw),
20-
tags=self.get_keyword_tags(kw),
21-
doc=self.get_keyword_documentation(kw))
19+
info_dict[kw] = dict(args=['*args'] if kw == 'some_keyword' else ['arg=None'],
20+
doc="Documentation for '%s'." % kw,
21+
tags=['tag', kw],
22+
types=['bool'] if kw == 'some_keyword' else ['int'])
2223
return info_dict
2324

25+
2426
class The10001KeywordsLibrary(object):
2527

2628
def __init__(self):
27-
def count(n): return lambda: "%d"%n
2829
for i in range(10000):
29-
setattr(self, "keyword_%d"%i, count(i))
30+
setattr(self, 'keyword_%d' % i, lambda result=str(i): result)
3031

31-
def some_keyword(self):
32-
return "some"
32+
def some_keyword(self, arg=True, *extra):
33+
return 'yes' if arg else 'no'
3334

3435

3536
if __name__ == '__main__':

src/robot/libraries/Remote.py

Lines changed: 21 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -65,63 +65,41 @@ def __init__(self, uri='http://127.0.0.1:8270', timeout=None):
6565
timeout = timestr_to_secs(timeout)
6666
self._uri = uri
6767
self._client = XmlRpcRemoteClient(uri, timeout)
68-
self._kw_cache = None
69-
70-
def _cached(info_type=None, default=None):
71-
def decorator(f):
72-
@wraps(f)
73-
def wrapper(self, name=None):
74-
if self._kw_cache:
75-
return self._kw_cache.get(info_type, dict()).get(name, default)
76-
else:
77-
try:
78-
return f(self, name)
79-
except TypeError:
80-
return default
81-
return wrapper
82-
return decorator
83-
84-
def _build_kw_info_cache(self):
85-
"""
86-
Single attempt to build the cache using get_library_information interface
87-
cache structure:
88-
{ "keyword_name" : { 'args':[], 'tags':[], 'doc':"", 'types':[]},
89-
"kw2" : {...}, etc. }
90-
"""
91-
try:
92-
self._kw_cache = self._client.get_library_information()
93-
self._kw_cache['__intro__'] = dict(
94-
doc=self._client.get_keyword_documentation('__intro__'))
95-
self._kw_cache['__init__'] = dict(
96-
doc=self._client.get_keyword_documentation('__init__'))
97-
except TypeError:
98-
pass # Best effort failed, fall back to regular loading
68+
self._lib_info = None
9969

10070
def get_keyword_names(self):
101-
self._build_kw_info_cache()
102-
if self._kw_cache:
103-
return self._kw_cache.keys()
71+
try:
72+
self._lib_info = self._client.get_library_information()
73+
except TypeError:
74+
pass
75+
else:
76+
return self._lib_info.keys()
10477
try:
10578
return self._client.get_keyword_names()
10679
except TypeError as error:
10780
raise RuntimeError('Connecting remote server at %s failed: %s'
10881
% (self._uri, error))
10982

110-
@_cached('args', default=['*args'])
11183
def get_keyword_arguments(self, name):
112-
return self._client.get_keyword_arguments(name)
84+
return self._get_kw_info(name, 'args', self._client.get_keyword_arguments,
85+
default=['*args'])
86+
87+
def _get_kw_info(self, kw, info, getter, default=None):
88+
if self._lib_info is not None:
89+
return self._lib_info[kw].get(info, default)
90+
try:
91+
return getter(kw)
92+
except TypeError:
93+
return default
11394

114-
@_cached('types')
11595
def get_keyword_types(self, name):
116-
return self._client.get_keyword_types(name)
96+
return self._get_kw_info(name, 'types', self._client.get_keyword_types)
11797

118-
@_cached('tags')
11998
def get_keyword_tags(self, name):
120-
return self._client.get_keyword_tags(name)
99+
return self._get_kw_info(name, 'tags', self._client.get_keyword_tags)
121100

122-
@_cached('doc')
123101
def get_keyword_documentation(self, name):
124-
return self._client.get_keyword_documentation(name)
102+
return self._get_kw_info(name, 'doc', self._client.get_keyword_documentation)
125103

126104
def run_keyword(self, name, args, kwargs):
127105
coercer = ArgumentCoercer()
@@ -258,7 +236,7 @@ def get_library_information(self):
258236
def get_keyword_names(self):
259237
with self._server as server:
260238
return server.get_keyword_names()
261-
239+
262240
def get_keyword_arguments(self, name):
263241
with self._server as server:
264242
return server.get_keyword_arguments(name)

0 commit comments

Comments
 (0)