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.


Reply via email to