# HG changeset patch # User Sylvain Thénault # Date 1249986013 -7200 # Node ID 30063071aee0db447e8ed70c5a4a27003057bd68 # Parent 8a54f91a43e12e4991b02a2dafc11e5ad2574070 fix reloading, new .reset prototype diff -r 8a54f91a43e1 -r 30063071aee0 cwvreg.py --- a/cwvreg.py Mon Aug 10 18:01:46 2009 +0200 +++ b/cwvreg.py Tue Aug 11 12:20:13 2009 +0200 @@ -250,8 +250,8 @@ def itervalues(self): return (value for key, value in self.items()) - def reset(self): - super(CubicWebVRegistry, self).reset() + def reset(self, path=None, force_reload=None): + super(CubicWebVRegistry, self).reset(path, force_reload) self._needs_iface = {} # two special registries, propertydefs which care all the property # definitions, and propertyvals which contains values for those @@ -260,6 +260,17 @@ self['propertyvalues'] = self.eprop_values = {} for key, propdef in self.config.eproperty_definitions(): self.register_property(key, **propdef) + if path is not None and force_reload: + cleanup_sys_modules(path) + cubes = self.config.cubes() + # if the fs code use some cubes not yet registered into the instance + # we should cleanup sys.modules for those as well to avoid potential + # bad class reference pb after reloading + cfg = self.config + for cube in cfg.expand_cubes(cubes, with_recommends=True): + if not cube in cubes: + cpath = cfg.build_vregistry_cube_path([cfg.cube_dir(cube)]) + cleanup_sys_modules(cpath) def set_schema(self, schema): """set instance'schema and load application objects""" @@ -302,13 +313,14 @@ def register_objects(self, path, force_reload=None): """overriden to remove objects requiring a missing interface""" + if force_reload is None: + force_reload = self.config.mode == 'dev' try: self._register_objects(path, force_reload) except RegistryOutOfDate: CW_EVENT_MANAGER.emit('before-registry-reload') # modification detected, reset and reload - self.reset() - cleanup_sys_modules(path) + self.reset(path, force_reload) self._register_objects(path, force_reload) CW_EVENT_MANAGER.emit('after-registry-reload') diff -r 8a54f91a43e1 -r 30063071aee0 vregistry.py --- a/vregistry.py Mon Aug 10 18:01:46 2009 +0200 +++ b/vregistry.py Tue Aug 11 12:20:13 2009 +0200 @@ -206,7 +206,7 @@ super(VRegistry, self).__init__() self.config = config - def reset(self, force_reload=None): + def reset(self, path=None, force_reload=None): self.clear() self._lastmodifs = {} @@ -318,14 +318,7 @@ self._loadedmods = {} return filemods - def register_objects(self, path, force_reload=None, extrapath=None): - if force_reload is None: - force_reload = self.config.mode == 'dev' - elif not force_reload: - # force_reload == False usually mean modules have been reloaded - # by another connection, so we want to update the registry - # content even if there has been no module content modification - self.reset() + def register_objects(self, path, force_reload, extrapath=None): # need to clean sys.path this to avoid import confusion pb (i.e. # having the same module loaded as 'cubicweb.web.views' subpackage and # as views' or 'web.views' subpackage