Fixed extra change-hook save in testChangeHookMutableProperty.
authorW. Trevor King <wking@drexel.edu>
Tue, 21 Jul 2009 16:07:27 +0000 (12:07 -0400)
committerW. Trevor King <wking@drexel.edu>
Tue, 21 Jul 2009 16:07:27 +0000 (12:07 -0400)
commit795b15c60fd43e5d393f53926d679fb29c609359
tree582700bef457eaf8386bdec77d78a1b10a8e225e
parent680b3a15076d24d9e1ba5cd96623081d74dbd441
Fixed extra change-hook save in testChangeHookMutableProperty.

The actual fix was

@@ -339,7 +355,10 @@
         fset = funcs.get("fset")
         name = funcs.get("name", "<unknown>")
         def _fget(self, new_value=None, from_fset=False): # only used if mutable == True
-            value = fget(self)
+            if from_fset == True:
+                value = new_value # compare new value with cached
+            else:
+                value = fget(self) # compare current value with cached
             if _cmp_cached_mutable_property(self, "change hook property", name, value) != 0:
                 # there has been a change, cache new value
                 old_value = _get_cached_mutable_property(self, "change hook property", name)

The reason for the double-save was:

  >>> print t.settings["List-type"]==EMPTY
  True
    (the cached value here is EMPTY)
  >>> t.list_type = []
    (old fget compares cached EMPTY to current EMPTY, no change, so no
     cache.  fset notices change and saves EMPTY->[])
  >>> t.list_type.append(5)
    (now fget notices the change EMPTY->[], caches [], and calls extra save)

The new way:

  >>> print t.settings["List-type"]==EMPTY
  True
    (the cached value here is EMPTY)
  >>> t.list_type = []
    (fget compares cached EMPTY to new [] and saves EMPTY->[])
  >>> t.list_type.append(5)
    (fget sees no change ([]->[]), which is correct)

In addition to the fix and the related corrections to
testChangeHookMutableProperty, I added details about mutables to all
relevant docstrings and stripped trailing whitespace from both files.
libbe/properties.py
libbe/settings_object.py