Skip to content

Commit b8e5b3e

Browse files
committed
Support get_keyword_tags method. Fixes robotframework#38
1 parent b0ece5a commit b8e5b3e

File tree

4 files changed

+54
-33
lines changed

4 files changed

+54
-33
lines changed

README.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ Supported library APIs
3737
Starting from the remote server version 1.1, Robot Framework's `static,
3838
hybrid and dynamic library APIs`__ are all supported. This includes setting
3939
custom name and tags for keywords using the `robot.api.deco.keyword`__
40-
decorator. Earlier versions support only the static and hybrid APIs and do
41-
not support the keyword decorator.
40+
decorator, although the support for tags requires using Robot Framework 3.0.2
41+
or newer. Earlier remote server versions support only the static and hybrid
42+
APIs and do not support the keyword decorator at all.
4243

4344
For most parts these APIs work exactly like when using with Robot Framework
4445
normally. There main limitation is that logging using ``robot.api.logger`` or

src/robotremoteserver.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,11 @@ def get_keyword_documentation(self, name):
184184
'Return ``True/False`` depending was server stopped or not.')
185185
return self._library.get_keyword_documentation(name)
186186

187+
def get_keyword_tags(self, name):
188+
if name == 'stop_remote_server':
189+
return []
190+
return self._library.get_keyword_tags(name)
191+
187192

188193
class StoppableXMLRPCServer(SimpleXMLRPCServer):
189194
allow_reuse_address = True
@@ -320,11 +325,7 @@ def get_keyword_documentation(self, name):
320325
init = self._get_init(self._library)
321326
return inspect.getdoc(init) or ''
322327
keyword = self._get_keyword(name)
323-
doc = (inspect.getdoc(keyword) or '').lstrip()
324-
if getattr(keyword, 'robot_tags', []):
325-
tags = 'Tags: %s' % ', '.join(keyword.robot_tags)
326-
doc = '%s\n\n%s' % (doc, tags) if doc else tags
327-
return doc
328+
return inspect.getdoc(keyword) or ''
328329

329330
def _get_init(self, library):
330331
if inspect.ismodule(library):
@@ -342,6 +343,10 @@ def _is_valid_init(self, init):
342343
return init is not object.__init__
343344
return is_function_or_method(init)
344345

346+
def get_keyword_tags(self, name):
347+
keyword = self._get_keyword(name)
348+
return getattr(keyword, 'robot_tags', [])
349+
345350

346351
class HybridRemoteLibrary(StaticRemoteLibrary):
347352

@@ -360,6 +365,8 @@ def __init__(self, library, get_keyword_names, run_keyword):
360365
= dynamic_method(library, 'get_keyword_arguments')
361366
self._get_keyword_documentation \
362367
= dynamic_method(library, 'get_keyword_documentation')
368+
self._get_keyword_tags \
369+
= dynamic_method(library, 'get_keyword_tags')
363370

364371
def _get_kwargs_support(self, run_keyword):
365372
spec = inspect.getargspec(run_keyword)
@@ -381,6 +388,11 @@ def get_keyword_documentation(self, name):
381388
return self._get_keyword_documentation(name)
382389
return ''
383390

391+
def get_keyword_tags(self, name):
392+
if self._get_keyword_tags:
393+
return self._get_keyword_tags(name)
394+
return []
395+
384396

385397
class KeywordRunner(object):
386398

test/utest/test_dynamicargsdocs.py renamed to test/utest/test_dynamicargsdoctags.py

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from robotremoteserver import RemoteLibraryFactory
44

55

6-
class OwnArgsAndDocs(object):
6+
class OwnArgsDocTags(object):
77

88
def get_keyword_names(self):
99
return ['keyword']
@@ -17,8 +17,11 @@ def get_keyword_arguments(self, name):
1717
def get_keyword_documentation(self, name):
1818
return 'The doc for %s' % name
1919

20+
def get_keyword_tags(self, name):
21+
return [name, 'tags']
2022

21-
class OwnArgsAndDocsWithCamelCaseNames(object):
23+
24+
class OwnArgsDocTagsWithCamelCaseNames(object):
2225

2326
def getKeywordNames(self):
2427
return ['keyword']
@@ -32,8 +35,11 @@ def getKeywordArguments(self, name):
3235
def getKeywordDocumentation(self, name):
3336
return 'The doc for %s' % name
3437

38+
def getKeywordTags(self, name):
39+
return [name, 'tags']
40+
3541

36-
class NoArgsOrDocs(object):
42+
class NoArgsDocTags(object):
3743

3844
def get_keyword_names(self):
3945
return ['keyword']
@@ -42,7 +48,7 @@ def run_keyword(self, name, args, kwargs=None):
4248
pass
4349

4450

45-
class NoArgsOrDocsWithoutKwargs(object):
51+
class NoArgsDocTagsWithoutKwargs(object):
4652

4753
def get_keyword_names(self):
4854
return ['keyword']
@@ -51,10 +57,10 @@ def run_keyword(self, name, args):
5157
pass
5258

5359

54-
class TestOwnArgsAndDocs(unittest.TestCase):
60+
class TestOwnArgsDocTags(unittest.TestCase):
5561

5662
def setUp(self):
57-
self.lib = RemoteLibraryFactory(OwnArgsAndDocs())
63+
self.lib = RemoteLibraryFactory(OwnArgsDocTags())
5864

5965
def test_arguments(self):
6066
self.assertEqual(self.lib.get_keyword_arguments('keyword'),
@@ -64,34 +70,36 @@ def test_documentation(self):
6470
self.assertEqual(self.lib.get_keyword_documentation('keyword'),
6571
'The doc for keyword')
6672

73+
def test_tags(self):
74+
self.assertEqual(self.lib.get_keyword_tags('keyword'),
75+
['keyword', 'tags'])
6776

68-
class TestOwnArgsAndDocsWithCamelCaseNames(TestOwnArgsAndDocs):
77+
78+
class TestOwnArgsDocTagsWithCamelCaseNames(TestOwnArgsDocTags):
6979

7080
def setUp(self):
71-
self.lib = RemoteLibraryFactory(OwnArgsAndDocsWithCamelCaseNames())
81+
self.lib = RemoteLibraryFactory(OwnArgsDocTagsWithCamelCaseNames())
7282

7383

74-
class TestNoArgsOrDocs(unittest.TestCase):
84+
class TestNoArgsDocTags(unittest.TestCase):
7585

7686
def setUp(self):
77-
self.lib = RemoteLibraryFactory(NoArgsOrDocs())
87+
self.lib = RemoteLibraryFactory(NoArgsDocTags())
7888

79-
def test_arguments(self):
89+
def test_arguments_with_kwargs(self):
8090
self.assertEqual(self.lib.get_keyword_arguments('keyword'),
8191
['*varargs', '**kwargs'])
8292

93+
def test_arguments_without_kwargs(self):
94+
self.lib = RemoteLibraryFactory(NoArgsDocTagsWithoutKwargs())
95+
self.assertEqual(self.lib.get_keyword_arguments('keyword'),
96+
['*varargs'])
97+
8398
def test_documentation(self):
8499
self.assertEqual(self.lib.get_keyword_documentation('keyword'), '')
85100

86-
87-
class TestNoArgsOrDocsWithoutKwargs(unittest.TestCase):
88-
89-
def setUp(self):
90-
self.lib = RemoteLibraryFactory(NoArgsOrDocsWithoutKwargs())
91-
92-
def test_arguments(self):
93-
self.assertEqual(self.lib.get_keyword_arguments('keyword'),
94-
['*varargs'])
101+
def test_tags(self):
102+
self.assertEqual(self.lib.get_keyword_tags('keyword'), [])
95103

96104

97105
if __name__ == '__main__':

test/utest/test_keyword_decorator.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ def setUp(self):
1111
self.server = NonServingRemoteServer(KeywordDecorator())
1212

1313
def test_tags(self):
14-
self._assert_keyword_doc('tags', 'Tags: tag1, tag2')
14+
self._assert_tags_and_doc('tags', ['tag1', 'tag2'], '')
1515

1616
def test_tags_with_doc(self):
17-
self._assert_keyword_doc('Tags with doc (and custom name)',
18-
'Keyword documentation.\n\nTags: tag1')
17+
self._assert_tags_and_doc('Tags with doc (and custom name)',
18+
['tag1'], 'Keyword documentation.')
1919

20-
def _assert_keyword_doc(self, name, expected):
21-
doc = self.server.get_keyword_documentation(name)
22-
self.assertEqual(doc, expected)
20+
def _assert_tags_and_doc(self, name, tags, doc):
21+
self.assertEqual(self.server.get_keyword_tags(name), tags)
22+
self.assertEqual(self.server.get_keyword_documentation(name), doc)
2323

2424

2525
if __name__ == '__main__':

0 commit comments

Comments
 (0)