clear vreg's parent_classes cache to fix etype cache / auto-reloading bug
authorAdrien Di Mascio <Adrien.DiMascio@logilab.fr>
Wed, 20 Jan 2010 13:03:08 +0100
changeset 4291 62a315e61adb
parent 4290 c2f15166f019
child 4296 bb8a572d3f55
clear vreg's parent_classes cache to fix etype cache / auto-reloading bug EtypeRegistry.parent_classes()'s is cached. When the registry is reloaded, if the cache is not cleared, we might get the old list of parent classes and that leads to strange bugs. Typical scenario : 1/ start application in debug mode 2/ go to add/Bookmark -> everything's fine 3/ change the source 4/ reload add/Bookmark -> 'creation' not selectable because : a/ cw detects a change in the source and reloads vreg b/ cw tries to select 'creation' view for 'Bookmark' - 'creation' view uses specified_etype_implements('Any') - cw compares Bookmark.__bases__[0] (i.e. new version of AnyEntity) with the old version of AnyEntity cached in the vreg. They don't match => view is not applicable.
cwvreg.py
--- a/cwvreg.py	Wed Jan 20 11:31:38 2010 +0100
+++ b/cwvreg.py	Wed Jan 20 13:03:08 2010 +0100
@@ -115,6 +115,7 @@
         super(ETypeRegistry, self).initialization_completed()
         # clear etype cache if you don't want to run into deep weirdness
         clear_cache(self, 'etype_class')
+        clear_cache(self, 'parent_classes')
 
     def register(self, obj, **kwargs):
         oid = kwargs.get('oid') or class_regid(obj)