[Zope] Conditional import of annotations for Zope 2.9 and 2.10: how?

Maurits van Rees m.van.rees at zestsoftware.nl
Mon May 14 05:46:49 EDT 2007


Hi,

In Zope 2.9 (or 3.2) the annotations module is in
zope.app.annotations.  In Zope 2.10 (or 3.3) it is in
zope.annotations.

In a product for zope 2.9 I used to do this in zcml:

  <include package="zope.app.annotation" />

and this in code:

from zope.app.annotation.interfaces import IAnnotations
from zope.app.annotation.interfaces import IAttributeAnnotatable

This of course gives problems in zope 2.10/3.3.

The code part is easily fixable to run in all versions:

try:
    from zope.app.annotation.interfaces import IAnnotations
    from zope.app.annotation.interfaces import IAttributeAnnotatable
except:
    # Zope 2.10+/3.3+ have a different location for annotations
    from zope.annotation.interfaces import IAnnotations
    from zope.annotation.interfaces import IAttributeAnnotatable

But how should I fix up the zcml?  With the zcml above, zope 2.10 does
not start.  With this:

  <include package="zope.annotation" />

zope 2.9 does not start.  That is to be expected.  zcml:condition to
the rescue:

  <!--   for zope 2.9 -->
  <include zcml:condition="installed zope.app.annotation"
           package="zope.app.annotation" />
  <!--   for zope 2.10 -->
  <include zcml:condition="installed zope.annotation"
           package="zope.annotation" />

Zope 2.9 is fine with this.  And the tests for my product that make
use of annotations pass.  But now zope 2.10 cannot start:

zope.configuration.xmlconfig.ZopeXMLConfigurationError: File "/home/maurits/instances/plone3/etc/site.zcml", line 15.2-15.23
    ZopeXMLConfigurationError: File "/home/maurits/instances/plone3/Products/eXtremeManagement/configure.zcml", line 7.2-7.31
    ZopeXMLConfigurationError: File "/home/maurits/instances/plone3/Products/eXtremeManagement/actual/configure.zcml", line 6.2-7.43
    IOError: [Errno 2] No such file or directory: '/opt/zope/zope2.10.3/lib/python/zope/app/annotation/configure.zcml'


So I change the code so both zopes can start:

  <!--   for zope 2.9 -->
  <include zcml:condition="have zope.app.annotation"
           package="zope.app.annotation" />
  <!--   for zope 2.10 -->
  <include zcml:condition="have zope.annotation"
           package="zope.annotation" />

Now zope 2.10 looks fine.  Its tests fail but that is due to other
reasons.  Within a zopectl debug session I can adapt to IAnnotations.
But now the tests in 2.9 fail because adapting does not work:

TypeError: ('Could not adapt', <Task at >,
 <InterfaceClass zope.app.annotation.interfaces.IAnnotations>)


So: neither the conditions 'have' nor 'installed' work for both zopes.

What other options are there to do this in zcml?

Or should I take my loss and translate the
zope/(app/)annotations/configure.zcml file (which only registers one
adapter) into python code?

-- 
Maurits van Rees | http://maurits.vanrees.org/ [NL]
            Work | http://zestsoftware.nl/
"Do not worry about your difficulties in computers,
 I can assure you mine are still greater."



More information about the Zope mailing list