python 3.4 support
authorEmmanuel Garette <egarette@cadoles.com>
Sat, 19 Mar 2016 20:27:37 +0000 (21:27 +0100)
committerEmmanuel Garette <egarette@cadoles.com>
Sat, 19 Mar 2016 20:27:37 +0000 (21:27 +0100)
12 files changed:
test/test_config.py
test/test_config_domain.py
test/test_dyn_optiondescription.py
test/test_state.py
tiramisu/autolib.py
tiramisu/config.py
tiramisu/option/baseoption.py
tiramisu/option/option.py
tiramisu/option/optiondescription.py
tiramisu/storage/__init__.py
tiramisu/storage/dictionary/option.py
tiramisu/storage/util.py

index 9ff9652..8c7e332 100644 (file)
@@ -372,7 +372,7 @@ def test_config_od_function():
     descr = OptionDescription('tiramisu', '', [o])
     cfg = Config(descr)
     try:
-        print cfg.impl_get_opt_by_path()
-    except AttributeError, err:
+        print(cfg.impl_get_opt_by_path())
+    except AttributeError as err:
         assert str(err) == _('unknown Option {0} in OptionDescription {1}'
                              '').format('impl_get_opt_by_path', descr.impl_getname())
index 3c0fb8f..9eec43a 100644 (file)
@@ -1,7 +1,7 @@
 from autopath import do_autopath
 do_autopath()
 
-import warnings
+import warnings, sys
 from py.test import raises
 
 from tiramisu.config import Config
@@ -49,15 +49,21 @@ def test_domainname_upper():
     has_error = False
     try:
         c.d = 'TOTO.COM'
-    except ValueError, err:
-        assert msg in unicode(err)
+    except ValueError as err:
+        if sys.version_info[0] >= 3:  # pragma: optional cover
+            assert msg in str(err)
+        else:
+            assert msg in unicode(err)
         has_error = True
     assert has_error is True
     has_error = False
     try:
         c.d = 'toTo.com'
-    except ValueError, err:
-        assert msg in unicode(err)
+    except ValueError as err:
+        if sys.version_info[0] >= 3:  # pragma: optional cover
+            assert msg in str(err)
+        else:
+            assert msg in unicode(err)
         has_error = True
     assert has_error is True
 
index e911b35..1b5e467 100644 (file)
@@ -207,7 +207,7 @@ def test_prop_dyndescription():
     assert str(cfg.cfgimpl_get_settings()[stval2]) in [str(['test']), str([u'test'])]
     cfg.cfgimpl_get_settings()[stval2].append('test2')
     assert str(cfg.cfgimpl_get_settings()[stval1]) in [str(['test']), str([u'test'])]
-    assert str(cfg.cfgimpl_get_settings()[stval2]) in [str(['test', 'test2']), str([u'test', 'test2'])]
+    assert str(cfg.cfgimpl_get_settings()[stval2]) in [str(['test', 'test2']), str([u'test', 'test2']), str(['test2', 'test'])]
     cfg.cfgimpl_get_settings()[stval1].remove('test')
     assert str(cfg.cfgimpl_get_settings()[stval1]) == str([])
     #
@@ -417,7 +417,7 @@ def test_prop_dyndescription_context():
     assert str(cfg.cfgimpl_get_settings()[stval2]) in [str(['test']), str([u'test'])]
     cfg.cfgimpl_get_settings()[stval2].append('test2')
     assert str(cfg.cfgimpl_get_settings()[stval1]) in [str(['test']), str([u'test'])]
-    assert str(cfg.cfgimpl_get_settings()[stval2]) in [str(['test', 'test2']), str([u'test', 'test2'])]
+    assert str(cfg.cfgimpl_get_settings()[stval2]) in [str(['test', 'test2']), str([u'test', 'test2']), str(['test2', 'test'])]
     cfg.cfgimpl_get_settings()[stval1].remove('test')
     assert str(cfg.cfgimpl_get_settings()[stval1]) == str([])
 
@@ -1346,7 +1346,7 @@ def test_invalid_samevalue_dyndescription():
     od = OptionDescription('od', '', [dod])
     cfg = Config(od)
     cfg
-    raises(ConfigError, "print cfg")
+    raises(ConfigError, "print(cfg)")
 
 
 def test_invalid_name_dyndescription():
@@ -1355,4 +1355,4 @@ def test_invalid_name_dyndescription():
     od = OptionDescription('od', '', [dod])
     cfg = Config(od)
     cfg
-    raises(ValueError, "print cfg")
+    raises(ValueError, "print(cfg)")
index 2f20db6..c8ca16a 100644 (file)
@@ -10,6 +10,7 @@ from tiramisu.storage import delete_session
 from tiramisu.error import ConfigError
 from pickle import dumps, loads
 from py.test import raises
+import sys
 
 
 def return_value(value=None):
@@ -460,7 +461,7 @@ def test_state_groupconfig():
 def test_state_unkown_setting_owner():
     """load an unknow _owner, should create it"""
     assert not 'supernewuser' in owners.__dict__
-    loads("""ccopy_reg
+    val = """ccopy_reg
 _reconstructor
 p0
 (ctiramisu.setting
@@ -496,5 +497,8 @@ sS'_properties'
 p17
 (dp18
 sbsb.
-.""")
+."""
+    if sys.version_info[0] >= 3:  # pragma: optional cover
+        val = bytes(val, "UTF-8")
+    loads(val)
     assert 'supernewuser' in owners.__dict__
index 082afb0..ffcdee8 100644 (file)
@@ -243,7 +243,7 @@ def calculate(callback, args, kwargs, returns_raise):
     if returns_raise:
         try:
             return callback(*args, **kwargs)
-        except ValueError, err:
+        except ValueError as err:
             return err
     else:
         return callback(*args, **kwargs)
index a09102b..096ca47 100644 (file)
@@ -20,6 +20,7 @@
 # ____________________________________________________________
 "options handler global entry point"
 import weakref
+import sys
 
 
 from .error import PropertiesOptionError, ConfigError, ConflictError
@@ -33,6 +34,10 @@ from .value import Values, Multi
 from .i18n import _
 
 
+if sys.version_info[0] >= 3:  # pragma: optional cover
+    xrange = range
+
+
 class SubConfig(object):
     """Sub configuration management entry.
     Tree if OptionDescription's responsability. SubConfig are generated
index 2a75efa..2988d83 100644 (file)
@@ -21,6 +21,7 @@
 import re
 from types import FunctionType
 import warnings
+import sys
 
 from ..i18n import _
 from ..setting import log, undefined
@@ -344,8 +345,12 @@ class BaseOption(Base):
         return self._properties
 
     def _impl_valid_unicode(self, value):
-        if not isinstance(value, unicode) and not isinstance(value, str):
-            return ValueError(_('invalid unicode or string'))
+        if sys.version_info[0] >= 3:
+            if not isinstance(value, str):
+                return ValueError(_('invalid string'))
+        else:
+            if not isinstance(value, unicode) and not isinstance(value, str):
+                return ValueError(_('invalid unicode or string'))
 
 
 class OnlyOption(BaseOption):
@@ -676,7 +681,7 @@ class Option(OnlyOption):
                                                   warnings_only, transitive)
                 if err:
                     if warnings_only:
-                        return ValueWarning(err.message, option)
+                        return ValueWarning(str(err), option)
                     else:
                         return err
 
index 6eb3cad..2f4578c 100644 (file)
@@ -278,7 +278,10 @@ class PortOption(Option):
 
     def _validate(self, value, context=undefined, current_opt=undefined):
         if isinstance(value, int):
-            value = unicode(value)
+            if sys.version_info[0] >= 3:  # pragma: optional cover
+                value = str(value)
+            else:
+                value = unicode(value)
         err = self._impl_valid_unicode(value)
         if err:
             return err
index dc5172b..c6c29c9 100644 (file)
@@ -35,6 +35,11 @@ StorageOptionDescription = get_storages_option('optiondescription')
 
 name_regexp = re.compile(r'^[a-zA-Z\d\-_]*$')
 
+import sys
+if sys.version_info[0] >= 3:  # pragma: optional cover
+    xrange = range
+del(sys)
+
 
 class OptionDescription(BaseOption, StorageOptionDescription):
     """Config's schema (organisation, group) and container of Options
index 8cabd6d..3568ef2 100644 (file)
@@ -130,7 +130,7 @@ def get_storages(context, session_id, persistent):
     values = imp.Values(storage)
     try:
         return settings, values
-    except Exception, err:
+    except Exception as err:
         raise Exception(_('unable to get storages:') + str(err))
 
 
index d3187c4..1d50573 100644 (file)
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #
 # ____________________________________________________________
+import sys
 from ...i18n import _
 from ...setting import undefined
 from ...error import ConfigError
 static_tuple = tuple()
 static_set = frozenset()
+if sys.version_info[0] >= 3:  # pragma: optional cover
+    xrange = range
 
 
 #____________________________________________________________
@@ -128,7 +131,7 @@ class StorageBase(object):
         if isinstance(dico, tuple):
             if key in dico[0]:
                 return dico[1][dico[0].index(key)]
-        elif isinstance(dico, str) or isinstance(dico, unicode):
+        elif self._is_string(dico):
             if key == 'doc':
                 return dico
         elif isinstance(dico, dict):
@@ -262,6 +265,12 @@ class StorageBase(object):
     def _impl_setopt(self, opt):
         self._opt = opt
 
+    def _is_string(self, infos):
+        if sys.version_info[0] >= 3:  # pragma: optional cover
+            return isinstance(infos, str)
+        else:
+            return isinstance(infos, str) or isinstance(infos, unicode)
+
     def _impl_convert_zinformations(self, descr, load=False):
         if not load:
             infos = self._informations
@@ -269,7 +278,7 @@ class StorageBase(object):
                 self._state_informations = {}
                 for idx, key in enumerate(infos[0]):
                     self._state_informations[key] = infos[1][idx]
-            elif isinstance(infos, str) or isinstance(infos, unicode):
+            elif self._is_string(infos):
                 self._state_informations = {'doc': infos}
             else:
                 self._state_informations = infos
index b118913..9948de8 100644 (file)
@@ -114,8 +114,10 @@ class Cache(object):
         return path in self._cache and index in self._cache[path]
 
     def reset_expired_cache(self, exp):
-        for key in self._cache.keys():
-            for index in self._cache[key].keys():
+        cache_keys = list(self._cache.keys())
+        for key in cache_keys:
+            key_cache_keys = list(self._cache[key].keys())
+            for index in key_cache_keys:
                 val, created = self._cache[key][index]
                 if created is not None and exp > created:
                     del(self._cache[key][index])