python 3.5 support
[tiramisu.git] / tiramisu / option / baseoption.py
index 13c99d5..3b0102e 100644 (file)
@@ -22,7 +22,11 @@ import re
 from types import FunctionType
 import warnings
 import sys
-from inspect import getargspec
+
+if sys.version_info[0] >= 3:
+    from inspect import signature
+else:
+    from inspect import getargspec
 
 from ..i18n import _
 from ..setting import log, undefined, debug, groups
@@ -180,13 +184,17 @@ class Base(StorageBase):
         self.commit(session)
 
     def _build_validator_params(self, validator, validator_params):
-        func_args = getargspec(validator)
-        defaults = func_args.defaults
-        if defaults is None:
-            defaults = []
-        args = func_args.args[0:len(func_args.args)-len(defaults)]
+        if sys.version_info[0] < 3:
+            func_args = getargspec(validator)
+            defaults = func_args.defaults
+            if defaults is None:
+                defaults = []
+            args = func_args.args[0:len(func_args.args)-len(defaults)]
+        else:
+            func_params = signature(validator).parameters
+            args = [f.name for f in func_params.values() if f.default is f.empty]
         if validator_params is not None:
-            kwargs = validator_params.keys()
+            kwargs = list(validator_params.keys())
             if '' in kwargs:
                 kwargs.remove('')
             for kwarg in kwargs:
@@ -454,7 +462,7 @@ class BaseOption(Base):
                 name = dyn_name
             else:
                 name = self.impl_getname()
-        if isinstance(name, unicode):
+        if sys.version_info[0] < 3 and isinstance(name, unicode):
             name = name.encode('utf8')
         return name
 
@@ -1024,7 +1032,7 @@ def validate_requires_arg(new_option, multi, requires, name):
         operator = get_operator(require)
         if isinstance(expected, list):
             for exp in expected:
-                if exp.keys() != ['option', 'value']:
+                if set(exp.keys()) != {'option', 'value'}:
                     raise ValueError(_('malformed requirements expected must have '
                                        'option and value for option {0}').format(name))
                 option = exp['option']