Log message for revision 31025: ported and reversed bridging code from Five; added fromZ3Method
Changed: A Zope/branches/yuppie-z3z2bridge/lib/python/Interface/bridge.py A Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/bridge.txt A Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/framework.py A Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/test_bridge.py -=- Added: Zope/branches/yuppie-z3z2bridge/lib/python/Interface/bridge.py =================================================================== --- Zope/branches/yuppie-z3z2bridge/lib/python/Interface/bridge.py 2005-07-08 10:21:51 UTC (rev 31024) +++ Zope/branches/yuppie-z3z2bridge/lib/python/Interface/bridge.py 2005-07-08 10:33:37 UTC (rev 31025) @@ -0,0 +1,104 @@ +############################################################################## +# +# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +""" Z3 -> Z2 bridge utilities. + +$Id$ +""" + +from Interface._InterfaceClass import Interface as Z2_InterfaceClass +from Interface import Interface as Z2_Interface +from Interface import Attribute as Z2_Attribute +from Interface.Method import Method as Z2_Method + +from zope.interface.interface import InterfaceClass as Z3_InterfaceClass +from zope.interface.interface import Interface as Z3_Interface +from zope.interface.interface import Attribute as Z3_Attribute +from zope.interface.interface import Method as Z3_Method + + +def fromZ3Interface(z3i): + + """ Return a Zope 2 interface corresponding to 'z3i'. + + o 'z3i' must be a Zope 3 interface. + """ + if not isinstance(z3i, Z3_InterfaceClass): + raise ValueError, 'Not a Zope 3 interface!' + + if z3i is Z3_Interface: # special case; root in new hierarchy! + return Z2_Interface + + name = z3i.getName() + + bases = [ fromZ3Interface(x) for x in z3i.getBases() ] + + attrs = {} + + for k, v in z3i.namesAndDescriptions(): + + if isinstance(v, Z3_Method): + v = fromZ3Method(v) + + elif isinstance(v, Z3_Attribute): + v = fromZ3Attribute(v) + + attrs[k] = v + + # XXX: Note that we pass the original interface's __module__; + # we may live to regret that. + return Z2_InterfaceClass(name=name, + bases=bases, + attrs=attrs, + __doc__=z3i.getDoc(), + __module__=z3i.__module__, + ) + +def fromZ3Attribute(z3a): + + """ Return a Zope 2 interface attribute corresponding to 'z3a'. + + o 'z3a' must be a Zope 3 interface attribute. + """ + if not isinstance(z3a, Z3_Attribute): + raise ValueError, 'Not a Zope 3 interface attribute!' + + return Z2_Attribute(z3a.getName(), z3a.getDoc()) + +def fromZ3Method(z3m): + + """ Return a Zope 2 interface method corresponding to 'z3a'. + + o 'z3a' must be a Zope 3 interface method. + """ + if not isinstance(z3m, Z3_Method): + raise ValueError, 'Not a Zope 3 interface method!' + + m = Z2_Method(z3m.getName(), z3m.getDoc()) + sig = z3m.getSignatureInfo() + m.positional = sig['positional'] + m.required = sig['required'] + m.optional = sig['optional'] + m.varargs = sig['varargs'] + m.kwargs = sig['kwargs'] + return m + +def createZope3Bridge(zope3, package, name): + # Map a Zope 3 interface into a Zope2 interface, seated within 'package' + # as 'name'. + z2i = fromZ3Interface(zope3) + + if name is not None: + z2i.__dict__['__name__'] = name + + z2i.__dict__['__module__'] = package.__name__ + setattr(package, z2i.getName(), z2i) Property changes on: Zope/branches/yuppie-z3z2bridge/lib/python/Interface/bridge.py ___________________________________________________________________ Name: svn:keywords + Id Name: svn:eol-style + native Added: Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/bridge.txt =================================================================== --- Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/bridge.txt 2005-07-08 10:21:51 UTC (rev 31024) +++ Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/bridge.txt 2005-07-08 10:33:37 UTC (rev 31025) @@ -0,0 +1,122 @@ +====== +Bridge +====== + +The ``bridge`` module provides functionality to convert a Zope 3 +interface into a Zope 2 one. First we'll import all we know about +interfaces from the two generations: + + >>> from Interface import Interface as Z2_Interface + >>> from Interface import Attribute as Z2_Attribute + >>> from Interface.Method import Method as Z2_Method + + >>> from zope.interface import Interface as Z3_Interface + >>> from zope.interface import Attribute as Z3_Attribute + + +An empty interface +------------------ + + >>> class IEmpty(Z3_Interface): + ... pass + + >>> from Interface.bridge import fromZ3Interface + >>> converted = fromZ3Interface(IEmpty) + + >>> Z2_Interface.isEqualOrExtendedBy(converted) + 1 + >>> len(converted.names()) + 0 + + +Attributes +---------- + + >>> class IAttributes(Z3_Interface): + ... one = Z3_Attribute('one', 'One attribute') + ... another = Z3_Attribute('another', 'Another attribute') + + >>> converted = fromZ3Interface(IAttributes) + + >>> Z2_Interface.isEqualOrExtendedBy(converted) + 1 + >>> len(converted.names()) + 2 + >>> 'one' in converted.names() + True + >>> 'another' in converted.names() + True + + >>> one = converted.getDescriptionFor('one') + >>> isinstance(one, Z2_Attribute) + True + >>> one.getName() + 'one' + >>> one.getDoc() + 'One attribute' + + >>> another = converted.getDescriptionFor('another') + >>> isinstance(another, Z2_Attribute) + True + >>> another.getName() + 'another' + >>> another.getDoc() + 'Another attribute' + + +Methods +------- + + >>> class IMethods(Z3_Interface): + ... def one(): + ... """One method.""" + ... def another(arg1, arg2): + ... """Another method, taking arguments.""" + + >>> converted = fromZ3Interface(IMethods) + + >>> Z2_Interface.isEqualOrExtendedBy(converted) + 1 + >>> len(converted.names()) + 2 + >>> 'one' in converted.names() + True + >>> 'another' in converted.names() + True + + >>> one = converted.getDescriptionFor('one') + >>> isinstance(one, Z2_Method) + True + >>> one.getName() + 'one' + >>> one.getDoc() + 'One method.' + + >>> another = converted.getDescriptionFor('another') + >>> isinstance(another, Z2_Method) + True + >>> another.getName() + 'another' + >>> another.getDoc() + 'Another method, taking arguments.' + + +Invalid parameters +------------------ + + >>> fromZ3Interface(None) + Traceback (most recent call last): + ... + ValueError: Not a Zope 3 interface! + + >>> fromZ3Interface(object()) + Traceback (most recent call last): + ... + ValueError: Not a Zope 3 interface! + + >>> class IZ2_NotAllowed(Z2_Interface): + ... pass + >>> fromZ3Interface(IZ2_NotAllowed) + Traceback (most recent call last): + ... + ValueError: Not a Zope 3 interface! Property changes on: Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/bridge.txt ___________________________________________________________________ Name: svn:eol-style + native Added: Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/framework.py =================================================================== --- Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/framework.py 2005-07-08 10:21:51 UTC (rev 31024) +++ Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/framework.py 2005-07-08 10:33:37 UTC (rev 31025) @@ -0,0 +1,116 @@ +############################################################################## +# +# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +"""ZopeTestCase framework + +COPY THIS FILE TO YOUR 'tests' DIRECTORY. + +This version of framework.py will use the SOFTWARE_HOME +environment variable to locate Zope and the Testing package. + +If the tests are run in an INSTANCE_HOME installation of Zope, +Products.__path__ and sys.path with be adjusted to include the +instance's Products and lib/python directories respectively. + +If you explicitly set INSTANCE_HOME prior to running the tests, +auto-detection is disabled and the specified path will be used +instead. + +If the 'tests' directory contains a custom_zodb.py file, INSTANCE_HOME +will be adjusted to use it. + +If you set the ZEO_INSTANCE_HOME environment variable a ZEO setup +is assumed, and you can attach to a running ZEO server (via the +instance's custom_zodb.py). + +The following code should be at the top of every test module: + + import os, sys + if __name__ == '__main__': + execfile(os.path.join(sys.path[0], 'framework.py')) + +...and the following at the bottom: + + if __name__ == '__main__': + framework() + +$Id$ +""" + +__version__ = '0.2.4' + +# Save start state +# +__SOFTWARE_HOME = os.environ.get('SOFTWARE_HOME', '') +__INSTANCE_HOME = os.environ.get('INSTANCE_HOME', '') + +if __SOFTWARE_HOME.endswith(os.sep): + __SOFTWARE_HOME = os.path.dirname(__SOFTWARE_HOME) + +if __INSTANCE_HOME.endswith(os.sep): + __INSTANCE_HOME = os.path.dirname(__INSTANCE_HOME) + +# Find and import the Testing package +# +if not sys.modules.has_key('Testing'): + p0 = sys.path[0] + if p0 and __name__ == '__main__': + os.chdir(p0) + p0 = '' + s = __SOFTWARE_HOME + p = d = s and s or os.getcwd() + while d: + if os.path.isdir(os.path.join(p, 'Testing')): + zope_home = os.path.dirname(os.path.dirname(p)) + sys.path[:1] = [p0, p, zope_home] + break + p, d = s and ('','') or os.path.split(p) + else: + print 'Unable to locate Testing package.', + print 'You might need to set SOFTWARE_HOME.' + sys.exit(1) + +import Testing, unittest +execfile(os.path.join(os.path.dirname(Testing.__file__), 'common.py')) + +# Include ZopeTestCase support +# +if 1: # Create a new scope + + p = os.path.join(os.path.dirname(Testing.__file__), 'ZopeTestCase') + + if not os.path.isdir(p): + print 'Unable to locate ZopeTestCase package.', + print 'You might need to install ZopeTestCase.' + sys.exit(1) + + ztc_common = 'ztc_common.py' + ztc_common_global = os.path.join(p, ztc_common) + + f = 0 + if os.path.exists(ztc_common_global): + execfile(ztc_common_global) + f = 1 + if os.path.exists(ztc_common): + execfile(ztc_common) + f = 1 + + if not f: + print 'Unable to locate %s.' % ztc_common + sys.exit(1) + +# Debug +# +print 'SOFTWARE_HOME: %s' % os.environ.get('SOFTWARE_HOME', 'Not set') +print 'INSTANCE_HOME: %s' % os.environ.get('INSTANCE_HOME', 'Not set') +sys.stdout.flush() + Property changes on: Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/framework.py ___________________________________________________________________ Name: svn:keywords + Id Name: svn:eol-style + native Added: Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/test_bridge.py =================================================================== --- Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/test_bridge.py 2005-07-08 10:21:51 UTC (rev 31024) +++ Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/test_bridge.py 2005-07-08 10:33:37 UTC (rev 31025) @@ -0,0 +1,27 @@ +############################################################################## +# +# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +""" Unit tests for Z3 -> Z2 bridge utilities. + +$Id$ +""" + +import os, sys +if __name__ == '__main__': + execfile(os.path.join(sys.path[0], 'framework.py')) + +def test_suite(): + from Testing.ZopeTestCase import ZopeDocFileSuite + return ZopeDocFileSuite('bridge.txt', package="Interface.tests") + +if __name__ == '__main__': + framework() Property changes on: Zope/branches/yuppie-z3z2bridge/lib/python/Interface/tests/test_bridge.py ___________________________________________________________________ Name: svn:keywords + Id Name: svn:eol-style + native _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins