Changeset 513 for elixir/trunk/elixir

Show
Ignore:
Timestamp:
11/09/09 21:10:55 (3 years ago)
Author:
ged
Message:

- do not leak options_defaults from a subclass into a parent class
- do not initialize useless attributes for base and abstract classes

Location:
elixir/trunk/elixir
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • elixir/trunk/elixir/entity.py

    r512 r513  
    4848    def __init__(self, entity): 
    4949        self.entity = entity 
    50         # entity.__module__ is not always reliable (eg in mod_python) 
    51         self.module = sys.modules.get(entity.__module__) 
    52  
    53         self.builders = [] 
    54  
    5550        self.parent = None 
    56         #XXX: use entity.__subclasses__ ? 
    57         self.children = [] 
    5851 
    5952        bases = [] 
     
    7366                    bases.append(base) 
    7467        self.bases = bases 
    75  
    76         if not is_entity(entity): 
     68        if not is_entity(entity) or is_abstract_entity(entity): 
    7769            return 
     70 
     71        # entity.__module__ is not always reliable (eg in mod_python) 
     72        self.module = sys.modules.get(entity.__module__) 
     73 
     74        self.builders = [] 
     75 
     76        #XXX: use entity.__subclasses__ ? 
     77        self.children = [] 
    7878 
    7979        # used for multi-table inheritance 
     
    9898 
    9999        # base class(es) options_defaults 
    100         base_defaults = {} 
    101         for base in self.bases: 
    102             base_defaults.update(getattr(base, 'options_defaults', {})) 
     100        options_defaults = self.options_defaults() 
    103101 
    104102        complete_defaults = options.options_defaults.copy() 
     
    111109        # set default value for other options 
    112110        for key in options.valid_options: 
    113             value = base_defaults.get(key, complete_defaults[key]) 
     111            value = options_defaults.get(key, complete_defaults[key]) 
    114112            if isinstance(value, dict): 
    115113                value = value.copy() 
     
    121119            if hasattr(self.module, attr): 
    122120                setattr(self, key, getattr(self.module, attr)) 
     121 
     122    def options_defaults(self): 
     123        base_defaults = {} 
     124        for base in self.bases: 
     125            base_defaults.update(base._descriptor.options_defaults()) 
     126        base_defaults.update(getattr(self.entity, 'options_defaults', {})) 
     127        return base_defaults 
    123128 
    124129    def setup_options(self): 
  • elixir/trunk/elixir/options.py

    r511 r513  
    242242            raise Exception("'%s' is not a valid option for Elixir entities." 
    243243                            % kwarg) 
    244     if not hasattr(entity, 'options_defaults'): 
     244 
     245    # We use __dict__ instead of hasattr to not check its presence within the 
     246    # parent, and thus update the parent dict instead of creating a local dict. 
     247    if not entity.__dict__.get('options_defaults'): 
    245248        entity.options_defaults = {} 
    246249    entity.options_defaults.update(kwargs)