§
    ÈtºfBU  ã                   ó°  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZ d„ Z	 G d„ de¦  «        Z
 e e	¦   «          d¦  «         G d„ de
¦  «        ¦   «         Z e e	¦   «          d¦  «         G d	„ d
e
¦  «        ¦   «         Z e e	¦   «          d¦  «         G d„ de¦  «        ¦   «         Z e e	¦   «          d¦  «         G d„ de
¦  «        ¦   «         ZdS )é    N)ÚskipIfÚTestCasec                  óH   — 	 t          d¦  «         dS # t          $ r Y dS w xY w)NÚtwistedTF)Ú
__import__ÚImportError© ó    úZ/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/automat/_test/test_discover.pyÚisTwistedInstalledr   	   s@   € ðÝ�9ÑÔÐð ˆtøõ ð ð ð Øˆuˆuðøøøs   ‚ “
! !c                   óP   ‡ — e Zd ZdZˆ fd„Zˆ fd„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zˆ xZS )
Ú_WritesPythonModuleszG
    A helper that enables generating Python module test fixtures.
    c                 ó’  •— t          t          | ¦  «                             ¦   «          ddlm}m} ddlm} || _        || _        || _        t          t          j
                             ¦   «         ¦  «        | _        t          j        d d …         | _        t          j        ¦   «         | _        |                      | j        ¦  «         d S )Nr   )Ú	getModuleÚ
PythonPath)ÚFilePath)Úsuperr   ÚsetUpÚtwisted.python.modulesr   r   Útwisted.python.filepathr   ÚsetÚsysÚmodulesÚkeysÚoriginalSysModulesÚpathÚsavedSysPathÚtempfileÚmkdtempÚpathDirÚmakeImportable)Úselfr   r   r   Ú	__class__s       €r   r   z_WritesPythonModules.setUp   s»   ø€ ÝÕ" DÑ)Ô)×/Ò/Ñ1Ô1Ð1à@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ø4Ð4Ð4Ð4Ð4Ð4à"ˆŒØ$ˆŒØ ˆŒå"%¥c¤k×&6Ò&6Ñ&8Ô&8Ñ"9Ô"9ˆÔÝœH Q Q QœKˆÔåÔ'Ñ)Ô)ˆŒØ×Ò˜DœLÑ)Ô)Ð)Ð)Ð)r
   c                 ó$  •— t          t          | ¦  «                             ¦   «          | j        t          j        d d …<   t          j                             ¦   «         | j        z
  }|D ]}t          j        |= Œt          j
        | j        ¦  «         d S ©N)r   r   ÚtearDownr   r   r   r   r   r   ÚshutilÚrmtreer    )r"   ÚmodulesToDeleteÚmoduler#   s      €r   r&   z_WritesPythonModules.tearDown'   s�   ø€ ÝÕ" DÑ)Ô)×2Ò2Ñ4Ô4Ð4àÔ'�Œ���‰Ýœ+×*Ò*Ñ,Ô,¨tÔ/FÑFˆØ%ð 	$ð 	$ˆFÝ”˜FÐ#Ð#åŒ�d”lÑ#Ô#Ð#Ð#Ð#r
   c                 óD   — t           j                             |¦  «         d S r%   )r   r   Úappend)r"   r   s     r   r!   z#_WritesPythonModules.makeImportable1   s   € ÝŒ�Š˜ÑÔÐÐÐr
   c                 ó4  — |                       |¦  «        }|                     |¦  «        }t          |j        d¦  «        5 }|                     t          j        |¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   |                      |j        g¦  «        S )NÚw)r   ÚchildÚopenr   ÚwriteÚtextwrapÚdedentr   )r"   Úsourcer   Ú
moduleNameÚ	directoryr*   Úfs          r   ÚwriteSourceIntoz$_WritesPythonModules.writeSourceInto4   s¿   € Ø—M’M $Ñ'Ô'ˆ	à—’ Ñ,Ô,ˆõ �&”+˜sÑ#Ô#ð 	- qØ�GŠG•H”O FÑ+Ô+Ñ,Ô,Ð,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð �Š 	¤Ð/Ñ0Ô0Ð0s   Á (A4Á4A8Á;A8c                 ó€   — t           j                             |¦  «        \  }}|                      |||¦  «        |         S r%   )Úosr   Úsplitextr8   )r"   r4   r   r5   ÚpythonModuleNameÚ_s         r   Ú
makeModulez_WritesPythonModules.makeModule?   s;   € Ý œg×.Ò.¨zÑ:Ô:ÑÐ˜!Ø×#Ò# F¨D°*Ñ=Ô=Ð>NÔOÐOr
   c                 ó>   — d„ |                      ¦   «         D ¦   «         S )Nc                 ó   — i | ]
}|j         |“ŒS r	   )Úname)Ú.0Úattrs     r   ú
<dictcomp>z9_WritesPythonModules.attributesAsDict.<locals>.<dictcomp>D   s   € ÐOÐOÐO D�”	˜4ÐOÐOÐOr
   )ÚiterAttributes)r"   ÚhasIterAttributess     r   ÚattributesAsDictz%_WritesPythonModules.attributesAsDictC   s#   € ØOÐOÐ,=×,LÒ,LÑ,NÔ,NÐOÑOÔOÐOr
   c                 óT   — |                      ¦   «          |                      |¦  «        S r%   )ÚloadrG   )r"   r*   s     r   ÚloadModuleAsDictz%_WritesPythonModules.loadModuleAsDictF   s#   € Ø�Š‰ŒˆØ×$Ò$ VÑ,Ô,Ð,r
   c                 óV   — |                       |                      |||¦  «        ¦  «        S r%   )rJ   r>   )r"   r4   r   rA   s       r   ÚmakeModuleAsDictz%_WritesPythonModules.makeModuleAsDictJ   s&   € Ø×$Ò$ T§_¢_°V¸TÀ4Ñ%HÔ%HÑIÔIÐIr
   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r&   r!   r8   r>   rG   rJ   rL   Ú__classcell__©r#   s   @r   r   r      sÂ   ø€ € € € € ðð ð*ð *ð *ð *ð *ð $ð $ð $ð $ð $ðð ð ð	1ð 	1ð 	1ðPð Pð PðPð Pð Pð-ð -ð -ðJð Jð Jð Jð Jð Jð Jr
   r   zTwisted is not installed.c                   ó4   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zˆ xZS )ÚOriginalLocationTestsa˜  
    Tests that L{isOriginalLocation} detects when a
    L{PythonAttribute}'s FQPN refers to an object inside the module
    where it was defined.

    For example: A L{twisted.python.modules.PythonAttribute} with a
    name of 'foo.bar' that refers to a 'bar' object defined in module
    'baz' does *not* refer to bar's original location, while a
    L{PythonAttribute} with a name of 'baz.bar' does.

    c                 óp   •— t          t          | ¦  «                             ¦   «          ddlm} || _        d S )Né   )ÚisOriginalLocation)r   rT   r   Ú	_discoverrW   )r"   rW   r#   s     €r   r   zOriginalLocationTests.setUp[   s@   ø€ ÝÕ# TÑ*Ô*×0Ò0Ñ2Ô2Ð2Ø2Ð2Ð2Ð2Ð2Ð2Ø"4ˆÔÐÐr
   c                 óž   — d}|                       || j        d¦  «        }|                      |                      |d         ¦  «        ¦  «         dS )zŽ
        L{isOriginalLocation} returns False when the attribute refers to an
        object whose source module cannot be determined.
        z~        class Fake(object):
            pass
        hasEmptyModule = Fake()
        hasEmptyModule.__module__ = None
        zempty_module_attr.pyz empty_module_attr.hasEmptyModuleN)rL   r    ÚassertFalserW   )r"   r4   Ú
moduleDicts      r   Útest_failsWithNoModulez,OriginalLocationTests.test_failsWithNoModule`   sk   € ð
ˆð ×*Ò*¨6Ø+/¬<Ø+AñCô Cˆ
ð 	×Ò˜×0Ò0ØÐ9Ô:ñ<ô <ñ 	=ô 	=ð 	=ð 	=ð 	=r
   c                 óÐ  — d}d}|                       || j        d¦  «         |                      || j        d¦  «        }|                      |                      |d         ¦  «        ¦  «         |                      |                      |d         ¦  «        ¦  «         |d         }|                      |¦  «        }|d         }|                      |                      |¦  «        ¦  «         d	S )
z™
        L{isOriginalLocation} returns False when the attribute refers to
        an object outside of the module where that object was defined.
        zâ        class ImportThisClass(object):
            pass
        importThisObject = ImportThisClass()
        importThisNestingObject = ImportThisClass()
        importThisNestingObject.nestedObject = ImportThisClass()
        zž        from original import (ImportThisClass,
                              importThisObject,
                              importThisNestingObject)
        úoriginal.pyúimporting.pyzimporting.ImportThisClasszimporting.importThisObjectz!importing.importThisNestingObjectz.importing.importThisNestingObject.nestedObjectN)r>   r    rL   rZ   rW   rG   )r"   ÚoriginalSourceÚimportingSourceÚimportingDictÚnestingObjectÚnestingObjectDictÚnestedObjects          r   Útest_failsWithDifferentModulez3OriginalLocationTests.test_failsWithDifferentModules   s  € ð
ˆðˆð 	�Š˜¨¬°mÑDÔDÐDØ×-Ò-¨oØ.2¬lØ.<ñ>ô >ˆð 	×ÒØ×#Ò#ØÐ9Ô:ñ<ô <ñ	=ô 	=ð 	=ð 	×ÒØ×#Ò#ØÐ:Ô;ñ=ô =ñ	>ô 	>ð 	>ð &Ð&IÔJˆØ ×1Ò1°-Ñ@Ô@ÐØ(Ø<ô>ˆð 	×Ò˜×0Ò0°Ñ>Ô>Ñ?Ô?Ð?Ð?Ð?r
   c                 ó¸  — t          j        d¦  «        }|                      || j        d¦  «        }|                      |                      |d         ¦  «        ¦  «         |                      |                      |d         ¦  «        ¦  «         |d         }|                      |¦  «        }|d         }|                      |                      |¦  «        ¦  «         dS )z”
        L{isOriginalLocation} returns True when the attribute refers to an
        object inside the module where that object was defined.
        zé
        class ThisClassWasDefinedHere(object):
            pass
        anObject = ThisClassWasDefinedHere()
        aNestingObject = ThisClassWasDefinedHere()
        aNestingObject.nestedObject = ThisClassWasDefinedHere()
        zm.pyzm.ThisClassWasDefinedHerezm.aNestingObjectzm.aNestingObject.nestedObjectN)r2   r3   rL   r    Ú
assertTruerW   rG   )r"   ÚmSourceÚmDictrc   rd   re   s         r   Útest_succeedsWithSameModulez1OriginalLocationTests.test_succeedsWithSameModule˜   sÜ   € õ
 ”/ð #ñ ô ˆð ×%Ò% g¨t¬|¸VÑDÔDˆØ�Š˜×/Ò/ØÐ-Ô.ñ0ô 0ñ 	1ô 	1ð 	1à�Š˜×/Ò/°Ð6HÔ0IÑJÔJÑKÔKÐKàÐ0Ô1ˆØ ×1Ò1°-Ñ@Ô@ÐØ(Ð)HÔIˆà�Š˜×/Ò/°Ñ=Ô=Ñ>Ô>Ð>Ð>Ð>r
   )	rM   rN   rO   rP   r   r\   rf   rk   rQ   rR   s   @r   rT   rT   N   ss   ø€ € € € € ð
ð 
ð5ð 5ð 5ð 5ð 5ð
=ð =ð =ð&#@ð #@ð #@ðJ?ð ?ð ?ð ?ð ?ð ?ð ?r
   rT   c                   ó\   ‡ — e Zd ZdZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zˆ xZS )ÚFindMachinesViaWrapperTestszÍ
    L{findMachinesViaWrapper} recursively yields FQPN,
    L{MethodicalMachine} pairs in and under a given
    L{twisted.python.modules.PythonModule} or
    L{twisted.python.modules.PythonAttribute}.
    aÊ  
    from automat import MethodicalMachine


    class PythonClass(object):
        _classMachine = MethodicalMachine()

        class NestedClass(object):
            _nestedClassMachine = MethodicalMachine()

        ignoredAttribute = "I am ignored."

        def ignoredMethod(self):
            "I am also ignored."

    rootLevelMachine = MethodicalMachine()
    ignoredPythonObject = PythonClass()
    anotherIgnoredPythonObject = "I am ignored."
    c                 óp   •— t          t          | ¦  «                             ¦   «          ddlm} || _        d S )NrV   )ÚfindMachinesViaWrapper)r   rm   r   rX   ro   )r"   ro   r#   s     €r   r   z!FindMachinesViaWrapperTests.setUpÌ   s@   ø€ ÝÕ)¨4Ñ0Ô0×6Ò6Ñ8Ô8Ð8Ø6Ð6Ð6Ð6Ð6Ð6Ø&<ˆÔ#Ð#Ð#r
   c                 óæ   — d}|                       || j        d¦  «        }|d         }|                      d|                     ¦   «         ft	          |                      |¦  «        ¦  «        ¦  «         dS )zÄ
        When given a L{twisted.python.modules.PythonAttribute} that refers
        directly to a L{MethodicalMachine}, L{findMachinesViaWrapper}
        yields that machine and its FQPN.
        úa        from automat import MethodicalMachine

        rootMachine = MethodicalMachine()
        úroot.pyúroot.rootMachineN)rL   r    ÚassertInrI   Úlistro   )r"   r4   r[   ÚrootMachines       r   Útest_yieldsMachinez.FindMachinesViaWrapperTests.test_yieldsMachineÑ   s�   € ðˆð ×*Ò*¨6°4´<ÀÑKÔKˆ
Ø Ð!3Ô4ˆØ�ŠÐ)¨;×+;Ò+;Ñ+=Ô+=Ð>Ý˜4×6Ò6°{ÑCÔCÑDÔDñ	Fô 	Fð 	Fð 	Fð 	Fr
   c                 óð   — d}|                       || j        d¦  «        }|d         }|                      d|                     ¦   «         j        ft          |                      |¦  «        ¦  «        ¦  «         dS )zí
        When given a L{twisted.python.modules.PythonAttribute} that refers
        to a class that contains a L{MethodicalMachine} as a class
        variable, L{findMachinesViaWrapper} yields that machine and
        its FQPN.
        úŠ        from automat import MethodicalMachine

        class PythonClass(object):
            _classMachine = MethodicalMachine()
        ú	clsmod.pyúclsmod.PythonClassú clsmod.PythonClass._classMachineN)rL   r    rt   rI   Ú_classMachineru   ro   ©r"   r4   r[   ÚPythonClasss       r   Útest_yieldsMachineInClassz5FindMachinesViaWrapperTests.test_yieldsMachineInClassâ   s‡   € ðˆð ×*Ò*¨6°4´<ÀÑMÔMˆ
Ø Ð!5Ô6ˆØ�ŠÐ9Ø"×'Ò'Ñ)Ô)Ô7ð9å˜4×6Ò6°{ÑCÔCÑDÔDñ	Fô 	Fð 	Fð 	Fð 	Fr
   c                 óú   — d}|                       || j        d¦  «        }|d         }|                      d|                     ¦   «         j        j        ft          |                      |¦  «        ¦  «        ¦  «         dS )zô
        When given a L{twisted.python.modules.PythonAttribute} that refers
        to a nested class that contains a L{MethodicalMachine} as a
        class variable, L{findMachinesViaWrapper} yields that machine
        and its FQPN.
        úµ        from automat import MethodicalMachine

        class PythonClass(object):
            class NestedClass(object):
                _classMachine = MethodicalMachine()
        únestedcls.pyúnestedcls.PythonClassú/nestedcls.PythonClass.NestedClass._classMachineN)rL   r    rt   rI   ÚNestedClassr}   ru   ro   r~   s       r   Útest_yieldsMachineInNestedClassz;FindMachinesViaWrapperTests.test_yieldsMachineInNestedClassõ   s“   € ðˆð ×*Ò*¨6Ø+/¬<Ø+9ñ;ô ;ˆ
ð !Ð!8Ô9ˆØ�ŠÐHØ"×'Ò'Ñ)Ô)Ô5ÔCðEå˜4×6Ò6°{ÑCÔCÑDÔDñ	Fô 	Fð 	Fð 	Fð 	Fr
   c                 ó  — d}|                       || j        d¦  «        }|                      |¦  «        d                              ¦   «         }|                      d|ft          |                      |¦  «        ¦  «        ¦  «         dS )zÏ
        When given a L{twisted.python.modules.PythonModule} that refers to
        a module that contains a L{MethodicalMachine},
        L{findMachinesViaWrapper} yields that machine and its FQPN.
        rq   rr   rs   N)r>   r    rJ   rI   rt   ru   ro   )r"   r4   r*   rv   s       r   Útest_yieldsMachineInModulez6FindMachinesViaWrapperTests.test_yieldsMachineInModule  s�   € ðˆð
 —’ ¨¬°yÑAÔAˆØ×+Ò+¨FÑ3Ô3Ð4FÔG×LÒLÑNÔNˆØ�ŠÐ)¨;Ð7Ý˜4×6Ò6°vÑ>Ô>Ñ?Ô?ñ	Aô 	Að 	Að 	Að 	Ar
   c                 ó  — d}|                       || j        d¦  «        }|                      |¦  «        d                              ¦   «         }|                      d|j        ft          |                      |¦  «        ¦  «        ¦  «         dS )zê
        When given a L{twisted.python.modules.PythonModule} that refers to
        the original module of a class containing a
        L{MethodicalMachine}, L{findMachinesViaWrapper} yields that
        machine and its FQPN.
        ry   rz   r{   r|   N)r>   r    rJ   rI   rt   r}   ru   ro   ©r"   r4   r*   r   s       r   Ú!test_yieldsMachineInClassInModulez=FindMachinesViaWrapperTests.test_yieldsMachineInClassInModule  sš   € ðˆð —’ ¨¬°{ÑCÔCˆØ×+Ò+Øñô Ø(ô*ß*.ª$©&¬&ð 	à�ŠÐ9Ø"Ô0ð2å˜4×6Ò6°vÑ>Ô>Ñ?Ô?ñ	Aô 	Að 	Að 	Að 	Ar
   c                 ó   — d}|                       || j        d¦  «        }|                      |¦  «        d                              ¦   «         }|                      d|j        j        ft          |                      |¦  «        ¦  «        ¦  «         dS )zñ
        When given a L{twisted.python.modules.PythonModule} that refers to
        the original module of a nested class containing a
        L{MethodicalMachine}, L{findMachinesViaWrapper} yields that
        machine and its FQPN.
        r‚   rƒ   r„   r…   N)	r>   r    rJ   rI   rt   r†   r}   ru   ro   r‹   s       r   Ú'test_yieldsMachineInNestedClassInModulezCFindMachinesViaWrapperTests.test_yieldsMachineInNestedClassInModule0  sŸ   € ðˆð —’ ¨¬°~ÑFÔFˆØ×+Ò+Øñô Ø+ô-ß-1ªT©V¬Vð 	ð 	�ŠÐHØ"Ô.Ô<ð>å˜4×6Ò6°vÑ>Ô>Ñ?Ô?ñ	Aô 	Að 	Að 	Að 	Ar
   c                 óè   — d}d}|                       || j        d¦  «         |                       || j        d¦  «        }|                      t          |                      |¦  «        ¦  «        ¦  «         dS )aM  
        When given a L{twisted.python.modules.PythonAttribute} that refers
        to a class imported from another module, any
        L{MethodicalMachine}s on that class are ignored.

        This behavior ensures that a machine is only discovered on a
        class when visiting the module where that class was defined.
        z‹
        from automat import MethodicalMachine

        class PythonClass(object):
            _classMachine = MethodicalMachine()
        z2
        from original import PythonClass
        r^   r_   N©r>   r    rZ   ru   ro   )r"   r`   ra   ÚimportingModules       r   Útest_ignoresImportedClassz5FindMachinesViaWrapperTests.test_ignoresImportedClassF  sy   € ðˆðˆð 	�Š˜¨¬°mÑDÔDÐDØŸ/š/¨/Ø*.¬,Ø*8ñ:ô :ˆð 	×Ò�˜d×9Ò9¸/ÑJÔJÑKÔKÑLÔLÐLÐLÐLr
   c                 óê  — |                       | j        g¦  «        }|                      | j        ¦  «                             d¦  «        }|                     ¦   «          |                     d¦  «                             ¦   «          d}|                      ||j        d¦  «         |d         }t          |  	                    |¦  «        t          j        d¦  «        ¬¦  «        }|                      |d         ¦  «        }|d                              ¦   «         }|d	                              ¦   «         }t          d|fd
|j        fgt          j        d¦  «        ¬¦  «        }	|                      |	|¦  «         dS )z`
        L{findMachinesViaWrapper} descends into packages to discover
        machines.
        Útest_packageú__init__.pyz¸
        from automat import MethodicalMachine


        class PythonClass(object):
            _classMachine = MethodicalMachine()


        rootMachine = MethodicalMachine()
        ú	module.pyr   ©Úkeyr*   ztest_package.module.rootMachineztest_package.module.PythonClassz-test_package.module.PythonClass._classMachineN)r   r    r   r/   ÚmakedirsÚtouchr>   r   Úsortedro   ÚoperatorÚ
itemgetterrJ   rI   r}   ÚassertEqual)
r"   Ú
pythonPathÚpackager4   r”   Úmachinesr[   rv   r   ÚexpectedMachiness
             r   Útest_descendsIntoPackagesz5FindMachinesViaWrapperTests.test_descendsIntoPackagesa  st  € ð
 —_’_ d¤l ^Ñ4Ô4ˆ
Ø—-’- ¤Ñ-Ô-×3Ò3°NÑCÔCˆØ×ÒÑÔÐØ�Š�mÑ$Ô$×*Ò*Ñ,Ô,Ð,ð	ˆð 	�Š˜ ¤¨kÑ:Ô:Ð:à! .Ô1ˆÝ˜$×5Ò5°lÑCÔCÝ&Ô1°!Ñ4Ô4ð6ñ 6ô 6ˆð ×*Ò*¨<¸Ô+AÑBÔBˆ
Ø Ð!BÔC×HÒHÑJÔJˆØ Ð!BÔC×HÒHÑJÔJˆå!Ø/Øðà=ØÔ'ð)ð*õ 08Ô/BÀ1Ñ/EÔ/Eð	Gñ Gô GÐð 	×ÒÐ)¨8Ñ4Ô4Ð4Ð4Ð4r
   c                 ó¬   — d}|                       || j        d¦  «        }|                      t          |                      |¦  «        ¦  «        ¦  «         dS )z�
        L{findMachinesViaWrapper} ignores infinite loops.

        Note this test can't fail - it can only run forever!
        zh
        class InfiniteLoop(object):
            pass

        InfiniteLoop.loop = InfiniteLoop
        zloop.pyNr�   )r"   r4   r*   s      r   Útest_infiniteLoopz-FindMachinesViaWrapperTests.test_infiniteLoop‡  sR   € ðˆð —’ ¨¬°yÑAÔAˆØ×Ò�˜d×9Ò9¸&ÑAÔAÑBÔBÑCÔCÐCÐCÐCr
   )rM   rN   rO   rP   ÚTEST_MODULE_SOURCEr   rw   r€   r‡   r‰   rŒ   rŽ   r’   r£   r¥   rQ   rR   s   @r   rm   rm   °   sî   ø€ € € € € ðð ðÐð(=ð =ð =ð =ð =ð
Fð Fð Fð"Fð Fð Fð&Fð Fð Fð.Að Að Að Að Að Að(Að Að Að,Mð Mð Mð6$5ð $5ð $5ðLDð Dð Dð Dð Dð Dð Dr
   rm   c                   ó`   — 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„ Zd„ ZdS )ÚWrapFQPNTestszŸ
    Tests that ensure L{wrapFQPN} loads the
    L{twisted.python.modules.PythonModule} or
    L{twisted.python.modules.PythonAttribute} for a given FQPN.
    c                 ó‚   — ddl m}m} ddlm}m}m}m} || _        || _        || _        || _        || _        || _        d S )Nr   )ÚPythonModuleÚPythonAttributerV   )ÚwrapFQPNÚInvalidFQPNÚNoModuleÚNoObject)r   rª   r«   rX   r¬   r­   r®   r¯   )r"   rª   r«   r¬   r­   r®   r¯   s          r   r   zWrapFQPNTests.setUpŸ  so   € ØHÐHÐHÐHÐHÐHÐHÐHØIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIà(ˆÔØ.ˆÔØ ˆŒØ&ˆÔØ ˆŒØ ˆŒˆˆr
   c                 óÌ   — |                       || j        ¦  «         |                      |j        |j        ¦  «         |                      |                     ¦   «         |¦  «         dS )zt
        Assert that a L{twisted.python.modules.PythonModule} refers to a
        particular Python module.
        N)ÚassertIsInstancerª   rž   rA   rM   ÚassertIsrI   )r"   ÚmoduleWrapperr*   s      r   ÚassertModuleWrapperRefersToz)WrapFQPNTests.assertModuleWrapperRefersToª  s^   € ð
 	×Ò˜m¨TÔ->Ñ?Ô?Ð?Ø×Ò˜Ô+¨V¬_Ñ=Ô=Ð=Ø�Š�m×(Ò(Ñ*Ô*¨FÑ3Ô3Ð3Ð3Ð3r
   c                 óÂ   — |                       || j        ¦  «         |                      |j        |¦  «         |                      |                     ¦   «         |¦  «         dS )zw
        Assert that a L{twisted.python.modules.PythonAttribute} refers to a
        particular Python object.
        N)r±   r«   rž   rA   r²   rI   )r"   ÚattributeWrapperÚfqpnÚobjs       r   ÚassertAttributeWrapperRefersToz,WrapFQPNTests.assertAttributeWrapperRefersTo³  s_   € ð
 	×ÒÐ.°Ô0DÑEÔEÐEØ×ÒÐ)Ô.°Ñ5Ô5Ð5Ø�ŠÐ&×+Ò+Ñ-Ô-¨sÑ3Ô3Ð3Ð3Ð3r
   c                 ó–   — |                       | j        ¦  «        5  |                      d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zO
        L{wrapFQPN} raises L{InvalidFQPN} when given an empty string.
        Ú N©ÚassertRaisesr­   r¬   ©r"   s    r   Útest_failsWithEmptyFQPNz%WrapFQPNTests.test_failsWithEmptyFQPN¼  s‘   € ð ×Ò˜tÔ/Ñ0Ô0ð 	ð 	Ø�MŠM˜"ÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ó   ›>¾AÁAc                 óž   — dD ]I}|                       | j        ¦  «        5  |                      |¦  «         ddd¦  «         n# 1 swxY w Y   ŒJdS )zk"
        L{wrapFQPN} raises L{InvalidFQPN} when given a badly-dotted
        FQPN.  (e.g., x..y).
        )z.failszfails.zthis..failsNr¼   ©r"   Úbads     r   Útest_failsWithBadDottingz&WrapFQPNTests.test_failsWithBadDottingÃ  sœ   € ð
 7ð 	#ð 	#ˆCØ×"Ò" 4Ô#3Ñ4Ô4ð #ð #Ø—’˜cÑ"Ô"Ð"ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #øð	#ð 	#ó   ŸAÁA	ÁA	c                 ó¾   — ddl }|                      d¦  «        }|                      || j        ¦  «         |                      |                     ¦   «         |¦  «         dS )z�
        L{wrapFQPN} returns a L{twisted.python.modules.PythonModule}
        referring to the single module a dotless FQPN describes.
        r   Nr:   )r:   r¬   r±   rª   r²   rI   )r"   r:   r³   s      r   Útest_singleModulezWrapFQPNTests.test_singleModuleÌ  s]   € ð
 	ˆ	ˆ	ˆ	àŸš dÑ+Ô+ˆà×Ò˜m¨TÔ->Ñ?Ô?Ð?Ø�Š�m×(Ò(Ñ*Ô*¨BÑ/Ô/Ð/Ð/Ð/r
   c                 ó–   — |                       | j        ¦  «        5  |                      d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z~
        L{wrapFQPN} raises L{NoModule} when given a dotless FQPN that does
        not refer to a module or package.
        zthis is not an acceptable name!N)r½   r®   r¬   r¾   s    r   Ú*test_failsWithMissingSingleModuleOrPackagez8WrapFQPNTests.test_failsWithMissingSingleModuleOrPackageØ  s‘   € ð
 ×Ò˜tœ}Ñ-Ô-ð 	=ð 	=Ø�MŠMÐ;Ñ<Ô<Ð<ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð 	=ð 	=rÀ   c                 ó`   — ddl }|                      |                      d¦  «        |¦  «         dS )z�
        L{wrapFQPN} returns a L{twisted.python.modules.PythonModule}
        referring to the single package a dotless FQPN describes.
        r   NÚxml)rË   r´   r¬   ©r"   rË   s     r   Útest_singlePackagez WrapFQPNTests.test_singlePackageà  s5   € ð
 	ˆ
ˆ
ˆ
Ø×(Ò(¨¯ª°uÑ)=Ô)=¸sÑCÔCÐCÐCÐCr
   c                 ój   — ddl }|                      |                      d¦  «        |j        ¦  «         dS )z‘
        L{wrapFQPN} returns a L{twisted.python.modules.PythonModule}
        referring to the deepest package described by dotted FQPN.
        r   Nz	xml.etree)Ú	xml.etreer´   r¬   ÚetreerÌ   s     r   Útest_multiplePackagesz#WrapFQPNTests.test_multiplePackagesè  s:   € ð
 	ÐÐÐØ×(Ò(¨¯ª°{Ñ)CÔ)CÀSÄYÑOÔOÐOÐOÐOr
   c                 ót   — ddl }|                      |                      d¦  «        |j        j        ¦  «         dS )z�
        L{wrapFQPN} returns a L{twisted.python.modules.PythonModule}
        referring to the deepest module described by dotted FQPN.
        r   Nzxml.etree.ElementTree)Úxml.etree.ElementTreer´   r¬   rÐ   ÚElementTreerÌ   s     r   Ú test_multiplePackagesFinalModulez.WrapFQPNTests.test_multiplePackagesFinalModuleð  sN   € ð
 	%Ð$Ð$Ð$Ø×(Ò(Ø�MŠMÐ1Ñ2Ô2°C´IÔ4Iñ	Kô 	Kð 	Kð 	Kð 	Kr
   c                 ól   — ddl }|                      |                      d¦  «        d|j        ¦  «         dS )zŸ
        L{wrapFQPN} returns a L{twisted.python.modules.PythonAttribute}
        referring to the deepest object an FQPN names, traversing one module.
        r   Nzos.path)r:   r¹   r¬   r   )r"   r:   s     r   Útest_singleModuleObjectz%WrapFQPNTests.test_singleModuleObjectù  sD   € ð
 	ˆ	ˆ	ˆ	Ø×+Ò+Ø�MŠM˜)Ñ$Ô$ i°´ñ	:ô 	:ð 	:ð 	:ð 	:r
   c                 ó¸   — ddl }ddl}d|j        j        j        fd|j        j        ffD ]/\  }}|                      |                      |¦  «        ||¦  «         Œ0dS )z¼
        L{wrapFQPN} returns a L{twisted.python.modules.PythonAttribute}
        referring to the deepest object described by an FQPN,
        descending through several packages.
        r   Nz xml.etree.ElementTree.fromstringz!automat.MethodicalMachine.__doc__)	rÓ   ÚautomatrÐ   rÔ   Ú
fromstringÚMethodicalMachinerP   r¹   r¬   )r"   rË   rÙ   r·   r¸   s        r   Útest_multiplePackagesObjectz)WrapFQPNTests.test_multiplePackagesObject  sŽ   € ð 	%Ð$Ð$Ð$Øˆˆˆà=Øœ9Ô0Ô;ð=à>Ø"Ô4Ô<ð>ð?ð 	0ð 	0‰IˆD�#ð ×/Ò/Ø—’˜dÑ#Ô# T¨3ñ0ô 0ð 0ð 0ð		0ð 	0r
   c                 óž   — dD ]I}|                       | j        ¦  «        5  |                      |¦  «         ddd¦  «         n# 1 swxY w Y   ŒJdS )z‚
        L{wrapFQPN} raises L{NoObject} when given an FQPN that contains a
        missing attribute, module, or package.
        )zxml.etree.nope!z*xml.etree.nope!.but.the.rest.is.believableN)r½   r¯   r¬   rÂ   s     r   Ú4test_failsWithMultiplePackagesMissingModuleOrPackagezBWrapFQPNTests.test_failsWithMultiplePackagesMissingModuleOrPackage  sœ   € ð
Bð 	#ð 	#ˆCà×"Ò" 4¤=Ñ1Ô1ð #ð #Ø—’˜cÑ"Ô"Ð"ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #øð	#ð 	#rÅ   N)rM   rN   rO   rP   r   r´   r¹   r¿   rÄ   rÇ   rÉ   rÍ   rÑ   rÕ   r×   rÜ   rÞ   r	   r
   r   r¨   r¨   —  sê   € € € € € ðð ð	!ð 	!ð 	!ð4ð 4ð 4ð4ð 4ð 4ðð ð ð#ð #ð #ð
0ð 
0ð 
0ð=ð =ð =ðDð Dð DðPð Pð PðKð Kð Kð:ð :ð :ð0ð 0ð 0ð #ð #ð #ð #ð #r
   r¨   c                   ó,   ‡ — e Zd ZdZdZˆ fd„Zd„ Zˆ xZS )ÚFindMachinesIntegrationTestszs
    Integration tests to check that L{findMachines} yields all
    machines discoverable at or below an FQPN.
    zÚ
    from automat import MethodicalMachine

    class PythonClass(object):
        _machine = MethodicalMachine()
        ignored = "i am ignored"

    rootLevel = MethodicalMachine()

    ignored = "i am ignored"
    c                 ó  •— t          t          | ¦  «                             ¦   «          ddlm} || _        |                      | j        ¦  «                             d¦  «        }|                     ¦   «          |  	                    | j        g¦  «        | _
        |                      | j        |j        d¦  «         |                     d¦  «        }|                     ¦   «          |                     d¦  «                             ¦   «          |                      | j        |j        d¦  «         |                      | j
        d         ¦  «        | _        |                      | j
        d         d         d         ¦  «        | _        d S )NrV   )ÚfindMachinesr”   r•   Ú
subpackager–   r*   )r   rà   r   rX   râ   r   r    r/   r™   r   rŸ   r8   ÚSOURCEr   rš   r>   rJ   ÚpackageDictr[   )r"   râ   Ú
packageDirÚsubPackageDirr#   s       €r   r   z"FindMachinesIntegrationTests.setUp0  sS  ø€ ÝÕ*¨DÑ1Ô1×7Ò7Ñ9Ô9Ð9Ø,Ð,Ð,Ð,Ð,Ð,à(ˆÔà—]’] 4¤<Ñ0Ô0×6Ò6°~ÑFÔFˆ
Ø×ÒÑÔÐØŸ/š/¨4¬<¨.Ñ9Ô9ˆŒØ×Ò˜Tœ[¨*¬/¸=ÑIÔIÐIà"×(Ò(¨Ñ6Ô6ˆØ×ÒÑ Ô Ð Ø×Ò˜MÑ*Ô*×0Ò0Ñ2Ô2Ð2à�Š˜œ ]Ô%7¸ÑEÔEÐEà×0Ò0ØŒO˜NÔ+ñ-ô -ˆÔà×/Ò/ØŒO˜NÔ+¨LÔ9¸(ÔCñEô EˆŒˆˆr
   c                 ó  — t          |                      d¦  «        t          j        d¦  «        ¬¦  «        }| j        d                              ¦   «         }| j        d                              ¦   «         }| j        d         }|                     ¦   «         }| j        d         }|                     ¦   «         }t          d|fd|j        fd|fd	|j        fgt          j        d¦  «        ¬¦  «        }|                      ||¦  «         d
S )z‡
        Given a top-level package FQPN, L{findMachines} discovers all
        L{MethodicalMachine} instances in and below it.
        r”   r   r—   ztest_package.rootLevelztest_package.PythonClassz(test_package.subpackage.module.rootLevelz*test_package.subpackage.module.PythonClassz!test_package.PythonClass._machinez3test_package.subpackage.module.PythonClass._machineN)	r›   râ   rœ   r�   rå   rI   r[   Ú_machinerž   )	r"   r¡   ÚtpRootLevelÚtpPythonClassÚmRLAttrÚ
mRootLevelÚmPCAttrÚmPythonClassr¢   s	            r   Útest_discoverAllz-FindMachinesIntegrationTests.test_discoverAllF  s  € õ
 ˜$×+Ò+¨NÑ;Ô;Ý&Ô1°!Ñ4Ô4ð6ñ 6ô 6ˆð Ô&Ð'?Ô@×EÒEÑGÔGˆØÔ(Ð)CÔD×IÒIÑKÔKˆà”/Ð"LÔMˆØ—\’\‘^”^ˆ
Ø”/Ð"NÔOˆØ—|’|‘~”~ˆå!Ø&¨Ð4Ø1°=Ô3IÐJØ8¸*ÐEØCØÔ#ð%ð&õ
 Ô# AÑ&Ô&ð(ñ (ô (Ðð 	×ÒÐ)¨8Ñ4Ô4Ð4Ð4Ð4r
   )rM   rN   rO   rP   rä   r   rð   rQ   rR   s   @r   rà   rà     s]   ø€ € € € € ðð ð

€FðEð Eð Eð Eð Eð,5ð 5ð 5ð 5ð 5ð 5ð 5r
   rà   )rœ   r:   r'   r   r2   r   Úunittestr   r   r   r   rT   rm   r¨   rà   r	   r
   r   ú<module>rò      s  ðØ €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø €€€Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %ðð ð ð9Jð 9Jð 9Jð 9Jð 9J˜8ñ 9Jô 9Jð 9Jðx €ÐÐÑ Ô Ð Ð"=Ñ>Ô>ð^?ð ^?ð ^?ð ^?ð ^?Ð0ñ ^?ô ^?ñ ?Ô>ð^?ðB €ÐÐÑ Ô Ð Ð"=Ñ>Ô>ðcDð cDð cDð cDð cDÐ"6ñ cDô cDñ ?Ô>ðcDðL €ÐÐÑ Ô Ð Ð"=Ñ>Ô>ðB#ð B#ð B#ð B#ð B#�Hñ B#ô B#ñ ?Ô>ðB#ðJ €ÐÐÑ Ô Ð Ð"=Ñ>Ô>ð@5ð @5ð @5ð @5ð @5Ð#7ñ @5ô @5ñ ?Ô>ð@5ð @5ð @5r
   