3 new revisions:
Revision: 61867ad0783f
Branch: default
Author: Mika Hänninen <[email protected]>
Date: Tue Mar 19 01:35:01 2013
Log: methods are inspected for kwargs
http://code.google.com/p/robotframework/source/detail?r=61867ad0783f
Revision: f8f75df26942
Branch: default
Author: Mika Hänninen <[email protected]>
Date: Wed Mar 20 03:00:33 2013
Log: added support for escaped equals and added tests
http://code.google.com/p/robotframework/source/detail?r=f8f75df26942
Revision: 9ea710550f77
Branch: default
Author: Mika Hänninen <[email protected]>
Date: Wed Mar 20 03:44:58 2013
Log: test files for testing kwargs
http://code.google.com/p/robotframework/source/detail?r=9ea710550f77
==============================================================================
Revision: 61867ad0783f
Branch: default
Author: Mika Hänninen <[email protected]>
Date: Tue Mar 19 01:35:01 2013
Log: methods are inspected for kwargs
http://code.google.com/p/robotframework/source/detail?r=61867ad0783f
Modified:
/atest/testresources/testlibs/classes.py
/src/robot/running/arguments.py
=======================================
--- /atest/testresources/testlibs/classes.py Wed Oct 10 03:52:33 2012
+++ /atest/testresources/testlibs/classes.py Tue Mar 19 01:35:01 2013
@@ -47,34 +47,37 @@
class ArgInfoLibrary:
- handler_count = 11
+ handler_count = 13
def no_args(self):
- """[], [], None"""
+ """[], [], None, None"""
# Argument inspection had a bug when there was args on function
body
# so better keep some of them around here.
a=b=c=1
def required1(self, one):
- """['one',], [], None"""
+ """['one',], [], None, None"""
def required2(self, one, two):
- """['one','two'], [], None"""
+ """['one','two'], [], None, None"""
def required9(self, one, two, three, four, five, six, seven, eight,
nine):
"""['one','two','three','four','five','six','seven','eight','nine'],\
- [], None"""
+ [], None, None"""
def default1(self, one=1):
- """['one'], [1], None"""
+ """['one'], [1], None, None"""
def default5(self, one='', two=None, three=3, four='huh', five=True):
- """['one','two','three','four','five'], ['',None,3,'huh',True],
None"""
+ """['one','two','three','four','five'], ['',None,3,'huh',True],
None, None"""
def required1_default1(self, one, two=''):
- """['one','two'], [''], None"""
+ """['one','two'], [''], None, None"""
def required2_default3(self, one, two, three=3, four=4, five=5):
- """['one','two','three','four','five'], [3,4,5], None"""
+ """['one','two','three','four','five'], [3,4,5], None, None"""
def varargs(self,*one):
- """[], [], 'one'"""
+ """[], [], 'one', None"""
def required2_varargs(self, one, two, *three):
- """['one','two'], [], 'three'"""
+ """['one','two'], [], 'three', None"""
def req4_def2_varargs(self, one, two, three, four, five=5, six=6,
*seven):
- """['one','two','three','four','five','six'], [5,6], 'seven'"""
-
+ """['one','two','three','four','five','six'], [5,6], 'seven',
None"""
+ def req2_def3_varargs_kwargs(self, three, four, five=5, six=6,
seven=7, *eight, **nine):
+ """['three','four','five','six','seven'],
[5,6,7], 'eight', 'nine'"""
+ def varargs_kwargs(self,*one, **two):
+ """[], [], 'one', 'two'"""
class GetattrLibrary:
handler_count = 3
=======================================
--- /src/robot/running/arguments.py Wed Jan 2 01:08:24 2013
+++ /src/robot/running/arguments.py Tue Mar 19 01:35:01 2013
@@ -36,9 +36,9 @@
kw_or_lib_name,
self._type)
def _determine_args(self, handler_or_argspec):
- args, defaults, varargs = self._get_arg_spec(handler_or_argspec)
+ args, defaults, varargs, kwargs =
self._get_arg_spec(handler_or_argspec)
minargs = len(args) - len(defaults)
- maxargs = len(args) if not varargs else sys.maxint
+ maxargs = len(args) if not (varargs or kwargs) else sys.maxint
return args, defaults, varargs, minargs, maxargs
def resolve(self, args, variables, output=None):
@@ -81,11 +81,11 @@
defaults - list of default values
varargs - name of the argument accepting varargs or None
"""
- args, varargs, _, defaults = inspect.getargspec(handler)
+ args, varargs, kwargs, defaults = inspect.getargspec(handler)
if inspect.ismethod(handler):
args = args[1:] # drop 'self'
defaults = list(defaults) if defaults else []
- return args, defaults, varargs
+ return args, defaults, varargs, kwargs
class JavaKeywordArguments(_KeywordArguments):
@@ -152,7 +152,7 @@
def _get_arg_spec(self, argspec):
if argspec is None:
- return [], [], '<unknown>'
+ return [], [], '<unknown>', {}
try:
if isinstance(argspec, basestring):
raise TypeError
@@ -162,10 +162,11 @@
def _parse_arg_spec(self, argspec):
if not argspec:
- return [], [], None
+ return [], [], None, {}
args = []
defaults = []
vararg = None
+ kwargs = {}
for token in argspec:
if vararg is not None:
raise TypeError
@@ -180,7 +181,7 @@
if defaults:
raise TypeError
args.append(token)
- return args, defaults, vararg
+ return args, defaults, vararg, kwargs
class RunKeywordArguments(PythonKeywordArguments):
@@ -211,7 +212,7 @@
class UserKeywordArguments(object):
def __init__(self, args, name):
- self.names, self.defaults, self.varargs = self._get_arg_spec(args)
+ self.names, self.defaults, self.varargs, self.kwargs =
self._get_arg_spec(args)
self.minargs = len(self.names) - len(self.defaults)
maxargs = len(self.names) if not self.varargs else sys.maxint
self._arg_limit_checker = _ArgLimitChecker(self.minargs, maxargs,
@@ -233,6 +234,7 @@
args = []
defaults = []
varargs = None
+ kwargs = {}
for arg in origargs:
if varargs:
raise DataError('Only last argument can be a list')
@@ -247,7 +249,7 @@
args.append(arg)
if default is not None:
defaults.append(default)
- return args, defaults, varargs
+ return args, defaults, varargs, kwargs
def _split_default(self, arg):
if '=' not in arg:
@@ -399,7 +401,7 @@
return arg.split('=', 1)
def _is_arg_name(self, name):
- return self._arg_name(name) in self._arguments.names
+ return self._arg_name(name) in self._arguments.names or True
def _resolve_variables(self, posargs, kwargs, variables):
posargs = self._replace_list(posargs, variables)
==============================================================================
Revision: f8f75df26942
Branch: default
Author: Mika Hänninen <[email protected]>
Date: Wed Mar 20 03:00:33 2013
Log: added support for escaped equals and added tests
http://code.google.com/p/robotframework/source/detail?r=f8f75df26942
Modified:
/src/robot/running/arguments.py
=======================================
--- /src/robot/running/arguments.py Tue Mar 19 01:35:01 2013
+++ /src/robot/running/arguments.py Wed Mar 20 03:00:33 2013
@@ -30,7 +30,7 @@
def __init__(self, argument_source, kw_or_lib_name):
self.name = kw_or_lib_name
- self.names, self.defaults, self.varargs, self.minargs,
self.maxargs \
+ self.names, self.defaults, self.varargs, self.kwargs,
self.minargs, self.maxargs \
= self._determine_args(argument_source)
self._arg_limit_checker = _ArgLimitChecker(self.minargs,
self.maxargs,
kw_or_lib_name,
self._type)
@@ -39,7 +39,7 @@
args, defaults, varargs, kwargs =
self._get_arg_spec(handler_or_argspec)
minargs = len(args) - len(defaults)
maxargs = len(args) if not (varargs or kwargs) else sys.maxint
- return args, defaults, varargs, minargs, maxargs
+ return args, defaults, varargs, kwargs, minargs, maxargs
def resolve(self, args, variables, output=None):
posargs, namedargs = self._resolve(args, variables, output)
@@ -50,8 +50,8 @@
def _resolve(self, args, variables, output):
return self._get_argument_resolver().resolve(args, output,
variables)
- def check_arg_limits(self, args, namedargs={}):
- self._arg_limit_checker.check_arg_limits(args, namedargs)
+ def check_arg_limits(self, args, namedargs=None):
+ self._arg_limit_checker.check_arg_limits(args, namedargs or {})
def check_arg_limits_for_dry_run(self, args):
self._arg_limit_checker.check_arg_limits_for_dry_run(args)
@@ -75,11 +75,12 @@
return PythonKeywordArgumentResolver(self)
def _get_arg_spec(self, handler):
- """Returns info about args in a tuple (args, defaults, varargs)
+ """Returns info about args in a tuple (args, defaults, varargs,
kwargs)
args - list of all accepted arguments except varargs
defaults - list of default values
varargs - name of the argument accepting varargs or None
+ kwargs - name of the argument accepting kwargs or None
"""
args, varargs, kwargs, defaults = inspect.getargspec(handler)
if inspect.ismethod(handler):
@@ -100,7 +101,7 @@
def _determine_args(self, handler_method):
signatures = self._get_signatures(handler_method)
minargs, maxargs = self._get_arg_limits(signatures)
- return [], [], None, minargs, maxargs
+ return [], [], None, None, minargs, maxargs
def _get_signatures(self, handler):
co = self._get_code_object(handler)
@@ -395,13 +396,18 @@
return False
if '=' not in arg:
return False
+ if '=' not in arg.split('\\=',1)[0]:
+ return False
return True
def _split_from_kwarg_sep(self, arg):
return arg.split('=', 1)
def _is_arg_name(self, name):
- return self._arg_name(name) in self._arguments.names or True
+ return self._arg_name(name) in self._arguments.names or
self._kwargs_is_used()
+
+ def _kwargs_is_used(self):
+ return bool(self._arguments.kwargs)
def _resolve_variables(self, posargs, kwargs, variables):
posargs = self._replace_list(posargs, variables)
==============================================================================
Revision: 9ea710550f77
Branch: default
Author: Mika Hänninen <[email protected]>
Date: Wed Mar 20 03:44:58 2013
Log: test files for testing kwargs
http://code.google.com/p/robotframework/source/detail?r=9ea710550f77
Added:
/atest/robot/test_libraries/kwargs.txt
/atest/testdata/test_libraries/TestKwargsLibrary.py
/atest/testdata/test_libraries/kwargs.txt
=======================================
--- /dev/null
+++ /atest/robot/test_libraries/kwargs.txt Wed Mar 20 03:44:58 2013
@@ -0,0 +1,29 @@
+*** Setting ***
+Resource atest_resource.txt
+Suite Setup Run Tests ${EMPTY} test_libraries/kwargs.txt
+Default Tags pybot jybot regression
+
+*** Test Cases ***
+Using arguments args, vargs, kwargs
+ Check Test Case
+
+Using arguments kwargs only
+ Check Test Case
+
+Does not change old bad behaviour
+ Check Test Case
+
+Variable assignments with default and kwargs
+ Check Test Case
+
+Check that positional assignment works
+ Check Test Case
+
+Use all possible arguments types and check escaping
+ Check Test Case
+
+Using equal sign as argument value should fail
+ Check Test Case
+
+Using unnamed argument after named argument is given should fail
+ Check Test Case
=======================================
--- /dev/null
+++ /atest/testdata/test_libraries/TestKwargsLibrary.py Wed Mar 20 03:44:58
2013
@@ -0,0 +1,60 @@
+class TestKwargsLibrary:
+
+ def __init__(self):
+ self.command = ""
+ self.args = ()
+ self.kwargs = {}
+
+ def vargs_and_kwargs(self, command, *args, **kwargs):
+ self.command = command
+ self.args = args
+ self.kwargs = kwargs
+ print self
+ assert(command == "my command")
+ assert(args == ("sdfsdfsf",))
+ assert(kwargs == {"jada":"bada", "kwow":"we2222"})
+
+ def only_kwargs(self, def1="my default value", **kwargs):
+ self.command = None
+ self.args = None
+ self.kwargs = kwargs
+ print self
+ assert(def1 == "we2222")
+ assert(kwargs == {"jada":"bada"})
+
+ def arg_and_default(self, x, y=2):
+ assert(x == 'x=y')
+ assert(y == 'z')
+
+ def arg_default_and_kwargs(self, x, y=2, **z):
+ print x, y, z
+ assert(x == 'x=y')
+ assert(y == 'z')
+ assert(z == {'z':'x'})
+
+ def only_defaulters(self, def1="1", def2="2"):
+ print "def1='%r' def2='%r'" % (def1, def2)
+ assert(def1 == 'killu=tillu')
+ assert(def2 == 'tillu')
+
+ def everything(self, yks, kaks=2, *koli, **neli):
+ print yks, kaks, koli, neli
+ assert(yks == 'first')
+ assert(kaks == 2 or kaks.startswith('second'))
+ assert(not koli or all('third' == i for i in koli))
+ assert(not neli or all(v.startswith('fourth') for v in
neli.values()))
+
+ def return_stuff(self):
+ return (self.command, self.args, self.kwargs)
+
+ def __str__(self):
+ output = "vargs_and_kwargs()\n"
+ output += "\t%12s: %r\n" % ("command", self.command)
+ output += "\t%12s: %r\n" % ("args", self.args)
+ output += "\t%12s: %r\n" % ("kwargs", self.kwargs)
+ return output
+
+if __name__ == "__main__":
+ dl = TestKwargsLibrary()
+ dl.vargs_and_kwargs("dfssffds", 333, 555, named="dasdasdasd",
another="2323232")
+ print dl
=======================================
--- /dev/null
+++ /atest/testdata/test_libraries/kwargs.txt Wed Mar 20 03:44:58 2013
@@ -0,0 +1,35 @@
+*** Setting ***
+Library TestKwargsLibrary.py
+Default Tags pybot jybot regression
+
+*** Test Cases ***
+Using arguments args, vargs, kwargs
+ vargs and kwargs my command sdfsdfsf jada=bada
kwow=we2222
+
+Using arguments kwargs only
+ only kwargs jada=bada def1=we2222
+
+Does not change old bad behaviour
+ arg and default x=y y=z
+
+Variable assignments with default and kwargs
+ arg default and kwargs x=y y=z z=x
+
+Check that positional assignment works
+ only defaulters killu=tillu def2=tillu
+
+Use all possible arguments types and check escaping
+ [Template] everything
+ first second third fourth=fourth
+ first kaks=second fourth=fourth
+ first second third third
+ first fourth=fourth
+ first second\=fourth
+ first second\=fourth=djskkdsj
+ first fourth=fourth\=fourth
+
+Using equal sign as argument value should fail
+ Run Keyword And Expect Error AssertionError everything first =
+
+Using unnamed argument after named argument is given should fail
+ Run Keyword And Expect Error * everything first kaks=second
third neli=fourth
--
---
You received this message because you are subscribed to the Google Groups "robotframework-commit" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.