Skip to content

Commit 77cac53

Browse files
committed
Fixing named argumens with default values
Simply logic also Fixes #118
1 parent c7ac794 commit 77cac53

File tree

5 files changed

+34
-28
lines changed

5 files changed

+34
-28
lines changed

atest/DynamicTypesAnnotationsLibrary.py

+9
Original file line numberDiff line numberDiff line change
@@ -178,3 +178,12 @@ def kw_with_many_named_arguments_with_default(self, *, arg1, arg2: int):
178178
print(arg1)
179179
print(arg2)
180180
return f"arg1: {arg1}, type: {type(arg1)}, arg2: {arg2}, type: {type(arg2)}"
181+
182+
@keyword
183+
def kw_with_positional_and_named_arguments(self, arg1, *, arg2: int):
184+
return f"arg1: {arg1}, type: {type(arg1)}, arg2: {arg2}, type: {type(arg2)}"
185+
186+
@keyword
187+
def kw_with_positional_and_named_arguments_with_defaults(self, arg1: int = 1, *, arg2: str = "foobar"):
188+
return f"arg1: {arg1}, type: {type(arg1)}, arg2: {arg2}, type: {type(arg2)}"
189+

atest/tests.robot

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Keyword Names
1717
IF $LIBRARY == "ExtendExistingLibrary" Keyword In Extending Library
1818

1919
Method Without @keyword Are Not Keyowrds
20-
[Documentation] FAIL GLOB: No keyword with name 'Not keyword' found.*
20+
[Documentation] FAIL GLOB: No keyword with name 'Not Keyword' found.*
2121
Not Keyword
2222

2323
Arguments

src/robotlibcore.py

+21-26
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@
2121
import inspect
2222
import os
2323
from dataclasses import dataclass
24-
from typing import Any, List, Optional, get_type_hints
24+
from typing import Any, Callable, List, Optional, get_type_hints
2525

2626
from robot.api.deco import keyword # noqa F401
2727
from robot.errors import DataError
2828
from robot.utils import Importer # noqa F401
2929

30-
__version__ = "4.1.1"
30+
__version__ = "4.1.2"
3131

3232

3333
class PythonLibCoreException(Exception):
@@ -196,20 +196,18 @@ def unwrap(cls, function):
196196
def _get_arguments(cls, function):
197197
unwrap_function = cls.unwrap(function)
198198
arg_spec = cls._get_arg_spec(unwrap_function)
199-
argument_specification = cls._get_default_and_named_args(arg_spec, function)
200-
argument_specification.extend(cls._get_var_args(arg_spec))
201-
kw_only_args = cls._get_kw_only(arg_spec)
202-
if kw_only_args:
203-
argument_specification.extend(kw_only_args)
199+
argument_specification = cls._get_args(arg_spec, function)
200+
argument_specification.extend(cls._get_varargs(arg_spec))
201+
argument_specification.extend(cls._get_named_only_args(arg_spec))
204202
argument_specification.extend(cls._get_kwargs(arg_spec))
205203
return argument_specification
206204

207205
@classmethod
208-
def _get_arg_spec(cls, function):
206+
def _get_arg_spec(cls, function: Callable):
209207
return inspect.getfullargspec(function)
210208

211209
@classmethod
212-
def _get_default_and_named_args(cls, arg_spec, function):
210+
def _get_args(cls, arg_spec: inspect.FullArgSpec, function: Callable):
213211
args = cls._drop_self_from_args(function, arg_spec)
214212
args.reverse()
215213
defaults = list(arg_spec.defaults) if arg_spec.defaults else []
@@ -223,33 +221,30 @@ def _get_default_and_named_args(cls, arg_spec, function):
223221
return formated_args
224222

225223
@classmethod
226-
def _drop_self_from_args(cls, function, arg_spec):
224+
def _drop_self_from_args(cls, function: Callable, arg_spec: inspect.FullArgSpec):
227225
return arg_spec.args[1:] if inspect.ismethod(function) else arg_spec.args
228226

229227
@classmethod
230-
def _get_var_args(cls, arg_spec):
231-
if arg_spec.varargs:
232-
return [f"*{arg_spec.varargs}"]
233-
return []
228+
def _get_varargs(cls, arg_spec: inspect.FullArgSpec) -> list:
229+
return [f"*{arg_spec.varargs}"] if arg_spec.varargs else []
234230

235231
@classmethod
236-
def _get_kwargs(cls, arg_spec):
232+
def _get_kwargs(cls, arg_spec: inspect.FullArgSpec) -> list:
237233
return [f"**{arg_spec.varkw}"] if arg_spec.varkw else []
238234

239235
@classmethod
240-
def _get_kw_only(cls, arg_spec):
241-
kw_only_args = []
236+
def _get_named_only_args(cls, arg_spec: inspect.FullArgSpec) -> list:
237+
rf_spec = []
238+
kw_only_args = arg_spec.kwonlyargs if arg_spec.kwonlyargs else []
239+
if not arg_spec.varargs and kw_only_args:
240+
rf_spec.append("*")
242241
kw_only_defaults = arg_spec.kwonlydefaults if arg_spec.kwonlydefaults else []
243-
for arg in arg_spec.kwonlyargs:
244-
if not arg_spec.varargs and arg not in kw_only_defaults and not kw_only_args:
245-
kw_only_args.append("*")
246-
kw_only_args.append(arg)
247-
elif arg not in kw_only_defaults:
248-
kw_only_args.append(arg)
242+
for kw_only_arg in kw_only_args:
243+
if kw_only_arg in kw_only_defaults:
244+
rf_spec.append((kw_only_arg, kw_only_defaults[kw_only_arg]))
249245
else:
250-
value = arg_spec.kwonlydefaults.get(arg, "")
251-
kw_only_args.append((arg, value))
252-
return kw_only_args
246+
rf_spec.append(kw_only_arg)
247+
return rf_spec
253248

254249
@classmethod
255250
def _get_types(cls, function):

utest/test_keyword_builder.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def test_positional_and_named(lib):
3838
assert spec.argument_specification == ["arg1", "arg2", ("named1", "string1"), ("named2", 123)]
3939

4040

41-
def test_named_only(lib):
41+
def test_named_only_default_only(lib):
4242
spec = KeywordBuilder.build(lib.default_only)
4343
assert spec.argument_specification == [("named1", "string1"), ("named2", 123)]
4444

utest/test_robotlibcore.py

+2
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ def test_named_only_argumens():
138138
assert args("kw_with_many_named_arguments") == ["*", "arg1", "arg2"]
139139
assert args("kw_with_named_arguments_and_variable_number_args") == ["*varargs", "arg"]
140140
assert args("kw_with_many_named_arguments_with_default") == ["*", "arg1", "arg2"]
141+
assert args("kw_with_positional_and_named_arguments") == ["arg1", "*", "arg2"]
142+
assert args("kw_with_positional_and_named_arguments_with_defaults") == [("arg1", 1), "*", ("arg2", "foobar")]
141143

142144

143145
def test_get_keyword_documentation():

0 commit comments

Comments
 (0)