Your IP : 172.28.240.42


Current Path : /usr/lib/python2.7/dist-packages/zope/interface/tests/
Upload File :
Current File : //usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyc


Kc@sdZddlZddlZddlmZmZddlmZmZddlmZm	Z	m
Z
defdYZdefd	YZd
efdYZ
defd
YZdefdYZdefdYZdefdYZdeefdYZdeefdYZdeefdYZdefdYZdZdZdZdejfd YZd!Zd"Zd#Zd$Zd%Z d&Z!d'Z"d(Z#d)Z$d*Z%d+Z&d,Z'dS(-sTest the new API for making and checking interface declarations

$Id: test_declarations.py 110827 2010-04-13 20:33:31Z tseaver $
iN(t	Interfacet
implements(tdirectlyProvidest
providedBy(tclassImplementst
implementedBytimplementsOnlytI1cBseZRS((t__name__t
__module__(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyRstI2cBseZRS((RR	(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyR
stI3cBseZRS((RR	(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyRstI4cBseZRS((RR	(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyRstI5cBseZRS((RR	(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyR
stAcBseZeeRS((RR	RR(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyRstBcBseZeeRS((RR	RR
(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyR!stCcBseZeeRS((RR	RR(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyR#stCOnlycBseZeeRS((RR	RR(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyR&st	COnly_oldcBseZeZRS((RR	Rt__implemented__(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyR)stDcBseZeeRS((RR	RR
(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyR,scCsdS(s~
    >>> c = C()
    >>> directlyProvides(c, I4)
    >>> [i.__name__ for i in providedBy(c)]
    ['I4', 'I3', 'I1', 'I2']
    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyttest_ObjectSpecification_Simple/scCsdS(sv
    >>> c = COnly()
    >>> directlyProvides(c, I4)
    >>> [i.__name__ for i in providedBy(c)]
    ['I4', 'I3']
    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt&test_ObjectSpecification_Simple_w_only7scCsdS(sz
    >>> c = COnly_old()
    >>> directlyProvides(c, I4)
    >>> [i.__name__ for i in providedBy(c)]
    ['I4', 'I3']
    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt)test_ObjectSpecification_Simple_old_style?stTestcBs#eZdZdZdZRS(cszdtfdY}d|fdYdffdY}|j|jjtk|jgt|D]}|j^qwddd	gd
|fdY}|jgt|D]}|j^qdddd	g|jg|jD]}|j^qdddd	g|jg|jD]}|j^q8ddd	g|j|jjtkdS(
NtC1cBseZeZRS((RR	RR(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyROstC2cBseZeefZRS((RR	R
R
R(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyRPstC3cseZejfZRS((RR	RR((R(sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyRQsRR
R
tC4cBseZeeRS((RR	RR(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyRZsR(	tobjecttassert_Rt	__class__ttupletassertEqualRtgetNametfailIf(tselfRRtiR((RsJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyttest_backward_compatMs$%%cCsXddlm}m}t||j|j|jtt|tt|dS(Ni(tm1tm2(	tzope.interface.testsR'R(RRR
R!tlistR(R$R'R(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyttest_modulens
cCs
tt}|j}tttdtfdY}d}|jgt|D]}|j^qQdg|d}t|t	|jgt|D]}|j^qdddg||_ttd}|jgt|D]}|j^qgdS(NtmyintcBseZeeRS((RR	RR
(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyR,si*RRR
(
RtinttdeclaredRRR!RR"RR(R$tintspectolddeclaredR,txR%((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt
test_builtinsys 	
(

(	
((RR	R&R+R2(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyRHs	!	cCsdS(s
    >>> from zope.interface import *
    >>> class C(object):
    ...     pass
    >>> c = C()
    >>> list(providedBy(c))
    []

    >>> class I(Interface):
    ...    pass
    >>> directlyProvides(c, I)
    >>> list(providedBy(c))  == list(directlyProvidedBy(c))
    1
    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt$test_signature_w_no_class_interfacesscCsdS(sThis test is in response to a bug found, which is why it's a bit
    contrived

    >>> from zope.interface import *
    >>> class B1(object):
    ...     pass
    >>> class B2(B1):
    ...     pass
    >>> class B3(B2):
    ...     pass
    >>> class D(object):
    ...     implements()
    >>> class S(B3, D):
    ...     implements()

    This failed due to a bug in the code for finding __providedBy__
    descriptors for old-style classes.

    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt,test_classImplement_on_deeply_nested_classesscCsdS(s
    >>> from pickle import dumps, loads
    >>> a = A()
    >>> I2.providedBy(a)
    0
    >>> directlyProvides(a, I2)
    >>> I2.providedBy(a)
    1
    >>> a2 = loads(dumps(a))
    >>> I2.providedBy(a2)
    1

    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyttest_pickle_provides_specsscCsdS(s2
    >>> from zope.interface import classProvides
    >>> class X(object):
    ...     classProvides(I1)
    >>> class Y(X):
    ...     pass
    >>> [i.__name__ for i in X.__provides__]
    ['I1']
    >>> Y.__provides__
    Traceback (most recent call last):
    ...
    AttributeError: __provides__

    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt(test_that_we_dont_inherit_class_providesscCsdS(s

    When we make a declaration for a class, we install a __provides__
    descriptors that provides a default for instances that don't have
    instance-specific declarations:

    >>> class A(object):
    ...     implements(I1)

    >>> class B(object):
    ...     implements(I2)

    >>> [i.__name__ for i in A().__provides__]
    ['I1']
    >>> [i.__name__ for i in B().__provides__]
    ['I2']

    But it's important that we don't use this for subclasses without
    declarations.  This would cause incorrect results:

    >>> class X(A, B):
    ...     pass

    >>> X().__provides__
    Traceback (most recent call last):
    ...
    AttributeError: __provides__

    However, if we "induce" a declaration, by calling implementedBy
    (even indirectly through providedBy):

    >>> [i.__name__ for i in providedBy(X())]
    ['I1', 'I2']


    then the optimization will work:

    >>> [i.__name__ for i in X().__provides__]
    ['I1', 'I2']

    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt0test_that_we_dont_inherit_provides_optimizationsscCsdS(sSpecial descriptor for class __provides__

    The descriptor caches the implementedBy info, so that
    we can get declarations for objects without instance-specific
    interfaces a bit quicker.

        For example::

          >>> from zope.interface import Interface, classProvides
          >>> class IFooFactory(Interface):
          ...     pass
          >>> class IFoo(Interface):
          ...     pass
          >>> class C(object):
          ...     classProvides(IFooFactory)
          ...     implements(IFoo)
          >>> [i.getName() for i in C.__provides__]
          ['IFooFactory']

          >>> [i.getName() for i in C().__provides__]
          ['IFoo']
    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt$test_classProvides_before_implementsscCsdS(s_

    In general, we should be able to get a spec
    for a proxied class if someone has declared or
    asked for a spec before.

    We don't want to depend on proxies in this (zope.interface)
    package, but we do want to work with proxies.  Proxies have the
    effect that a class's __dict__ cannot be gotten. Further, for
    built-in classes, we can't save, and thus, cannot get, any class
    attributes.  We'll emulate this by treating a plain object as a class:

      >>> cls = object()

    We'll create an implements specification:

      >>> import zope.interface.declarations
      >>> impl = zope.interface.declarations.Implements(I1, I2)

    Now, we'll emulate a declaration for a built-in type by putting
    it in BuiltinImplementationSpecifications:

      >>> zope.interface.declarations.BuiltinImplementationSpecifications[
      ...   cls] = impl

    Now, we should be able to get it back:

      >>> implementedBy(cls) is impl
      True

    Of course, we don't want to leave it there. :)

      >>> del zope.interface.declarations.BuiltinImplementationSpecifications[
      ...   cls]

    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt+test_getting_spec_for_proxied_builtin_classscCsdS(s
    We can get definitions from a declaration:

        >>> import zope.interface
        >>> class I1(zope.interface.Interface):
        ...    a11 = zope.interface.Attribute('a11')
        ...    a12 = zope.interface.Attribute('a12')
        >>> class I2(zope.interface.Interface):
        ...    a21 = zope.interface.Attribute('a21')
        ...    a22 = zope.interface.Attribute('a22')
        ...    a12 = zope.interface.Attribute('a212')
        >>> class I11(I1):
        ...    a11 = zope.interface.Attribute('a111')

        >>> decl = zope.interface.Declaration(I11, I2)
        >>> decl.get('a11') is I11.get('a11')
        True
        >>> decl.get('a12') is I1.get('a12')
        True
        >>> decl.get('a21') is I2.get('a21')
        True
        >>> decl.get('a22') is I2.get('a22')
        True
        >>> decl.get('a')
        >>> decl.get('a', 42)
        42

    We get None even with no interfaces:

        >>> decl = zope.interface.Declaration()
        >>> decl.get('a11')
        >>> decl.get('a11', 42)
        42

    We get new data if e change interface bases:

        >>> decl.__bases__ = I11, I2
        >>> decl.get('a11') is I11.get('a11')
        True
    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyttest_declaration_getBscCsdS(sXhttp://www.zope.org/Collectors/Zope3-dev/402

>>> from zope.interface import *
>>> class I1(Interface):
...     pass
>>> class I2(Interface):
...     pass
>>> class C:
...     implements(I1)
>>> class C2:
...     implementsOnly(I2)
>>> class I3(Interface):
...     pass

>>> [i.__name__ for i in providedBy(C2()).__iro__]
['I2', 'Interface']

>>> classImplements(C2, I3)
>>> [i.__name__ for i in providedBy(C2()).__iro__]
['I2', 'I3', 'Interface']

>>> class I4(Interface):
...     pass
>>> classImplements(C2, I4)
>>> [i.__name__ for i in providedBy(C2()).__iro__]
['I2', 'I3', 'I4', 'Interface']


N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt8test_classImplements_after_classImplementsOnly_issue_402lscCsdS(s

    Sometimes, we need to pickle implements specs.  We should be able
    to do so as long as the class is picklable.

    >>> import pickle
    >>> pickle.loads(pickle.dumps(implementedBy(C))) is implementedBy(C)
    True


    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt.test_picklability_of_implements_specificationsscCsdS(s

    This is an edge case: if the __slots__ of a class contain '__provides__',
    using providedBy() on that class should still work (this occurs, for
    example, when providing an adapter for a concrete class.)

    >>> import zope.interface
    >>> class Slotted(object):
    ...     __slots__ = ('__provides__')
    >>> class IFoo(zope.interface.Interface):
    ...     pass
    >>> IFoo.providedBy(Slotted)
    False

    N((((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyttest_provided_by_with_slotsscCs.tjtjttjdtjfS(Nszope.interface.declarations(tunittestt	TestSuitet	makeSuiteRtdoctesttDocTestSuite(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt
test_suites((t__doc__RAR>tzope.interfaceRRRRRRRRR
RRR
RRRRRRRRRRtTestCaseRR3R4R5R6R7R8R9R:R;R<R=RC(((sJ/usr/lib/python2.7/dist-packages/zope/interface/tests/test_declarations.pyt<module>s@				M					+		&	*