diff --git a/test/test_config.py b/test/test_config.py index 9ff9652..8c7e332 100644 --- a/test/test_config.py +++ b/test/test_config.py @@ -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()) diff --git a/test/test_config_domain.py b/test/test_config_domain.py index 3c0fb8f..9eec43a 100644 --- a/test/test_config_domain.py +++ b/test/test_config_domain.py @@ -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 diff --git a/test/test_dyn_optiondescription.py b/test/test_dyn_optiondescription.py index e911b35..1b5e467 100644 --- a/test/test_dyn_optiondescription.py +++ b/test/test_dyn_optiondescription.py @@ -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)") diff --git a/test/test_state.py b/test/test_state.py index 2f20db6..c8ca16a 100644 --- a/test/test_state.py +++ b/test/test_state.py @@ -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__ diff --git a/tiramisu/autolib.py b/tiramisu/autolib.py index 082afb0..ffcdee8 100644 --- a/tiramisu/autolib.py +++ b/tiramisu/autolib.py @@ -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) diff --git a/tiramisu/config.py b/tiramisu/config.py index a09102b..096ca47 100644 --- a/tiramisu/config.py +++ b/tiramisu/config.py @@ -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 diff --git a/tiramisu/option/baseoption.py b/tiramisu/option/baseoption.py index 2a75efa..2988d83 100644 --- a/tiramisu/option/baseoption.py +++ b/tiramisu/option/baseoption.py @@ -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 diff --git a/tiramisu/option/option.py b/tiramisu/option/option.py index 6eb3cad..2f4578c 100644 --- a/tiramisu/option/option.py +++ b/tiramisu/option/option.py @@ -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 diff --git a/tiramisu/option/optiondescription.py b/tiramisu/option/optiondescription.py index dc5172b..c6c29c9 100644 --- a/tiramisu/option/optiondescription.py +++ b/tiramisu/option/optiondescription.py @@ -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 diff --git a/tiramisu/storage/__init__.py b/tiramisu/storage/__init__.py index 8cabd6d..3568ef2 100644 --- a/tiramisu/storage/__init__.py +++ b/tiramisu/storage/__init__.py @@ -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)) diff --git a/tiramisu/storage/dictionary/option.py b/tiramisu/storage/dictionary/option.py index d3187c4..1d50573 100644 --- a/tiramisu/storage/dictionary/option.py +++ b/tiramisu/storage/dictionary/option.py @@ -17,11 +17,14 @@ # 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 diff --git a/tiramisu/storage/util.py b/tiramisu/storage/util.py index b118913..9948de8 100644 --- a/tiramisu/storage/util.py +++ b/tiramisu/storage/util.py @@ -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])