ó
    Î›‘h3V  ã                   óh  • S SK r S SKrS SKrS SKrS SKrS SKrS SKJrJr  S r	 " S S\5      r
\" \	" 5       (       + S5       " S S\
5      5       r\" \	" 5       (       + S5       " S	 S
\
5      5       r\" \	" 5       (       + S5       " S S\5      5       r\" \	" 5       (       + S5       " S S\
5      5       rg)é    N)ÚskipIfÚTestCasec                  ó<   •  [        S5        g! [         a     gf = f)NÚtwistedTF)Ú
__import__ÚImportError© ó    Ú_C:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\automat/_test/test_discover.pyÚisTwistedInstalledr   
   s(   € ðÜ�9Ôð øô ó Ùðús   ‚ Ž
šc                   ó\   ^ • \ rS rSrSrU 4S jrU 4S jrS rS rS r	S r
S	 rS
 rSrU =r$ )Ú_WritesPythonModulesé   z?
A helper that enables generating Python module test fixtures.
c                 ó\  >• [         [        U ]  5         SSKJnJn  SSKJn  Xl        X l        X0l        [        [        R                  R                  5       5      U l        [        R                  S S  U l        [        R                   " 5       U l        U R%                  U R"                  5        g )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   Ú_WritesPythonModules.setUp   sr   ø€ ÜÔ" DÑ/Ô1ç@Ý4à"ŒØ$ŒØ Œä"%¤c§k¡k×&6Ñ&6Ó&8Ó"9ˆÔÜŸH™H¡Q˜KˆÔä×'Ò'Ó)ˆŒØ×Ñ˜DŸL™LÕ)r
   c                 ó.  >• [         [        U ]  5         U R                  [        R
                  S S & [        R                  R                  5       U R                  -
  nU H  n[        R                  U	 M     [        R                  " U R                  5        g ©N)r   r   ÚtearDownr   r   r   r   r   r   ÚshutilÚrmtreer!   )r#   ÚmodulesToDeleteÚmoduler$   s      €r   r(   Ú_WritesPythonModules.tearDown(   si   ø€ ÜÔ" DÑ2Ô4à×'Ñ'Œ�‰‘ˆÜŸ+™+×*Ñ*Ó,¨t×/FÑ/FÑFˆÛ%ˆFÜ—‘˜FÒ#ñ &ô 	�Š�d—l‘lÕ#r
   c                 óB   • [         R                  R                  U5        g r'   )r   r   Úappend)r#   r   s     r   r"   Ú#_WritesPythonModules.makeImportable2   s   € Ü�‰�‰˜Õr
   c                 ó(  • U R                  U5      nUR                  U5      n[        UR                  S5       nUR	                  [
        R                  " U5      5        S S S 5        U R                  UR                  /5      $ ! , (       d  f       N*= f)NÚw)r   ÚchildÚopenr   ÚwriteÚtextwrapÚdedentr   )r#   Úsourcer   Ú
moduleNameÚ	directoryr,   Úfs          r   ÚwriteSourceIntoÚ$_WritesPythonModules.writeSourceInto5   sk   € Ø—M‘M $Ó'ˆ	à—‘ Ó,ˆô �&—+‘+˜sÔ# qØ�G‰G”H—O’O FÓ+Ô,÷ $ð �‰ 	§¡Ð/Ó0Ð0÷ $Õ#ús   ¹&BÂ
Bc                 ón   • [         R                  R                  U5      u  pEU R                  XU5      U   $ r'   )Úosr   Úsplitextr<   )r#   r8   r   r9   ÚpythonModuleNameÚ_s         r   Ú
makeModuleÚ_WritesPythonModules.makeModule@   s3   € Ü Ÿg™g×.Ñ.¨zÓ:ÑÐØ×#Ñ# F°*Ó=Ð>NÑOÐOr
   c                 ób   • UR                  5        Vs0 s H  o"R                  U_M     sn$ s  snf r'   )ÚiterAttributesÚname)r#   ÚhasIterAttributesÚattrs      r   ÚattributesAsDictÚ%_WritesPythonModules.attributesAsDictD   s+   € Ø,=×,LÑ,LÔ,NÓOÒ,N D—	‘	˜4’Ñ,NÑOÐOùÒOs   “,c                 óD   • UR                  5         U R                  U5      $ r'   )ÚloadrJ   )r#   r,   s     r   ÚloadModuleAsDictÚ%_WritesPythonModules.loadModuleAsDictG   s   € Ø�‰ŒØ×$Ñ$ VÓ,Ð,r
   c                 óD   • U R                  U R                  XU5      5      $ r'   )rN   rC   )r#   r8   r   rG   s       r   ÚmakeModuleAsDictÚ%_WritesPythonModules.makeModuleAsDictK   s   € Ø×$Ñ$ T§_¡_°VÀ4Ó%HÓIÐIr
   )r   r   r   r   r!   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r(   r"   r<   rC   rJ   rN   rQ   Ú__static_attributes__Ú__classcell__©r$   s   @r   r   r      s9   ø† ñõ*õ $òò	1òPòPò-÷Jð Jr
   r   zTwisted is not installed.c                   ó>   ^ • \ rS rSrSrU 4S jrS rS rS rSr	U =r
$ )ÚOriginalLocationTestséO   ax  
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                 óB   >• [         [        U ]  5         SSKJn  Xl        g )Né   ©ÚisOriginalLocation)r   r\   r   Ú	_discoverra   )r#   ra   r$   s     €r   r   ÚOriginalLocationTests.setUp]   s   ø€ ÜÔ# TÑ0Ô2Ý2à"4Õr
   c                 ó†   • SnU R                  XR                  S5      nU R                  U R                  US   5      5        g)zv
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)rQ   r!   ÚassertFalsera   )r#   r8   Ú
moduleDicts      r   Útest_failsWithNoModuleÚ,OriginalLocationTests.test_failsWithNoModulec   sD   € ð
ˆð ×*Ñ*¨6·<±<ÐAWÓXˆ
à×ÑØ×#Ñ# JÐ/QÑ$RÓSõ	
r
   c                 ó~  • SnSnU R                  XR                  S5        U R                  X R                  S5      nU R                  U R	                  US   5      5        U R                  U R	                  US   5      5        US   nU R                  U5      nUS   nU R                  U R	                  U5      5        g	)
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)rC   r!   rQ   re   ra   rJ   )r#   ÚoriginalSourceÚimportingSourceÚimportingDictÚnestingObjectÚnestingObjectDictÚnestedObjects          r   Útest_failsWithDifferentModuleÚ3OriginalLocationTests.test_failsWithDifferentModuleu   sË   € ð
ˆðˆð 	�‰˜¯©°mÔDØ×-Ñ-ØŸ\™\¨>ó
ˆð 	×ÑØ×#Ñ# MÐ2MÑ$NÓOô	
ð 	×ÑØ×#Ñ# MÐ2NÑ$OÓPô	
ð &Ð&IÑJˆØ ×1Ñ1°-Ó@ÐØ(Ø<ñ
ˆð 	×Ñ˜×0Ñ0°Ó>Õ?r
   c                 ój  • [         R                  " S5      nU R                  XR                  S5      nU R	                  U R                  US   5      5        U R	                  U R                  US   5      5        US   nU R                  U5      nUS   nU R	                  U R                  U5      5        g)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)r6   r7   rQ   r!   Ú
assertTruera   rJ   )r#   ÚmSourceÚmDictro   rp   rq   s         r   Útest_succeedsWithSameModuleÚ1OriginalLocationTests.test_succeedsWithSameModule›   s§   € ô
 —/’/ðó
ˆð ×%Ñ% g¯|©|¸VÓDˆØ�‰˜×/Ñ/°Ð6QÑ0RÓSÔTØ�‰˜×/Ñ/°Ð6HÑ0IÓJÔKàÐ0Ñ1ˆØ ×1Ñ1°-Ó@ÐØ(Ð)HÑIˆà�‰˜×/Ñ/°Ó=Õ>r
   r`   )rS   rT   rU   rV   rW   r   rg   rr   rx   rX   rY   rZ   s   @r   r\   r\   O   s#   ø† ñ
õ5ò
ò$$@÷L?ð ?r
   r\   c                   ól   ^ • \ rS rSrSrU 4S jrS rSS jrS rS r	S r
S	 rS
 rS rS rS rSrU =r$ )ÚFindMachinesViaWrapperTestsé´   z¹
L{findMachinesViaWrapper} recursively yields FQPN,
L{MethodicalMachine} pairs in and under a given
L{twisted.python.modules.PythonModule} or
L{twisted.python.modules.PythonAttribute}.
c                 óB   >• [         [        U ]  5         SSKJn  Xl        g )Nr_   ©ÚfindMachinesViaWrapper)r   r{   r   rb   r   )r#   r   r$   s     €r   r   Ú!FindMachinesViaWrapperTests.setUp½   s   ø€ ÜÔ)¨4Ñ6Ô8Ý6à&<Õ#r
   c                 ó¾   • SnU R                  XR                  S5      nUS   nU R                  SUR                  5       4[	        U R                  U5      5      5        g)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©rQ   r!   ÚassertInrM   Úlistr   ©r#   r8   rf   ÚrootMachines       r   Útest_yieldsMachineÚ.FindMachinesViaWrapperTests.test_yieldsMachineÃ   s\   € ðˆð ×*Ñ*¨6·<±<ÀÓKˆ
Ø Ð!3Ñ4ˆØ�‰Ø ×!1Ñ!1Ó!3Ð4Ü�×,Ñ,¨[Ó9Ó:õ	
r
   c                 ó¾   • SnU R                  XR                  S5      nUS   nU R                  SUR                  5       4[	        U R                  U5      5      5        g)zž
When given a L{twisted.python.modules.PythonAttribute} that refers
directly to a L{TypeMachine}, L{findMachinesViaWrapper} yields that
machine and its FQPN.
ae          from automat import TypeMachineBuilder
        from typing import Protocol, Callable
        class P(Protocol):
            def method(self) -> None: ...
        class C:...
        def buildBuilder() -> Callable[[C], P]:
            builder = TypeMachineBuilder(P, C)
            return builder.build()
        rootMachine = buildBuilder()
        rƒ   r„   Nr…   rˆ   s       r   Útest_yieldsTypeMachineÚ2FindMachinesViaWrapperTests.test_yieldsTypeMachineÖ   s\   € ð
ˆð ×*Ñ*¨6·<±<ÀÓKˆ
Ø Ð!3Ñ4ˆØ�‰Ø ×!1Ñ!1Ó!3Ð4Ü�×,Ñ,¨[Ó9Ó:õ	
r
   c                 óÒ   • SnU R                  XR                  S5      nUS   nU R                  SUR                  5       R                  4[        U R                  U5      5      5        g)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)rQ   r!   r†   rM   Ú_classMachiner‡   r   ©r#   r8   rf   ÚPythonClasss       r   Útest_yieldsMachineInClassÚ5FindMachinesViaWrapperTests.test_yieldsMachineInClassï   sb   € ðˆð ×*Ñ*¨6·<±<ÀÓMˆ
Ø Ð!5Ñ6ˆØ�‰Ø/°×1AÑ1AÓ1C×1QÑ1QÐRÜ�×,Ñ,¨[Ó9Ó:õ	
r
   c                 óæ   • SnU R                  XR                  S5      nUS   nU R                  SUR                  5       R                  R
                  4[        U R                  U5      5      5        g)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)rQ   r!   r†   rM   ÚNestedClassr”   r‡   r   r•   s       r   Útest_yieldsMachineInNestedClassÚ;FindMachinesViaWrapperTests.test_yieldsMachineInNestedClass  sm   € ðˆð ×*Ñ*¨6·<±<ÀÓPˆ
à Ð!8Ñ9ˆØ�‰àAØ× Ñ Ó"×.Ñ.×<Ñ<ðô �×,Ñ,¨[Ó9Ó:õ	
r
   c                 óÜ   • SnU R                  XR                  S5      nU R                  U5      S   R                  5       nU R	                  SU4[        U R                  U5      5      5        g)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.
r‚   rƒ   r„   N)rC   r!   rN   rM   r†   r‡   r   )r#   r8   r,   r‰   s       r   Útest_yieldsMachineInModuleÚ6FindMachinesViaWrapperTests.test_yieldsMachineInModule  se   € ðˆð
 —‘ ¯©°yÓAˆØ×+Ñ+¨FÓ3Ð4FÑG×LÑLÓNˆØ�‰Ø Ð-¬t°D×4OÑ4OÐPVÓ4WÓ/Xõ	
r
   c                 óð   • SnU R                  XR                  S5      nU R                  U5      S   R                  5       nU R	                  SUR
                  4[        U R                  U5      5      5        g)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.
r�   r‘   r’   r“   N)rC   r!   rN   rM   r†   r”   r‡   r   ©r#   r8   r,   r–   s       r   Ú!test_yieldsMachineInClassInModuleÚ=FindMachinesViaWrapperTests.test_yieldsMachineInClassInModule-  sk   € ðˆð —‘ ¯©°{ÓCˆØ×+Ñ+¨FÓ3Ð4HÑI×NÑNÓPˆØ�‰Ø/°×1JÑ1JÐKÜ�×,Ñ,¨VÓ4Ó5õ	
r
   c                 ó  • SnU R                  XR                  S5      nU R                  U5      S   R                  5       nU R	                  SUR
                  R                  4[        U R                  U5      5      5        g)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)	rC   r!   rN   rM   r†   rž   r”   r‡   r   r¥   s       r   Ú'test_yieldsMachineInNestedClassInModuleÚCFindMachinesViaWrapperTests.test_yieldsMachineInNestedClassInModuleA  sv   € ðˆð —‘ ¯©°~ÓFˆØ×+Ñ+¨FÓ3Ð4KÑL×QÑQÓSˆà�‰àAØ×'Ñ'×5Ñ5ðô �×,Ñ,¨VÓ4Ó5õ	
r
   c                 óÎ   • SnSnU R                  XR                  S5        U R                  X R                  S5      nU R                  [        U R	                  U5      5      5        g)a  
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
        rj   rk   N©rC   r!   re   r‡   r   )r#   rl   rm   ÚimportingModules       r   Útest_ignoresImportedClassÚ5FindMachinesViaWrapperTests.test_ignoresImportedClassZ  sV   € ðˆðˆð 	�‰˜¯©°mÔDØŸ/™/¨/¿<¹<ÈÓXˆà×Ñœ˜d×9Ñ9¸/ÓJÓKÕLr
   c                 ó€  • U R                  U R                  /5      nU R                  U R                  5      R                  S5      nUR	                  5         UR                  S5      R                  5         SnU R                  X2R                  S5        US   n[        U R                  U5      [        R                  " S5      S9nU R                  US   5      nUS   R                  5       nUS	   R                  5       n[        SU4S
UR                  4/[        R                  " S5      S9n	U R                  X•5        g)zH
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   r3   ÚmakedirsÚtouchrC   r   Úsortedr   ÚoperatorÚ
itemgetterrN   rM   r”   ÚassertEqual)
r#   Ú
pythonPathÚpackager8   r±   Úmachinesrf   r‰   r–   ÚexpectedMachiness
             r   Útest_descendsIntoPackagesÚ5FindMachinesViaWrapperTests.test_descendsIntoPackagess  s)  € ð
 —_‘_ d§l¡l ^Ó4ˆ
Ø—-‘- §¡Ó-×3Ñ3°NÓCˆØ×ÑÔØ�‰�mÓ$×*Ñ*Ô,ð	ˆð 	�‰˜§¡¨kÔ:à! .Ñ1ˆÜØ×'Ñ'¨Ó5¼8×;NÒ;NÈqÓ;Qñ
ˆð ×*Ñ*¨<¸Ñ+AÓBˆ
Ø Ð!BÑC×HÑHÓJˆØ Ð!BÑC×HÑHÓJˆä!à2°KÐ@àCØ×-Ñ-ððô ×#Ò# AÓ&ñ	
Ðð 	×ÑÐ)Õ4r
   c                 ó’   • SnU R                  XR                  S5      nU R                  [        U R	                  U5      5      5        g)zi
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#   r8   r,   s      r   Útest_infiniteLoopÚ-FindMachinesViaWrapperTests.test_infiniteLoopŸ  s=   € ðˆð —‘ ¯©°yÓAˆØ×Ñœ˜d×9Ñ9¸&ÓAÓBÕCr
   r~   )ÚreturnN)rS   rT   rU   rV   rW   r   rŠ   r�   r—   rŸ   r¢   r¦   r©   r®   rÀ   rÃ   rX   rY   rZ   s   @r   r{   r{   ´   sH   ø† ñõ=ò
ô&
ò2
ò(
ò2
ò"
ò(
ò2Mò2*5÷XDð Dr
   r{   c                   óf   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rSrg)ÚWrapFQPNTestsi¯  z�
Tests that ensure L{wrapFQPN} loads the
L{twisted.python.modules.PythonModule} or
L{twisted.python.modules.PythonAttribute} for a given FQPN.
c                 ót   • SSK JnJn  SSKJnJnJnJn  Xl        X l        X0l        X@l        XPl        X`l        g )Nr   )ÚPythonModuleÚPythonAttributer_   )ÚwrapFQPNÚInvalidFQPNÚNoModuleÚNoObject)r   rÉ   rÊ   rb   rË   rÌ   rÍ   rÎ   )r#   rÉ   rÊ   rË   rÌ   rÍ   rÎ   s          r   r   ÚWrapFQPNTests.setUp·  s,   € ßHßIÓIà(ÔØ.ÔØ ŒØ&ÔØ ŒØ �r
   c                 óÆ   • U R                  XR                  5        U R                  UR                  UR                  5        U R                  UR                  5       U5        g)z\
Assert that a L{twisted.python.modules.PythonModule} refers to a
particular Python module.
N)ÚassertIsInstancerÉ   r»   rG   rS   ÚassertIsrM   )r#   ÚmoduleWrapperr,   s      r   ÚassertModuleWrapperRefersToÚ)WrapFQPNTests.assertModuleWrapperRefersToÂ  sI   € ð
 	×Ñ˜m×->Ñ->Ô?Ø×Ñ˜×+Ñ+¨V¯_©_Ô=Ø�‰�m×(Ñ(Ó*¨FÕ3r
   c                 ó²   • U R                  XR                  5        U R                  UR                  U5        U R	                  UR                  5       U5        g)z_
Assert that a L{twisted.python.modules.PythonAttribute} refers to a
particular Python object.
N)rÑ   rÊ   r»   rG   rÒ   rM   )r#   ÚattributeWrapperÚfqpnÚobjs       r   ÚassertAttributeWrapperRefersToÚ,WrapFQPNTests.assertAttributeWrapperRefersToË  sH   € ð
 	×ÑÐ.×0DÑ0DÔEØ×ÑÐ)×.Ñ.°Ô5Ø�‰Ð&×+Ñ+Ó-¨sÕ3r
   c                 ó�   • U R                  U R                  5         U R                  S5        SSS5        g! , (       d  f       g= f)z?
L{wrapFQPN} raises L{InvalidFQPN} when given an empty string.
Ú N©ÚassertRaisesrÌ   rË   ©r#   s    r   Útest_failsWithEmptyFQPNÚ%WrapFQPNTests.test_failsWithEmptyFQPNÔ  s0   € ð ×Ñ˜t×/Ñ/Õ0Ø�M‰M˜"Ô÷ 1×0Ö0úó	   œ7·
Ac                 ó¤   • S H8  nU R                  U R                  5         U R                  U5        SSS5        M:     g! , (       d  f       ML  = f)zS"
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_failsWithBadDottingÚ&WrapFQPNTests.test_failsWithBadDottingÛ  s=   € ó
 7ˆCØ×"Ñ" 4×#3Ñ#3Õ4Ø—‘˜cÔ"÷ 5Ñ4ò 7ß4Ö4úó   ¡A Á 
A	c                 ó¤   • SSK nU R                  S5      nU R                  X R                  5        U R	                  UR                  5       U5        g)zw
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Ò   rM   )r#   r?   rÓ   s      r   Útest_singleModuleÚWrapFQPNTests.test_singleModuleä  s@   € ó
 	àŸ™ dÓ+ˆà×Ñ˜m×->Ñ->Ô?Ø�‰�m×(Ñ(Ó*¨BÕ/r
   c                 ó�   • U R                  U R                  5         U R                  S5        SSS5        g! , (       d  f       g= f)zf
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_failsWithMissingSingleModuleOrPackageÚ8WrapFQPNTests.test_failsWithMissingSingleModuleOrPackageð  s/   € ð
 ×Ñ˜tŸ}™}Õ-Ø�M‰MÐ;Ô<÷ .×-Ö-úrã   c                 óN   • SSK nU R                  U R                  S5      U5        g)zx
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_singlePackageÚ WrapFQPNTests.test_singlePackageø  s    € ó
 	à×(Ñ(¨¯©°uÓ)=¸sÕCr
   c                 ób   • SSK nU R                  U R                  S5      UR                  5        g)zy
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_multiplePackagesÚ#WrapFQPNTests.test_multiplePackages  s$   € ó
 	à×(Ñ(¨¯©°{Ó)CÀSÇYÁYÕOr
   c                 óv   • SSK nU R                  U R                  S5      UR                  R                  5        g)zx
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_multiplePackagesFinalModuleÚ.WrapFQPNTests.test_multiplePackagesFinalModule
  s.   € ó
 	%à×(Ñ(Ø�M‰MÐ1Ó2°C·I±I×4IÑ4Iõ	
r
   c                 ód   • SSK nU R                  U R                  S5      SUR                  5        g)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_singleModuleObjectÚ%WrapFQPNTests.test_singleModuleObject  s)   € ó
 	à×+Ñ+Ø�M‰M˜)Ó$ i°·±õ	
r
   c                 óÜ   • SSK nSSKnSUR                  R                  R                  4SUR
                  R                  44 H&  u  p4U R                  U R                  U5      X45        M(     g)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ÚMethodicalMachinerW   rÚ   rË   )r#   rñ   r  rØ   rÙ   s        r   Útest_multiplePackagesObjectÚ)WrapFQPNTests.test_multiplePackagesObject   sa   € ó 	%Ûð 0°·±×1FÑ1F×1QÑ1QÐRØ0°'×2KÑ2K×2SÑ2SÐTó
‰IˆDð ×/Ñ/°·±¸dÓ0CÀTÖOò	
r
   c                 ó¤   • S H8  nU R                  U R                  5         U R                  U5        SSS5        M:     g! , (       d  f       ML  = f)zj
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_failsWithMultiplePackagesMissingModuleOrPackageÚBWrapFQPNTests.test_failsWithMultiplePackagesMissingModuleOrPackage/  s=   € ó
 UˆCØ×"Ñ" 4§=¡=Õ1Ø—‘˜cÔ"÷ 2Ñ1ò Uß1Ö1úré   )rÌ   rÍ   rÎ   rÊ   rÉ   rË   N)rS   rT   rU   rV   rW   r   rÔ   rÚ   rá   rç   rë   rî   ró   rø   rý   r   r  r	  rX   r	   r
   r   rÇ   rÇ   ¯  sK   † ñò	!ò4ò4òò#ò
0ò=òDòPò	
ò	
òPõ#r
   rÇ   c                   ó6   ^ • \ rS rSrSrSrU 4S jrS rSrU =r	$ )ÚFindMachinesIntegrationTestsi9  zg
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                 ó¬  >• [         [        U ]  5         SSKJn  Xl        U R                  U R                  5      R                  S5      nUR                  5         U R                  U R                  /5      U l
        U R                  U R                  UR                  S5        UR                  S5      nUR                  5         UR                  S5      R                  5         U R                  U R                  UR                  S5        U R!                  U R                  S   5      U l        U R!                  U R                  S   S   S   5      U l        g )Nr_   )ÚfindMachinesr±   r²   Ú
subpackager³   r,   )r   r  r   rb   r  r   r!   r3   r¶   r   r¼   r<   ÚSOURCEr   r·   rC   rN   ÚpackageDictrf   )r#   r  Ú
packageDirÚsubPackageDirr$   s       €r   r   Ú"FindMachinesIntegrationTests.setUpL  s  ø€ ÜÔ*¨DÑ7Ô9Ý,à(Ôà—]‘] 4§<¡<Ó0×6Ñ6°~ÓFˆ
Ø×ÑÔØŸ/™/¨4¯<©<¨.Ó9ˆŒØ×Ñ˜TŸ[™[¨*¯/©/¸=ÔIà"×(Ñ(¨Ó6ˆØ×ÑÔ Ø×Ñ˜MÓ*×0Ñ0Ô2à�‰˜Ÿ™ ]×%7Ñ%7¸ÔEà×0Ñ0°·±ÀÑ1PÓQˆÔØ×/Ñ/Ø�O‰O˜NÑ+¨LÑ9¸(ÑCó
ˆ�r
   c                 óì  • [        U R                  S5      [        R                  " S5      S9nU R                  S   R                  5       nU R                  S   R                  5       nU R                  S   nUR                  5       nU R                  S   nUR                  5       n[        SU4SUR                  4SU4S	UR                  4/[        R                  " S5      S9nU R                  X�5        g
)zo
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  rM   rf   Ú_machiner»   )	r#   r¾   ÚtpRootLevelÚtpPythonClassÚmRLAttrÚ
mRootLevelÚmPCAttrÚmPythonClassr¿   s	            r   Útest_discoverAllÚ-FindMachinesIntegrationTests.test_discoverAllb  sï   € ô
 ˜$×+Ñ+¨NÓ;Ä×ATÒATÐUVÓAWÑXˆà×&Ñ&Ð'?Ñ@×EÑEÓGˆØ×(Ñ(Ð)CÑD×IÑIÓKˆà—/‘/Ð"LÑMˆØ—\‘\“^ˆ
Ø—/‘/Ð"NÑOˆØ—|‘|“~ˆä!à)¨;Ð7Ø4°m×6LÑ6LÐMØ;¸ZÐHàIØ ×)Ñ)ðð	ô ×#Ò# AÓ&ñ
Ðð 	×ÑÐ)Õ4r
   )r  rf   r  r¼   )
rS   rT   rU   rV   rW   r  r   r  rX   rY   rZ   s   @r   r  r  9  s   ø† ñð

€Fõ
÷,5ð 5r
   r  )r¹   r?   r)   r   r6   r   Úunittestr   r   r   r   r\   r{   rÇ   r  r	   r
   r   Ú<module>r      së   ðÛ Û 	Û Û 
Û Û ß %òô9J˜8ô 9Jñx ÑÓ Ô Ð"=Ó>ôa?Ð0ó a?ó ?ða?ñH ÑÓ Ô Ð"=Ó>ôwDÐ"6ó wDó ?ðwDñt ÑÓ Ô Ð"=Ó>ôF#�Hó F#ó ?ðF#ñR ÑÓ Ô Ð"=Ó>ôD5Ð#7ó D5ó ?ñD5r
   