win32mbcs: wrapper supports keyword arguments and dict result.
authorShun-ichi GOTO <shunichi.goto@gmail.com>
Fri, 10 Jul 2009 15:52:01 +0900
changeset 9131 2bbb8419720d
parent 9130 335f749cc369
child 9132 b47d7b440c5c
win32mbcs: wrapper supports keyword arguments and dict result. The keyword arguments are also decoded before calling original. And dict of return value is also encoded back.
hgext/win32mbcs.py
--- a/hgext/win32mbcs.py	Fri Jul 10 19:45:31 2009 +0200
+++ b/hgext/win32mbcs.py	Fri Jul 10 15:52:01 2009 +0900
@@ -52,6 +52,9 @@
         return tuple(map(decode, arg))
     elif isinstance(arg, list):
         return map(decode, arg)
+    elif isinstance(arg, dict):
+        for k, v in arg.items():
+            arg[k] = decode(v)
     return arg
 
 def encode(arg):
@@ -61,17 +64,20 @@
         return tuple(map(encode, arg))
     elif isinstance(arg, list):
         return map(encode, arg)
+    elif isinstance(arg, dict):
+        for k, v in arg.items():
+            arg[k] = encode(v)
     return arg
 
-def wrapper(func, args):
+def wrapper(func, args, kwds):
     # check argument is unicode, then call original
     for arg in args:
         if isinstance(arg, unicode):
-            return func(*args)
+            return func(*args, **kwds)
 
     try:
         # convert arguments to unicode, call func, then convert back
-        return encode(func(*decode(args)))
+        return encode(func(*decode(args), **decode(kwds)))
     except UnicodeError:
         # If not encoded with encoding.encoding, report it then
         # continue with calling original function.
@@ -82,8 +88,8 @@
     module, name = name.rsplit('.', 1)
     module = sys.modules[module]
     func = getattr(module, name)
-    def f(*args):
-        return wrapper(func, args)
+    def f(*args, **kwds):
+        return wrapper(func, args, kwds)
     try:
         f.__name__ = func.__name__                # fail with python23
     except Exception: