9 new revisions:

Revision: a0ed46356158
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 12:25:23 2013 UTC
Log: Patch from https://bitbucket.org/userzimmermann/robotframework/commits...
http://code.google.com/p/robotframework/source/detail?r=a0ed46356158

Revision: 03a4229a2d0c
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 14:24:58 2013 UTC
Log:      Java keywords that use the kwargs
http://code.google.com/p/robotframework/source/detail?r=03a4229a2d0c

Revision: 646ffe0ba9a5
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 14:25:14 2013 UTC
Log:      regen class
http://code.google.com/p/robotframework/source/detail?r=646ffe0ba9a5

Revision: eb0436860814
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 14:26:00 2013 UTC
Log:      Tests for java kwargs.
http://code.google.com/p/robotframework/source/detail?r=eb0436860814

Revision: 45444093184d
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 18:42:16 2013 UTC
Log:      Test library keyword with many positional arguments and kwargs
http://code.google.com/p/robotframework/source/detail?r=45444093184d

Revision: ee6e410c761e
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 18:42:31 2013 UTC
Log:      regen
http://code.google.com/p/robotframework/source/detail?r=ee6e410c761e

Revision: 097da5a12760
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 18:45:24 2013 UTC
Log:      java kwargs wont be interpreted as names for positional args
http://code.google.com/p/robotframework/source/detail?r=097da5a12760

Revision: d78fda1469dd
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 18:47:45 2013 UTC
Log:      Automated merge with https://code.google.com/p/robotframework/
http://code.google.com/p/robotframework/source/detail?r=d78fda1469dd

Revision: 8f075bea1297
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 19:02:32 2013 UTC
Log:      fix unit tests
http://code.google.com/p/robotframework/source/detail?r=8f075bea1297

==============================================================================
Revision: a0ed46356158
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 12:25:23 2013 UTC
Log: Patch from https://bitbucket.org/userzimmermann/robotframework/commits/branch/javakwargs

Update issue 1583
Merged from https://bitbucket.org/userzimmermann/robotframework/commits/branch/javakwargs as a patch without history.
http://code.google.com/p/robotframework/source/detail?r=a0ed46356158

Modified:
 /src/robot/running/arguments/argumentparser.py
 /src/robot/running/arguments/javaargumentcoercer.py
 /src/robot/running/handlers.py

=======================================
--- /src/robot/running/arguments/argumentparser.py Thu Nov 28 14:42:23 2013 UTC +++ /src/robot/running/arguments/argumentparser.py Fri Nov 29 12:25:23 2013 UTC
@@ -13,7 +13,7 @@
 import inspect
 if sys.platform.startswith('java'):
     from java.lang import Class
-    from java.util import List
+    from java.util import List, Map

 from robot.errors import DataError
 from robot.variables import is_list_var, is_scalar_var
@@ -59,14 +59,23 @@

     def _single_signature_arg_spec(self, signature):
         args = signature.args
-        if args and self._is_varargs_type(args[-1]):
-            return self._format_arg_spec(len(args)-1, varargs=True)
-        return self._format_arg_spec(len(args))
+        len_ = len(args)
+        if len_:
+            if self._is_varargs_type(args[-1]):
+                return self._format_arg_spec(len_ - 1, varargs=True)
+            if self._is_kwargs_type(args[-1]):
+                varargs = len_ > 1 and self._is_varargs_type(args[-2])
+                return self._format_arg_spec(
+ len_ - (varargs and 2 or 1), varargs=varargs, kwargs=True)
+        return self._format_arg_spec(len_)

     def _is_varargs_type(self, arg):
         return isinstance(arg, Class) and (
           arg.isArray() or issubclass(arg, List))

+    def _is_kwargs_type(self, arg):
+        return issubclass(arg, Map)
+
     def _multi_signature_arg_spec(self, signatures):
         mina = maxa = len(signatures[0].args)
         for sig in signatures[1:]:
@@ -75,11 +84,14 @@
             maxa = max(argc, maxa)
         return self._format_arg_spec(maxa, maxa-mina)

-    def _format_arg_spec(self, positional=0, defaults=0, varargs=False):
+    def _format_arg_spec(
+      self, positional=0, defaults=0, varargs=False, kwargs=False
+      ):
         positional = ['arg%d' % (i+1) for i in range(positional)]
         defaults = [''] * defaults
         varargs = '*varargs' if varargs else None
-        return positional, defaults, varargs
+        kwargs = '**kwargs' if kwargs else None
+        return positional, defaults, varargs, kwargs


 class _ArgumentSpecParser(_ArgumentParser):
=======================================
--- /src/robot/running/arguments/javaargumentcoercer.py Thu Nov 28 15:40:56 2013 UTC +++ /src/robot/running/arguments/javaargumentcoercer.py Fri Nov 29 12:25:23 2013 UTC
@@ -20,12 +20,17 @@
 class JavaArgumentCoercer(object):

     def __init__(self, signatures, argspec):
+        self._argspec = argspec
         self._coercers = CoercerFinder().find_coercers(signatures)
         self._varargs_handler = VarargsHandler(argspec)

-    def coerce(self, arguments, dryrun=False):
+    def coerce(self, arguments, named, dryrun=False):
         arguments = self._varargs_handler.handle(arguments)
- return [c.coerce(a, dryrun) for c, a in zip(self._coercers, arguments)]
+        arguments = [c.coerce(a, dryrun)
+                     for c, a in zip(self._coercers, arguments)]
+        if self._argspec.kwargs:
+            arguments.append(named)
+        return arguments


 class CoercerFinder(object):
=======================================
--- /src/robot/running/handlers.py      Thu Nov 28 15:40:56 2013 UTC
+++ /src/robot/running/handlers.py      Fri Nov 29 12:25:23 2013 UTC
@@ -180,17 +180,15 @@
         signatures = self._get_signatures(handler_method)
         return JavaArgumentParser().parse(signatures, self.longname)

-    def _get_argument_resolver(self, argspec):
-        return ArgumentResolver(argspec, resolve_named=False)
-
     def _get_signatures(self, handler):
         code_object = getattr(handler, 'im_func', handler)
         return code_object.argslist[:code_object.nargs]

     def resolve_arguments(self, args, variables=None):
positional, named = self._argument_resolver.resolve(args, variables) - positional = self._arg_coercer.coerce(positional, dryrun=not variables)
-        return positional, named
+        arguments = self._arg_coercer.coerce(
+          positional, named, dryrun=not variables)
+        return arguments, {}


 class _DynamicHandler(_RunnableHandler):

==============================================================================
Revision: 03a4229a2d0c
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 14:24:58 2013 UTC
Log:      Java keywords that use the kwargs
http://code.google.com/p/robotframework/source/detail?r=03a4229a2d0c

Modified:
 /atest/testresources/testlibs/ArgumentsJava.java

=======================================
--- /atest/testresources/testlibs/ArgumentsJava.java Tue Apr 16 21:30:52 2013 UTC +++ /atest/testresources/testlibs/ArgumentsJava.java Fri Nov 29 14:24:58 2013 UTC
@@ -1,3 +1,5 @@
+import java.util.*;
+
 public class ArgumentsJava {

     public ArgumentsJava(String arg, String[] varargs) {
@@ -57,4 +59,36 @@
             ret += " " + arg;
         return ret;
     }
+
+    public String javaKWArgs(Map<String,Object> kwargs) {
+        String ret = "javaKWArgs:";
+        for (String key: kwargs.keySet())
+            ret += " " + key + ":" + kwargs.get(key);
+        return ret;
+    }
+
+ public String javaNormalAndKWArgs(String arg, Map<String,Object> kwargs) {
+        String ret = "javaNormalAndKWArgs: "+arg;
+        for (String key: kwargs.keySet())
+            ret += " " + key + ":" + kwargs.get(key);
+        return ret;
+    }
+
+ public String javaVarArgsAndKWArgs(List<String> varargs, Map<String,Object> kwargs) {
+        String ret = "javaVarArgsAndKWArgs:";
+        for (String arg: varargs)
+            ret += " " + arg;
+        for (String key: kwargs.keySet())
+            ret += " " + key + ":" + kwargs.get(key);
+        return ret;
+    }
+
+ public String javaAllArgs(String arg, List<String> varargs, Map<String,Object> kwargs) {
+        String ret = "javaAllArgs: "+arg;
+        for (String a: varargs)
+            ret += " " + a;
+        for (String key: kwargs.keySet())
+            ret += " " + key + ":" + kwargs.get(key);
+        return ret;
+    }
 }

==============================================================================
Revision: 646ffe0ba9a5
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 14:25:14 2013 UTC
Log:      regen class
http://code.google.com/p/robotframework/source/detail?r=646ffe0ba9a5

Modified:
 /atest/testresources/testlibs/ArgumentsJava.class

=======================================
--- /atest/testresources/testlibs/ArgumentsJava.class Tue Apr 16 21:30:52 2013 UTC +++ /atest/testresources/testlibs/ArgumentsJava.class Fri Nov 29 14:25:14 2013 UTC
Binary file, no diff available.

==============================================================================
Revision: eb0436860814
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 14:26:00 2013 UTC
Log:      Tests for java kwargs.
http://code.google.com/p/robotframework/source/detail?r=eb0436860814

Modified:
 /atest/robot/keywords/java_arguments.txt
 /atest/testdata/keywords/java_arguments.txt

=======================================
--- /atest/robot/keywords/java_arguments.txt    Thu Nov 28 14:43:04 2013 UTC
+++ /atest/robot/keywords/java_arguments.txt    Fri Nov 29 14:26:00 2013 UTC
@@ -47,6 +47,18 @@
 Varargs Work Also With Lists
[Documentation] Make sure varargs support doesn't make it impossible to used Java arrays and Python lists with Java keyword expecting arrays.
     Check Test Case    ${TESTNAME}
+
+Kwargs on java
+    Check Test Case    ${TESTNAME}
+
+Normal and Kwargs on java
+    Check Test Case    ${TESTNAME}
+
+Varargs and Kwargs on java
+    Check Test Case    ${TESTNAME}
+
+All args on java
+    Check Test Case    ${TESTNAME}

 Valid Arguments For Keyword Expecting Non String Scalar Arguments
     Check Test Case    ${TESTNAME}
=======================================
--- /atest/testdata/keywords/java_arguments.txt Thu Nov 28 14:43:04 2013 UTC
+++ /atest/testdata/keywords/java_arguments.txt Fri Nov 29 14:26:00 2013 UTC
@@ -104,6 +104,23 @@
     String List    ${array1.tolist()}
     String List    Hello    string    list    world

+Kwargs on java
+   ${res} =       javaKWArgs    foo=one   bar=two
+   Should be equal    ${res}    javaKWArgs: foo:one bar:two
+
+Normal and Kwargs on java
+   ${res} =       javaNormalAndKWArgs    hello   foo=one   bar=two
+   Should be equal    ${res}    javaNormalAndKWArgs: hello foo:one bar:two
+
+Varargs and Kwargs on java
+   ${res} =       javaVarArgsAndKWArgs    hello   kitty  foo=one   bar=two
+ Should be equal ${res} javaVarArgsAndKWArgs: hello kitty foo:one bar:two
+
+All args on java
+   ${res} =       javaAllArgs    arg   hello   kitty  foo=one   bar=two
+ Should be equal ${res} javaAllArgs: arg hello kitty foo:one bar:two
+
+
 Valid Arguments For Keyword Expecting Non String Scalar Arguments
     Byte 1    ${1}
     Byte 2    ${2}

==============================================================================
Revision: 45444093184d
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 18:42:16 2013 UTC
Log:      Test library keyword with many positional arguments and kwargs
http://code.google.com/p/robotframework/source/detail?r=45444093184d

Modified:
 /atest/testresources/testlibs/ArgumentsJava.java

=======================================
--- /atest/testresources/testlibs/ArgumentsJava.java Fri Nov 29 14:24:58 2013 UTC +++ /atest/testresources/testlibs/ArgumentsJava.java Fri Nov 29 18:42:16 2013 UTC
@@ -91,4 +91,11 @@
             ret += " " + key + ":" + kwargs.get(key);
         return ret;
     }
+
+ public String javaManyNormalArgs(String arg, String arg2, Map<String,Object> kwargs) {
+        String ret = "javaManyNormalArgs: "+arg+" "+arg2;
+        for (String key: kwargs.keySet())
+            ret += " " + key + ":" + kwargs.get(key);
+        return ret;
+    }
 }

==============================================================================
Revision: ee6e410c761e
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 18:42:31 2013 UTC
Log:      regen
http://code.google.com/p/robotframework/source/detail?r=ee6e410c761e

Modified:
 /atest/testresources/testlibs/ArgumentsJava.class

=======================================
--- /atest/testresources/testlibs/ArgumentsJava.class Fri Nov 29 14:25:14 2013 UTC +++ /atest/testresources/testlibs/ArgumentsJava.class Fri Nov 29 18:42:31 2013 UTC
Binary file, no diff available.

==============================================================================
Revision: 097da5a12760
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 18:45:24 2013 UTC
Log:      java kwargs wont be interpreted as names for positional args
http://code.google.com/p/robotframework/source/detail?r=097da5a12760

Modified:
 /atest/robot/keywords/java_arguments.txt
 /atest/testdata/keywords/java_arguments.txt
 /src/robot/running/arguments/argumentmapper.py
 /src/robot/running/arguments/argumentparser.py
 /src/robot/running/arguments/argumentresolver.py
 /src/robot/running/arguments/argumentspec.py
 /src/robot/running/arguments/argumentvalidator.py

=======================================
--- /atest/robot/keywords/java_arguments.txt    Fri Nov 29 14:26:00 2013 UTC
+++ /atest/robot/keywords/java_arguments.txt    Fri Nov 29 18:45:24 2013 UTC
@@ -59,6 +59,9 @@

 All args on java
     Check Test Case    ${TESTNAME}
+
+Java kwargs wont be interpreted as values for positional arguments
+    Check Test Case    ${TESTNAME}

 Valid Arguments For Keyword Expecting Non String Scalar Arguments
     Check Test Case    ${TESTNAME}
=======================================
--- /atest/testdata/keywords/java_arguments.txt Fri Nov 29 14:26:00 2013 UTC
+++ /atest/testdata/keywords/java_arguments.txt Fri Nov 29 18:45:24 2013 UTC
@@ -120,6 +120,9 @@
    ${res} =       javaAllArgs    arg   hello   kitty  foo=one   bar=two
Should be equal ${res} javaAllArgs: arg hello kitty foo:one bar:two

+Java kwargs wont be interpreted as values for positional arguments
+   ${res} =       javaManyNormalArgs    foo   huu   arg1=one
+   Should be equal    ${res}    javaManyNormalArgs: foo huu arg1:one

 Valid Arguments For Keyword Expecting Non String Scalar Arguments
     Byte 1    ${1}
=======================================
--- /src/robot/running/arguments/argumentmapper.py Wed Nov 20 17:05:12 2013 UTC +++ /src/robot/running/arguments/argumentmapper.py Fri Nov 29 18:45:24 2013 UTC
@@ -36,6 +36,7 @@
             defaults = variables.replace_list(defaults)
         self._positional = argspec.positional
         self._kwargs_supported = bool(argspec.kwargs)
+        self._named_arguments = argspec.named_arguments
self.args = [None] * argspec.minargs + [Default(d) for d in defaults]
         self.kwargs = {}

@@ -44,7 +45,7 @@

     def fill_named(self, named):
         for name, value in named.items():
-            if name in self._positional:
+            if name in self._positional and self._named_arguments:
                 index = self._positional.index(name)
                 self.args[index] = value
             elif self._kwargs_supported:
=======================================
--- /src/robot/running/arguments/argumentparser.py Fri Nov 29 12:25:23 2013 UTC +++ /src/robot/running/arguments/argumentparser.py Fri Nov 29 18:45:24 2013 UTC
@@ -84,14 +84,12 @@
             maxa = max(argc, maxa)
         return self._format_arg_spec(maxa, maxa-mina)

-    def _format_arg_spec(
-      self, positional=0, defaults=0, varargs=False, kwargs=False
-      ):
+ def _format_arg_spec(self, positional=0, defaults=0, varargs=False, kwargs=False):
         positional = ['arg%d' % (i+1) for i in range(positional)]
         defaults = [''] * defaults
         varargs = '*varargs' if varargs else None
         kwargs = '**kwargs' if kwargs else None
-        return positional, defaults, varargs, kwargs
+        return positional, defaults, varargs, kwargs, False


 class _ArgumentSpecParser(_ArgumentParser):
=======================================
--- /src/robot/running/arguments/argumentresolver.py Thu Nov 28 14:49:09 2013 UTC +++ /src/robot/running/arguments/argumentresolver.py Fri Nov 29 18:45:24 2013 UTC
@@ -58,6 +58,8 @@
         name = arg.split('=')[0]
         if self._is_escaped(name):
             return False
+        if not self._argspec.named_arguments:
+            return self._argspec.kwargs
         return name in self._argspec.positional or self._argspec.kwargs

     def _is_escaped(self, name):
=======================================
--- /src/robot/running/arguments/argumentspec.py Thu Jun 6 14:00:44 2013 UTC +++ /src/robot/running/arguments/argumentspec.py Fri Nov 29 18:45:24 2013 UTC
@@ -18,13 +18,14 @@
 class ArgumentSpec(object):

def __init__(self, name, type='Keyword', positional=None, defaults=None,
-                 varargs=None, kwargs=None):
+                 varargs=None, kwargs=None, named_arguments=True):
         self.name = name
         self.type = type
         self.positional = positional or []
         self.defaults = defaults or []
         self.varargs = varargs
         self.kwargs = kwargs
+        self.named_arguments = named_arguments

     @property
     def minargs(self):
=======================================
--- /src/robot/running/arguments/argumentvalidator.py Mon Sep 23 12:45:27 2013 UTC +++ /src/robot/running/arguments/argumentvalidator.py Fri Nov 29 18:45:24 2013 UTC
@@ -30,10 +30,15 @@
self._validate_no_mandatory_missing(positional, named, self._argspec)

     def _validate_limits(self, positional, named, spec):
- count = len(positional) + sum(1 for n in named if n in spec.positional)
+        count = len(positional) + self._named_positionals(named, spec)
         if not spec.minargs <= count <= spec.maxargs:
             self._raise_wrong_count(count, spec)

+    def _named_positionals(self, named, spec):
+        if not spec.named_arguments:
+            return 0
+        return sum(1 for n in named if n in spec.positional)
+
     def _raise_wrong_count(self, count, spec):
         minend = plural_or_not(spec.minargs)
         if spec.minargs == spec.maxargs:
@@ -49,7 +54,7 @@

     def _validate_no_multiple_values(self, positional, named, spec):
         for name in spec.positional[:len(positional)]:
-            if name in named:
+            if name in named and spec.named_arguments:
raise DataError("%s '%s' got multiple values for argument '%s'."
                                 % (spec.type, spec.name, name))


==============================================================================
Revision: d78fda1469dd
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 18:47:45 2013 UTC
Log:      Automated merge with https://code.google.com/p/robotframework/
http://code.google.com/p/robotframework/source/detail?r=d78fda1469dd



==============================================================================
Revision: 8f075bea1297
Branch:   default
Author:   Jussi Malinen <[email protected]>
Date:     Fri Nov 29 19:02:32 2013 UTC
Log:      fix unit tests
http://code.google.com/p/robotframework/source/detail?r=8f075bea1297

Modified:
 /utest/running/test_handlers.py

=======================================
--- /utest/running/test_handlers.py     Thu Nov 21 15:16:16 2013 UTC
+++ /utest/running/test_handlers.py     Fri Nov 29 19:02:32 2013 UTC
@@ -292,11 +292,11 @@
             return self.lib.handlers[name]

         def _test_coercion(self, handler, args, expected):
-            assert_equals(handler._arg_coercer.coerce(args), expected)
+            assert_equals(handler._arg_coercer.coerce(args, {}), expected)

         def _test_coercion_fails(self, handler, expected_message):
             assert_raises_with_msg(ValueError, expected_message,
- handler._arg_coercer.coerce, ['invalid']) + handler._arg_coercer.coerce, ['invalid'], {})


 if __name__ == '__main__':

--

--- 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