vregistry.py
branchtls-sprint
changeset 660 5233a9457f6b
parent 652 603c782dc092
child 665 1305da1ce3f9
equal deleted inserted replaced
659:5d754a1933cb 660:5233a9457f6b
   202     def values(self):
   202     def values(self):
   203         return self._registries.values()
   203         return self._registries.values()
   204 
   204 
   205     def __contains__(self, key):
   205     def __contains__(self, key):
   206         return key in self._registries
   206         return key in self._registries
   207         
   207 
       
   208 
       
   209     ##########
       
   210     def register(self, obj, registryname=None):
       
   211         registryname = registryname or obj.__registry__
       
   212         registry = self._registries.setdefault(registryname, {})
       
   213         registry.setdefault(obj.id, []).append(obj)
       
   214         # XXX automatic reloading management
       
   215         self._registered['%s.%s' % (obj.__module__, obj.id)] = obj
       
   216 
       
   217     def register_if_interface_found(self, obj, registryname, iface):
       
   218         registry = self._registries.setdefault(registryname, {})
       
   219         for etype in self.registry_object('etypes'):
       
   220             if implements(etype, iface):
       
   221                 registry.setdefault(obj.id, []).append(obj)
       
   222                 # XXX automatic reloading management
       
   223                 self._registered['%s.%s' % (obj.__module__, obj.id)] = obj
       
   224                 break
       
   225 
       
   226     def unregister(self, obj, registryname=None):
       
   227         registryname = registryname or obj.__registry__
       
   228         registry = self.registry(registryname)
       
   229         removed_id = obj.classid()
       
   230         for registered in registry[obj.id]:
       
   231             # use classid() to compare classes because vreg will probably
       
   232             # have its own version of the class, loaded through execfile
       
   233             if registered.classid() == removed_id:
       
   234                 # XXX automatic reloading management
       
   235                 registry[obj.id].remove(registered)
       
   236                 break
       
   237     
       
   238     def register_and_replace(self, obj, replaced, registryname=None):
       
   239         registryname = registryname or obj.__registry__
       
   240         registry = self.registry(registryname)
       
   241         registered_objs = registry[obj.id]
       
   242         for index, registered in enumerate(registered_objs):
       
   243             if registered.classid() == replaced:
       
   244                 registry[obj.id][index] = obj
       
   245                 self._registered['%s.%s' % (obj.__module__, obj.id)] = obj
       
   246     ##########
       
   247     
   208     def register_vobject_class(self, cls, _kicked=set()):
   248     def register_vobject_class(self, cls, _kicked=set()):
   209         """handle vobject class registration
   249         """handle vobject class registration
   210         
   250         
   211         vobject class with __abstract__ == True in their local dictionnary or
   251         vobject class with __abstract__ == True in their local dictionnary or
   212         with a name starting starting by an underscore are not registered.
   252         with a name starting starting by an underscore are not registered.
   471             self.update_registered_subclasses(oldnew_mapping)
   511             self.update_registered_subclasses(oldnew_mapping)
   472         _lastmodifs[filepath] = modified_on
   512         _lastmodifs[filepath] = modified_on
   473         return True
   513         return True
   474 
   514 
   475     def load_module(self, module):
   515     def load_module(self, module):
   476         registered = {}
   516         if hasattr(module, 'cw_register_objects'):
   477         self.info('loading %s', module)
   517             self._registered = {}
   478         for objname, obj in vars(module).items():
   518             module.cw_register_objects(self)
   479             if objname.startswith('_'):
   519             registered = self._resigtered
   480                 continue
   520             del self._registered
   481             self.load_ancestors_then_object(module.__name__, registered, obj)
   521             return registered
   482         return registered
   522         else:
       
   523             registered = {}
       
   524             self.info('loading %s', module)
       
   525             for objname, obj in vars(module).items():
       
   526                 if objname.startswith('_'):
       
   527                     continue
       
   528                 self.load_ancestors_then_object(module.__name__, registered, obj)
       
   529             return registered
   483     
   530     
   484     def load_ancestors_then_object(self, modname, registered, obj):
   531     def load_ancestors_then_object(self, modname, registered, obj):
   485         # skip imported classes
   532         # skip imported classes
   486         if getattr(obj, '__module__', None) != modname:
   533         if getattr(obj, '__module__', None) != modname:
   487             return
   534             return