ó
    ½Rj¢£  ã                   óú  • 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r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rS SKJr  S SKJr  S SKJr  S SKJr  S SKrS SKrS SKJr  S SKJr  S SKJrJr  S S	KJrJ r J!r!  S S
KJ"r#  S SKJ$r$  S SKJ%r&  S SKJ'r'  S SK(J)r)  S SK*J+r+  S SK,J-r-   S SK.r/ S SK1r2 " S S\Rf                  5      r4 " S S\Rf                  5      r5 " S S5      r6 " S S\Rn                  5      r8 " S S5      r9S r:S r;S q<     S/S jr=S r>S r? " S  S!\R€                  5      rA " S" S#5      rB " S$ S%5      rCS& rDS' rES( rFS) rGS0S* jrHS1S+ jrIS, rJS- rKS. rLg! \0 a    S SK/r/ NÅf = f! \0 a    Sr2 NÎf = f)2é    N)Údefaultdict)Úcontextmanager)Úimport_module)ÚStringIO)Úcall_command)Úconnections)ÚSimpleTestCaseÚTestCase)ÚNullTimeKeeperÚ
TimeKeeperÚiter_test_cases)Úsetup_databases)Úsetup_test_environment)Úteardown_databases)Úteardown_test_environment)Únew_hash)Ú
OrderedSet)ÚRemovedInDjango50Warningc                   ój   ^ • \ rS rSrU 4S jrU 4S jrU 4S jrU 4S jrU 4S jrU 4S jr	S r
S	rU =r$ )
ÚDebugSQLTextTestResulté.   c                 ó¼   >• [         R                  " S5      U l        U R                  R                  [         R                  5        S U l        [        TU ]  XU5        g )Nzdjango.db.backends)ÚloggingÚ	getLoggerÚloggerÚsetLevelÚDEBUGÚdebug_sql_streamÚsuperÚ__init__)ÚselfÚstreamÚdescriptionsÚ	verbosityÚ	__class__s       €Ú>D:\diplom_project\venv\Lib\site-packages\django/test/runner.pyr    ÚDebugSQLTextTestResult.__init__/   sC   ø€ Ü×'Ò'Ð(<Ó=ˆŒØ�‰×ÑœWŸ]™]Ô+Ø $ˆÔÜ‰Ñ˜¨yÕ9ó    c                 óÖ   >• [        5       U l        [        R                  " U R                  5      U l        U R
                  R                  U R                  5        [        TU ]!  U5        g ©N)	r   r   r   ÚStreamHandlerÚhandlerr   Ú
addHandlerr   Ú	startTest©r!   Útestr%   s     €r&   r.   Ú DebugSQLTextTestResult.startTest5   sH   ø€ Ü (£
ˆÔÜ×,Ò,¨T×-BÑ-BÓCˆŒØ�‰×Ñ˜tŸ|™|Ô,Ü‰Ñ˜$Õr(   c                 óx  >• [         TU ]  U5        U R                  R                  U R                  5        U R
                  (       at  U R                  R                  S5        U R                  R                  U R                  R                  5       5        U R                  R                  U R                  5        g g )Nr   )r   ÚstopTestr   ÚremoveHandlerr,   ÚshowAllr   Úseekr"   ÚwriteÚreadÚwritelnÚ
separator2r/   s     €r&   r3   ÚDebugSQLTextTestResult.stopTest;   s}   ø€ Ü‰Ñ˜ÔØ�‰×!Ñ! $§,¡,Ô/Ø�<�<Ø×!Ñ!×&Ñ& qÔ)Ø�K‰K×Ñ˜d×3Ñ3×8Ñ8Ó:Ô;Ø�K‰K×Ñ §¡Õ0ð r(   c                 óî   >• [         TU ]  X5        U R                  c  SnO5U R                  R                  S5        U R                  R	                  5       nU R
                  S   U4-   U R
                  S'   g )NÚ r   éÿÿÿÿ)r   ÚaddErrorr   r6   r8   Úerrors)r!   r0   ÚerrÚsqlr%   s       €r&   r?   ÚDebugSQLTextTestResult.addErrorC   se   ø€ Ü‰Ñ˜Ô#Ø× Ñ Ñ(à‰Cà×!Ñ!×&Ñ& qÔ)Ø×'Ñ'×,Ñ,Ó.ˆCØŸ+™+ b™/¨S¨FÑ2ˆ�‰�BŠr(   c                 óÊ   >• [         TU ]  X5        U R                  R                  S5        U R                  S   U R                  R                  5       4-   U R                  S'   g ©Nr   r>   )r   Ú
addFailurer   r6   Úfailuresr8   ©r!   r0   rA   r%   s      €r&   rF   Ú!DebugSQLTextTestResult.addFailureM   sR   ø€ Ü‰Ñ˜4Ô%Ø×Ñ×"Ñ" 1Ô%Ø ŸM™M¨"Ñ-°×1FÑ1F×1KÑ1KÓ1MÐ0OÑOˆ�‰�bÒr(   c                 ó  >• [         TU ]  XU5        Ubv  U R                  R                  S5        [	        US   UR
                  5      (       a  U R                  OU R                  nUS   U R                  R                  5       4-   US'   g g rE   )	r   Ú
addSubTestr   r6   Ú
issubclassÚfailureExceptionrG   r@   r8   )r!   r0   ÚsubtestrA   r@   r%   s        €r&   rK   Ú!DebugSQLTextTestResult.addSubTestR   s„   ø€ Ü‰Ñ˜4¨#Ô.Ø‰?Ø×!Ñ!×&Ñ& qÔ)ô ˜c !™f d×&;Ñ&;×<Ñ<ð —’à—[‘[ð ð
   ™ t×'<Ñ'<×'AÑ'AÓ'CÐ&EÑEˆF�2ŠJð r(   c           	      óð  • U Hð  u  p4nU R                   R                  U R                  5        U R                   R                  U< SU R                  U5      < 35        U R                   R                  U R                  5        U R                   R                  U5        U R                   R                  U R                  5        U R                   R                  [
        R                  " USSS95        Mò     g )Nz: TÚupper)ÚreindentÚkeyword_case)r"   r9   Ú
separator1ÚgetDescriptionr:   ÚsqlparseÚformat)r!   Úflavourr@   r0   rA   Ú	sql_debugs         r&   ÚprintErrorListÚ%DebugSQLTextTestResult.printErrorList]   s©   € Û$*Ñ ˆD�yØ�K‰K×Ñ §¡Ô0Ø�K‰K×Ñ«G°T×5HÑ5HÈÕ5NÐ OÔPØ�K‰K×Ñ §¡Ô0Ø�K‰K×Ñ Ô$Ø�K‰K×Ñ §¡Ô0Ø�K‰K×ÑÜ—’ 	°DÀwÑOöò %+r(   )r   r,   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r    r.   r3   r?   rF   rK   rZ   Ú__static_attributes__Ú__classcell__©r%   s   @r&   r   r   .   s-   ø† õ:õ õ1õ3õPõ
	F÷	ð 	r(   r   c                   óJ   ^ • \ rS rSrSrU 4S jrU 4S jrU 4S jrS rSr	U =r
$ )ÚPDBDebugResultéi   zR
Custom result class that triggers a PDB session when an error or failure
occurs.
c                 óF   >• [         TU ]  X5        U R                  U5        g r*   )r   r?   ÚdebugrH   s      €r&   r?   ÚPDBDebugResult.addErroro   s   ø€ Ü‰Ñ˜Ô#Ø�
‰
�3�r(   c                 óF   >• [         TU ]  X5        U R                  U5        g r*   )r   rF   rg   rH   s      €r&   rF   ÚPDBDebugResult.addFailures   s   ø€ Ü‰Ñ˜4Ô%Ø�
‰
�3�r(   c                 óN   >• Ub  U R                  U5        [        TU ]	  XU5        g r*   )rg   r   rK   ©r!   r0   rN   rA   r%   s       €r&   rK   ÚPDBDebugResult.addSubTestw   s"   ø€ Ø‰?Ø�J‰J�sŒOÜ‰Ñ˜4¨#Õ.r(   c                 ó„   • U R                  5         SU l        Uu  p#n[        SU-  5        [        R                  " U5        g )NFz
Opening PDB: %r)Ú_restoreStdoutÚbufferÚprintÚpdbÚpost_mortem)r!   ÚerrorÚexc_typeÚ	exc_valueÚ	tracebacks        r&   rg   ÚPDBDebugResult.debug|   s9   € Ø×ÑÔØˆŒØ).Ñ&ˆ˜YÜÐ! IÑ-Ô.Ü�Š˜	Õ"r(   )rp   )r\   r]   r^   r_   Ú__doc__r?   rF   rK   rg   r`   ra   rb   s   @r&   rd   rd   i   s!   ø† ñõ
õõ/÷
#ð #r(   rd   c                   ó"   • \ rS rSrSrSrS rSrg)Ú	DummyListé„   zH
Dummy list class for faking storage of results in unittest.TestResult.
© c                 ó   • g r*   r}   )r!   Úitems     r&   ÚappendÚDummyList.append‹   s   € Ør(   N)r\   r]   r^   r_   ry   Ú	__slots__r€   r`   r}   r(   r&   r{   r{   „   s   † ñð €Iõr(   r{   c                   óê   ^ • \ rS rSrSrU 4S jrS r\S 5       rS r	S r
S rS	 rU 4S
 jrU 4S jrU 4S jrU 4S jrU 4S jrU 4S jrU 4S jrU 4S jrU 4S jrU 4S jrU 4S jrS rS rSrU =r$ )ÚRemoteTestResulté�   z¯
Extend unittest.TestResult to record events in the child processes so they
can be replayed in the parent process. Events include things like which
tests succeeded or failed.
c                 óÎ   >• [         TU ]  " U0 UD6  [        5       nX0l        X0l        X0l        X0l        X0l        [        b  [        R                  R                  5         / U l        g r*   )r   r    r{   rG   r@   ÚskippedÚexpectedFailuresÚunexpectedSuccessesÚtblibÚpickling_supportÚinstallÚevents)r!   ÚargsÚkwargsÚ
dummy_listr%   s       €r&   r    ÚRemoteTestResult.__init__–   sX   ø€ Ü‰Ò˜$Ð) &Ò)ô “[ˆ
Ø"ŒØ ŒØ!ŒØ *ÔØ#-Ô äÑÜ×"Ñ"×*Ñ*Ô,Øˆ�r(   c                 óÊ   • U R                   R                  5       nUR                  SS 5        UR                  SS 5        UR                  SS 5        UR                  SS 5        U$ )NÚ_stdout_bufferÚ_stderr_bufferÚ_original_stdoutÚ_original_stderr)Ú__dict__ÚcopyÚpop)r!   Ústates     r&   Ú__getstate__ÚRemoteTestResult.__getstate__¥   sW   € ð —‘×"Ñ"Ó$ˆØ�	‰	Ð" DÔ)Ø�	‰	Ð" DÔ)Ø�	‰	Ð$ dÔ+Ø�	‰	Ð$ dÔ+Øˆr(   c                 ó    • U R                   S-
  $ )Né   )ÚtestsRun©r!   s    r&   Ú
test_indexÚRemoteTestResult.test_index°   s   € à�}‰}˜qÑ Ð r(   c                 óX   • [         R                  " [         R                  " U5      5        g)zÀ
Confirm that obj can be pickled and unpickled as multiprocessing will
need to pickle the exception in the child process and unpickle it in
the parent process. Let the exception rise, if not.
N)ÚpickleÚloadsÚdumps)r!   Úobjs     r&   Ú_confirm_picklableÚ#RemoteTestResult._confirm_picklable´   s   € ô 	�Š”V—\’\ #Ó&Õ'r(   c                 ó:   • [        SR                  XU5      5        g )Na'  
Subtest failed:

    test: {}
 subtest: {}

Unfortunately, the subtest that failed cannot be pickled, so the parallel
test runner cannot handle it cleanly. Here is the pickling error:

> {}

You should re-run this test with --parallel=1 to reproduce the failure
with a cleaner failure message.
)rq   rW   )r!   r0   rN   Ú
pickle_excs       r&   Ú_print_unpicklable_subtestÚ+RemoteTestResult._print_unpicklable_subtest¼   s    € Üð÷ �FØ˜zóõ	
r(   c                 óV  •  U R                  U5        g ! [         aŠ  n[        US   5      n[        R                  " USSSS9n[        U5      n[        R                  " USSSS9n[
        c  [        SR                  X5      5        e [        SR                  XU5      5        e S nAff = f)Nrž   éK   z    )Úinitial_indentÚsubsequent_indentzî

{} failed:

{}

Unfortunately, tracebacks cannot be pickled, making it impossible for the
parallel test runner to handle this exception cleanly.

In order to see the traceback, you should install tblib:

    python -m pip install tblib
aL  

{} failed:

{}

Unfortunately, the exception it raised cannot be pickled, making it impossible
for the parallel test runner to handle it cleanly.

Here's the error encountered while trying to pickle the exception:

{}

You should re-run this test with the --parallel=1 option to reproduce the
failure and get a correct traceback.
)r¨   Ú	ExceptionÚreprÚtextwrapÚfillrŠ   rq   rW   )r!   r0   rA   ÚexcÚoriginal_exc_txtÚpickle_exc_txts         r&   Úcheck_picklableÚ RemoteTestResult.check_picklableÐ   s¼   € ð2	Ø×#Ñ# CÕ(øÜó 0	Ü# C¨¡F›|ÐÜ'Ÿ}š}Ø  "°VÈvñ Ðô " #›YˆNÜ%Ÿ]š]Ø °6ÈVñˆNô ‰}Üð÷ �FØóôðL ô) ð÷ �FØ°óô!ð( ûða0	ús   ‚ ”
B(žBB#Â#B(c                 ór   •  U R                  U5        g ! [         a  nU R                  XU5        e S nAff = fr*   )r¨   r²   r¬   )r!   r0   rN   r¶   s       r&   Úcheck_subtest_picklableÚ(RemoteTestResult.check_subtest_picklable  s8   € ð	Ø×#Ñ# GÕ,øÜó 	Ø×+Ñ+¨D¸3Ô?Øûð	ús   ‚ ”
6ž1±6c                 óX   >• [         TU ]  5         U R                  R                  S5        g )N)ÚstartTestRun)r   r¿   r�   r€   ©r!   r%   s    €r&   r¿   ÚRemoteTestResult.startTestRun  s!   ø€ Ü‰ÑÔØ�‰×ÑÐ,Õ-r(   c                 óX   >• [         TU ]  5         U R                  R                  S5        g )N)ÚstopTestRun)r   rÃ   r�   r€   rÀ   s    €r&   rÃ   ÚRemoteTestResult.stopTestRun  s!   ø€ Ü‰ÑÔØ�‰×ÑÐ+Õ,r(   c                 ór   >• [         TU ]  U5        U R                  R                  SU R                  45        g )Nr.   )r   r.   r�   r€   r¡   r/   s     €r&   r.   ÚRemoteTestResult.startTest  s+   ø€ Ü‰Ñ˜$ÔØ�‰×Ñ˜K¨¯©Ð9Õ:r(   c                 ór   >• [         TU ]  U5        U R                  R                  SU R                  45        g )Nr3   )r   r3   r�   r€   r¡   r/   s     €r&   r3   ÚRemoteTestResult.stopTest  s+   ø€ Ü‰Ñ˜ÔØ�‰×Ñ˜J¨¯©Ð8Õ9r(   c                 ó–   >• U R                  X5        U R                  R                  SU R                  U45        [        TU ]  X5        g )Nr?   )r¹   r�   r€   r¡   r   r?   rH   s      €r&   r?   ÚRemoteTestResult.addError"  s;   ø€ Ø×Ñ˜TÔ'Ø�‰×Ñ˜J¨¯©¸Ð=Ô>Ü‰Ñ˜Õ#r(   c                 ó–   >• U R                  X5        U R                  R                  SU R                  U45        [        TU ]  X5        g )NrF   )r¹   r�   r€   r¡   r   rF   rH   s      €r&   rF   ÚRemoteTestResult.addFailure'  s;   ø€ Ø×Ñ˜TÔ'Ø�‰×Ñ˜L¨$¯/©/¸3Ð?Ô@Ü‰Ñ˜4Õ%r(   c                 óÀ   >• UbJ  U R                  X5        U R                  X5        U R                  R                  SU R                  X#45        [
        TU ]  XU5        g )NrK   )r¹   r¼   r�   r€   r¡   r   rK   rl   s       €r&   rK   ÚRemoteTestResult.addSubTest,  sT   ø€ ð ‰?ð × Ñ  Ô+Ø×(Ñ(¨Ô7Ø�K‰K×Ñ ¨d¯o©o¸wÐLÔMÜ‰Ñ˜4¨#Õ.r(   c                 ór   >• U R                   R                  SU R                  45        [        TU ]  U5        g )NÚ
addSuccess)r�   r€   r¡   r   rÐ   r/   s     €r&   rÐ   ÚRemoteTestResult.addSuccess7  s+   ø€ Ø�‰×Ñ˜L¨$¯/©/Ð:Ô;Ü‰Ñ˜4Õ r(   c                 ót   >• U R                   R                  SU R                  U45        [        TU ]  X5        g )NÚaddSkip)r�   r€   r¡   r   rÓ   )r!   r0   Úreasonr%   s      €r&   rÓ   ÚRemoteTestResult.addSkip;  s,   ø€ Ø�‰×Ñ˜I t§¡¸Ð?Ô@Ü‰‰˜Õ%r(   c                 óº   >• [         c  US   US   S 4nU R                  X5        U R                  R                  SU R                  U45        [
        TU ]  X5        g )Nr   rž   ÚaddExpectedFailure)rŠ   r¹   r�   r€   r¡   r   r×   rH   s      €r&   r×   Ú#RemoteTestResult.addExpectedFailure?  sW   ø€ ô
 ‰=Ø�a‘&˜#˜a™& $Ð&ˆCØ×Ñ˜TÔ'Ø�‰×ÑÐ0°$·/±/À3ÐGÔHÜ‰Ñ" 4Õ-r(   c                 ór   >• U R                   R                  SU R                  45        [        TU ]  U5        g )NÚaddUnexpectedSuccess)r�   r€   r¡   r   rÚ   r/   s     €r&   rÚ   Ú%RemoteTestResult.addUnexpectedSuccessJ  s,   ø€ Ø�‰×ÑÐ2°D·O±OÐDÔEÜ‰Ñ$ TÕ*r(   c                 óJ   ^• 1 Skm[        U4S jU R                   5       5      $ )z/Tells whether or not this result was a success.>   r?   rF   rK   rÚ   c              3   ó2   >#   • U  H  oS    T;  v •  M     g7f)r   Nr}   )Ú.0ÚeÚfailure_typess     €r&   Ú	<genexpr>Ú1RemoteTestResult.wasSuccessful.<locals>.<genexpr>Q  s   øé € ÐB²k°�Q‘4˜}Ö,²kùs   ƒ)Úallr�   )r!   rà   s    @r&   ÚwasSuccessfulÚRemoteTestResult.wasSuccessfulN  s   ø€ âXˆÜÔB°d·k²kÓBÓBÐBr(   c                 ó   • g)Nr=   r}   )r!   rA   r0   s      r&   Ú_exc_info_to_stringÚ$RemoteTestResult._exc_info_to_stringS  s   € ð r(   )r@   r�   rˆ   rG   r‡   r‰   )r\   r]   r^   r_   ry   r    r›   Úpropertyr¡   r¨   r¬   r¹   r¼   r¿   rÃ   r.   r3   r?   rF   rK   rÐ   rÓ   r×   rÚ   rä   rç   r`   ra   rb   s   @r&   r„   r„   �   s‚   ø† ñõò	ð ñ!ó ð!ò(ò
ò(9òvõ.õ-õ;õ:õ$õ
&õ
	/õ!õ&õ	.õ+òC÷
ð r(   r„   c                   ó,   • \ rS rSrSr\rSS jrS rSr	g)ÚRemoteTestRunneriZ  zƒ
Run tests and record everything but don't display anything.

The implementation matches the unpythonic coding style of unittest2.
Nc                 ó0   • Xl         X0l        Ub  X l        g g r*   )Úfailfastrp   Úresultclass)r!   rí   rî   rp   s       r&   r    ÚRemoteTestRunner.__init__c  s   € Ø ŒØŒØÑ"Ø*Õð #r(   c                 ó¦   • U R                  5       n[        R                  " U5        U R                  Ul        U R                  Ul        U" U5        U$ r*   )rî   ÚunittestÚregisterResultrí   rp   )r!   r0   Úresults      r&   ÚrunÚRemoteTestRunner.runi  s@   € Ø×!Ñ!Ó#ˆÜ×Ò Ô'ØŸ-™-ˆŒØŸ™ˆŒÙˆVŒØˆr(   )rp   rí   rî   )FNF)
r\   r]   r^   r_   ry   r„   rî   r    rô   r`   r}   r(   r&   rë   rë   Z  s   † ñð #€Kô+õr(   rë   c                  óº   • [         R                  " 5       S;  a  g [        [        R                  S   5      $ ! [
         a    [         R                  " 5       s $ f = f)zH
The maximum number of test processes when using the --parallel option.
>   ÚforkÚspawnrž   ÚDJANGO_TEST_PROCESSES)ÚmultiprocessingÚget_start_methodÚintÚosÚenvironÚKeyErrorÚ	cpu_countr}   r(   r&   Úget_max_test_processesr  r  sQ   € ô ×'Ò'Ó)Ð1BÓBØð+Ü”2—:‘:Ð5Ñ6Ó7Ð7øÜó +Ü×(Ò(Ó*Ò*ð+ús   œ8 ¸AÁAc                 óz   • U S:X  a  U $  [        U 5      $ ! [         a    [        R                  " U < S35      ef = f)z,Parse value passed to the --parallel option.Úautoz' is not an integer or the string 'auto')rü   Ú
ValueErrorÚargparseÚArgumentTypeError)Úvalues    r&   Úparallel_typer  €  sJ   € à�ƒØˆð
Ü�5‹zÐøÜó 
Ü×(Ò(Ø‰iÐ>Ð?ó
ð 	
ð
ús   Š
 •%:c                 ó:  • U R                  5          U =R                  S-  sl        U R                  qSSS5        [        R                  " 5       nUS:X  a?  U(       a  [        U5      (       a
  Uc  SnU" U6   [        R                  " 5         [        US9  [         Hl  n[        U   nUS:X  a;  UR                  R                  X   5        UR                  U5      =n	(       a  X˜l        UR                  R                  [        5        Mn     g! , (       d  f       Nß= f)zˆ
Switch to databases dedicated to this worker.

This helper lives at module-level because of the multiprocessing module's
requirements.
rž   Nrø   r}   ©rg   )Úget_lockr  Ú
_worker_idrú   rû   ÚcallableÚdjangoÚsetupr   r   Úsettings_dictÚupdateÚgetÚ_test_serialized_contentsÚcreationÚsetup_worker_connection)
ÚcounterÚinitial_settingsÚserialized_contentsÚprocess_setupÚprocess_setup_argsÚ
debug_modeÚstart_methodÚaliasÚ
connectionr  s
             r&   Ú_init_workerr  �  sä   € ð" 
×	Ñ	Õ	Ø�Š˜Ñ�Ø—]‘]ˆ
÷ 
ô #×3Ò3Ó5€Là�wÓÞœX m×4Ñ4Ø!Ñ)Ø%'Ð"ÙÐ-Ñ.Ü�ŠŒÜ ZÒ0çˆÜ  Ñ'ˆ
Ø˜7Ó"à×$Ñ$×+Ñ+Ð,<Ñ,CÔDØ+×/Ñ/°Ó6Ð6ˆuÕ6Ø7<Ô4Ø×Ñ×3Ñ3´JÖ?ò ÷ 
Õ	ús   ‘"DÄ
Dc                 óV   • U u  pp4nU" XES9nUR                  U5      nX'R                  4$ )zÏ
Run a suite of tests with a RemoteTestRunner and return a RemoteTestResult.

This helper lives at module-level and its arguments are wrapped in a tuple
because of the multiprocessing module's requirements.
)rí   rp   )rô   r�   )rŽ   Úrunner_classÚsubsuite_indexÚsubsuiterí   rp   Úrunnerró   s           r&   Ú_run_subsuiter%  ¸  s7   € ð @DÑ<€L (°fÙ 8Ñ;€FØ�Z‰Z˜Ó!€FØŸ=™=Ð(Ð(r(   c                  ó   • g)z-Stub method to simplify run() implementation.Nr}   )rŽ   s    r&   Ú_process_setup_stubr'  Å  s   € àr(   c                   óX   ^ • \ rS rSrSr\r\rSr	\
r\r S	U 4S jjrS rS rS rSrU =r$ )
ÚParallelTestSuiteiÊ  ay  
Run a series of tests in parallel in several processes.

While the unittest module's documentation implies that orchestrating the
execution of tests is the responsibility of the test runner, in practice,
it appears that TestRunner classes are more concerned with formatting and
displaying test results.

Since there are fewer use cases for customizing TestSuite than TestRunner,
implementing parallelization at the level of the TestSuite improves
interoperability with existing custom test runners. A single instance of a
test runner can still collect results from all tests without being aware
that they have been run in parallel.
r}   c                 óz   >• Xl         X l        X0l        X@l        XPl        S U l        S U l        [        TU ]!  5         g r*   )	Ú	subsuitesÚ	processesrí   r  rp   r  r  r   r    )r!   r+  r,  rí   r  rp   r%   s         €r&   r    ÚParallelTestSuite.__init__á  s9   ø€ ð #ŒØ"ŒØ ŒØ$ŒØŒØ $ˆÔØ#'ˆÔ Ü‰ÑÕr(   c           
      óÞ  • U R                  5         [        R                  " [        R                  S5      n[        R
                  " U R                  U R                  R                  UU R                  U R                  U R                  R                  U R                  U R                  /S9n[        U R                  5       VVs/ s H)  u  pEU R                   XEU R"                  U R$                  4PM+     nnnUR'                  U R(                  R                  U5      n UR*                  (       a  UR-                  5         O` UR/                  SS9u  p‰[7        U R                  U   5      n
U	 H.  nUS   n[9        XS5      nUc  M  X«S      nUSS nU" U/UQ76   M0     M‚  UR;                  5         U$ s  snnf ! [        R0                   a     M²  [2         a    UR5                  5          MK  f = f)aÏ  
Distribute test cases across workers.

Return an identifier of each test case with its result in order to use
imap_unordered to show results as soon as they're available.

To minimize pickling errors when getting results from workers:

- pass back numeric indexes in self.subsuites instead of tests
- make tracebacks picklable with tblib, if available

Even with tblib, errors may still occur for dynamically created
exception classes which cannot be unpickled.
r   )r,  ÚinitializerÚinitargsgš™™™™™¹?)ÚtimeoutNrž   é   )Úinitialize_suiterú   ÚValueÚctypesÚc_intÚPoolr,  Úinit_workerÚ__func__r  r  r  r  r  Ú	enumerater+  r!  rí   rp   Úimap_unorderedÚrun_subsuiteÚ
shouldStopÚ	terminateÚnextÚTimeoutErrorÚStopIterationÚcloseÚlistÚgetattrÚjoin)r!   ró   r  ÚpoolÚindexr#  rŽ   Útest_resultsr"  r�   ÚtestsÚeventÚ
event_namer,   r0   s                  r&   rô   ÚParallelTestSuite.runí  sÄ  € ð 	×ÑÔÜ!×'Ò'¬¯©°aÓ8ˆÜ×#Ò#Ø—n‘nØ×(Ñ(×1Ñ1àØ×%Ñ%Ø×(Ñ(Ø×"Ñ"×+Ñ+Ø×'Ñ'Ø—‘ðñ
ˆô $-¨T¯^©^Ô#<ô
â#<‘�ð ×Ñ °·±ÀÇÁÓLÙ#<ð 	ñ 
ð ×*Ñ*¨4×+<Ñ+<×+EÑ+EÀtÓLˆàØ× × Ø—‘Ô ØðØ)5×):Ñ):À3Ð):Ð)GÑ&�ô ˜Ÿ™¨Ñ7Ó8ˆEÛ�Ø" 1™X�
Ü! &°dÓ;�Ø‘?ÙØ 1™X‘�Ø˜Q˜R�y�Ù˜Ð$˜tÕ$ñ  ñ ð. 	�	‰	Œàˆùó?
øô #×/Ñ/ó ÚÜ ó Ø—
‘
”Úðús   Ã0F2ÅF8 Æ8G,ÇG,Ç+G,c                 ó,   • [        U R                  5      $ r*   )Úiterr+  r    s    r&   Ú__iter__ÚParallelTestSuite.__iter__+  s   € Ü�D—N‘NÓ#Ð#r(   c                 ó$  • [         R                  " 5       S:X  am  [         Vs0 s H  o[        U   R                  _M     snU l        [         Vs0 s H(  nXR
                  ;   d  M  U[        U   R                  _M*     snU l        g g s  snf s  snf )Nrø   )rú   rû   r   r  r  Úserialized_aliasesr  r  )r!   r  s     r&   r3  Ú"ParallelTestSuite.initialize_suite.  s�   € Ü×+Ò+Ó-°Ó8åEPó%ÚEP¸E”{ 5Ñ)×7Ñ7Ò7Á[ñ%ˆDÔ!õ
 )ó(â(�EØ×3Ñ3Ñ3ó D�”{ 5Ñ)×CÑCÒCÙ(ñ(ˆDÕ$ð	 9ùò%ùò(s   ¢BÁBÁ&B)rp   r  rí   r  r,  r  r+  )FFF)r\   r]   r^   r_   ry   r  r8  r'  r  r  r%  r<  rë   r!  r    rô   rO  r3  r`   ra   rb   s   @r&   r)  r)  Ê  sE   ø† ñð  €KØ'€MØÐØ €LØ#€Lð NS÷
ò<ò|$÷	ð 	r(   r)  c                   óR   • \ rS rSrSrSr\S 5       rSS jr\	S 5       r
S rS	 rS
rg)ÚShuffleri:  a‘  
This class implements shuffling with a special consistency property.
Consistency means that, for a given seed and key function, if two sets of
items are shuffled, the resulting order will agree on the intersection of
the two sets. For example, if items are removed from an original set, the
shuffled order for the new set will be the shuffled order of the original
set restricted to the smaller set.
Úmd5c                 óŠ   • [        U R                  SS9nUR                  UR                  S5      5        UR	                  5       $ )NF)Úusedforsecurityzutf-8)r   Úhash_algorithmr  ÚencodeÚ	hexdigest)ÚclsÚtextÚhs      r&   Ú
_hash_textÚShuffler._hash_textG  s5   € ä�S×'Ñ'¸Ñ?ˆØ	�‰�—‘˜WÓ%Ô&Ø�{‰{‹}Ðr(   Nc                 óZ   • Uc  [         R                  " SS5      nSnOSnXl        X l        g )Nr   l   ÿc(	 Ú	generatedÚgiven)ÚrandomÚrandintÚseedÚseed_source)r!   rf  rg  s      r&   r    ÚShuffler.__init__M  s,   € Ø‰<ä—>’> ! ZÓ0ˆDØ%‰Kà!ˆKØŒ	Ø&Õr(   c                 ó<   • U R                   < SU R                   S3$ )Nz (Ú)©rf  rg  r    s    r&   Úseed_displayÚShuffler.seed_displayW  s    € à—)‘)‘˜b ×!1Ñ!1Ð 2°!Ð4Ð4r(   c                 óh   • SR                  U R                  U" U5      5      nU R                  U5      $ )Nz{}{})rW   rf  r_  )r!   r   Úkeyr]  s       r&   Ú
_hash_itemÚShuffler._hash_item[  s)   € Ø�}‰}˜TŸY™Y©¨D«	Ó2ˆØ�‰˜tÓ$Ð$r(   c                 óÒ   • 0 nU H=  nU R                  XB5      nXS;   a   SR                  UUX5   5      n[        U5      eXCU'   M?     [        U5       Vs/ s H  oSU   PM	     sn$ s  snf )a2  
Return a new list of the items in a shuffled order.

The `key` is a function that accepts an item in `items` and returns
a string unique for that item that can be viewed as a string id. The
order of the return value is deterministic. It depends on the seed
and key function but not on the original order.
z)item {!r} has same hash {!r} as item {!r})rp  rW   ÚRuntimeErrorÚsorted)r!   Úitemsro  Úhashesr   ÚhashedÚmsgs          r&   ÚshuffleÚShuffler.shuffle_  sv   € ð ˆÛˆDØ—_‘_ TÓ/ˆFØÓØA×HÑHØØØ‘Nó�ô
 # 3Ó'Ð'Ø!�6‹Nñ ô .4°F¬^Ó<ª^ 6�v”©^Ñ<Ð<ùÒ<s   ÁA$rk  r*   )r\   r]   r^   r_   ry   rY  Úclassmethodr_  r    ré   rl  rp  ry  r`   r}   r(   r&   rU  rU  :  sC   † ñð €Nàñó ðô
'ð ñ5ó ð5ò%õ=r(   rU  c                   ó8  • \ rS rSrSr\R                  r\r	\R                  r\R                  r\\4r                   SS jr\S 5       r\S 5       rSS jrS rS	 r\S
 5       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%S r&SS jr'Sr(g)ÚDiscoverRunneriv  z8A Django test runner that uses unittest2 test discovery.Nc                 ój  • Xl         X l        X0l        X@l        XPl        X`l        Xpl        X€l        X�l        X l	        [        U=(       d    / 5      U l        [        U=(       d    / 5      U l        [        R                  " 5       (       d8  U(       a1   [        R                  " [         R"                  R%                  5       S9  Xàl        U R.                  (       a  U R                  S:”  a  [1        S5      eXðl        S U l        U(       a
  [7        5       O	[9        5       U l        U(       a#  U Vs1 s H  nSU;   a  UOSU-  iM     snU l        UU l        S U l        UU l         g ! [&        [(        R*                  4 a3    [        R                  " [         R,                  R%                  5       S9   Nëf = fs  snf )N)Úfilerž   zFYou cannot use --pdb with parallel tests; pass --parallel=1 to use it.Ú*z*%s*)!ÚpatternÚ	top_levelr$   Úinteractiverí   ÚkeepdbÚreverser  Ú	debug_sqlÚparallelÚsetÚtagsÚexclude_tagsÚfaulthandlerÚ
is_enabledÚenableÚsysÚstderrÚfilenoÚAttributeErrorÚioÚUnsupportedOperationÚ
__stderr__rr   r  rp   Útest_name_patternsr   r   Útime_keeperry  Ú	_shufflerr   )r!   r�  r‚  r$   rƒ  rí   r„  r…  r  r†  r‡  r‰  rŠ  r•  rr   rp   Úenable_faulthandlerÚtimingry  r   r�   s                        r&   r    ÚDiscoverRunner.__init__  s]  € ð. ŒØ"ŒØ"ŒØ&ÔØ ŒØŒØŒØ$ŒØ"ŒØ ŒÜ˜Ÿ
 “OˆŒ	Ü × 2°Ó3ˆÔÜ×&Ò&×(Ñ(Ö-@ðBÜ×#Ò#¬¯©×):Ñ):Ó)<Ò=ð ŒØ�8�8˜Ÿ™¨Ó)ÜØXóð ð ŒØ"&ˆÔÞ+1œ:œ<´~Ó7GˆÔÞñ
  2ó'â1�Gð  '›>‘¨v¸Ñ/?Ò?Ù1ñ'ˆDÔ#ð ˆŒØˆŒØˆ�øô' #¤B×$;Ñ$;Ð<ó BÜ×#Ò#¬¯©×)>Ñ)>Ó)@ÔAðBüò's   Â0E  Ä+F0Å A
F-Æ,F-c           
      ó2  • UR                  SSSSS9  UR                  SSSS	S
9  UR                  SSSS9  UR                  SSS[        SSS9  UR                  SSSSS9  UR                  SSSS9  UR                  SSSSS9  UR                  SSSS[        S S!S"9  UR                  S#S$S%S&S'9  UR                  S(S$S)S*S'9  UR                  S+SS,S9  UR                  S-S.SS/S9  UR                  S0S1S2S3S'9  UR                  S4SS5S9  UR                  S6S$S7S8S'9  g )9Nz-tz--top-level-directoryr‚  z,Top level of project for unittest discovery.)ÚdestÚhelpz-pz	--patternztest*.pyz0The test matching pattern. Defaults to test*.py.)Údefaultr�  z--keepdbÚ
store_truez#Preserves the test DB between runs.)Úactionr�  z	--shuffleÚ?FÚSEEDzShuffles test case order.)Únargsrž  ÚtypeÚmetavarr�  z-rz	--reversezReverses test case order.z--debug-modezSets settings.DEBUG to True.z-dz--debug-sqlz%Prints logged SQL queries on failure.z
--parallelr  r   ÚNzqRun tests using up to N parallel processes. Use the value "auto" to run one test process for each processor core.)r£  Úconstrž  r¤  r¥  r�  z--tagr€   r‰  zBRun only tests with the specified tag. Can be used multiple times.)r   rœ  r�  z--exclude-tagrŠ  zDDo not run tests with the specified tag. Can be used multiple times.z--pdbz@Runs a debugger (pdb, or ipdb if installed) on error or failure.z-bz--bufferz"Discard output from passing tests.z--no-faulthandlerÚstore_falser˜  z5Disables the Python faulthandler module during tests.z--timingz=Output timings, including database set up and total run time.z-kr•  z~Only run test methods and classes that match the pattern or substring. Can be used multiple times. Same as unittest -k option.)Úadd_argumentrü   r  )r\  Úparsers     r&   Úadd_argumentsÚDiscoverRunner.add_argumentsº  sö  € à×ÑØØ#ØØ?ð	 	ñ 	
ð 	×ÑØØØØCð	 	ñ 	
ð 	×ÑØ˜|Ð2Wð 	ñ 	
ð 	×ÑØØØÜØØ,ð 	ñ 	
ð 	×ÑØØØØ,ð	 	ñ 	
ð 	×ÑØØØ/ð 	ñ 	
ð
 	×ÑØØØØ8ð	 	ñ 	
ð 	×ÑØØØØÜØðJð 	ñ 	
ð 	×ÑØØØØUð	 	ñ 	
ð 	×ÑØØØØWð	 	ñ 	
ð 	×ÑØØØSð 	ñ 	
ð
 	×ÑØØØØ5ð	 	ñ 	
ð 	×ÑØØ Ø&ØHð	 	ñ 	
ð 	×ÑØØØQð 	ñ 	
ð
 	×ÑØØØ%ð&ð 	ò 		
r(   c                 óJ   • U R                   c  g U R                   R                  $ r*   )r—  rf  r    s    r&   Úshuffle_seedÚDiscoverRunner.shuffle_seed  s   € à�>‰>Ñ!ØØ�~‰~×"Ñ"Ð"r(   c                 óü   • Uc  [         R                  nU R                  cA  U R                  S::  d$  U R                  S:X  a  U[         R                  :  a  g[	        U5        gU R                  R                  X!5        g)a,  
Log the message at the given logging level (the default is INFO).

If a logger isn't set, the message is instead printed to the console,
respecting the configured verbosity. A verbosity of 0 prints no output,
a verbosity of 1 prints INFO and above, and a verbosity of 2 or higher
prints all levels.
Nr   rž   )r   ÚINFOr   r$   rq   Úlog)r!   rx  Úlevels      r&   r²  ÚDiscoverRunner.log#  sX   € ð ‰=Ü—L‘LˆEØ�;‰;ÑØ�~‰~ Ó" t§~¡~¸Ó':¸uÄwÇ|Á|Ó?SØÜ�#�Jà�K‰K�O‰O˜EÕ'r(   c                 óT   • [        U R                  S9  [        R                  " 5         g )Nr
  )r   r  rñ   ÚinstallHandler©r!   r�   s     r&   r   Ú%DiscoverRunner.setup_test_environment5  s   € Ü T§_¡_Ò5Ü×ÒÕ!r(   c                 ó’   • U R                   SL a  g [        U R                   S9nU R                  SUR                   35        Xl        g )NF)rf  zUsing shuffle seed: )ry  rU  r²  rl  r—  )r!   Úshufflers     r&   Úsetup_shufflerÚDiscoverRunner.setup_shuffler9  s?   € Ø�<‰<˜5Ò ØÜ §¡Ñ.ˆØ�‰Ð'¨×(=Ñ(=Ð'>Ð?Ô@Ø!�r(   c              #   óÂ   #   • U R                   R                  nU R                  U R                   l         S v •  XR                   l        g ! XR                   l        f = f7fr*   )Útest_loaderÚtestNamePatternsr•  )r!   Úoriginal_test_name_patternss     r&   Úload_with_patternsÚ!DiscoverRunner.load_with_patterns@  sP   é € à&*×&6Ñ&6×&GÑ&GÐ#Ø,0×,CÑ,Cˆ×ÑÔ)ð	LÛð 1L×ÑÕ-øÐ0K×ÑÕ-üs   ‚2AµA
 ¹AÁ
AÁAc                 óœ  • [         R                  R                  U5      nS n[         R                  R                  U5      (       dK  U R	                  5          U R
                  R                  U5      nS S S 5        UR                  5       (       a  U$ [        U5      u  pVU(       a
  U(       d  U$ O_[         R                  R                  U5      (       d;  [         R                  R                  U5      (       a  Ub   e[        SU< S35      eU$ UR                  5       n[         R                  R                  U5      (       a  U R                  (       d  [        U5      US'   U R	                  5          U R
                  R                  " SSU0UD6nS S S 5        S U R
                  l        U$ ! , (       d  f       GN@= f! , (       d  f       N3= f)Nz,One of the test labels is a path to a file: zR, which is not supported. Use a dotted module name or path to a directory instead.Útop_level_dirÚ	start_dirr}   )rý   ÚpathÚabspathÚexistsrÁ  r¾  ÚloadTestsFromNameÚcountTestCasesÚtry_importingÚisdirrs  r˜   r‚  Úfind_top_levelÚdiscoverÚ_top_level_dir)r!   ÚlabelÚdiscover_kwargsÚlabel_as_pathrI  Úis_importableÚ
is_packager�   s           r&   Úload_tests_for_labelÚ#DiscoverRunner.load_tests_for_labelJ  sh  € ÜŸ™Ÿ™¨Ó.ˆØˆô �w‰w�~‰~˜m×,Ñ,Ø×(Ñ(Õ*Ø×(Ñ(×:Ñ:¸5ÓA�÷ +à×#Ñ#×%Ñ%Ø�ä$1°%Ó$8Ñ!ˆÞÞØ�ð ä—‘—‘˜}×-Ñ-Ü�w‰w�~‰~˜m×,Ñ,Ø‘}Ð$�}Ü"ØBÀ5Á)ð L3ð 4óð ð
 ˆLà ×%Ñ%Ó'ˆÜ�7‰7�=‰=˜×'Ñ'°··Ü&4°]Ó&CˆF�?Ñ#à×$Ñ$Õ&Ø×$Ñ$×-Ò-ÑH¸ÐHÀÑHˆE÷ 'ð
 +/ˆ×ÑÔ'Øˆ÷; +Ö*ú÷. 'Õ&ús   ÁF+Å1F=Æ+
F:Æ=
Gc           	      óf  • Ub  [         R                  " S[        SS9  U=(       d    S/nU=(       d    / n0 nU R                  b  U R                  US'   U R                  b  U R                  US'   U R                  5         / nU H.  nU R                  Xd5      nUR                  [        U5      5        M0     UR                  [        U5      5        U R                  (       d  U R                  (       aÈ  U R                  (       aC  U R                  SSR                  [        U R                  5      5      -  [        R                  S	9  U R                  (       aC  U R                  S
SR                  [        U R                  5      5      -  [        R                  S	9  [!        XPR                  U R                  5      n["        R$                  R&                  /U R(                  Q7n[+        [-        UUU R.                  U R0                  S95      nU R                  S[3        U5      -  5        U R5                  U5      n	U R6                  S:”  ai  [9        U	5      n
[;        U R6                  [3        U
5      5      nX°l        US:”  a3  U R=                  U
UU R>                  U R@                  U RB                  5      n	U	$ )Nú'The extra_tests argument is deprecated.r2  ©Ú
stacklevelÚ.r�  rÄ  zIncluding test tag(s): %s.ú, ©r³  zExcluding test tag(s): %s.©rº  r…  zFound %d test(s).rž   )"ÚwarningsÚwarnr   r�  r‚  r»  rÕ  Úextendr   r‰  rŠ  r²  rE  rt  r   r   Úfilter_tests_by_tagsrñ   ÚloaderÚ_FailedTestÚ
reorder_byrC  Úreorder_testsr—  r…  ÚlenÚ
test_suiter‡  Úpartition_suite_by_caseÚminÚparallel_test_suiterí   r  rp   )r!   Útest_labelsÚextra_testsr�   rÑ  Ú	all_testsrÐ  rI  Ú
test_typesÚsuiter+  r,  s               r&   Úbuild_suiteÚDiscoverRunner.build_suiteo  s1  € ØÑ"Ü�MŠMØ9Ü(Øòð
 "×* c UˆØ!×' RˆàˆØ�<‰<Ñ#Ø)-¯©ˆO˜IÑ&Ø�>‰>Ñ%Ø/3¯~©~ˆO˜OÑ,Ø×ÑÔàˆ	Û ˆEØ×-Ñ-¨eÓEˆEØ×Ñœ_¨UÓ3Ö4ñ !ð 	×Ñœ¨Ó5Ô6à�9�9˜×)×)Ø�y�yØ—‘Ø0°4·9±9¼VÀDÇIÁIÓ=NÓ3OÑOÜ!Ÿ-™-ð ñ ð × × Ø—‘Ø0°4·9±9¼VÀD×DUÑDUÓ=VÓ3WÑWÜ!Ÿ-™-ð ñ ô -¨Y¿	¹	À4×CTÑCTÓUˆIô
 —o‘o×1Ñ1ÐD°D·O±OÑDˆ
ÜÜØØØŸ™ØŸ™ñ	ó
ˆ	ð 	�‰Ð$¤s¨9£~Ñ5Ô6Ø—‘ 	Ó*ˆà�=‰=˜1ÓÜ/°Ó6ˆIô ˜DŸM™M¬3¨y«>Ó:ˆIð &ŒMØ˜1‹}Ø×0Ñ0ØØØ—M‘MØ—O‘OØ—K‘Kó�ð ˆr(   c                 óž   • [        U R                  U R                  4U R                  U R                  U R
                  U R                  S.UD6$ )N)r–  r„  r†  r‡  )Ú_setup_databasesr$   rƒ  r–  r„  r†  r‡  r·  s     r&   r   ÚDiscoverRunner.setup_databasesµ  sN   € ÜØ�N‰NØ×Ñð
ð ×(Ñ(Ø—;‘;Ø—n‘nØ—]‘]ñ
ð ñ
ð 	
r(   c                 ó`   • U R                   (       a  [        $ U R                  (       a  [        $ g r*   )r†  r   rr   rd   r    s    r&   Úget_resultclassÚDiscoverRunner.get_resultclassÀ  s!   € Ø�>�>Ü)Ð)Ø�X�XÜ!Ð!ð r(   c                 óh   • U R                   U R                  5       U R                  U R                  S.$ )N)rí   rî   r$   rp   )rí   r÷  r$   rp   r    s    r&   Úget_test_runner_kwargsÚ%DiscoverRunner.get_test_runner_kwargsÆ  s-   € àŸ™Ø×/Ñ/Ó1ØŸ™Ø—k‘kñ	
ð 	
r(   c                 ó.   • [        SU R                  US9  g )NÚcheck)r$   Ú	databases)r   r$   )r!   rþ  s     r&   Ú
run_checksÚDiscoverRunner.run_checksÎ  s   € ô 	�W¨¯©À)ÓLr(   c                 óT  • U R                  5       nU R                  " S0 UD6n UR                  U5      U R                  b+  U R                  R                  nU R                  SU 35        $ $ ! U R                  b+  U R                  R                  nU R                  SU 35        f f = f)NzUsed shuffle seed: r}   )rú  Útest_runnerrô   r—  rl  r²  )r!   rð  r�   r$  rl  s        r&   Ú	run_suiteÚDiscoverRunner.run_suiteÓ  s™   € Ø×,Ñ,Ó.ˆØ×!Ò!Ñ+ FÑ+ˆð	?Ø—:‘:˜eÓ$à�~‰~Ñ)Ø#Ÿ~™~×:Ñ:�Ø—‘Ð.¨|¨nÐ=Õ>ð *øˆt�~‰~Ñ)Ø#Ÿ~™~×:Ñ:�Ø—‘Ð.¨|¨nÐ=Õ>ð *ús   ¤A- Á-:B'c                 óX   • [        UU R                  U R                  U R                  S9  g)z%Destroy all the non-mirror databases.)r$   r‡  r„  N)Ú_teardown_databasesr$   r‡  r„  )r!   Ú
old_configr�   s      r&   r   Ú!DiscoverRunner.teardown_databasesÝ  s"   € äØØ—n‘nØ—]‘]Ø—;‘;ó		
r(   c                 óB   • [         R                  " 5         [        5         g r*   )rñ   r4   r   r·  s     r&   r   Ú(DiscoverRunner.teardown_test_environmentæ  s   € Ü×ÒÔ Ü!Õ#r(   c                 ó„   • [        UR                  5      [        UR                  5      -   [        UR                  5      -   $ r*   )rç  rG   r@   r‰   )r!   rð  ró   r�   s       r&   Úsuite_resultÚDiscoverRunner.suite_resultê  s1   € ä�—‘Ó ¤3 v§}¡}Ó#5Ñ5¼¸F×<VÑ<VÓ8WÑWð	
r(   c                 óÈ   ^^• 0 m[        U5       HN  n[        USS 5      nUS:X  a  [        nU(       d  M%  [        USS5      mTR                  UU4S jU 5       5        MP     T$ )Nrþ  Ú__all__Úserialized_rollbackFc              3   ó^   >#   • U  H"  nUT=(       d    TR                  US 5      4v •  M$     g7f©FN)r  )rÞ   r  rþ  r  s     €€r&   rá   Ú0DiscoverRunner._get_databases.<locals>.<genexpr>÷  s.   øé € ð !â!/˜ð Ð/×N°9·=±=ÀÈÓ3NÕOÚ!/ùs   ƒ*-)r   rD  r   r  )r!   rð  r0   Útest_databasesrþ  r  s       @@r&   Ú_get_databasesÚDiscoverRunner._get_databasesï  sj   ù€ Øˆ	Ü# EÖ*ˆDÜ$ T¨;¸Ó=ˆNØ Ó*Ü!,�ßˆ~Ü&-¨dÐ4IÈ5Ó&QÐ#Ø× Ñ õ !á!/ó!ö ñ +ð Ðr(   c                 óì   • U R                  U5      n[         Vs/ s H  o3U;  d  M
  UPM     nnU(       a9  U R                  SSR                  [	        U5      5      -  [
        R                  S9  U$ s  snf )Nz)Skipping setup of unused database(s): %s.rÜ  rÝ  )r  r   r²  rE  rt  r   r   )r!   rð  rþ  r  Úunused_databasess        r&   Úget_databasesÚDiscoverRunner.get_databasesý  so   € Ø×'Ñ'¨Ó.ˆ	Ý/:ÓUª{ eÈ9Ñ>TŸE©{ÐÐUÞØ�H‰HØ;Ø—)‘)œFÐ#3Ó4Ó5ñ6ä—m‘mð ñ ð
 Ðùò Vs
   š	A1§A1c                 ó  • Ub  [         R                  " S[        SS9  U R                  5         U R	                  X5      nU R                  U5      n[        S UR                  5        5       5      Ul        U R                  R                  S5         U R                  UUR                  S9nSSS5        Sn U R                  U5        U R                  U5      n  U R                  R                  S
5         U R                  W5        SSS5        U R!                  5         U R                  R#                  5         U R%                  XH5      $ ! , (       d  f       N¥= f! [         a    S	ne f = f! , (       d  f       Nk= f! [         a    U(       d  e  Nrf = f!  U R                  R                  S
5         U R                  W5        SSS5        O! , (       d  f       O= fU R!                  5         f ! [         a    U(       d  e  f f = f= f)zÆ
Run the unit tests for all the test labels in the provided list.

Test labels should be dotted Python paths to test modules, test
classes, or test methods.

Return the number of tests that failed.
NrØ  r2  rÙ  c              3   ó<   #   • U  H  u  pU(       d  M  Uv •  M     g 7fr*   r}   )rÞ   r  Ú	serializes      r&   rá   Ú+DiscoverRunner.run_tests.<locals>.<genexpr>  s   é € ð '
Ú*;Ñ&�e¼y�E‰EÒ*;ùs   ‚“	zTotal database setup)ÚaliasesrR  FTzTotal database teardown)rß  rà  r   r   rñ  r  rˆ  ru  rR  r–  Útimedr   rÿ  r  r²   r   r   Úprint_resultsr  )	r!   rì  rí  r�   rð  rþ  r  Ú
run_failedró   s	            r&   Ú	run_testsÚDiscoverRunner.run_tests  sÕ  € ð Ñ"Ü�MŠMØ9Ü(Øòð
 	×#Ñ#Ô%Ø× Ñ  Ó:ˆØ×&Ñ& uÓ-ˆ	Ü#&ñ '
Ø*3¯/©/Ô*;ó'
ó $
ˆÔ ð ×Ñ×#Ñ#Ð$:Õ;Ø×-Ñ-Ø!Ø#(×#;Ñ#;ð .ð ˆJ÷ <ð
 ˆ
ð	Ø�O‰O˜IÔ&Ø—^‘^ EÓ*‰Fð
Ø×%Ñ%×+Ñ+Ð,EÕFØ×+Ñ+¨JÔ7÷ Gà×.Ñ.Ô0ð 	×Ñ×&Ñ&Ô(Ø× Ñ  Ó/Ð/÷/ <Õ;ûô ó 	ØˆJØð	ú÷
 GÕFûô ó ö "Øñ "ðûð	Ø×%Ñ%×+Ñ+Ð,EÕFØ×+Ñ+¨JÔ7÷ G×FÖFúà×.Ñ.Õ0øÜó ö "Øñ "ðýsŠ   ÂE
Â6"E ÃE= Ã5E,ÄE= Å

EÅE)Å)F Å,
E:Å6E= Å=FÆFÆHÆG/Æ2GÇ	G/Ç
GÇG/Ç.HÇ/HÈHÈHÈH)r—  rp   r  r†  rŠ  rí   rƒ  r„  r   r‡  r�  rr   r…  ry  r‰  r•  r–  r‚  r$   )NNrž   TFFFFFr   NNNFFTFFNr*   )NN))r\   r]   r^   r_   ry   rñ   Ú	TestSuiterè  r)  rë  ÚTextTestRunnerr  ÚdefaultTestLoaderr¾  r
   r	   rå  r    r{  r«  ré   r®  r²  r   r»  r   rÁ  rÕ  rñ  r   r÷  rú  rÿ  r  r   r   r  r  r  r#  r`   r}   r(   r&   r}  r}  v  s  † ÙBà×#Ñ#€JØ+ÐØ×)Ñ)€KØ×,Ñ,€KØ˜NÐ+€Jð ØØØØØØØØØØØØØØØ ØØØô)9ðv ñ`
ó ð`
ðD ñ#ó ð#ô
(ò$"ò"ð ñLó ðLò#ôJDòL	
ò"ò
òMò
?ò
ò$ò
ò
ò	÷,0r(   r}  c                 ób   •  [        U 5      nS[        US5      4$ ! [        [        4 a     gf = f)z�
Try importing a test label, and return (is_importable, is_package).

Relative labels like "." and ".." are seen as directories.
)FFTÚ__path__)r   ÚImportErrorÚ	TypeErrorÚhasattr)rÐ  Úmods     r&   rË  rË  7  s>   € ðÜ˜EÓ"ˆð ”'˜#˜zÓ*Ð+Ð+øô œÐ#ó Ùðús   ‚ ›.­.c                 óè   •  [         R                  R                  U S5      n[         R                  R                  U5      (       d   U $ [         R                  R	                  U 5      nX :X  a   U $ Un Mr  )Nz__init__.py)rý   rÆ  rE  rÈ  Údirname)r‚  Úinit_pyÚtry_nexts      r&   rÍ  rÍ  E  sh   € ð Ü—'‘'—,‘,˜y¨-Ó8ˆÜ�w‰w�~‰~˜g×&Ñ&Øð Ðô —7‘7—?‘? 9Ó-ˆØÓ ààÐð ˆ	ñ r(   c                 ó8   • U R                    SU R                   3$ )NrÛ  )r]   r^   )r\  s    r&   Ú_class_shuffle_keyr3  ]  s   € Ø�n‰nÐ˜Q˜s×/Ñ/Ð0Ð1Ð1r(   c                 ó  ^• 0 m[         R                  " U [        5       H4  u  p#[        U5      n[        US   5      nUR	                  US S9nUTU'   M6     UR	                  T[
        S9n[         R                  " U4S jU 5       6 $ )z™
Return an iterator over the given tests in a shuffled order, keeping tests
next to other tests of their class.

`tests` should be an iterable of tests.
r   c                 ó"   • U R                  5       $ r*   )Úid)r0   s    r&   Ú<lambda>Úshuffle_tests.<locals>.<lambda>l  s
   € ÀTÇWÁWÄYr(   )ro  c              3   ó.   >#   • U  H
  nTU   v •  M     g 7fr*   r}   )rÞ   r\  Útests_by_types     €r&   rá   Ú shuffle_tests.<locals>.<genexpr>q  s   øé € ÐCº7°C˜]¨3Ö/º7ùs   ƒ)Ú	itertoolsÚgroupbyr¤  rC  ry  r3  Úchain)rI  rº  Ú_Úclass_testsÚ	test_typeÚclassesr:  s         @r&   Úshuffle_testsrC  a  sˆ   ø€ ð €MÜ#×+Ò+¨E´4Ö8‰ˆÜ˜;Ó'ˆÜ˜ Q™Ó(ˆ	Ø×&Ñ& {Ñ8NÐ&ÐOˆØ#.ˆ�iÓ ñ	 9ð ×Ñ˜}Ô2DÐÐE€Gä�?Š?ÔC¹7ÓCÐDÐDr(   c                 ó’   • Uc  U(       a  [        U 5      $ [        U 5      $ [        X5      n U(       d  U $ [        [        U 5      5      $ )z§
Return an iterator that reorders the given tests, keeping tests next to
other tests of their class.

`tests` should be an iterable of tests that supports reversed().
)ÚreversedrN  rC  rC  )rI  rº  r…  s      r&   Úreorder_test_binrF  t  sB   € ð ÑÞÜ˜E“?Ð"ä�E‹{Ðä˜%Ó*€EÞØˆä”D˜“KÓ Ð r(   c              #   óÈ  #   • [        [        U5      S-   5       Vs/ s H  n[        [        5      PM     nnUGt pgU  HH  n[	        Xa5       H  u  pš[        XŠ5      (       d  M    O   Un	U	[        U5         R                  U5        MJ     U HK  n	[        [        R                  R                  U	R                  5       5      5      n [        XUS9 Sh  v•N   MM     gs  snf  N7f)aF  
Reorder an iterable of tests, grouping by the given TestCase classes.

This function also removes any duplicates and reorders so that tests of the
same type are consecutive.

The result is returned as an iterator. `classes` is a sequence of types.
Tests that are instances of `classes[0]` are grouped first, followed by
instances of `classes[1]`, etc. Tests that are not instances of any of the
classes are grouped last.

If `reverse` is True, the tests within each `classes` group are reversed,
but without reversing the order of `classes` itself.

The `shuffler` argument is an optional instance of this module's `Shuffler`
class. If provided, tests will be shuffled within each `classes` group, but
keeping tests with other tests of their TestCase class. Reversing is
applied after shuffling to allow reversing the same random order.
rž   rÞ  N)Úrangerç  r   r   ÚzipÚ
isinstancer¤  ÚaddrC  r<  r>  Úfrom_iterableÚvaluesrF  )rI  rB  r…  rº  ÚiÚbinsÚ
class_binsÚlast_binr0   Útest_binÚ
test_classs              r&   ræ  ræ  ˆ  sÈ   é € ô, .3´3°w³<À!Ñ3CÔ-DÓEÒ-D¨ŒKœ
Ö#Ñ-D€DÐEØ Ñ€ZãˆÜ$'¨
Ö$<Ñ ˆHÜ˜$×+Ó+Ùñ %=ð  ˆHØ”�d“Ñ× Ñ  Ö&ñ ó ˆä”Y—_‘_×2Ñ2°8·?±?Ó3DÓEÓFˆÜ# EÀgÑN×NÒNò ùò Fñ 	Oùs"   ‚C"œCµ)C"Á"A/C"ÃC ÃC"c                 ó¦   • [        U 5      n[        U 5      n[        R                  " U[         5       VVs/ s H  u  p4U" U5      PM     snn$ s  snnf )zCPartition a test suite by test case, preserving the order of tests.)r¤  r   r<  r=  )rð  Úsuite_classrî  r?  rI  s        r&   ré  ré  ¯  sC   € ä�u“+€KÜ Ó&€IÜ/8×/@Ò/@ÀÌDÔ/QÔRÒ/Q¡8 1‰K˜ÖÑ/QÒRÐRùÓRs   µAc                 ó�  • [        U [        R                  R                  5      (       a  g[	        [        U S/ 5      5      n[        U S[        U 5      5      n[        X5      (       a2  [        X5      n[        [        US/ 5      5      nUR                  U5      nU(       a  UR                  U5      (       a  gUR                  U5      $ )NTr‰  Ú_testMethodNameF)rJ  rñ   rã  rä  rˆ  rD  Ústrr,  rC  ÚunionÚ
isdisjoint)r0   r‰  rŠ  Ú	test_tagsÚtest_fn_nameÚtest_fnÚtest_fn_tagss          r&   Útest_match_tagsr_  ¶  s¡   € Ü�$œŸ™×3Ñ3×4Ñ4ð Ü”G˜D &¨"Ó-Ó.€IÜ˜4Ð!2´C¸³IÓ>€LÜˆt×"Ñ"Ü˜$Ó-ˆÜœG G¨V°RÓ8Ó9ˆØ—O‘O LÓ1ˆ	Þ�	×$Ñ$ T×*Ñ*ØØ×Ñ Ó-Ð-r(   c                 ó    ^^• UU4S jU  5       $ )z)Return the matching tests as an iterator.c              3   óP   >#   • U  H  n[        UTT5      (       d  M  Uv •  M     g 7fr*   )r_  )rÞ   r0   rŠ  r‰  s     €€r&   rá   Ú'filter_tests_by_tags.<locals>.<genexpr>È  s   øé € ÐPšU�T¤o°d¸DÀ,×&O�D‰DšUùs   ƒ&�	&r}   )rI  r‰  rŠ  s    ``r&   râ  râ  Æ  s   ù€ åP™UÓPÐPr(   )NNNNN)NFr  )Mr  r5  r‹  r’  r<  r   rú   rý   r¤   rd  rŽ  r´   rñ   rß  Úcollectionsr   Ú
contextlibr   Ú	importlibr   r   rV   r  Údjango.core.managementr   Ú	django.dbr   Údjango.testr	   r
   Údjango.test.utilsr   r   r   r   rô  r   r   r  r   Údjango.utils.cryptor   Údjango.utils.datastructuresr   Údjango.utils.deprecationr   Úipdbrr   r*  Útblib.pickling_supportrŠ   ÚTextTestResultr   rd   r{   Ú
TestResultr„   rë   r  r  r  r  r%  r'  r%  r)  rU  r}  rË  rÍ  r3  rC  rF  ræ  ré  r_  râ  r}   r(   r&   Ú<module>rq     s  ðÛ Û Û Û 	Û Û Û Û 	Û Û Û 
Û Û Û Ý #Ý %Ý #Ý ã ã Ý /Ý !ß 0ß IÑ IÝ AÝ 4Ý GÝ 7Ý (Ý 2Ý =ðÛðÛ!ô
8˜X×4Ñ4ô 8ôv#�X×,Ñ,ô #÷6ñ ôH�x×*Ñ*ô H÷Vñ ò0+ò	
ð €
ð
 ØØØØô&@òR
)ò	ô
m˜×*Ñ*ô m÷`9=ñ 9=÷x~0ñ ~0òB,òò02òEô&!ô($OòNSò.ó QøðC% ó Ýðûð
 ó Ø‚Eðús$   Â"E Â'E/ Å
E,Å+E,Å/E:Å9E: