Merge branch 'master' of ssh://git.labs.libre-entreprise.org/gitroot/tiramisu
[tiramisu.git] / tiramisu / setting.py
index 836278f..86f900e 100644 (file)
@@ -22,6 +22,7 @@
 # ____________________________________________________________
 from time import time
 from copy import copy
+import weakref
 from tiramisu.error import (RequirementError, PropertiesOptionError,
                             ConstError, ConfigError)
 from tiramisu.i18n import _
@@ -131,12 +132,12 @@ def populate_owners():
     setattr(owners, 'default', owners.DefaultOwner('default'))
     setattr(owners, 'user', owners.Owner('user'))
 
-    def add_owner(name):
+    def addowner(name):
         """
         :param name: the name of the new owner
         """
         setattr(owners, name, owners.Owner(name))
-    setattr(owners, 'add_owner', add_owner)
+    setattr(owners, 'addowner', addowner)
 
 # names are in the module now
 populate_owners()
@@ -221,9 +222,8 @@ def get_storage(context, session_id, persistent):
 
     if session_id is None:
         session_id = gen_id(context)
-    a=__import__(storage_type.get_storage(), globals(), locals(),
+    return __import__(storage_type.get_storage(), globals(), locals(),
                       ['Storage'], -1).Storage(session_id, persistent)
-    return a
 
 
 def list_sessions():
@@ -239,7 +239,7 @@ def delete_session(session_id):
 #____________________________________________________________
 class Settings(object):
     "``Config()``'s configuration options"
-    __slots__ = ('context', '_owner', '_p_')
+    __slots__ = ('context', '_owner', '_p_', '__weakref__')
 
     def __init__(self, context, storage):
         """
@@ -253,7 +253,7 @@ class Settings(object):
         """
         # generic owner
         self._owner = owners.user
-        self.context = context
+        self.context = weakref.ref(context)
         import_lib = 'tiramisu.storage.{0}.setting'.format(storage.storage)
         self._p_ = __import__(import_lib, globals(), locals(), ['Settings'],
                               -1).Settings(storage)
@@ -287,7 +287,7 @@ class Settings(object):
             if opt is not None and _path is None:
                 _path = self._get_opt_path(opt)
             self._p_.reset_properties(_path)
-        self.context.cfgimpl_reset_cache()
+        self.context().cfgimpl_reset_cache()
 
     def _getproperties(self, opt=None, path=None, is_apply_req=True):
         if opt is None:
@@ -337,7 +337,7 @@ class Settings(object):
                 self._p_.reset_properties(path)
             else:
                 self._p_.setproperties(path, properties)
-        self.context.cfgimpl_reset_cache()
+        self.context().cfgimpl_reset_cache()
 
     #____________________________________________________________
     def validate_properties(self, opt_or_descr, is_descr, is_write, path,
@@ -377,7 +377,7 @@ class Settings(object):
             properties -= frozenset(('mandatory', 'frozen'))
         else:
             if 'mandatory' in properties and \
-                    not self.context.cfgimpl_get_values()._isempty(
+                    not self.context().cfgimpl_get_values()._isempty(
                         opt_or_descr, value):
                 properties.remove('mandatory')
             if is_write and 'everything_frozen' in self_properties:
@@ -494,8 +494,8 @@ class Settings(object):
                                              " '{0}' with requirement on: "
                                              "'{1}'").format(path, reqpath))
                 try:
-                    value = self.context._getattr(reqpath,
-                                                  force_permissive=True)
+                    value = self.context()._getattr(reqpath,
+                                                    force_permissive=True)
                 except PropertiesOptionError, err:
                     if not transitive:
                         continue
@@ -519,4 +519,4 @@ class Settings(object):
             return calc_properties
 
     def _get_opt_path(self, opt):
-        return self.context.cfgimpl_get_description().impl_get_path_by_opt(opt)
+        return self.context().cfgimpl_get_description().impl_get_path_by_opt(opt)