diff --git a/src/robotlibcore.py b/src/robotlibcore.py index 68ec838..bba6ca9 100644 --- a/src/robotlibcore.py +++ b/src/robotlibcore.py @@ -29,6 +29,7 @@ from robot.api.deco import keyword # noqa F401 +from robot import __version__ as robot_version PY2 = sys.version_info < (3,) @@ -97,7 +98,27 @@ def run_keyword(self, name, args, kwargs=None): return self.keywords[name](*args, **(kwargs or {})) def get_keyword_arguments(self, name): - kw = self.keywords[name] if name != '__init__' else self.__init__ + if robot_version >= '3.2': + return self.__new_arg_spec(name) + return self.__old_arg_spec(name) + + def __new_arg_spec(self, keyword_name): + kw = self.__get_keyword(keyword_name) + if kw is None: + return [tuple(), ] + args, defaults, varargs, kwargs = self.__get_arg_spec(kw) + args = [(arg, ) for arg in args] + args += [(name, value) for name, value in defaults] + if varargs: + args.append(('*{}'.format(varargs), )) + if kwargs: + args.append(('**{}'.format(kwargs), )) + return args + + def __old_arg_spec(self, keyword_name): + kw = self.__get_keyword(keyword_name) + if kw is None: + return [] args, defaults, varargs, kwargs = self.__get_arg_spec(kw) args += ['{}={}'.format(name, value) for name, value in defaults] if varargs: diff --git a/utest/test_robotlibcore.py b/utest/test_robotlibcore.py index 160a9ab..26b52ea 100644 --- a/utest/test_robotlibcore.py +++ b/utest/test_robotlibcore.py @@ -1,9 +1,9 @@ import sys import pytest +from robot import __version__ as robot__version from robotlibcore import HybridCore - from HybridLibrary import HybridLibrary from DynamicLibrary import DynamicLibrary @@ -36,6 +36,8 @@ def test_dir(): '_DynamicCore__get_keyword_tags_supported', '_DynamicCore__get_typing_hints', '_DynamicCore__join_defaults_with_types', + '_DynamicCore__new_arg_spec', + '_DynamicCore__old_arg_spec', '_HybridCore__get_members', '_HybridCore__get_members_from_instance', '_custom_name', @@ -72,6 +74,8 @@ def test_dir(): '_DynamicCore__get_keyword_path', '_DynamicCore__get_keyword_tags_supported', '_DynamicCore__join_defaults_with_types', + '_DynamicCore__new_arg_spec', + '_DynamicCore__old_arg_spec', 'get_keyword_arguments', 'get_keyword_documentation', 'get_keyword_source', @@ -94,14 +98,26 @@ def test_getattr(): assert str(exc_info.value) == \ "'%s' object has no attribute 'non_existing'" % type(lib).__name__ - -def test_get_keyword_arguments(): +@pytest.mark.skipif(robot__version >= '3.2', reason='For RF 3.1') +def test_get_keyword_arguments_rf31(): args = DynamicLibrary().get_keyword_arguments assert args('mandatory') == ['arg1', 'arg2'] assert args('defaults') == ['arg1', 'arg2=default', 'arg3=3'] assert args('varargs_and_kwargs') == ['*args', '**kws'] assert args('all_arguments') == ['mandatory', 'default=value', '*varargs', '**kwargs'] assert args('__init__') == ['arg=None'] + assert args('__foobar__') == [] + + +@pytest.mark.skipif(robot__version < '3.2', reason='For RF 3.2 or greater') +def test_get_keyword_arguments_rf32(): + args = DynamicLibrary().get_keyword_arguments + assert args('mandatory') == [('arg1', ), ('arg2', )] + assert args('defaults') == [('arg1', ), ('arg2', 'default'), ('arg3', 3)] + assert args('varargs_and_kwargs') == [('*args', ), ('**kws', )] + assert args('all_arguments') == [('mandatory', ), ('default', 'value'), ('*varargs', ), ('**kwargs', )] + assert args('__init__') == [('arg', None)] + assert args('__foobar__') == [()] def test_get_keyword_documentation():