[Zope3-dev] schema initial documentation
Florent Guillaume
fg@nuxeo.com
Mon, 22 Apr 2002 14:46:02 +0000 (UTC)
Hi,
This simple example already raises what I believes could be i18n issues:
- documentation, title: are those only for the programmer? If that
is the case, then there is no i18n problem there.
- if there is error checking, then it means the error could possibly
get back to the user, so it may be important to have a codification
of possible errors to be able to translate them. A simple
raise KeyError, name
is ok to translate but anything more complex should probably use a new
Exception subclass, and they should be part of the schema.
- date_of_birth: i18n is also probably done at a higher level, but I
wanted to mention it also, in case I'm mistaken.
Florent
Martijn Faassen <faassen@vet.uu.nl> wrote:
> Hi there,
>
> I've written up some very initial documentation on the schema Jim and I
> were playing with last week during the sprint. Here it comes, please comment!
>
> Zope 3 Schemas
>
> Introduction
>
> Zope 3 schemas were born when we (Jim Fulton and Martijn Faassen)
> were thinking about Formulator for Zope3 and PropertySets while at
> the Zope3 sprint at the Zope BBQ in Berlin. We realized that forms
> stripped of all logic to view them look suspiciously similar to
> Zope 3 interfaces. And thus schemas were born.
>
> What is a schema?
>
> A schema is a definition of an object's properties. A property is
> an attribute of an object that is intended to be 'public'; it is
> part of the interface of the object. While properties generally
> look and feel like normal attributes to the Python programmer,
> they are often implemented with a hidden getter and setter
> instead.
>
> To make things more clear, let's compare schemas with normal Zope 3
> interfaces. What are Zope 3 interfaces used for?
>
> * documentation: by writing an interface, we can tell
> programmers what methods are available for them to use, and
> provide documentation on what these methods do. Similarly, a
> class documents itself by advertising what interfaces it is
> implementing. Only publically available methods (useable by
> the programmer as well as other components) are advertised
> this way.
>
> * error checking: interfaces can do some minimal verification to
> see whether a class that advertises it implements methods with
> these names and signatures.
>
> * introspection: a programmer can check whether an object implements
> a certain interface. This allows robust and clear introspection.
>
> * component architecture: Zope 3's component architecture uses
> these introspection facilities to plug objects together by
> their interfaces. The component architecture can for instance
> be asked to supply an object with another interface (adapters)
> or end-user presentation (views).
>
> Schemas are used in much the same way, substituting 'property' for
> 'method'. What are schemas used for?
>
> * documentation: by writing a schema, we can tell programmers
> what public properties are available for them to use (get or
> set), and to provide documentation on what these properties
> are to be used for. Classes document themselves by advertising
> what schemas they are implementing.
>
> * error checking: schemas can do some minimal verification to
> see whether a class actually implements it (supplies these
> properties).
>
> * introspection: a programmer can check whether an object implements
> a certain schema.
>
> * component architecture: we can look up adapters and views for
> schemas; we could for instance have a view for the Dublin Core
> schema. In some senses we can do even more here than we can do
> with normal interfaces; we can in fact create objects that
> *implement* a schema, as we will see later.
>
> What does a schema look like?
>
> Enough theory; how does one define a schema? Much like one would
> define an interface, but it has fields instead of methods::
>
> from Interface import Schema
>
> class IPerson(Schema):
> """A simple schema for a person.
> """
>
> initials = StringField(
> title="Initials",
> description="Initials.",
> )
>
> last_name = StringField(
> title="Last name",
> description="Last name.",
> )
>
> date_of_birth = DateTimeField(
> title="Date of birth",
> description="Date of birth.",
> )
>
> is_zope_user = BooleanField(
> title="Is Zope user?",
> description="Is this person a zope user?",
> )
>
> Now we need a class that implements this interface::
>
> class MyPerson:
> """A very simple implementation of the IPerson schema.
> """
> __implements__ = IPerson
>
> def __init__(self, initials, last_name, date_of_birth, is_zope_user):
> # now we have to do what we promised
> self.initials = initials
> self.last_name = last_name
> self.date_of_birth = date_of_birth
> self.is_zope_user = is_zope_user
>
> This is a very simple class, but we can make much fancier ones by
> using Python 2.2's facilities for defining properties.
>
> [Note that in this example a MyPerson instance may in fact not
> conform to the schema anymore, as it does no checking whether the
> values of the properties are in fact the ones specified in the
> schema. .. more here]
>
> Providing a view
>
> We can now proceed to provide a view for this schema in much the
> same way we provide a view for any Zope 3 interface. What would
> such a view actually look like? A view could be used just to
> display the values of properties. Often, we'd also like to provide
> an edit facility such as a web form. This is where Formulator
> comes in; Formulator provides views (widgets) for each type of
> field; say an input box for a StringField and a check box for a
> BooleanField.
>
> ..more..
>
> More magic
>
> The MyPerson class is of course only a very minimal implementation
> of the IPerson schema. The following will talk about another
> implementation that is more involved, demonstrating some of the
> power of what one can do with schemas. To be written: stuff about
> properties adapter automagic creation for IMementoBag..
>
> Ideas
>
> Schemas are useful beyond just providing views and and attaching
> metadata to an object. Another possible use is in the area of
> relational database integration; a schema could be used to
> generate an SQL query automatically, for instance.
>
> What about argument list schemas? Could be used to specify what
> fields arguments of some methods should take. Could then be used
> to create views for methods, also for documentation and
> introspection. Though this may lean too much towards static
> typing. :)
--
Florent Guillaume, Nuxeo (Paris, France)
+33 1 40 33 79 87 http://nuxeo.com mailto:fg@nuxeo.com