§
    Ètºfé£  ã                   óÒ  — d Z ddlZddlZddlZddlZddlmZ ddlmZmZ 	 ddl	m
Z
 n# e$ r dZ
Y nw xY wddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ dd	lmZ dd
l m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z'  G d„ d¦  «        Z( G d„ de'¦  «        Z) G d„ de'¦  «        Z* G d„ de%e'¦  «        Z+ G d„ de'¦  «        Z,d„ Z-d„ Z. G d„ de'¦  «        Z/ e edddd¦  «        ¦  «         G d „ d!¦  «        ¦   «         Z0 G d"„ d#¦  «        Z1 e edd$dd¦  «        d%¦  «        d/d&„¦   «         Z2 G d'„ d(e'¦  «        Z3 G d)„ d*e'¦  «        Z4 G d+„ d,e'¦  «        Z5 G d-„ d.e'¦  «        Z6dS )0zI
Tests for Twisted's deprecation framework, L{twisted.python.deprecate}.
é    N)Únormcase)Úcatch_warningsÚsimplefilter)Úinvalidate_caches)ÚVersion)Ú	deprecate)ÚDEPRECATION_WARNING_FORMATÚ_appendToDocstringÚ_fullyQualifiedNameÚ_getDeprecationDocstringÚ_getDeprecationWarningStringÚ_mutuallyExclusiveArgumentsÚ_passedArgSpecÚ_passedSignatureÚ
deprecatedÚdeprecatedKeywordParameterÚdeprecatedPropertyÚgetDeprecationWarningString)ÚFilePath)Úplatform)Údeprecatedattributes)ÚTwistedModulesMixin)ÚSynchronousTestCasec                   ó   — e Zd ZdZd„ Zd„ ZdS )Ú_MockDeprecatedAttributezq
    Mock of L{twisted.python.deprecate._DeprecatedAttribute}.

    @ivar value: The value of the attribute.
    c                 ó   — || _         d S ©N©Úvalue©Úselfr   s     úa/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/python/test/test_deprecate.pyÚ__init__z!_MockDeprecatedAttribute.__init__8   s   € ØˆŒ
ˆ
ˆ
ó    c                 ó   — | j         S )z$
        Get a known value.
        r   ©r!   s    r"   Úgetz_MockDeprecatedAttribute.get;   s   € ð ŒzÐr$   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r'   © r$   r"   r   r   1   s<   € € € € € ðð ðð ð ðð ð ð ð r$   r   c                   ó6   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚModuleProxyTestszÔ
    Tests for L{twisted.python.deprecate._ModuleProxy}, which proxies
    access to module-level attributes, intercepting access to deprecated
    attributes and passing through access to normal attributes.
    c                 ó¨   — t          j        d¦  «        }|                     ¦   «         D ]\  }}t          |||¦  «         Œt	          j        |¦  «        S )zÀ
        Create a temporary module proxy object.

        @param **kw: Attributes to initialise on the temporary module object

        @rtype: L{twistd.python.deprecate._ModuleProxy}
        Úfoo)ÚtypesÚ
ModuleTypeÚitemsÚsetattrr   Ú_ModuleProxy)r!   ÚattrsÚmodÚkeyr   s        r"   Ú
_makeProxyzModuleProxyTests._makeProxyI   sU   € õ Ô˜uÑ%Ô%ˆØŸ+š+™-œ-ð 	%ð 	%‰JˆC�Ý�C˜˜eÑ$Ô$Ð$Ð$ÝÔ% cÑ*Ô*Ð*r$   c                 ó¬   — |                       d¬¦  «        }|                      |j        d¦  «         |                      t          t
          |d¦  «         dS )zÜ
        Getting a normal attribute on a L{twisted.python.deprecate._ModuleProxy}
        retrieves the underlying attribute's value, and raises C{AttributeError}
        if a non-existent attribute is accessed.
        Úhello)ÚSOME_ATTRIBUTEÚDOES_NOT_EXISTN)r9   ÚassertIsr<   ÚassertRaisesÚAttributeErrorÚgetattr©r!   Úproxys     r"   Útest_getattrPassthroughz(ModuleProxyTests.test_getattrPassthroughV   sO   € ð —’¨w�Ñ7Ô7ˆØ�Š�eÔ*¨GÑ4Ô4Ð4Ø×Ò�.­'°5Ð:JÑKÔKÐKÐKÐKr$   c                 ó¾   — |                       ¦   «         }t                               |d¦  «        }t          d¦  «        |d<   |                      |j        d¦  «         dS )z¸
        Getting an attribute marked as being deprecated on
        L{twisted.python.deprecate._ModuleProxy} results in calling the
        deprecated wrapper's C{get} method.
        Ú_deprecatedAttributesé*   r0   N)r9   ÚobjectÚ__getattribute__r   ÚassertEqualr0   )r!   rC   rF   s      r"   Útest_getattrInterceptz&ModuleProxyTests.test_getattrIntercept`   s[   € ð —’Ñ!Ô!ˆÝ &× 7Ò 7¸Ð?VÑ WÔ WÐÝ'?ÀÑ'CÔ'CÐ˜eÑ$Ø×Ò˜œ BÑ'Ô'Ð'Ð'Ð'r$   c                 ó¶   — |                       ¦   «         }|                      t          t          |d¦  «         |                      t          t          |d¦  «         dS )z�
        Private attributes of L{twisted.python.deprecate._ModuleProxy} are
        inaccessible when regular attribute access is used.
        Ú_modulerF   N)r9   r?   r@   rA   rB   s     r"   Útest_privateAttributesz'ModuleProxyTests.test_privateAttributesk   sN   € ð
 —’Ñ!Ô!ˆØ×Ò�.­'°5¸)ÑDÔDÐDØ×Ò�.­'°5Ð:QÑRÔRÐRÐRÐRr$   c                 óÐ   — |                       ¦   «         }d|_        |                      t                               |d¦  «        d¦  «         |                      |j        d¦  «         dS )z„
        Setting attributes on L{twisted.python.deprecate._ModuleProxy} proxies
        them through to the wrapped module.
        é   rM   N)r9   rM   ÚassertNotEqualrH   rI   rJ   rB   s     r"   Útest_setattrzModuleProxyTests.test_setattrt   s^   € ð
 —’Ñ!Ô!ˆØˆŒØ×Ò�F×3Ò3°E¸9ÑEÔEÀqÑIÔIÐIØ×Ò˜œ¨Ñ*Ô*Ð*Ð*Ð*r$   c                 óÜ   — |                       ¦   «         }t                               |d¦  «        }|                      t	          |¦  «        dt          |¦  «        j        › d|›d�¦  «         dS )z³
        L{twisted.python.deprecated._ModuleProxy.__repr__} produces a string
        containing the proxy type and a representation of the wrapped module
        object.
        rM   ú<z module=ú>N)r9   rH   rI   rJ   ÚreprÚtyper(   )r!   rC   Ú
realModules      r"   Ú	test_reprzModuleProxyTests.test_repr~   sg   € ð —’Ñ!Ô!ˆÝ×,Ò,¨U°IÑ>Ô>ˆ
Ø×Ò�˜e™œÐ&W­$¨u©+¬+Ô*>Ð&WÐ&WÈ
Ð&WÐ&WÐ&WÑXÔXÐXÐXÐXr$   N)
r(   r)   r*   r+   r9   rD   rK   rN   rR   rY   r,   r$   r"   r.   r.   B   sƒ   € € € € € ðð ð+ð +ð +ðLð Lð Lð	(ð 	(ð 	(ðSð Sð Sð+ð +ð +ðYð Yð Yð Yð Yr$   r.   c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚDeprecatedAttributeTestszÄ
    Tests for L{twisted.python.deprecate._DeprecatedAttribute} and
    L{twisted.python.deprecate.deprecatedModuleAttribute}, which issue
    warnings for deprecated module-level attributes.
    c                 óh   — t           j        | _        t           j        | _        t          dz   | _        d S )Nz.foo)r   ÚversionÚmessager(   Ú_testModuleNamer&   s    r"   ÚsetUpzDeprecatedAttributeTests.setUp�   s)   € Ý+Ô3ˆŒÝ+Ô3ˆŒÝ'¨&Ñ0ˆÔÐÐr$   c                 ó‚   — t          t          j        dz   |z   t          j        t          dz   t          j        z   ¦  «        S )zJ
        Create the warning string used by deprecated attributes.
        ú.z: )r   r   r(   r]   r	   r^   )r!   Úattrs     r"   Ú_getWarningStringz*DeprecatedAttributeTests._getWarningString•   s=   € õ ,Ý Ô)¨CÑ/°$Ñ6Ý Ô(Ý&¨Ñ-Õ0DÔ0LÑLñ
ô 
ð 	
r$   c                 ó  ‡— d}t          t          |d¦  «         t          j        t          || j        | j        ¦  «        Š|                      ‰j        |¦  «         ˆfd„} |¦   «          |                      | j	        g¦  «        }|  
                    |d         d         t          ¦  «         |                      |d         d         |                      |¦  «        ¦  «         |                      t          |¦  «        d¦  «         dS )	zÛ
        L{twisted.python.deprecate._DeprecatedAttribute} correctly sets its
        __name__ to match that of the deprecated attribute and emits a warning
        when the original attribute value is accessed.
        ÚANOTHER_DEPRECATED_ATTRIBUTErG   c                  ó0   •— ‰                       ¦   «          d S r   )r'   )rc   s   €r"   ÚaddStackLevelzNDeprecatedAttributeTests.test_deprecatedAttributeHelper.<locals>.addStackLevel¯   s   ø€ Ø�HŠH‰JŒJˆJˆJˆJr$   r   Úcategoryr^   rP   N)r4   r   r   Ú_DeprecatedAttributer]   r^   rJ   r(   ÚflushWarningsÚtest_deprecatedAttributeHelperr>   ÚDeprecationWarningrd   Úlen)r!   Únamerh   ÚwarningsShownrc   s       @r"   rl   z7DeprecatedAttributeTests.test_deprecatedAttributeHelperŸ   s  ø€ ð .ˆÝÕ$ d¨BÑ/Ô/Ð/ÝÔ-Ý  $¨¬°d´lñ
ô 
ˆð 	×Ò˜œ¨Ñ-Ô-Ð-ð	ð 	ð 	ð 	ð 	ð 	ˆ‰ŒˆØ×*Ò*¨DÔ,OÐ+PÑQÔQˆØ�Š�m AÔ& zÔ2Õ4FÑGÔGÐGØ×Ò˜ qÔ)¨)Ô4°d×6LÒ6LÈTÑ6RÔ6RÑSÔSÐSØ×Ò�˜]Ñ+Ô+¨QÑ/Ô/Ð/Ð/Ð/r$   c                 óü  — t           j         |                      | j        g¦  «        }|                      t          |¦  «        d¦  «         d}t          t           |¦  «         |                      | j        g¦  «        }|                      t          |¦  «        d¦  «         |                      |d         d         t          ¦  «         |                      |d         d         |  	                    |¦  «        ¦  «         dS )a  
        L{twisted.python.deprecate.deprecatedModuleAttribute} wraps a
        module-level attribute in an object that emits a deprecation warning
        when it is accessed the first time only, while leaving other unrelated
        attributes alone.
        r   ÚDEPRECATED_ATTRIBUTErP   ri   r^   N)
r   ÚANOTHER_ATTRIBUTErk   Útest_deprecatedAttributerJ   rn   rA   r>   rm   rd   )r!   rp   ro   s      r"   rt   z1DeprecatedAttributeTests.test_deprecatedAttribute¹   sæ   € õ 	Ô.Ð.Ø×*Ò*¨DÔ,IÐ+JÑKÔKˆØ×Ò�˜]Ñ+Ô+¨QÑ/Ô/Ð/à%ˆõ 	Õ$ dÑ+Ô+Ð+à×*Ò*¨DÔ,IÐ+JÑKÔKˆØ×Ò�˜]Ñ+Ô+¨QÑ/Ô/Ð/Ø�Š�m AÔ& zÔ2Õ4FÑGÔGÐGØ×Ò˜ qÔ)¨)Ô4°d×6LÒ6LÈTÑ6RÔ6RÑSÔSÐSÐSÐSr$   c                 óN  — t          j        d¦  «        xt          j        | j        <   }|                      t          j        j        | j        ¦  «         t          |dd¦  «         t          |dd¦  «         t          j	        t          dddd¦  «        d	| j        d¦  «         t          j        | j                 }|                      ||¦  «         t          j	        t          dddd¦  «        d	| j        d¦  «         |                      |t          j        | j                 ¦  «         d
S )zï
        Deprecating an attribute in a module replaces and wraps that module
        instance, in C{sys.modules}, with a
        L{twisted.python.deprecate._ModuleProxy} instance but only if it hasn't
        already been wrapped.
        r0   ÚfirstrP   Úsecondé   ÚTwistedé   r   r^   N)r1   r2   ÚsysÚmodulesr_   Ú
addCleanupÚpopr4   r   ÚdeprecatedModuleAttributer   rQ   r>   )r!   r7   rC   s      r"   Útest_wrappedModulez+DeprecatedAttributeTests.test_wrappedModuleÐ   s  € õ 38Ô2BÀ5Ñ2IÔ2IÐI�Œ�DÔ(Ñ)¨CØ�Š�œœ¨Ô)=Ñ>Ô>Ð>å��W˜aÑ Ô Ð Ý��X˜qÑ!Ô!Ð!åÔ+Ý�I˜q ! QÑ'Ô'¨°DÔ4HÈ'ñ	
ô 	
ð 	
õ ”˜DÔ0Ô1ˆØ×Ò˜E 3Ñ'Ô'Ð'åÔ+Ý�I˜q ! QÑ'Ô'¨°DÔ4HÈ(ñ	
ô 	
ð 	
ð 	�Š�e�Sœ[¨Ô)=Ô>Ñ?Ô?Ð?Ð?Ð?r$   N)	r(   r)   r*   r+   r`   rd   rl   rt   r€   r,   r$   r"   r[   r[   ‰   sq   € € € € € ðð ð1ð 1ð 1ð

ð 
ð 
ð0ð 0ð 0ð4Tð Tð Tð.@ð @ð @ð @ð @r$   r[   c                   ó4   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚImportedModuleAttributeTestsza
    Tests for L{deprecatedModuleAttribute} which involve loading a module via
    'import'.
    z»from twisted.python.deprecate import deprecatedModuleAttribute
from incremental import Version

deprecatedModuleAttribute(
    Version('Package', 1, 2, 3), 'message', __name__, 'module')
c                 ó’  ‡— ˆfd„Št          |                      ¦   «                              d¦  «        ¦  «        }|                     ¦   «           ‰||¦  «        }|                      |j                             d¦  «        gt          j        z   ¦  «         |                      t          j	         
                    ¦   «         ¦  «         |S )a_  
        Create some files in a hierarchy, based on a dictionary describing those
        files.  The resulting hierarchy will be placed onto sys.path for the
        duration of the test.

        @param tree: A dictionary representing a directory structure.  Keys are
            strings, representing filenames, dictionary values represent
            directories, string values represent file contents.

        @return: another dictionary similar to the input, with file content
            strings replaced with L{FilePath} objects pointing at where those
            contents are now stored.
        c                 óX  •— i }|                      ¦   «         D ]‘\  }}|                      |¦  «        }t          |t          ¦  «        r|||<   |                     |¦  «         ŒJt          |t
          ¦  «        r$|                     ¦   «           ‰||¦  «        ||<   Œƒt          d¦  «        ‚|S )Nz(only strings and dicts allowed as values)r3   ÚchildÚ
isinstanceÚbytesÚ
setContentÚdictÚcreateDirectoryÚ
ValueError)ÚpathobjÚdirdictÚpathdictr8   r   r…   ÚmakeSomeFiless         €r"   r�   zAImportedModuleAttributeTests.pathEntryTree.<locals>.makeSomeFiles  s¹   ø€ ØˆHØ%Ÿmšm™oœoð 	Qð 	Q‘
��UØŸš cÑ*Ô*�Ý˜e¥UÑ+Ô+ð QØ$)�H˜S‘MØ×$Ò$ UÑ+Ô+Ð+Ð+Ý ¥tÑ,Ô,ð QØ×)Ò)Ñ+Ô+Ð+Ø$1 M°%¸Ñ$?Ô$?�H˜S‘M�Må$Ð%OÑPÔPÐPØˆOr$   úutf-8)r   ÚmktempÚencodeÚmakedirsÚreplaceSysPathÚpathÚdecoder{   ÚreplaceSysModulesr|   Úcopy)r!   ÚtreeÚbaseÚresultr�   s       @r"   ÚpathEntryTreez*ImportedModuleAttributeTests.pathEntryTreeù   s´   ø€ ð	ð 	ð 	ð 	ð 	õ ˜Ÿš™œ×,Ò,¨WÑ5Ô5Ñ6Ô6ˆØ�Š‰Œˆà�˜t TÑ*Ô*ˆà×Ò˜TœY×-Ò-¨gÑ6Ô6Ð7½#¼(ÑBÑCÔCÐCØ×Ò�sœ{×/Ò/Ñ1Ô1Ñ2Ô2Ð2Øˆr$   c                 ó‚   — |                       d| j                             d¦  «        ddœi¦  «        }|d         d         S )z¢
        Add a sample module and package to the path, returning a L{FilePath}
        pointing at the module which will be loadable as C{package.module}.
        s   packager�   r$   )s   __init__.pyó	   module.pyrž   )rœ   Ú_packageInitr’   )r!   Úpathss     r"   ÚsimpleModuleEntryz.ImportedModuleAttributeTests.simpleModuleEntry  sT   € ð
 ×"Ò"àØ$(Ô$5×$<Ò$<¸WÑ$EÔ$EØ"%ðð ðñ
ô 
ˆð �ZÔ  Ô.Ð.r$   c                 ó–  — ddl m} |                      t          |j                             d¦  «        ¦  «        |¦  «         |                      | j        g¦  «        }|                      t          |¦  «        d¦  «         |                      |d         d         d¦  «         |                      |d         d         t          ¦  «         dS )	zB
        Verification logic for L{test_deprecatedModule}.
        r   ©Úmoduler�   rP   r^   z7package.module was deprecated in Package 1.2.3: messageri   N)
Úpackager¤   rJ   r   Ú__file__r’   rk   ÚcheckOneWarningrn   rm   )r!   Ú
modulePathr¤   Úemitteds       r"   r§   z,ImportedModuleAttributeTests.checkOneWarning.  sÈ   € ð 	#Ð"Ð"Ð"Ð"Ð"à×Ò� &¤/×"8Ò"8¸Ñ"AÔ"AÑBÔBÀJÑOÔOÐOØ×$Ò$ dÔ&:Ð%;Ñ<Ô<ˆØ×Ò�˜W™œ qÑ)Ô)Ð)Ø×ÒØ�AŒJ�yÔ!ØHñ	
ô 	
ð 	
ð 	×Ò˜ œ JÔ/Õ1CÑDÔDÐDÐDÐDr$   c                 óT   — |                       |                      ¦   «         ¦  «         dS )zÇ
        If L{deprecatedModuleAttribute} is used to deprecate a module attribute
        of a package, only one deprecation warning is emitted when the
        deprecated module is imported.
        N)r§   r¡   r&   s    r"   Útest_deprecatedModulez2ImportedModuleAttributeTests.test_deprecatedModule=  s*   € ð 	×Ò˜T×3Ò3Ñ5Ô5Ñ6Ô6Ð6Ð6Ð6r$   c                 óÐ   — |                       ¦   «         }|                      |¦  «         |                      |¦  «         t          d¦  «        D ]}|                      |¦  «         ŒdS )zÔ
        If L{deprecatedModuleAttribute} is used to deprecate a module attribute
        of a package, only one deprecation warning is emitted when the
        deprecated module is subsequently imported.
        rx   N)r¡   r§   Úrange)r!   ÚmpÚxs      r"   Ú"test_deprecatedModuleMultipleTimesz?ImportedModuleAttributeTests.test_deprecatedModuleMultipleTimesE  sw   € ð ×#Ò#Ñ%Ô%ˆà×Ò˜RÑ Ô Ð ð 	×Ò˜RÑ Ô Ð õ �q‘”ð 	%ð 	%ˆAØ× Ò  Ñ$Ô$Ð$Ð$ð	%ð 	%r$   N)
r(   r)   r*   r+   rŸ   rœ   r¡   r§   r«   r°   r,   r$   r"   r‚   r‚   ë   st   € € € € € ðð ð
€Lð$ð $ð $ðL/ð /ð /ðEð Eð Eð7ð 7ð 7ð%ð %ð %ð %ð %r$   r‚   c                   óB   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚWarnAboutFunctionTestsz¢
    Tests for L{twisted.python.deprecate.warnAboutFunction} which allows the
    callers of a function to issue a C{DeprecationWarning} about that function.
    c                 ó>  ‡— t          |                      ¦   «         ¦  «                             d¦  «        | _        | j                             ¦   «          | j                             d¦  «                             d¦  «         | j                             d¦  «                             d¦  «         | j                             d¦  «                             d¦  «         | j                             ¦   «         j        }t          j         	                    d|¦  «         |  
                    t          j        j        |¦  «         t          j                             ¦   «         Š|  
                    ˆfd	„¦  «         t          j        ¦   «         r|                      ¦   «          d
S d
S )zY
        Create a file that will have known line numbers when emitting warnings.
        Útwisted_private_helperz__init__.pyr$   z	module.pys  
"A module string"

from twisted.python import deprecate

def testFunction():
    "A doc string"
    a = 1 + 2
    return a

def callTestFunction():
    b = testFunction()
    if b == 3:
        deprecate.warnAboutFunction(testFunction, "A Warning String")
z	pep626.pysQ  
"A module string"

from twisted.python import deprecate

def noop():
    pass

def testFunction(a=1, b=1):
    "A doc string"
    if a:
        if b:
            noop()
        else:
            pass

def callTestFunction():
    b = testFunction()
    if b is None:
        deprecate.warnAboutFunction(testFunction, "A Warning String")
r   c                  ó~   •— t           j                             ¦   «         t           j                             ‰ ¦  «        fS r   )r{   r|   ÚclearÚupdate)r|   s   €r"   ú<lambda>z.WarnAboutFunctionTests.setUp.<locals>.<lambda>•  s*   ø€ ¥¤×!2Ò!2Ñ!4Ô!4µc´k×6HÒ6HÈÑ6QÔ6QÐ R€ r$   N)r   r‘   r…   r¥   r“   rˆ   Úparentr•   r{   Úinsertr}   Úremover|   r˜   r   Ú	isWindowsrk   )r!   ÚpackagePathr|   s     @r"   r`   zWarnAboutFunctionTests.setUp`  si  ø€ õ   §¢¡¤Ñ.Ô.×4Ò4Ð5MÑNÔNˆŒØŒ×ÒÑÔÐØŒ×Ò˜=Ñ)Ô)×4Ò4°SÑ9Ô9Ð9ØŒ×Ò˜;Ñ'Ô'×2Ò2ðñ	
ô 	
ð 	
ð" 	Œ×Ò˜;Ñ'Ô'×2Ò2ðñ	
ô 	
ð 	
ð0 ”l×)Ò)Ñ+Ô+Ô0ˆÝŒ�Š˜˜;Ñ'Ô'Ð'Ø�Š�œœ¨Ñ5Ô5Ð5å”+×"Ò"Ñ$Ô$ˆØ�ŠÐRÐRÐRÐRÑSÔSÐSõ
 ÔÑÔð 	!Ø×ÒÑ Ô Ð Ð Ð ð	!ð 	!r$   c                 óŠ  — d„ }t          j        |d¦  «         |                      ¦   «         }t          }|                     ¦   «                              d¦  «        r
|dd…         }|                      t          |d         d         ¦  «        t          |¦  «        ¦  «         |                      |d         d         d¦  «         dS )	z½
        L{deprecate.warnAboutFunction} emits a warning the file and line number
        of which point to the beginning of the implementation of the function
        passed to it.
        c                  ó   — d S r   r,   r,   r$   r"   ÚaFuncz2WarnAboutFunctionTests.test_warning.<locals>.aFunc¤  ó   € ØˆDr$   zA Warning Messagez.pycNéÿÿÿÿr   Úfilenamer^   )	r   ÚwarnAboutFunctionrk   r¦   ÚlowerÚendswithÚassertSamePathr   rJ   )r!   rÀ   rp   rÃ   s       r"   Útest_warningz#WarnAboutFunctionTests.test_warning�  sÁ   € ð	ð 	ð 	õ 	Ô# EÐ+>Ñ?Ô?Ð?Ø×*Ò*Ñ,Ô,ˆÝˆØ�>Š>ÑÔ×$Ò$ VÑ,Ô,ð 	%Ø   ”}ˆHØ×Ò�H ]°1Ô%5°jÔ%AÑBÔBÅHÈXÑDVÔDVÑWÔWÐWØ×Ò˜ qÔ)¨)Ô4Ð6IÑJÔJÐJÐJÐJr$   c                 ó
  — ddl m} |                     ¦   «          |                      ¦   «         }|                      t          |d         d                              d¦  «        ¦  «        | j                             d¦  «         	                    d¦  «        ¦  «         |  
                    |d         d         d¦  «         |  
                    |d         d	         d
¦  «         |  
                    t          |¦  «        d¦  «         dS )z¨
        L{deprecate.warnAboutFunction} emits a C{DeprecationWarning} with the
        number of a line within the implementation of the function passed to it.
        r   r£   rÃ   r�   ó   twisted_private_helperrž   Úlinenoé	   r^   úA Warning StringrP   N)r´   r¤   ÚcallTestFunctionrk   rÇ   r   r’   r¥   Úsiblingr…   rJ   rn   ©r!   r¤   rp   s      r"   Útest_warningLineNumberz-WarnAboutFunctionTests.test_warningLineNumber¯  sý   € ð
 	2Ð1Ð1Ð1Ð1Ð1à×ÒÑ!Ô!Ð!Ø×*Ò*Ñ,Ô,ˆØ×ÒÝ�] 1Ô% jÔ1×8Ò8¸ÑAÔAÑBÔBØŒL× Ò Ð!:Ñ;Ô;×AÒAÀ,ÑOÔOñ	
ô 	
ð 	
ð 	×Ò˜ qÔ)¨(Ô3°QÑ7Ô7Ð7Ø×Ò˜ qÔ)¨)Ô4Ð6HÑIÔIÐIØ×Ò�˜]Ñ+Ô+¨QÑ/Ô/Ð/Ð/Ð/r$   c                 ó
  — ddl m} |                     ¦   «          |                      ¦   «         }|                      t          |d         d                              d¦  «        ¦  «        | j                             d¦  «         	                    d¦  «        ¦  «         |  
                    |d         d         d¦  «         |  
                    |d         d	         d
¦  «         |  
                    t          |¦  «        d¦  «         dS )zã
        L{deprecate.warnAboutFunction} emits a C{DeprecationWarning} with the
        number of a line within the implementation handling the case in which
        dis.findlinestarts returns the lines in random order.
        r   )Úpep626rÃ   r�   rÊ   s	   pep626.pyrË   é   r^   rÍ   rP   N)r´   rÓ   rÎ   rk   rÇ   r   r’   r¥   rÏ   r…   rJ   rn   )r!   rÓ   rp   s      r"   Ú'test_warningLineNumberDisFindlinestartsz>WarnAboutFunctionTests.test_warningLineNumberDisFindlinestartsÂ  sý   € ð 	2Ð1Ð1Ð1Ð1Ð1à×ÒÑ!Ô!Ð!Ø×*Ò*Ñ,Ô,ˆØ×ÒÝ�] 1Ô% jÔ1×8Ò8¸ÑAÔAÑBÔBØŒL× Ò Ð!:Ñ;Ô;×AÒAÀ,ÑOÔOñ	
ô 	
ð 	
ð 	×Ò˜ qÔ)¨(Ô3°RÑ8Ô8Ð8Ø×Ò˜ qÔ)¨)Ô4Ð6HÑIÔIÐIØ×Ò�˜]Ñ+Ô+¨QÑ/Ô/Ð/Ð/Ð/r$   c                 óŒ   — |                       t          |j        ¦  «        t          |j        ¦  «        k    |›d|›�¦  «         dS )a  
        Assert that the two paths are the same, considering case normalization
        appropriate for the current platform.

        @type first: L{FilePath}
        @type second: L{FilePath}

        @raise C{self.failureType}: If the paths are not the same.
        z != N)Ú
assertTruer   r•   )r!   rv   rw   s      r"   rÇ   z%WarnAboutFunctionTests.assertSamePathÖ  sQ   € ð 	�ŠÝ�U”ZÑ Ô ¥H¨V¬[Ñ$9Ô$9Ò9ØÐ&Ð&˜FÐ&Ð&ñ	
ô 	
ð 	
ð 	
ð 	
r$   c                 ó–  — ddl m} t          j        d= t          j        |j        = | j                             | j                             d¦  «        ¦  «         t          rt          ¦   «          ddl	m} |  
                    t          j        j        d¦  «         |  
                    t          j        j        |j        ¦  «         |                     ¦   «          |                      |j        g¦  «        }t          |d         d                              d¦  «        ¦  «        }| j                             d¦  «                             d¦  «        }|                      ||¦  «         |                      |d         d	         d
¦  «         |                      |d         d         d¦  «         |                      t)          |¦  «        d¦  «         dS )a  
        Even if the implementation of a deprecated function is moved around on
        the filesystem, the line number in the warning emitted by
        L{deprecate.warnAboutFunction} points to a line in the implementation of
        the deprecated function.
        r   r£   r´   s   twisted_renamed_helperÚtwisted_renamed_helperrÃ   r�   rž   rË   rÌ   r^   rÍ   rP   N)r´   r¤   r{   r|   r(   r¥   ÚmoveTorÏ   r   rÙ   r}   r~   rÎ   rk   ÚtestFunctionr   r’   r…   rÇ   rJ   rn   )r!   r¤   rp   Ú
warnedPathÚexpectedPaths        r"   Útest_renamedFilez'WarnAboutFunctionTests.test_renamedFileå  s«  € ð 	2Ð1Ð1Ð1Ð1Ð1õ ŒKÐ0Ð1ÝŒK˜œÐ(ð 	Œ×Ò˜DœL×0Ò0Ð1JÑKÔKÑLÔLÐLõ ð 	 ÝÑÔÐð 	2Ð1Ð1Ð1Ð1Ð1à�Š�œœÐ)AÑBÔBÐBØ�Š�œœ¨¬Ñ9Ô9Ð9à×ÒÑ!Ô!Ð!Ø×*Ò*¨FÔ,?Ð+@ÑAÔAˆÝ˜m¨AÔ.¨zÔ:×AÒAÀ'ÑJÔJÑKÔKˆ
Ø”|×+Ò+Ð,EÑFÔF×LÒLØñ
ô 
ˆð 	×Ò˜J¨Ñ5Ô5Ð5Ø×Ò˜ qÔ)¨(Ô3°QÑ7Ô7Ð7Ø×Ò˜ qÔ)¨)Ô4Ð6HÑIÔIÐIØ×Ò�˜]Ñ+Ô+¨QÑ/Ô/Ð/Ð/Ð/r$   c                 óò   — t           j        dd…= t          j        dd¬¦  «         ddlm} |                     ¦   «          |                      ¦   «         }|                      t          |¦  «        d¦  «         dS )z¾
        L{deprecate.warnAboutFunction} emits a warning that will be filtered if
        L{warnings.filterwarning} is called with the module name of the
        deprecated function.
        NÚignorer´   ©Úactionr¤   r   r£   )	ÚwarningsÚfiltersÚfilterwarningsr´   r¤   rÎ   rk   rJ   rn   rÐ   s      r"   Útest_filteredWarningz+WarnAboutFunctionTests.test_filteredWarning  sƒ   € õ Ô˜Q˜Q˜QÐåÔ xÐ8PÐQÑQÔQÐQà1Ð1Ð1Ð1Ð1Ð1à×ÒÑ!Ô!Ð!à×*Ò*Ñ,Ô,ˆØ×Ò�˜]Ñ+Ô+¨QÑ/Ô/Ð/Ð/Ð/r$   c                 ó  — t           j        dd…= t          j        dd¬¦  «         ddlm} |                     ¦   «          |                     ¦   «          |                      ¦   «         }|                      t          |¦  «        d¦  «         |d         d         }|d         d	         }|d         d
         }|d         d         }t          j	        ||||¦  «        }|  
                    |                     d¦  «        d|›�¦  «         dS )zÙ
        L{deprecate.warnAboutFunction} emits a warning that will be filtered
        once if L{warnings.filterwarning} is called with the module name of the
        deprecated function and an action of once.
        Nr¤   r´   rá   r   r£   rP   r^   ri   rÃ   rË   z=module.py:9: DeprecationWarning: A Warning String
  return a
zUnexpected warning string: )rã   rä   rå   r´   r¤   rÎ   rk   rJ   rn   Úformatwarningr×   rÆ   )r!   r¤   rp   r^   ri   rÃ   rË   Úmsgs           r"   Útest_filteredOnceWarningz/WarnAboutFunctionTests.test_filteredOnceWarning  s"  € õ Ô˜Q˜Q˜QÐåÔ xÐ8PÐQÑQÔQÐQà1Ð1Ð1Ð1Ð1Ð1à×ÒÑ!Ô!Ð!Ø×ÒÑ!Ô!Ð!à×*Ò*Ñ,Ô,ˆØ×Ò�˜]Ñ+Ô+¨QÑ/Ô/Ð/Ø Ô" 9Ô-ˆØ  Ô# JÔ/ˆØ  Ô# JÔ/ˆØ˜qÔ! (Ô+ˆÝÔ$ W¨h¸À&ÑIÔIˆØ�ŠØ�LŠLØTñô ð 2¨#Ð1Ð1ñ		
ô 	
ð 	
ð 	
ð 	
r$   N)r(   r)   r*   r+   r`   rÈ   rÑ   rÕ   rÇ   rÞ   ræ   rê   r,   r$   r"   r²   r²   Z  s›   € € € € € ðð ð
;!ð ;!ð ;!ðzKð Kð Kð$0ð 0ð 0ð&0ð 0ð 0ð(
ð 
ð 
ð$0ð $0ð $0ðL0ð 0ð 0ð(
ð 
ð 
ð 
ð 
r$   r²   c                  ó   — dS )zK
    Do nothing.

    This is used to test the deprecation decorators.
    Nr,   r,   r$   r"   ÚdummyCallablerì   @  ó   € € € r$   c                  ó   — dS )z[
    Do nothing.

    This is used to test the replacement parameter to L{deprecated}.
    Nr,   r,   r$   r"   ÚdummyReplacementMethodrï   H  rí   r$   c                   óD   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚDeprecationWarningsTestsc                 óŒ   — t          dddd¦  «        }|                      t          | j        |¦  «        t          ›d�¦  «         dS )z 
        L{getDeprecationWarningString} returns a string that tells us that a
        callable was deprecated at a certain released version of Twisted.
        ry   rz   r   zZ.DeprecationWarningsTests.test_getDeprecationWarningString was deprecated in Twisted 8.0.0N)r   rJ   r   Ú test_getDeprecationWarningStringr(   ©r!   r]   s     r"   ró   z9DeprecationWarningsTests.test_getDeprecationWarningStringQ  sU   € õ
 ˜) Q¨¨1Ñ-Ô-ˆØ×ÒÝ'¨Ô(MÈwÑWÔWå19°°ð<ñ	
ô 	
ð 	
ð 	
ð 	
r$   c                 ó¢   — t          dddd¦  «        }t          dz   }|                      t          | j        ||¦  «        t
          ›d�¦  «         dS )zð
        L{getDeprecationWarningString} returns a string that tells us that a
        callable was deprecated at a certain released version of Twisted, with
        a message containing additional information about the deprecation.
        ry   rz   r   z: This is a messagezm.DeprecationWarningsTests.test_getDeprecationWarningString was deprecated in Twisted 8.0.0: This is a messageN)r   r	   rJ   r   ró   r(   )r!   r]   Úformats      r"   Ú*test_getDeprecationWarningStringWithFormatzCDeprecationWarningsTests.test_getDeprecationWarningStringWithFormat]  sl   € õ ˜) Q¨¨1Ñ-Ô-ˆÝ+Ð.CÑCˆØ×ÒÝ'ØÔ5°wÀñô õ AIÀÀðKñ		
ô 	
ð 	
ð 	
ð 	
r$   c                 óZ  ‡— t          dddd¦  «        } t          |¦  «        t          ¦  «        Šˆfd„}t          d¬¦  «        5 }t	          d¦  «          |¦   «          |                      |d         j        t          ¦  «         |                      t          |d         j	        ¦  «        t          t          |¦  «        ¦  «         |                      |d         j                             d¦  «        t                               d¦  «        ¦  «         d	d	d	¦  «         d	S # 1 swxY w Y   d	S )
zK
        Decorating a callable with L{deprecated} emits a warning.
        ry   rz   r   c                  ó   •—  ‰ ¦   «          d S r   r,   )Údummys   €r"   rh   zJDeprecationWarningsTests.test_deprecateEmitsWarning.<locals>.addStackLevelt  s   ø€ ØˆE‰GŒGˆGˆGˆGr$   T©ÚrecordÚalwaysÚcoN)r   r   rì   r   r   rJ   ri   rm   Ústrr^   r   rÃ   Úrstripr¦   )r!   r]   rh   Úcaughtrú   s       @r"   Útest_deprecateEmitsWarningz3DeprecationWarningsTests.test_deprecateEmitsWarningm  sv  ø€ õ ˜) Q¨¨1Ñ-Ô-ˆØ#•
˜7Ñ#Ô#¥MÑ2Ô2ˆð	ð 	ð 	ð 	ð 	õ  4Ð(Ñ(Ô(ð 		U¨FÝ˜Ñ"Ô"Ð"ØˆM‰OŒOˆOØ×Ò˜V AœYÔ/Õ1CÑDÔDÐDØ×ÒÝ�F˜1”IÔ%Ñ&Ô&Ý+­M¸7ÑCÔCñô ð ð
 ×Ò˜V AœYÔ/×6Ò6°tÑ<Ô<½h¿oºoÈdÑ>SÔ>SÑTÔTÐTð		Uð 		Uð 		Uñ 		Uô 		Uð 		Uð 		Uð 		Uð 		Uð 		Uð 		Uð 		Uøøøð 		Uð 		Uð 		Uð 		Uð 		Uð 		Us   ÁCD Ä D$Ä'D$c                 ó  — t          dddd¦  «        } t          |¦  «        t          ¦  «        }|                      t          j        |j        ¦  «         |                      t          t          ¦  «        t          |¦  «        ¦  «         dS )zK
        The decorated function has the same name as the original.
        ry   rz   r   N)r   r   rì   rJ   r(   ÚfullyQualifiedName©r!   r]   rú   s      r"   Útest_deprecatedPreservesNamez5DeprecationWarningsTests.test_deprecatedPreservesName‚  sw   € õ ˜) Q¨¨1Ñ-Ô-ˆØ#•
˜7Ñ#Ô#¥MÑ2Ô2ˆØ×Ò�Ô/°´Ñ@Ô@Ð@Ø×ÒÕ+­MÑ:Ô:Õ<NÈuÑ<UÔ<UÑVÔVÐVÐVÐVr$   c                 ór   — t          dddd¦  «        }|                      dt          |d¦  «        ¦  «         dS )zr
        L{_getDeprecationDocstring} returns a note about the deprecation to go
        into a docstring.
        ry   rz   r   zDeprecated in Twisted 8.0.0.Ú N)r   rJ   r   rô   s     r"   Útest_getDeprecationDocstringz5DeprecationWarningsTests.test_getDeprecationDocstring‹  sI   € õ
 ˜) Q¨¨1Ñ-Ô-ˆØ×ÒØ*Õ,DÀWÈbÑ,QÔ,Qñ	
ô 	
ð 	
ð 	
ð 	
r$   c                 óÜ   — d„ }t          dddd¦  «        } t          |¦  «        |¦  «        }t          |t          |d¦  «        ¦  «         |                      |j        |j        ¦  «         dS )zv
        The docstring of the deprecated function is appended with information
        about the deprecation.
        c                  ó   — dS )zc
            Do nothing.

            This is used to test the deprecation decorators.
            Nr,   r,   r$   r"   ÚlocalDummyCallablezTDeprecationWarningsTests.test_deprecatedUpdatesDocstring.<locals>.localDummyCallable›  rí   r$   ry   rz   r   r  N)r   r   r
   r   rJ   r+   )r!   r  r]   rú   s       r"   Útest_deprecatedUpdatesDocstringz8DeprecationWarningsTests.test_deprecatedUpdatesDocstring•  s}   € ð	ð 	ð 	õ ˜) Q¨¨1Ñ-Ô-ˆØ#•
˜7Ñ#Ô#Ð$6Ñ7Ô7ˆåÐ-Õ/GÈÐQSÑ/TÔ/TÑUÔUÐUà×ÒÐ+Ô3°U´]ÑCÔCÐCÐCÐCr$   c                 óš   — t          dddd¦  «        } t          |¦  «        t          ¦  «        }|                      ||j        ¦  «         dS )zt
        Deprecating a function adds version information to the decorated
        version of that function.
        ry   rz   r   N)r   r   rì   rJ   ÚdeprecatedVersionr  s      r"   Útest_versionMetadataz-DeprecationWarningsTests.test_versionMetadata©  sM   € õ
 ˜) Q¨¨1Ñ-Ô-ˆØ#•
˜7Ñ#Ô#¥MÑ2Ô2ˆØ×Ò˜ %Ô"9Ñ:Ô:Ð:Ð:Ð:r$   c                 ó®   — t          dddd¦  «        }t          | j        |d¬¦  «        }|                      |t	          | j        ¦  «        ›d�¦  «         dS )a  
        L{getDeprecationWarningString} takes an additional replacement parameter
        that can be used to add information to the deprecation.  If the
        replacement parameter is a string, it will be interpolated directly into
        the result.
        ry   rz   r   úsomething.foobar©ÚreplacementzE was deprecated in Twisted 8.0.0; please use something.foobar insteadN)r   r   ró   rJ   r  ©r!   r]   ÚwarningStrings      r"   Ú+test_getDeprecationWarningStringReplacementzDDeprecationWarningsTests.test_getDeprecationWarningStringReplacement²  sx   € õ ˜) Q¨¨1Ñ-Ô-ˆÝ3ØÔ1ØØ*ð
ñ 
ô 
ˆð
 	×ÒØå+¨DÔ,QÑRÔRÐRÐRðUñ	
ô 	
ð 	
ð 	
ð 	
r$   c                 óÈ   — t          dddd¦  «        }t          | j        |t          ¬¦  «        }|                      |t          | j        ¦  «        ›dt          ›d�¦  «         dS )a  
        L{getDeprecationWarningString} takes an additional replacement parameter
        that can be used to add information to the deprecation. If the
        replacement parameter is a callable, its fully qualified name will be
        interpolated into the result.
        ry   rz   r   r  z- was deprecated in Twisted 8.0.0; please use z.dummyReplacementMethod insteadN)r   r   ró   rï   rJ   r  r(   r  s      r"   Ú7test_getDeprecationWarningStringReplacementWithCallablezPDeprecationWarningsTests.test_getDeprecationWarningStringReplacementWithCallableÅ  s€   € õ ˜) Q¨¨1Ñ-Ô-ˆÝ3ØÔ1ØÝ.ð
ñ 
ô 
ˆð
 	×ÒØõ " $Ô"GÑHÔHÐHÐHÍ(È(È(ðTñ	
ô 	
ð 	
ð 	
ð 	
r$   N)r(   r)   r*   ró   r÷   r  r  r	  r  r  r  r  r,   r$   r"   rñ   rñ   P  s¤   € € € € € ð

ð 

ð 

ð
ð 
ð 
ð Uð Uð Uð*Wð Wð Wð
ð 
ð 
ðDð Dð Dð(;ð ;ð ;ð
ð 
ð 
ð&
ð 
ð 
ð 
ð 
r$   rñ   ry   rP   rx   é   c                   ó   — e Zd ZdZdS )ÚDeprecatedClasszJ
    Class which is entirely deprecated without having a replacement.
    N)r(   r)   r*   r+   r,   r$   r"   r  r  Ú  s   € € € € € ðð ð ð r$   r  c                   óv   — e Zd ZdZdZ e edddd¦  «        ¦  «        d„ ¦   «         Zej        d„ ¦   «         ZdS )	ÚClassWithDeprecatedPropertyz2
    Class with a single deprecated property.
    Nry   rP   rx   r  c                 ó   — | j         S )zC
        Getter docstring.

        @return: The property.
        ©Ú_someProtectedValuer&   s    r"   ÚsomePropertyz(ClassWithDeprecatedProperty.somePropertyè  s   € ð Ô'Ð'r$   c                 ó   — || _         dS )z#
        Setter docstring.
        Nr   r    s     r"   r"  z(ClassWithDeprecatedProperty.somePropertyñ  s   € ð
 $)ˆÔ Ð Ð r$   )	r(   r)   r*   r+   r!  r   r   r"  Úsetterr,   r$   r"   r  r  á  sz   € € € € € ðð ð ÐàÐ˜˜ 	¨1¨a°Ñ3Ô3Ñ4Ô4ð(ð (ñ 5Ô4ð(ð Ôð)ð )ñ Ôð)ð )ð )r$   r  é   r0   c                 ó   — dS )z7
    Function with a deprecated keyword parameter.
    Nr,   )ÚaÚbÚcr0   Úbars        r"   ÚfunctionWithDeprecatedParameterr+  ù  rí   r$   c                   ó<   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚDeprecatedDecoratorTestsz*
    Tests for deprecated decorators.
    c                 ót   — |                       |d„ |j                             ¦   «         D ¦   «         ¦  «         dS )a8  
        Check that C{target} object has the C{expected} docstring lines.

        @param target: Object which is checked.
        @type target: C{anything}

        @param expected: List of lines, ignoring empty lines or leading or
            trailing spaces.
        @type expected: L{list} or L{str}
        c                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S r,   )Ústrip)Ú.0r¯   s     r"   ú
<listcomp>z<DeprecatedDecoratorTests.assertDocstring.<locals>.<listcomp>  s-   € ÐSÐSÐS QÈÏÊÉÌÐS�q—w’w‘y”yÐSÐSÐSr$   N)rJ   r+   Ú
splitlines)r!   ÚtargetÚexpecteds      r"   ÚassertDocstringz(DeprecatedDecoratorTests.assertDocstring  sH   € ð 	×ÒØÐSÐS¨&¬.×*CÒ*CÑ*EÔ*EÐSÑSÔSñ	
ô 	
ð 	
ð 	
ð 	
r$   c                 óÈ  — t          ¦   «         }|j         |                      t           j        g d¢¦  «         t          dddd¦  «        t           j        _        d}|                      | j        g¦  «        }|                      dt          |¦  «        ¦  «         |                      t          |d         d         ¦  «         |                      ||d         d	         ¦  «         d
S )a%  
        When L{deprecatedProperty} is used on a C{property}, accesses raise a
        L{DeprecationWarning} and getter docstring is updated to inform the
        version in which it was deprecated. C{deprecatedVersion} attribute is
        also set to inform the deprecation version.
        )zGetter docstring.z@return: The property.úDeprecated in Twisted 1.2.3.ry   rP   rx   r  úktwisted.python.test.test_deprecate.ClassWithDeprecatedProperty.someProperty was deprecated in Twisted 1.2.3r   ri   r^   N)
r  r"  r6  r   r  rk   Útest_propertyGetterrJ   rn   rm   )r!   Úobjr^   rã   s       r"   r:  z,DeprecatedDecoratorTests.test_propertyGetter  sð   € õ *Ñ+Ô+ˆàÔÐà×ÒÝ'Ô4ðð ð ñ	
ô 	
ð 	
õ FMØ�q˜!˜QñF
ô F
Õ#Ô0ÔBð
;ð 	ð ×%Ò% tÔ'?Ð&@ÑAÔAˆØ×Ò˜�C ™MœMÑ*Ô*Ð*Ø×ÒÕ+¨X°a¬[¸Ô-DÑEÔEÐEØ×Ò˜ (¨1¤+¨iÔ"8Ñ9Ô9Ð9Ð9Ð9r$   c                 ó”  — t          ¦   «         }t          ¦   «         }||_        |                      ||j        ¦  «         d}|                      | j        g¦  «        }|                      dt          |¦  «        ¦  «         |                      t          |d         d         ¦  «         |                      ||d         d         ¦  «         dS )z}
        When L{deprecatedProperty} is used on a C{property}, setter accesses
        raise a L{DeprecationWarning}.
        r9  rP   r   ri   r^   N)
rH   r  r"  r>   r!  rk   Útest_propertySetterrJ   rn   rm   )r!   ÚnewValuer;  r^   rã   s        r"   r=  z,DeprecatedDecoratorTests.test_propertySetter4  s½   € õ
 ‘8”8ˆÝ)Ñ+Ô+ˆà#ˆÔà�Š�h Ô 7Ñ8Ô8Ð8ð;ð 	ð ×%Ò% tÔ'?Ð&@ÑAÔAˆØ×Ò˜�C ™MœMÑ*Ô*Ð*Ø×ÒÕ+¨X°a¬[¸Ô-DÑEÔEÐEØ×Ò˜ (¨1¤+¨iÔ"8Ñ9Ô9Ð9Ð9Ð9r$   c                 ó¦  — t          ¦   «          |                      t           ddg¦  «         t          dddd¦  «        t           _        d}|                      | j        g¦  «        }|                      dt          |¦  «        ¦  «         |                      t          |d         d	         ¦  «         |                      ||d         d
         ¦  «         dS )a  
        When L{deprecated} is used on a class, instantiations raise a
        L{DeprecationWarning} and class's docstring is updated to inform the
        version in which it was deprecated. C{deprecatedVersion} attribute is
        also set to inform the deprecation version.
        z@Class which is entirely deprecated without having a replacement.r8  ry   rP   rx   r  zRtwisted.python.test.test_deprecate.DeprecatedClass was deprecated in Twisted 1.2.3r   ri   r^   N)	r  r6  r   r  rk   Ú
test_classrJ   rn   rm   )r!   r^   rã   s      r"   r@  z#DeprecatedDecoratorTests.test_classH  sÓ   € õ 	ÑÔÐà×ÒÝàVØ.ðñ	
ô 	
ð 	
õ -4°I¸qÀ!ÀQÑ,GÔ,G�Ô)ð.ð 	ð ×%Ò% t¤Ð&7Ñ8Ô8ˆØ×Ò˜�C ™MœMÑ*Ô*Ð*Ø×ÒÕ+¨X°a¬[¸Ô-DÑEÔEÐEØ×Ò˜ (¨1¤+¨iÔ"8Ñ9Ô9Ð9Ð9Ð9r$   c                 óœ   — t          dddd¦  «        } t          |d¦  «        t          ¦  «        }|                      |j        d¦  «         dS )a  
        L{deprecated} takes an additional replacement parameter that can be used
        to indicate the new, non-deprecated method developers should use.  If
        the replacement parameter is a string, it will be interpolated directly
        into the warning message.
        ry   rz   r   r  z‚
Do nothing.

This is used to test the deprecation decorators.

Deprecated in Twisted 8.0.0; please use something.foobar instead.
N)r   r   rì   rJ   r+   r  s      r"   Útest_deprecatedReplacementz3DeprecatedDecoratorTests.test_deprecatedReplacementc  s]   € õ ˜) Q¨¨1Ñ-Ô-ˆØ7•
˜7Ð$6Ñ7Ô7½ÑFÔFˆØ×ÒØŒMðñ	
ô 	
ð 	
ð 	
ð 	
r$   c                 óÜ   — t          dddd¦  «        }t          |t          ¬¦  «        } |t          ¦  «        }|                      |j        d                     t          ¦  «        ¦  «         dS )a)  
        L{deprecated} takes an additional replacement parameter that can be used
        to indicate the new, non-deprecated method developers should use.  If
        the replacement parameter is a callable, its fully qualified name will
        be interpolated into the warning message.
        ry   rz   r   r  z‹
Do nothing.

This is used to test the deprecation decorators.

Deprecated in Twisted 8.0.0; please use {}.dummyReplacementMethod instead.
N)r   r   rï   rì   rJ   r+   rö   r(   )r!   r]   Ú	decoratorrú   s       r"   Ú&test_deprecatedReplacementWithCallablez?DeprecatedDecoratorTests.test_deprecatedReplacementWithCallablev  st   € õ ˜) Q¨¨1Ñ-Ô-ˆÝ˜wÕ4JÐKÑKÔKˆ	Ø�	�-Ñ(Ô(ˆØ×ÒØŒMð3÷ 4:²6½(Ñ3CÔ3Cñ	
ô 	
ð 	
ð 	
ð 	
r$   c                 ó°  — d}t          d¬¦  «        5 }t          d¦  «         t          dd¦  «         |                      |g ¦  «         t          ddd¦  «         |                      |g ¦  «         t          ddd¬	¦  «         |                      t	          |¦  «        d
¦  «         |                      |d         j        t          ¦  «         |                      t          |d         j        ¦  «        |¦  «         | 	                    ¦   «          t          ddd¬¦  «         |                      |g ¦  «         t          dddd¦  «         |                      t	          |¦  «        d
¦  «         |                      |d         j        t          ¦  «         |                      t          |d         j        ¦  «        |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NzzThe 'foo' parameter to twisted.python.test.test_deprecate.functionWithDeprecatedParameter was deprecated in Twisted 19.2.0Trû   rý   é
   é   é   é(   )r0   rP   r   é2   )r*  )
r   r   r+  rJ   rn   ri   rm   rÿ   r^   r¶   )r!   r^   Úwss      r"   Útest_deprecatedKeywordParameterz8DeprecatedDecoratorTests.test_deprecatedKeywordParameter‰  s÷  € ð/ð 	õ  4Ð(Ñ(Ô(ð 	:¨BÝ˜Ñ"Ô"Ð"å+¨B°Ñ3Ô3Ð3Ø×Ò˜R Ñ$Ô$Ð$å+¨B°°BÑ7Ô7Ð7Ø×Ò˜R Ñ$Ô$Ð$å+¨B°¸Ð;Ñ;Ô;Ð;Ø×Ò�S ™WœW aÑ(Ô(Ð(Ø×Ò˜R œUœ^Õ-?Ñ@Ô@Ð@Ø×Ò�S  A¤¤Ñ/Ô/°Ñ9Ô9Ð9à�HŠH‰JŒJˆJÝ+¨B°¸Ð;Ñ;Ô;Ð;Ø×Ò˜R Ñ$Ô$Ð$å+¨B°°B¸Ñ;Ô;Ð;Ø×Ò�S ™WœW aÑ(Ô(Ð(Ø×Ò˜R œUœ^Õ-?Ñ@Ô@Ð@Ø×Ò�S  A¤¤Ñ/Ô/°Ñ9Ô9Ð9ð+	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:ð 	:ð 	:s   “F+GÇGÇGN)r(   r)   r*   r+   r6  r:  r=  r@  rB  rE  rM  r,   r$   r"   r-  r-     sˆ   € € € € € ðð ð
ð 
ð 
ð:ð :ð :ð@:ð :ð :ð(:ð :ð :ð6
ð 
ð 
ð&
ð 
ð 
ð&:ð :ð :ð :ð :r$   r-  c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚAppendToDocstringTestszk
    Test the _appendToDocstring function.

    _appendToDocstring is used to add text to a docstring.
    c                 ób   — d„ }t          |d¦  «         |                      d|j        ¦  «         dS )zP
        Appending to an empty docstring simply replaces the docstring.
        c                  ó   — d S r   r,   r,   r$   r"   ÚnoDocstringzGAppendToDocstringTests.test_appendToEmptyDocstring.<locals>.noDocstringµ  rÁ   r$   úAppended text.N©r
   rJ   r+   )r!   rR  s     r"   Útest_appendToEmptyDocstringz2AppendToDocstringTests.test_appendToEmptyDocstring°  sD   € ð
	ð 	ð 	õ 	˜;Ð(8Ñ9Ô9Ð9Ø×ÒÐ)¨;Ô+>Ñ?Ô?Ð?Ð?Ð?r$   c                 óä   — d„ }t          |d¦  «         |                      g d¢|j                             ¦   «         ¦  «         |                      |j                             d¦  «        ¦  «         dS )aŽ  
        Appending to a single line docstring places the message on a new line,
        with a blank line separating it from the rest of the docstring.

        The docstring ends with a newline, conforming to Twisted and PEP 8
        standards. Unfortunately, the indentation is incorrect, since the
        existing docstring doesn't have enough info to help us indent
        properly.
        c                  ó   — dS )ú;This doesn't comply with standards, but is here for a test.Nr,   r,   r$   r"   ÚsingleLineDocstringzTAppendToDocstringTests.test_appendToSingleLineDocstring.<locals>.singleLineDocstringÆ  rí   r$   rS  )rX  r  rS  ú
N)r
   rJ   r+   r3  r×   rÆ   )r!   rY  s     r"   Ú test_appendToSingleLineDocstringz7AppendToDocstringTests.test_appendToSingleLineDocstring»  s�   € ð	Nð 	Nð 	Nõ 	Ð.Ð0@ÑAÔAÐAØ×Òðð ð ð
  Ô'×2Ò2Ñ4Ô4ñ	
ô 	
ð 	
ð 	�ŠÐ+Ô3×<Ò<¸TÑBÔBÑCÔCÐCÐCÐCr$   c                 ób   — d„ }t          |d¦  «         |                      d|j        ¦  «         dS )zþ
        Appending to a multi-line docstring places the messade on a new line,
        with a blank line separating it from the rest of the docstring.

        Because we have multiple lines, we have enough information to do
        indentation.
        c                  ó   — dS )z9
            This is a multi-line docstring.
            Nr,   r,   r$   r"   ÚmultiLineDocstringzRAppendToDocstringTests.test_appendToMultilineDocstring.<locals>.multiLineDocstringÝ  rí   r$   rS  z1
This is a multi-line docstring.

Appended text.
NrT  )r!   r^  s     r"   Útest_appendToMultilineDocstringz6AppendToDocstringTests.test_appendToMultilineDocstringÔ  sP   € ð	ð 	ð 	õ
 	Ð-Ð/?Ñ@Ô@Ð@Ø×ÒØLØÔ&ñ	
ô 	
ð 	
ð 	
ð 	
r$   N)r(   r)   r*   r+   rU  r[  r_  r,   r$   r"   rO  rO  ©  sQ   € € € € € ðð ð	@ð 	@ð 	@ðDð Dð Dð2
ð 
ð 
ð 
ð 
r$   rO  c                   óT   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ ZdS )ÚMutualArgumentExclusionTestsz2
    Tests for L{mutuallyExclusiveArguments}.
    c                 óº   — t          t          dd¦  «        r#t          t          j        |¦  «        ||¦  «        S t	          t          j        |¦  «        ||¦  «        S )aÊ  
        Test an invocation of L{passed} with the given function, arguments, and
        keyword arguments.

        @param func: A function whose argspec will be inspected.
        @type func: A callable.

        @param args: The arguments which could be passed to C{func}.

        @param kw: The keyword arguments which could be passed to C{func}.

        @return: L{_passedSignature} or L{_passedArgSpec}'s return value
        @rtype: L{dict}
        Ú	signatureN)rA   Úinspectr   rc  r   Ú
getargspec©r!   ÚfuncÚargsÚkws       r"   ÚcheckPassedz(MutualArgumentExclusionTests.checkPassedî  sU   € õ •7˜K¨Ñ.Ô.ð 	Få#¥GÔ$5°dÑ$;Ô$;¸TÀ2ÑFÔFÐFõ "¥'Ô"4°TÑ":Ô":¸DÀ"ÑEÔEÐEr$   c                 ó€   — d„ }|                       |                      |dd¦  «        t          dd¬¦  «        ¦  «         dS )z`
        L{passed} identifies the arguments passed by a simple
        positional test.
        c                 ó   — d S r   r,   ©r'  r(  s     r"   rg  zGMutualArgumentExclusionTests.test_passed_simplePositional.<locals>.func
  rÁ   r$   rP   rx   rm  N©rJ   rj  r‰   ©r!   rg  s     r"   Útest_passed_simplePositionalz9MutualArgumentExclusionTests.test_passed_simplePositional  sK   € ð	ð 	ð 	ð 	×Ò˜×)Ò)¨$°°1Ñ5Ô5µt¸aÀ1°~±~´~ÑFÔFÐFÐFÐFr$   c                 óT   — d„ }|                       t          | j        |ddd¦  «         dS )z[
        L{passed} raises a L{TypeError} if too many arguments are
        passed.
        c                 ó   — d S r   r,   rm  s     r"   rg  zBMutualArgumentExclusionTests.test_passed_tooManyArgs.<locals>.func  rÁ   r$   rP   rx   r  N©r?   Ú	TypeErrorrj  ro  s     r"   Útest_passed_tooManyArgsz4MutualArgumentExclusionTests.test_passed_tooManyArgs  s:   € ð	ð 	ð 	ð 	×Ò�) TÔ%5°t¸QÀÀ1ÑEÔEÐEÐEÐEr$   c                 óT   — d„ }|                       t          | j        |dd¬¦  «         dS )zs
        L{passed} raises a L{TypeError} if a argument is passed both
        positionally and by keyword.
        c                 ó   — d S r   r,   ©r'  s    r"   rg  zHMutualArgumentExclusionTests.test_passed_doublePassKeyword.<locals>.func   rÁ   r$   rP   rx   rx  Nrs  ro  s     r"   Útest_passed_doublePassKeywordz:MutualArgumentExclusionTests.test_passed_doublePassKeyword  ó;   € ð	ð 	ð 	ð 	×Ò�) TÔ%5°t¸QÀ!ÐÑDÔDÐDÐDÐDr$   c                 óT   — d„ }|                       t          | j        |dd¬¦  «         dS )z„
        L{passed} raises a L{TypeError} if a keyword argument not
        present in the function's declaration is passed.
        c                 ó   — d S r   r,   rx  s    r"   rg  zIMutualArgumentExclusionTests.test_passed_unspecifiedKeyword.<locals>.func+  rÁ   r$   rP   rx   )ÚzNrs  ro  s     r"   Útest_passed_unspecifiedKeywordz;MutualArgumentExclusionTests.test_passed_unspecifiedKeyword%  rz  r$   c                 ó‚   — d„ }|                       |                      |ddd¦  «        t          dd¬¦  «        ¦  «         dS )z|
        L{passed} places additional positional arguments into a tuple
        under the name of the star argument.
        c                 ó   — d S r   r,   rm  s     r"   rg  z;MutualArgumentExclusionTests.test_passed_star.<locals>.func6  rÁ   r$   rP   rx   r  )rx   r  rm  Nrn  ro  s     r"   Útest_passed_starz-MutualArgumentExclusionTests.test_passed_star0  sP   € ð	ð 	ð 	ð 	×Ò˜×)Ò)¨$°°1°aÑ8Ô8½$ÀÀfÐ:MÑ:MÔ:MÑNÔNÐNÐNÐNr$   c                 ó¦   — d„ }|                       |                      |dddd¬¦  «        t          dt          ddd¬¦  «        ¬¦  «        ¦  «         dS )	zn
        Additional keyword arguments are passed as a dict to the star star
        keyword argument.
        c                 ó   — d S r   r,   rm  s     r"   rg  z?MutualArgumentExclusionTests.test_passed_starStar.<locals>.funcA  rÁ   r$   rP   rx   r  é   )r¯   Úyr}  rm  Nrn  ro  s     r"   Útest_passed_starStarz1MutualArgumentExclusionTests.test_passed_starStar;  sp   € ð	ð 	ð 	ð 	×ÒØ×Ò˜T 1¨¨Q°!ÐÑ4Ô4µd¸QÅ$ÈÈaÐSTÐBUÑBUÔBUÐ6VÑ6VÔ6Vñ	
ô 	
ð 	
ð 	
ð 	
r$   c                 óˆ   — d	d„}|                       |                      |ddd¬¦  «        t          ddd¬¦  «        ¦  «         dS )
zp
        The results of L{passed} only include arguments explicitly
        passed, not default values.
        rP   rx   r  c                 ó   — d S r   r,   ©r'  r(  r)  ÚdÚes        r"   rg  zFMutualArgumentExclusionTests.test_passed_noDefaultValues.<locals>.funcN  rÁ   r$   é   )r‹  )r'  r(  r‹  N©rP   rx   r  rn  ro  s     r"   Útest_passed_noDefaultValuesz8MutualArgumentExclusionTests.test_passed_noDefaultValuesH  sZ   € ð	ð 	ð 	ð 	ð 	×Ò˜×)Ò)¨$°°1¸Ð)Ñ:Ô:½DÀ1ÈÈQÐ<OÑ<OÔ<OÑPÔPÐPÐPÐPr$   c                 ó   — t          dg¦  «        dd„¦   «         }|                       |dd¦  «        d¦  «         |                       |ddd¦  «        d	¦  «         |                       |ddd¬
¦  «        d¦  «         dS )z¥
        L{mutuallyExclusiveArguments} does not interfere in its
        decoratee's operation, either its receipt of arguments or its return
        value.
        rm  r  r„  c                 ó   — | |z   |z   |z   S r   r,   )r¯   r…  r'  r(  s       r"   rg  zMMutualArgumentExclusionTests.test_mutualExclusionPrimeDirective.<locals>.funcZ  s   € à�q‘5˜1‘9˜q‘=Ð r$   rP   rx   rG  rŒ  é   ©r(  é   N©r  r„  )r   rJ   ro  s     r"   Ú"test_mutualExclusionPrimeDirectivez?MutualArgumentExclusionTests.test_mutualExclusionPrimeDirectiveS  s›   € õ 
% j \Ñ	2Ô	2ð	!ð 	!ð 	!ñ 
3Ô	2ð	!ð 	×Ò˜˜˜a ™œ RÑ(Ô(Ð(Ø×Ò˜˜˜a  A™œ¨Ñ+Ô+Ð+Ø×Ò˜˜˜a  a˜™œ¨"Ñ-Ô-Ð-Ð-Ð-r$   c                 óz   — t          ddgg¦  «        dd„¦   «         }|                      t          |dd¬¦  «         dS )	z‘
        L{mutuallyExclusiveArguments} raises a L{TypeError}n if its
        decoratee is passed a pair of mutually exclusive arguments.
        r'  r(  r  r„  c                 ó   — | |z   S r   r,   rm  s     r"   rg  zPMutualArgumentExclusionTests.test_mutualExclusionExcludesByKeyword.<locals>.funch  s   € à�q‘5ˆLr$   rm  Nr”  )r   r?   rt  ro  s     r"   Ú%test_mutualExclusionExcludesByKeywordzBMutualArgumentExclusionTests.test_mutualExclusionExcludesByKeywordb  sV   € õ 
% s¨C j \Ñ	2Ô	2ð	ð 	ð 	ñ 
3Ô	2ð	ð 	×Ò�) T¨Q°!ÐÑ4Ô4Ð4Ð4Ð4r$   c                 ó,  —  G d„ d¦  «        } G d„ d¦  «        }d„ } |dd¦  «         t          j        |¦  «        j        }|                     ¦   «         } |dd¦  «        |d	<    ||¦  «        }|                      t
          t          |d
i ¦  «         dS )z²
        Create a fake signature with an invalid parameter
        type to test error handling.  The valid parameter
        types are specified in L{inspect.Parameter}.
        c                   ó   — e Zd Zd„ ZdS )úMMutualArgumentExclusionTests.test_invalidParameterType.<locals>.FakeSignaturec                 ó   — || _         d S r   )Ú
parameters)r!   r�  s     r"   r#   zVMutualArgumentExclusionTests.test_invalidParameterType.<locals>.FakeSignature.__init__v  s   € Ø",�”��r$   N©r(   r)   r*   r#   r,   r$   r"   ÚFakeSignaturer›  u  s#   € € € € € ð-ð -ð -ð -ð -r$   rŸ  c                   ó   — e Zd Zd„ ZdS )úMMutualArgumentExclusionTests.test_invalidParameterType.<locals>.FakeParameterc                 ó"   — || _         || _        d S r   )ro   Úkind)r!   ro   r£  s      r"   r#   zVMutualArgumentExclusionTests.test_invalidParameterType.<locals>.FakeParameter.__init__z  s   € Ø �”	Ø �”	�	�	r$   Nrž  r,   r$   r"   ÚFakeParameterr¡  y  s#   € € € € € ð!ð !ð !ð !ð !r$   r¤  c                 ó   — d S r   r,   rm  s     r"   rg  zDMutualArgumentExclusionTests.test_invalidParameterType.<locals>.func~  rÁ   r$   rP   rx   Úfaker)  ©rP   rx   N)rd  rc  r�  r˜   r?   rt  r   )r!   rŸ  r¤  rg  r�  ÚdummyParametersÚfakeSigs          r"   Útest_invalidParameterTypez6MutualArgumentExclusionTests.test_invalidParameterTypen  sÜ   € ð	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð	!ð 	!ð 	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð
	ð 	ð 	ð 	ˆˆQ�‰
Œ
ˆ
ÝÔ& tÑ,Ô,Ô7ˆ
Ø$Ÿ/š/Ñ+Ô+ˆØ,˜}¨V°VÑ<Ô<ˆ˜ÑØ�- Ñ0Ô0ˆØ×Ò�)Õ%5°wÀÈÑKÔKÐKÐKÐKr$   N)r(   r)   r*   r+   rj  rp  ru  ry  r~  r�  r†  rŽ  r•  r˜  rª  r,   r$   r"   ra  ra  é  sÝ   € € € € € ðð ðFð Fð Fð,	Gð 	Gð 	Gð	Fð 	Fð 	Fð	Eð 	Eð 	Eð	Eð 	Eð 	Eð	Oð 	Oð 	Oð
ð 
ð 
ð	Qð 	Qð 	Qð.ð .ð .ð
5ð 
5ð 
5ðLð Lð Lð Lð Lr$   ra  c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚKeywordOnlyTestsz,
    Keyword only arguments (PEP 3102).
    c                 óH   — t          t          j        |¦  «        ||¦  «        S )a°  
        Test an invocation of L{passed} with the given function, arguments, and
        keyword arguments.

        @param func: A function whose argspec to pass to L{_passed}.
        @type func: A callable.

        @param args: The arguments which could be passed to L{func}.

        @param kw: The keyword arguments which could be passed to L{func}.

        @return: L{_passed}'s return value
        @rtype: L{dict}
        )r   rd  rc  rf  s       r"   rj  zKeywordOnlyTests.checkPassedŽ  s!   € õ  ¥Ô 1°$Ñ 7Ô 7¸¸rÑBÔBÐBr$   c                 óà  — ddœd„}ddœd„}|                       |                      |ddd¦  «        t          dd¬	¦  «        ¦  «         |                       |                      |dddd
¬¦  «        t          dd
¬	¦  «        ¦  «         |                       |                      |ddd
ddd¬¦  «        t          dd
ddd¬¦  «        ¦  «         |                      t          | j        |ddd
dd¬¦  «         dS )z`
        Keyword only arguments follow varargs.
        They are specified in PEP 3102.
        Tr’  c                 ó   — dS )zM
            b is a keyword-only argument, with a default value.
            Nr,   )r(  r'  s     r"   Úfunc1z6KeywordOnlyTests.test_passedKeywordOnly.<locals>.func1¥  rí   r$   c                 ó   — dS )zd
            b, c, d, e  are keyword-only arguments.
            b has a default value.
            Nr,   )r(  r)  rŠ  r‹  r'  s        r"   Úfunc2z6KeywordOnlyTests.test_passedKeywordOnly.<locals>.func2ª  rí   r$   rP   rx   r  r�  rm  F)r(  r)  rŠ  r‹  r§  r‰  )r(  r)  rŠ  N)rJ   rj  r‰   r?   rt  )r!   r°  r²  s      r"   Útest_passedKeywordOnlyz'KeywordOnlyTests.test_passedKeywordOnlyŸ  s;  € ð ð 	ð 	ð 	ð 	ð 	ð
 ð 	ð 	ð 	ð 	ð 	ð 	×Ò˜×)Ò)¨%°°A°qÑ9Ô9½4À)ÈtÐ;TÑ;TÔ;TÑUÔUÐUØ×ÒØ×Ò˜U A q¨!¨uÐÑ5Ô5µt¸iÈ5Ð7QÑ7QÔ7Qñ	
ô 	
ð 	
ð 	×ÒØ×Ò˜U A q¨E°Q¸!¸qÐÑAÔAÝ�6˜U a¨1°Ð2Ñ2Ô2ñ	
ô 	
ð 	
ð 	×Ò�) TÔ%5°u¸aÀÀeÈqÐTUÐÑVÔVÐVÐVÐVr$   N)r(   r)   r*   r+   rj  r³  r,   r$   r"   r¬  r¬  ‰  sD   € € € € € ðð ðCð Cð Cð"Wð Wð Wð Wð Wr$   r¬  r�  )7r+   rd  r{   r1   rã   Úos.pathr   r   r   Ú	importlibr   ÚImportErrorÚincrementalr   Útwisted.pythonr   Útwisted.python.deprecater	   r
   r   r  r   r   r   r   r   r   r   r   r   Útwisted.python.filepathr   Útwisted.python.runtimer   Útwisted.python.testr   Ú#twisted.python.test.modules_helpersr   Útwisted.trial.unittestr   r   r.   r[   r‚   r²   rì   rï   rñ   r  r  r+  r-  rO  ra  r¬  r,   r$   r"   ú<module>r¿     sœ  ððð ð
 €€€Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1ðØ+Ð+Ð+Ð+Ð+Ð+Ð+øØð ð ð ØÐÐÐðøøøð  Ð Ð Ð Ð Ð à $Ð $Ð $Ð $Ð $Ð $ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð -Ð ,Ð ,Ð ,Ð ,Ð ,Ø +Ð +Ð +Ð +Ð +Ð +Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø CÐ CÐ CÐ CÐ CÐ CØ 6Ð 6Ð 6Ð 6Ð 6Ð 6ðð ð ð ð ñ ô ð ð"DYð DYð DYð DYð DYÐ*ñ DYô DYð DYðN_@ð _@ð _@ð _@ð _@Ð2ñ _@ô _@ð _@ðDl%ð l%ð l%ð l%ð l%Ð#6Ð8Kñ l%ô l%ð l%ð^c
ð c
ð c
ð c
ð c
Ð0ñ c
ô c
ð c
ðLð ð ðð ð ðG
ð G
ð G
ð G
ð G
Ð2ñ G
ô G
ð G
ðT €ˆGˆG�I˜q ! QÑ'Ô'Ñ(Ô(ðð ð ð ð ñ ô ñ )Ô(ðð)ð )ð )ð )ð )ñ )ô )ð )ð0 Ð˜G˜G I¨r°1°aÑ8Ô8¸%Ñ@Ô@ðð ð ñ AÔ@ððf:ð f:ð f:ð f:ð f:Ð2ñ f:ô f:ð f:ðR=
ð =
ð =
ð =
ð =
Ð0ñ =
ô =
ð =
ð@]Lð ]Lð ]Lð ]Lð ]LÐ#6ñ ]Lô ]Lð ]Lð@/Wð /Wð /Wð /Wð /WÐ*ñ /Wô /Wð /Wð /Wð /Ws   ¢) ©3²3