Merge branch 'master' into force-cache
authorEmmanuel Garette <egarette@cadoles.com>
Sat, 15 Mar 2014 09:09:19 +0000 (10:09 +0100)
committerEmmanuel Garette <egarette@cadoles.com>
Sat, 15 Mar 2014 09:09:19 +0000 (10:09 +0100)
Conflicts:
translations/fr/tiramisu.po
translations/tiramisu.pot

test/test_cache.py
test/test_mandatory.py
test/test_option_setting.py
tiramisu/config.py
tiramisu/setting.py
tiramisu/value.py
translations/fr/tiramisu.po
translations/tiramisu.pot

index f483c76..e1cd609 100644 (file)
@@ -4,7 +4,11 @@ from tiramisu import setting
 setting.expires_time = 1
 from tiramisu.option import IntOption, OptionDescription
 from tiramisu.config import Config
+from tiramisu.error import ConfigError
+
+
 from time import sleep, time
+from py.test import raises
 
 
 def make_description():
@@ -253,3 +257,25 @@ def test_reset_cache_only():
     c.cfgimpl_reset_cache(only=('settings',))
     assert 'u1' in values._p_.get_cached(c)
     assert 'u1' not in settings._p_.get_cached(c)
+
+
+def test_force_cache():
+    u1 = IntOption('u1', '', multi=True)
+    u2 = IntOption('u2', '')
+    u3 = IntOption('u3', '', multi=True)
+    u4 = IntOption('u4', '', properties=('disabled',))
+    od = OptionDescription('od1', '', [u1, u2, u3, u4])
+    c = Config(od)
+    c.cfgimpl_get_settings().remove('expire')
+
+    c.cfgimpl_get_values().force_cache()
+    assert c.cfgimpl_get_values()._p_.get_cached(c) == {'u1': ([], None), 'u3': ([], None), 'u2': (None, None), 'u4': (None, None)}
+    assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'u4': (set(['disabled']), None), 'u1': (set([]), None), 'u3': (set([]), None), 'u2': (set([]), None)}
+    c.read_only()
+
+    c.cfgimpl_get_values().force_cache()
+    assert c.cfgimpl_get_values()._p_.get_cached(c) == {'u1': ([], None), 'u3': ([], None), 'u2': (None, None)}
+    assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'u4': (set(['disabled']), None), 'u1': (set([]), None), 'u3': (set([]), None), 'u2': (set([]), None)}
+
+    c.cfgimpl_get_settings().remove('cache')
+    raises(ConfigError, "c.cfgimpl_get_values().force_cache()")
index c535e31..5b9878a 100644 (file)
@@ -1,7 +1,7 @@
 import autopath
 
 #from py.test import raises
-from tiramisu.config import Config, mandatory_warnings
+from tiramisu.config import Config
 from tiramisu.option import StrOption, UnicodeOption, OptionDescription
 from tiramisu.error import PropertiesOptionError
 
@@ -205,11 +205,11 @@ def test_mandatory_warnings_ro():
     except PropertiesOptionError as err:
         proc = err.proptype
     assert proc == ['mandatory']
-    assert list(mandatory_warnings(config)) == ['str', 'str1', 'unicode2', 'str3']
+    assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
     config.read_write()
     config.str = 'a'
     config.read_only()
-    assert list(mandatory_warnings(config)) == ['str1', 'unicode2', 'str3']
+    assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
 
 
 def test_mandatory_warnings_rw():
@@ -218,9 +218,9 @@ def test_mandatory_warnings_rw():
     config.str = ''
     config.read_write()
     config.str
-    assert list(mandatory_warnings(config)) == ['str', 'str1', 'unicode2', 'str3']
+    assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
     config.str = 'a'
-    assert list(mandatory_warnings(config)) == ['str1', 'unicode2', 'str3']
+    assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
 
 
 def test_mandatory_warnings_disabled():
@@ -230,9 +230,9 @@ def test_mandatory_warnings_disabled():
     setting = config.cfgimpl_get_settings()
     config.read_write()
     config.str
-    assert list(mandatory_warnings(config)) == ['str', 'str1', 'unicode2', 'str3']
+    assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
     setting[descr.str].append('disabled')
-    assert list(mandatory_warnings(config)) == ['str1', 'unicode2', 'str3']
+    assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
 
 
 def test_mandatory_warnings_frozen():
@@ -242,7 +242,7 @@ def test_mandatory_warnings_frozen():
     setting = config.cfgimpl_get_settings()
     config.read_write()
     config.str
-    assert list(mandatory_warnings(config)) == ['str', 'str1', 'unicode2', 'str3']
+    assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
     setting[descr.str].append('frozen')
     config.read_only()
-    assert list(mandatory_warnings(config)) == ['str', 'str1', 'unicode2', 'str3']
+    assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
index 94755e8..28327d5 100644 (file)
@@ -310,6 +310,15 @@ def test_access_by_get_whith_hide():
     raises(AttributeError, "c.find(byname='b1')")
 
 
+def test_extend_config_properties():
+    descr = make_description()
+    cfg = Config(descr)
+    setting = cfg.cfgimpl_get_settings()
+    assert str(setting) == str(['cache', 'expire', 'validator'])
+    setting.extend(['test', 'test2'])
+    assert str(setting) == str(['test', 'cache', 'test2', 'expire', 'validator'])
+
+
 def test_append_properties():
     descr = make_description()
     cfg = Config(descr)
index 4c59dbe..0ad082a 100644 (file)
@@ -719,19 +719,5 @@ class MetaConfig(GroupConfig):
 
 
 def mandatory_warnings(config):
-    """convenience function to trace Options that are mandatory and
-    where no value has been set
-
-    :returns: generator of mandatory Option's path
-
-    """
-    #if value in cache, properties are not calculated
-    config.cfgimpl_reset_cache(only=('values',))
-    for path in config.cfgimpl_get_description().impl_getpaths(
-            include_groups=True):
-        try:
-            config._getattr(path, force_properties=frozenset(('mandatory',)))
-        except PropertiesOptionError as err:
-            if err.proptype == ['mandatory']:
-                yield path
-    config.cfgimpl_reset_cache(only=('values',))
+    #only for retro-compatibility
+    config.cfgimpl_get_values().mandatory_warnings()
index e2ddb7d..d3b0a3b 100644 (file)
@@ -408,6 +408,10 @@ class Settings(object):
             props.remove(propname)
             self._setproperties(props, None, None)
 
+    def extend(self, propnames):
+        for propname in propnames:
+            self.append(propname)
+
     def _setproperties(self, properties, opt, path):
         """save properties for specified opt
         (never save properties if same has option properties)
index ed70f90..a82e1a4 100644 (file)
@@ -21,7 +21,7 @@ from time import time
 from copy import copy
 import sys
 import weakref
-from tiramisu.error import ConfigError, SlaveError
+from tiramisu.error import ConfigError, SlaveError, PropertiesOptionError
 from tiramisu.setting import owners, multitypes, expires_time, undefined
 from tiramisu.autolib import carry_out_calculation
 from tiramisu.i18n import _
@@ -395,6 +395,42 @@ class Values(object):
                 raise ValueError(_("information's item"
                                    " not found: {0}").format(key))
 
+    def mandatory_warnings(self):
+        """convenience function to trace Options that are mandatory and
+        where no value has been set
+
+        :returns: generator of mandatory Option's path
+
+        """
+        #if value in cache, properties are not calculated
+        self.reset_cache(False)
+        context = self.context()
+        for path in context.cfgimpl_get_description().impl_getpaths(
+                include_groups=True):
+            try:
+                context._getattr(path,
+                                 force_properties=frozenset(('mandatory',)))
+            except PropertiesOptionError as err:
+                if err.proptype == ['mandatory']:
+                    yield path
+        self.reset_cache(False)
+
+    def force_cache(self):
+        """parse all option to force data in cache
+        """
+        context = self.context()
+        if not 'cache' in context.cfgimpl_get_settings():
+            raise ConfigError(_('can force cache only if cache '
+                                'is actived in config'))
+        #remove all cached properties and value to update "expired" time
+        context.cfgimpl_reset_cache()
+        for path in context.cfgimpl_get_description().impl_getpaths(
+                include_groups=True):
+            try:
+                context._getattr(path)
+            except PropertiesOptionError:
+                pass
+
     def __getstate__(self):
         return {'_p_': self._p_}
 
index e5ce1a1..3dee004 100644 (file)
@@ -30,7 +30,7 @@ msgid "unknown group_type: {0}"
 msgstr "group_type inconnu: {0}"
 
 #: tiramisu/config.py:164 tiramisu/setting.py:339 tiramisu/value.py:57
-#: tiramisu/value.py:449
+#: tiramisu/value.py:485
 msgid "the context does not exist anymore"
 msgstr "le context n'existe plus"
 
@@ -506,24 +506,24 @@ msgid "if opt is not None, path should not be None in _getproperties"
 msgstr ""
 "si opt n'est pas None, path devrait ne pas être à None dans _getproperties"
 
-#: tiramisu/setting.py:483
+#: tiramisu/setting.py:487
 msgid "cannot change the value for option {0} this option is frozen"
 msgstr ""
 "ne peut modifier la valeur de l'option {0} cette option n'est pas modifiable"
 
-#: tiramisu/setting.py:489
+#: tiramisu/setting.py:493
 msgid "trying to access to an option named: {0} with properties {1}"
 msgstr "tentative d'accès à une option nommée : {0} avec les propriétés {1}"
 
-#: tiramisu/setting.py:507
+#: tiramisu/setting.py:511
 msgid "permissive must be a tuple"
 msgstr "permissive doit être un tuple"
 
-#: tiramisu/setting.py:514 tiramisu/value.py:334
+#: tiramisu/setting.py:518 tiramisu/value.py:334
 msgid "invalid generic owner {0}"
 msgstr "invalide owner générique {0}"
 
-#: tiramisu/setting.py:602
+#: tiramisu/setting.py:606
 msgid ""
 "malformed requirements imbrication detected for option: '{0}' with "
 "requirement on: '{1}'"
@@ -531,7 +531,7 @@ msgstr ""
 "imbrication de requirements mal formés detectée pour l'option : '{0}' avec "
 "requirement sur : '{1}'"
 
-#: tiramisu/setting.py:613
+#: tiramisu/setting.py:617
 msgid "option '{0}' has requirement's property error: {1} {2}"
 msgstr "l'option '{0}' a une erreur de propriété pour le requirement : {1} {2}"
 
@@ -560,43 +560,48 @@ msgstr "un espace de stockage dictionary ne peut être persistant"
 msgid "no value for {0} cannot change owner to {1}"
 msgstr "pas de valeur pour {0} ne peut changer d'utilisateur pour {1}"
 
-#: tiramisu/value.py:426
+#: tiramisu/value.py:423
+msgid "can force cache only if cache is actived in config"
+msgstr ""
+"peut force la mise en cache seulement si le cache est activé dans la config"
+
+#: tiramisu/value.py:462
 msgid "{0} is already a Multi "
 msgstr "{0} est déjà une Multi"
 
-#: tiramisu/value.py:462 tiramisu/value.py:526
+#: tiramisu/value.py:498 tiramisu/value.py:562
 msgid "invalid len for the slave: {0} which has {1} as master"
 msgstr "longueur invalide pour une esclave : {0} qui a {1} comme maître"
 
-#: tiramisu/value.py:498
+#: tiramisu/value.py:534
 msgid "cannot append a value on a multi option {0} which is a slave"
 msgstr "ne peut ajouter une valeur sur l'option multi {0} qui est une esclave"
 
-#: tiramisu/value.py:536
+#: tiramisu/value.py:572
 msgid "cannot sort multi option {0} if master or slave"
 msgstr "ne peut trier une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:540
+#: tiramisu/value.py:576
 msgid "cmp is not permitted in python v3 or greater"
 msgstr "cmp n'est pas permis en python v3 ou supérieure"
 
-#: tiramisu/value.py:549
+#: tiramisu/value.py:585
 msgid "cannot reverse multi option {0} if master or slave"
 msgstr "ne peut inverser une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:557
+#: tiramisu/value.py:593
 msgid "cannot insert multi option {0} if master or slave"
 msgstr "ne peut insérer une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:565
+#: tiramisu/value.py:601
 msgid "cannot extend multi option {0} if master or slave"
 msgstr "ne peut étendre une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:576
+#: tiramisu/value.py:612
 msgid "invalid value {0} for option {1}: {2}"
 msgstr "valeur invalide {0} pour l'option {1} : {2}"
 
-#: tiramisu/value.py:594
+#: tiramisu/value.py:630
 msgid "cannot pop a value on a multi option {0} which is a slave"
 msgstr "ne peut supprimer une valeur dans l'option multi {0} qui est esclave"
 
index 738fa53..81a388e 100644 (file)
@@ -28,7 +28,7 @@ msgid "unknown group_type: {0}"
 msgstr ""
 
 #: tiramisu/config.py:164 tiramisu/setting.py:339 tiramisu/value.py:57
-#: tiramisu/value.py:449
+#: tiramisu/value.py:485
 msgid "the context does not exist anymore"
 msgstr ""
 
@@ -472,27 +472,27 @@ msgstr ""
 msgid "if opt is not None, path should not be None in _getproperties"
 msgstr ""
 
-#: tiramisu/setting.py:483
+#: tiramisu/setting.py:487
 msgid "cannot change the value for option {0} this option is frozen"
 msgstr ""
 
-#: tiramisu/setting.py:489
+#: tiramisu/setting.py:493
 msgid "trying to access to an option named: {0} with properties {1}"
 msgstr ""
 
-#: tiramisu/setting.py:507
+#: tiramisu/setting.py:511
 msgid "permissive must be a tuple"
 msgstr ""
 
-#: tiramisu/setting.py:514 tiramisu/value.py:334
+#: tiramisu/setting.py:518 tiramisu/value.py:334
 msgid "invalid generic owner {0}"
 msgstr ""
 
-#: tiramisu/setting.py:602
+#: tiramisu/setting.py:606
 msgid "malformed requirements imbrication detected for option: '{0}' with requirement on: '{1}'"
 msgstr ""
 
-#: tiramisu/setting.py:613
+#: tiramisu/setting.py:617
 msgid "option '{0}' has requirement's property error: {1} {2}"
 msgstr ""
 
@@ -520,43 +520,47 @@ msgstr ""
 msgid "no value for {0} cannot change owner to {1}"
 msgstr ""
 
-#: tiramisu/value.py:426
+#: tiramisu/value.py:423
+msgid "can force cache only if cache is actived in config"
+msgstr ""
+
+#: tiramisu/value.py:462
 msgid "{0} is already a Multi "
 msgstr ""
 
-#: tiramisu/value.py:462 tiramisu/value.py:526
+#: tiramisu/value.py:498 tiramisu/value.py:562
 msgid "invalid len for the slave: {0} which has {1} as master"
 msgstr ""
 
-#: tiramisu/value.py:498
+#: tiramisu/value.py:534
 msgid "cannot append a value on a multi option {0} which is a slave"
 msgstr ""
 
-#: tiramisu/value.py:536
+#: tiramisu/value.py:572
 msgid "cannot sort multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:540
+#: tiramisu/value.py:576
 msgid "cmp is not permitted in python v3 or greater"
 msgstr ""
 
-#: tiramisu/value.py:549
+#: tiramisu/value.py:585
 msgid "cannot reverse multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:557
+#: tiramisu/value.py:593
 msgid "cannot insert multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:565
+#: tiramisu/value.py:601
 msgid "cannot extend multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:576
+#: tiramisu/value.py:612
 msgid "invalid value {0} for option {1}: {2}"
 msgstr ""
 
-#: tiramisu/value.py:594
+#: tiramisu/value.py:630
 msgid "cannot pop a value on a multi option {0} which is a slave"
 msgstr ""