[TransWarp] Constraints on model attributes
    Roché Compaan 
    roche at upfrontsystems.co.za
       
    Tue Jul 29 03:41:23 EDT 2003
    
    
  
* Phillip J. Eby <pje at telecommunity.com> [2003-07-29 00:39]:
> >How do I set attributes on the referencedType that are needed for
> >normalization *without* subclassing the types.
> 
> Eh?  That would be a *different* type.  So subclassing would be appropriate.
> 
> 
> >To be clear, let's
> >say I have a model.Attribute that only allows values in an enumerated
> >set and with a maximum length of 4 characters. For example on planet
> >Stepford, the beings there are only allowed names John, Mary and Pete
> >and their names may not be longer than 4 characters.
> 
> Um, why would you do that?  They're already four characters long, so what's 
> the extra bit for?
Just an example of another constraint.
> >class Drone(model.Element):
> >
> >    class Name(model.Attribute):
> >        referencedType = Text
> >
> >        # Ugly, doesn't work and just to illustrate what I want to do.
> >        referencedType.max_length = 4
> >        referencedType.John = model.enum("John")
> >        referencedType.Mary = model.enum("Mary")
> >        referencedType.Pete = model.enum("Pete")
> >
> >        # or
> >        referencedType = Text(max_length=4,
> >            allowed_values=["John", "Mary", "Pete"])
> 
> class DroneName(Enumeration):
>     John = Mary = Pete = model.enum()
> 
> class Drone(model.Element):
>     referencedType = DroneName
> 
> And that would be it.  Now, if you wanted to ensure that they were four 
> characters long, you could probably do something like:
> 
> class DroneName(MinMaxLen, Enumeration, Type):
>     max_length = 4
>     John = Mary = Pete = model.enum()
The problem is that the sequence for the enumaration can be dynamically
computed, so subclassing won't work eg.:
class Customer(model.Element):
    class Category(model.Attribute):
        referencedType = Enumeration(values=func)
where func returns a list of categories the user created in the app.
> >This is where I got stuck previously and implemented what are now types
> >as model.Attributes.
> 
> I'm not sure why you want to make types into constraints on features.  This 
> seems counterintuitive to me, since this is less reusable than just 
> creating a type explicitly.  Usually a type is available directly from a 
> module, whereas a feature is inside a class.
Yes, that's why I changed Enumeration, Text, MinMaxLen, etc to types -
they are not model.Attributes anymore. And as I said previously I agree
with you that they should be types - I just mentioned where I got stuck
the first time.
> I suppose I can imagine there being certain types that you don't want to 
> call out explicitly because they repeat a lot (e.g. bounded strings), but 
> I'd rather address such items on a case-by-case basis with e.g. functions 
> to create a new type on the fly.  Hm.  I suppose you could always create 
> constraints as IType/ITypeInfo implementations to wrap existing types, e.g.:
> 
> class DroneName(Enumeration):
>     John = Mary = Pete = model.enum()
> 
> class Drone(model.Element):
>     referencedType = MinMaxLen(DroneName, max_length=4)
This shows promise. Or MinMaxLen could be a type factory, then no
wrapping is needed?
I just want to make it as simple as possible for somebody using these
types. It should be as trivial as saying varchar[10] in SQL. Subclassing
shouldn't be required for simple constraints:
    class MemberPassword(model.Attribute):
        referencedType = Password(min_length=4)
    class Age(model.Attribute):
        referencedType = Integer(min=18)
    class Gender(model.Attribute):
        referencedType = Text(values=['male','female'])
    class SomeCategory(model.Attribute):
        referencedType = Enumeration(values=func_returning_categories)
-- 
Roché Compaan
Upfront Systems                 http://www.upfrontsystems.co.za
    
    
More information about the PEAK
mailing list