[PEAK] Trellis: setting @maintain attributes / initialization
rollback
Sergey Schetinin
maluke at gmail.com
Wed Oct 8 18:19:54 EDT 2008
Works well with my tests. Thanks!
Regarding corner cases, for example the TempConverter from README can
be initialized with TempConverter(F=0, C=0), which breaks the data
integrity. Such use of maintain rules would make sense in some cases
and one can add another maintain rule to check .was_set for both cells
to control such cases, but I thought I'd mention it anyway, because it
seems somewhat relevant.
On Thu, Oct 9, 2008 at 00:52, Phillip J. Eby <pje at telecommunity.com> wrote:
> At 11:47 PM 10/8/2008 +0300, Sergey Schetinin wrote:
>>
>> Consider this example:
>>
>> class C(Component):
>> @maintain(optional=True)
>> def calc(self):
>> return 0
>>
>> @maintain
>> def getx(self):
>> print 'get'
>> self.calc
>>
>> @maintain
>> def set(self):
>> print 'set'
>> self.calc = 1
>>
>> c = C()
>>
>> Depending on luck (order of hashes of get / set attr names I suppose)
>> we either get InputConflict or not.
>> If the get rule runs first, set rule is a conflict because the Cell is
>> set by the calc rule.
>> If set gets to run first, there's no conflict because calc rule
>> doesn't need to run.
>
> Actually, in that last case, the calc rule does need to run -- and does.
> It's just that its output is discarded, and not considered a conflict.
>
>
>> Is it possible to have calc / get rules rollback even when set runs last?
>
> Hm. I suppose. This seems to work (line 143 of trellis.py):
>
> if self._set_by is not ctrl.current_listener and self._set_by is
> not self:
>
> It doesn't break any of the existing tests, and adding a test for the above
> (forcing the order using an __init__ method) seems to work:
>
> def testResetCalcValue(self):
> class C(trellis.Component):
>
> trellis.maintain(optional=True)
> def calc(self):
> return 0
>
> trellis.maintain()
> def getx(self):
> print 'get'
> self.calc
>
> trellis.maintain()
> def set(self):
> print 'set'
> self.calc = 1
>
> def __init__(self):
> self.getx
> self.set
>
> c = C()
>
>
> That is, it generates an InputConflict without the change, and prints "get",
> "set", "get" with the change.
>
> I am a little suspicious of this, even though it *seems* correct. Mainly I
> worry a little about certain corner cases for initialization, but feel free
> to try the patch above for now. I want to think about this a bit more
> before I officially support it.
>
> I agree, however, that it *should* be supported, because it's an order
> dependency of precisely the sort that the trellis should make impossible. I
> just want to make sure it covers all the bases, and may need to think of
> some other test scenarios.
>
>
--
Best Regards,
Sergey Schetinin
http://s3bk.com/ -- S3 Backup
http://word-to-html.com/ -- Word to HTML Converter
More information about the PEAK
mailing list