[Zope3-dev] Re: Merging schema & interfaces

Jim Fulton jim at zope.com
Tue Mar 2 11:23:53 EST 2004


Peter Sabaini wrote:
> Jim Fulton wrote:
> 
>> Derrick 'dman' Hudson wrote:
>>
>>> On Tue, Mar 02, 2004 at 10:10:34AM -0300, Sidnei da Silva wrote:
>>> | | On Mon, 01 Mar 2004 10:05:08 -0500
>>> | | Jim Fulton <jim at zope.com> wrote:
>>> | | [..]
>>> | | > There is a separate schema package because schema are much 
>>> newer than
>>> | | > interfaces. It's a packaging issue, not a technical issue.  I'm 
>>> open
>>> | | > to merging the schema package into the interface package at some
>>> | | > point.
>>> | | Now that the subject came up, I would like to ask your opinions on
>>> | improving field constraints a bit, so one can have a bit more context
>>> | (like the object bound to the field for example). What do you think?
>>>
>>> +1
>>>
>>> I think this is essential.
>>>
>>> Imagine you are creating a contact, as in Jim's tutorial slides.  The
>>> contact has a city, state and zip code (in the US).  Without this
>>> context, someone could enter the address "Rochester, NY 60123".  Zip
>>> code 60123, however, is for Elgin, IL.  If need be, I could dig out
>>> several other real-world situations where the valid values for one
>>> field depend on the value set in another.
>>
>>
>>
>> Yup, this is the classic reason why someone would want this, *but*:
>>
>>> This does bring up the issue, though, of order of evaluation.  Perhaps
>>> a field could have two constraints - the first is applied only to the
>>> pending value of the field, the second has access to all the pending
>>> values.  All context-independent constraints are evaluated before any
>>> context-dependent ones are.  This way a field can have an independent
>>> sanity check that must pass before any other fields' context-dependent
>>> constraints see the value.
>>
>>
>>
>> This road leads to madness. I know, I've been down it before. :)
> 
>  >
> 
>> I've come to the conclusion that it is a mistake to try to deal with
>> relationships between multiple fields in individual field constraints.
>>
>> To deal with constraints on multiple fields, we will add the ability to
>> model interface/schema-level invariants/constraints.
>>
>> def cityStateZip(contact):
>>     pc = lookupPostalCodeFor(contact.city, contact.state)
>>     if pc != contact.postal_code:
>>        raise InvalidPostalCode(contact)
>>
>> class IContact(zope.interface.Interface):
>>
>>    postal_code = ...
>>    city = ...
>>    state = ...
>>
>>    invariant(cityStateZip)
>>
>> Then, when we modify a contact, we can check individual
>> field constraints *and* we can check the interface-level invariants.
> 
> 
> FWIW,
> 
> I dont know about madness (and anyway, the little green martians dancing 
> around me tell me not to worry...), but I've implemented something not 
> unlike this just now. The neat things (IMHO) about this:
> 
> * every attribute has a stack of 'Validators'
> 
> * Validators are constraints and operations on them (AND, OR, NOT)
> 
> * Validators are evaluated in a RPN-like notation
> 
> That way, one can create pretty flexible expressions, both on the 
> attribute and schema level.

Are yuou saying that the validators use the values of multiple fields?

Jim

-- 
Jim Fulton           mailto:jim at zope.com       Python Powered!
CTO                  (540) 361-1714            http://www.python.org
Zope Corporation     http://www.zope.com       http://www.zope.org




More information about the Zope3-dev mailing list