__getattr__ OD
authorEmmanuel Garette <egarette@cadoles.com>
Sat, 1 Feb 2014 17:35:18 +0000 (18:35 +0100)
committerEmmanuel Garette <egarette@cadoles.com>
Sat, 1 Feb 2014 17:35:18 +0000 (18:35 +0100)
test/test_config_api.py
tiramisu/config.py
tiramisu/option.py
tiramisu/storage/sqlalchemy/option.py

index ef2d4bf..89dbe85 100644 (file)
@@ -120,8 +120,7 @@ def test_find_in_config():
     assert conf.find(byname='prop') == [conf.unwrap_from_path('gc.prop')]
     conf.read_write()
     raises(AttributeError, "assert conf.find(byname='prop')")
-    assert conf.find(byname='prop', check_properties=False) == [conf.unwrap_from_path('gc.gc2.prop'), conf.unwrap_from_path('gc.prop')]
-    #assert conf.find_first(byname='prop') == conf.unwrap_from_path('gc.prop')
+    assert conf.find(byname='prop', check_properties=False) == [conf.unwrap_from_path('gc.prop'), conf.unwrap_from_path('gc.gc2.prop')]
     # combinaison of filters
     assert conf.find(bytype=BoolOption, byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
     assert conf.find_first(bytype=BoolOption, byname='dummy') == conf.unwrap_from_path('gc.dummy')
@@ -134,7 +133,7 @@ def test_find_in_config():
     assert conf.gc.find_first(byname='bool', byvalue=False) == conf.unwrap_from_path('gc.gc2.bool')
     raises(AttributeError, "assert conf.gc.find_first(byname='bool', byvalue=True)")
     raises(AttributeError, "conf.gc.find(byname='wantref').first()")
-    assert conf.gc.find(byname='prop', check_properties=False) == [conf.unwrap_from_path('gc.gc2.prop'), conf.unwrap_from_path('gc.prop')]
+    assert conf.gc.find(byname='prop', check_properties=False) == [conf.unwrap_from_path('gc.prop'), conf.unwrap_from_path('gc.gc2.prop')]
     conf.read_only()
     assert conf.gc.find(byname='prop') == [conf.unwrap_from_path('gc.prop')]
     # not OptionDescription
index 962fb0a..48e18e0 100644 (file)
@@ -320,9 +320,7 @@ class SubConfig(object):
         # if value and/or check_properties are set, need all avalaible option
         # If first one has no good value or not good property check second one
         # and so on
-        #FIXME
-        #only_first = first == True and value is None and check_properties is None
-        only_first = first
+        only_first = first is True and byvalue is None and check_properties is None
         options = self.cfgimpl_get_description().impl_get_options_paths(
             bytype, byname, _subpath, only_first)
         for path, option in options:
index 875149b..24d1b05 100644 (file)
@@ -366,7 +366,7 @@ class Option(OnlyOption):
                         #so _name is already set
                         is_readonly = True
                 #FIXME je n'aime pas ce except ...
-                except:
+                except KeyError:
                     pass
             elif name != '_readonly':
                 is_readonly = self.impl_is_readonly()
@@ -805,7 +805,6 @@ class SymLinkOption(OnlyOption):
         super(SymLinkOption, self)._impl_setstate(descr)
 
     def impl_get_information(self, key, default=None):
-        #FIXME ne devrait pas etre utile si ?
         return self._opt.impl_get_information(key, default)
 
 
@@ -1179,38 +1178,15 @@ class OptionDescription(BaseOption, StorageOptionDescription):
         self._group_type = groups.default
 
     def impl_getrequires(self):
-        #FIXME
         return self._requires
 
     def impl_getdoc(self):
         return self.impl_get_information('doc')
 
     def impl_validate(self, *args):
-        #FIXME a voir ...
+        """usefull for OptionDescription"""
         pass
 
-    def __getattr__(self, name):
-        try:
-            if name.startswith('_') or name.startswith('impl_'):
-                return object.__getattribute__(self, name)
-            else:
-                #FIXME regression ... devrait etre un query !
-                for child in self._children:
-                    if child.impl_getname() == name:
-                        return child
-                        #convert to object
-                        #return session.query(child._type).filter_by(id=child.id).first()
-                #return pouet#self._children[1][self._children[0].index(name)]
-        except ValueError:
-            pass
-        raise AttributeError(_('unknown Option {0} '
-                               'in OptionDescription {1}'
-                               '').format(name, self.impl_getname()))
-
-    #def impl_getkey(self, config):
-    #    return tuple([child.impl_getkey(getattr(config, child.impl_getname()))
-    #                  for child in self.impl_getchildren()])
-
     def impl_getpaths(self, include_groups=False, _currpath=None):
         """returns a list of all paths in self, recursively
            _currpath should not be provided (helps with recursion)
@@ -1288,7 +1264,6 @@ class OptionDescription(BaseOption, StorageOptionDescription):
         if init:
             self._readonly = True
 
-
     # ____________________________________________________________
     def impl_set_group_type(self, group_type):
         """sets a given group object to an OptionDescription
index 0990248..a2326c6 100644 (file)
@@ -382,8 +382,6 @@ class StorageOptionDescription(object):
             session.commit()
 
     def impl_get_options_paths(self, bytype, byname, _subpath, only_first):
-        #FIXME tester si 1er est un descr ...
-        #FAIRE UN JOIN pour only_first
         sqlquery = session.query(Cache).filter_by(descr=self.id)
         if bytype is None:
             sqlquery = sqlquery.filter(not_(Cache.opt_type == 'OptionDescription'))
@@ -415,6 +413,16 @@ class StorageOptionDescription(object):
                 ret.append((opt.path, option))
             return ret
 
+    def __getattr__(self, name):
+        if name.startswith('_') or name.startswith('impl_'):
+            return object.__getattribute__(self, name)
+        ret = session.query(_Base).filter_by(_parent=self.id, _name=name).first()
+        if ret is None:
+            raise AttributeError(_('unknown Option {0} '
+                                   'in OptionDescription {1}'
+                                   '').format(name, self.impl_getname()))
+        return ret
+
 
 class StorageBase(_Base):
     @declared_attr