ó
    F±‰jD  ã            	       óX  • 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JrJr  SSKJrJr  SSK
JrJr  SS	KJr   " S
 S\5      rS r " S S\R4                  5      r " S S\5      r " S S\5      r\	" \R<                  " \R>                  " SSS5      5      R>                  S5      r \	" \R<                  " \R>                  " SSS5      5      R>                  S5      r!S r" " S S\5      r#S r$S"S jr%S"S jr& " S S5      r'\'" 0 5      r(S#S  jr)S! r*g)$é    N)Úpartialé   )ÚErrors)Ú
CodeWriter)ÚTreeFragmentÚstrip_common_indentÚStringParseContext)ÚTreeVisitorÚVisitorTransform)ÚNodesÚTreePath)Ú	PostParsec                   ó.   ^ • \ rS rSrU 4S jrS rSrU =r$ )ÚNodeTypeWriteré   c                 ó>   >• [         TU ]  5         SU l        / U l        g )Nr   )ÚsuperÚ__init__Ú_indentsÚresult©ÚselfÚ	__class__s    €ÚžC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\Cython/TestUtils.pyr   ÚNodeTypeWriter.__init__   s   ø€ Ü‰ÑÔØˆŒØˆ�ó    c                 ót  • U R                   (       d  SnO#U R                   S   nUS   b	  SUSS -  nOUS   nU R                  R                  SU R                  -  U< SUR                  R
                  < 3-   5        U =R                  S-  sl        U R                  U5        U =R                  S-  sl        g )	Nz(root)éÿÿÿÿé   z%s[%d]r   é   z  z: )Úaccess_pathr   Úappendr   r   Ú__name__Úvisitchildren)r   ÚnodeÚnameÚtips       r   Ú
visit_NodeÚNodeTypeWriter.visit_Node   s£   € Ø××Ø‰Dà×"Ñ" 2Ñ&ˆCØ�1‰vÑ!Ø # a¨ (Ñ*‘à˜1‘v�à�‰×Ñ˜4 $§-¡-Ñ/Û'+¨T¯^©^×-DÓ-DÐEñFô 	Gà�Š˜Ñ�Ø×Ñ˜4Ô Ø�Š˜ÑŽr   )r   r   )r#   Ú
__module__Ú__qualname__Ú__firstlineno__r   r(   Ú__static_attributes__Ú__classcell__©r   s   @r   r   r      s   ø† õ÷
ð r   r   c                 ó~   • [        5       nUR                  U 5        SR                  S/UR                  -   S/-   5      $ )z¾Returns a string representing the tree by class names.
There's a leading and trailing whitespace so that it can be
compared by simple string comparison while still making test
cases look ok.Ú
Ú )r   ÚvisitÚjoinr   )ÚrootÚws     r   Ú	treetypesr7   *   s7   € ô
 	Ó€AØ‡G�GˆD„MØ�9‰9�b�T˜AŸH™H‘_¨ tÑ+Ó,Ð,r   c                   ó4   ^ • \ rS rSrU 4S jrU 4S jrSrU =r$ )Ú	TimedTesté4   c                 óV   >• [         TU ]  5         [        R                  " 5       U l        g ©N)r   ÚsetUpÚtimeÚ_start_timer   s    €r   r=   ÚTimedTest.setUp6   s   ø€ Ü‰‰ŒÜŸ9š9›;ˆÕr   c           	      óæ   >• [         R                   " 5       U R                  -
  n[        TU ]  5         [        R
                  R                  SU R                  5        SUS:  a  SOS SUS S35        g )	NÚ[Ú:g      à?r2   z	 SLOWTESTÚ z.2fz sec] )r>   r?   r   ÚtearDownÚsysÚstderrÚwriteÚid)r   Útr   s     €r   rE   ÚTimedTest.tearDown:   s\   ø€ Ü�IŠI‹K˜$×*Ñ*Ñ*ˆÜ‰ÑÔÜ�
‰
×Ñ˜1˜TŸW™W›Y˜K q¨q°2«v©¸;Ð(GÀqÈÈ3ÈÈvÐVÕWr   )r?   )r#   r*   r+   r,   r=   rE   r-   r.   r/   s   @r   r9   r9   4   s   ø† õ'÷Xó Xr   r9   c                   ót   ^ • \ 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S	 jrS
 r\4S jrS rSrU =r$ )Ú
CythonTesté@   c                 óL   >• [         R                  " 5         [        TU ]  5         g r<   )r   Úresetr   r=   r   s    €r   r=   ÚCythonTest.setUpB   s   ø€ Ü�ŠŒÜ‰‰�r   c                 óL   >• [         TU ]  5         [        R                  " 5         g r<   )r   rE   r   rP   r   s    €r   rE   ÚCythonTest.tearDownF   s   ø€ Ü‰ÑÔÜ�Š�r   c           
      ó   • [        U[        5      (       d  UR                  S5      n[        U[        5      (       d  UR                  S5      n[        [	        X5      5       H  u  nu  pEU R                  XESX4U4-  5        M!     U R                  [        U5      [        U5      SSR                  U5      < SSR                  U5      < 35        g)zHChecks that the given strings or lists of strings are equal line by liner1   zLine %d:
Exp: %s
Got: %súUnmatched lines. Got:
ú
Expected:
N)Ú
isinstanceÚlistÚsplitÚ	enumerateÚzipÚassertEqualÚlenr4   )r   Úexpectedr   ÚidxÚexpected_lineÚresult_lines         r   ÚassertLinesÚCythonTest.assertLinesJ   s°   € ä˜(¤D×)Ñ)Ø—~‘~ dÓ+ˆHÜ˜&¤$×'Ñ'Ø—\‘\ $Ó'ˆFÜ1:¼3¸xÓ;PÖ1QÑ-ˆCÑ-�-Ø×Ñ˜]Ø9¸SÐQ\Ð<]Ñ]ö_ñ 2Rð 	×Ñœ˜X›¬¨F¬ØGKÇyÁyÐQYÖGZÐ\`×\eÑ\eÐflÕ\mÐnõ	pr   c                 ód   • [        5       nUR                  U5        UR                  R                  $ r<   )r   rH   r   Úlines)r   ÚtreeÚwriters      r   ÚcodeToLinesÚCythonTest.codeToLinesV   s%   € Ü“ˆØ�‰�TÔØ�}‰}×"Ñ"Ð"r   c                 óB   • SR                  U R                  U5      5      $ )Nr1   )r4   rh   )r   rf   s     r   ÚcodeToStringÚCythonTest.codeToString[   s   € Ø�y‰y˜×)Ñ)¨$Ó/Ó0Ð0r   c           	      ó@  • U R                  U5      n[        UR                  S5      5      n[        [	        X45      5       H  u  nu  pgU R                  XvSXVU4-  5        M!     U R                  [        U5      [        U5      SSR                  U5      < SU< 35        g )Nr1   zLine %d:
Got: %s
Exp: %srU   rV   )rh   r   rY   rZ   r[   r\   r]   r4   )r   r^   Úresult_treeÚresult_linesÚexpected_linesr_   Úliner`   s           r   Ú
assertCodeÚCythonTest.assertCode^   s’   € Ø×'Ñ'¨Ó4ˆä,¨X¯^©^¸DÓ-AÓBˆä*3´C¸Ó4UÖ*VÑ&ˆCÑ&�$Ø×Ñ˜]Ø9¸SÈÐ<VÑVöXñ +Wð 	×Ñœ˜\Ó*¬C°Ô,?ØGKÇyÁyÐQ]ÖG^Ò`hÐiõ	kr   c                 óX   • U R                  [        R                  " X!5      S SU-  5        g )Nz"Path '%s' not found in result tree)ÚassertNotEqualr   Ú
find_first)r   Úpathrn   s      r   ÚassertNodeExistsÚCythonTest.assertNodeExistsi   s(   € Ø×ÑœH×/Ò/°ÓBÀDØ@À4ÑGõ	Ir   c                 ó0  • Uc  0 nUc  / nU R                  5       nUR                  S5      (       a  U[        S5      S nUR                  SS5      n[        R
                  " 5        n[        XX#S9nSSS5        W(       a  US   eW$ ! , (       d  f       N= f)zNSimply create a tree fragment using the name of the test-case in parse errors.Nz	__main__.Ú.Ú_©Úpipeliner   )rI   Ú
startswithr]   Úreplacer   Úlocal_errorsr   )r   ÚcodeÚpxdsr~   r&   ÚerrorsÚfragments          r   r…   ÚCythonTest.fragmentm   sŽ   € à‰<ØˆDØÑØˆHØ�w‰w‹yˆØ�?‰?˜;×'Ñ'Øœ˜KÓ(Ð)Ð*ˆDØ�|‰|˜C Ó%ˆä× Ò Ô" fÜ# D°ÑHˆH÷ #ö Ø˜‘)ˆOØˆ÷ #Õ"ús   Á&BÂ
Bc                 ó   • [        U5      $ r<   )r7   )r   r5   s     r   r7   ÚCythonTest.treetypes   s   € Ü˜‹Ðr   c                 óš   •  U" 5         U R                  SU-  5        g! U a&  nU R                  [        X25      5        Us SnA$ SnAff = f)zƒCalls "func" and fails if it doesn't raise the right exception
(any exception by default). Also returns the exception in question.
z Expected an exception of type %rN)ÚfailÚ
assertTruerW   )r   ÚfuncÚexc_typeÚes       r   Úshould_failÚCythonTest.should_fail‚   sD   € ð	ÙŒFØ�I‰IÐ8¸8ÑCÕDøØó 	Ø�O‰OœJ qÓ3Ô4Ø�Hûð	ús   ‚ žA
¤A¿A
ÁA
c                 ót   •  U" 5       $ ! [          a$  nU R                  [        U5      5         SnAgSnAff = f)z™Calls func and succeeds if and only if no exception is raised
(i.e. converts exception raising into a failed testcase). Returns
the return value of func.N)Ú	ExceptionrŠ   Ústr)r   rŒ   Úexcs      r   Úshould_not_failÚCythonTest.should_not_fail�   s1   € ð	 Ù“6ˆMøÜó 	 Ø�I‰I”c˜#“h×Ñûð	 ús   ‚	 ‰
7“2²7© )NN)r#   r*   r+   r,   r=   rE   rb   rh   rk   rr   rx   r…   r7   r’   r�   r•   r-   r.   r/   s   @r   rM   rM   @   sG   ø† õõò
pò#ò
1ò	kòIôò$ð *3ô 	÷ ð  r   rM   c                   ó"   • \ rS rSrSrSS jrSrg)ÚTransformTesté—   aê  
Utility base class for transform unit tests. It is based around constructing
test trees (either explicitly or by parsing a Cython code string); running
the transform, serialize it using a customized Cython serializer (with
special markup for nodes that cannot be represented in Cython),
and do a string-comparison line-by-line of the result.

To create a test case:
 - Call run_pipeline. The pipeline should at least contain the transform you
   are testing; pyx should be either a string (passed to the parser to
   create a post-parse tree) or a node representing input to pipeline.
   The result will be a transformed result.

 - Check that the tree is correct. If wanted, assertCode can be used, which
   takes a code string as expected, and a ModuleNode in result_tree
   (it serializes the ModuleNode to a string and compares line-by-line).

All code strings are first stripped for whitespace lines and then common
indentation.

Plans: One could have a pxd dictionary parameter to run_pipeline.
Nc                 óh   • Uc  0 nU R                  X#5      R                  nU H  nU" U5      nM     U$ r<   )r…   r5   )r   r~   Úpyxrƒ   rf   ÚTs         r   Úrun_pipelineÚTransformTest.run_pipeline¯   s8   € Ø‰<ØˆDØ�}‰}˜SÓ'×,Ñ,ˆãˆAÙ�T“7ŠDñ àˆr   r—   r<   )r#   r*   r+   r,   Ú__doc__rž   r-   r—   r   r   r™   r™   —   s   † ñ÷.r   r™   z\s+r2   zz
        /[*] (
            (?: [^*\n] | [*][^/] )*
            [\n]
            (?: [^*] | [*][^/] )*
        ) [*]/
    z\s\s+zÅ
    (?:
        <pre class=["'][^"']*cython\s+line[^"']*["']\s*>
        (?:[^<]|<(?!/pre))+
        </pre>
    )|(?:
        <style[^>]*>
        (?:[^<]|<(?!/style))+
        </style>
    )
    c                 óf  • S =pU R                  S5      (       a+  [        R                  " SU SS  SS9u  pU R                  5       n U R                  S5      (       aT  U SS  R                  5       n U R                  S5      (       a+  [        R                  " SU SS  SS9u  p U R                  5       n XU 4$ )NÚ/z(?<!\\)/r   )ÚmaxsplitrC   )r   ÚrerY   Ústrip)ÚpatternÚstartÚends      r   Ú_parse_patternr©   Ö   s¦   € ØÐ€EØ×Ñ˜#×ÑÜŸš +¨w°q°r¨{ÀQÑG‰ˆØ—-‘-“/ˆØ×Ñ˜#×ÑØ˜!˜"�+×#Ñ#Ó%ˆØ×Ñ˜c×"Ñ"ÜŸ8š8 K°¸¸°ÀqÑI‰LˆCØ—m‘m“oˆGØ�wÐÐr   c                   óX   ^ • \ rS rSrU 4S jrS rS rS rS r\	R                  rSrU =r$ )ÚTreeAssertVisitoréã   c                 óL   >• [         TU ]  5         S U l        / U l        / U l        g r<   )r   r   Ú_module_posÚ_c_patternsÚ_c_antipatternsr   s    €r   r   ÚTreeAssertVisitor.__init__ç   s&   ø€ Ü‰ÑÔØˆÔØˆÔØ!ˆÕr   c                 ó|   ^ ^^^^^• T R                   T R                  smmS mUU 4S jmUUUUU 4S jmUUU4S jnU$ )Nc           	      ó\   • [         R                  " U SU< SU(       a  SOS< SU< 35        g )Nz	Pattern 'z' Úwaszwas notz
 found in )r   Úerror)Úposr¦   ÚfoundÚ	file_paths       r   rŠ   Ú7TreeAssertVisitor.create_c_file_validator.<locals>.failð   s%   € Ü�LŠL™ÛÞ‘ IÒ-Úðõ r   c                 ó4  >• U(       aC  [         R                  " X!5      nU(       a  XR                  5       S  nOT" TR                  USU S9  U(       aE  [         R                  " X15      nU(       a  US UR	                  5        nU$ T" TR                  USU S9  U$ )NF©r·   r¸   )r¤   Úsearchr¨   r®   r§   )r¸   Úcontentr§   r¨   rY   rŠ   r   s        €€r   Úextract_sectionÚBTreeAssertVisitor.create_c_file_validator.<locals>.extract_section÷   sƒ   ø€ ÞÜŸ	š	 %Ó1�ÞØ%§i¡i£k lÐ3‘Gá˜×)Ñ)¨5¸ÈÒSÞÜŸ	š	 #Ó/�ÞØ% n u§{¡{£}Ð5�Gð ˆNñ ˜×)Ñ)¨3°eÀyÒQØˆNr   c                 óF  >• T
 HJ  n[        U5      u  p4nT" XX45      n[        R                  " X%5      (       a  M7  T	" TR                  USU S9  ML     T HJ  n[        U5      u  p4nT" XX45      n[        R                  " Xe5      (       d  M7  T	" TR                  USU S9  ML     g )NFr»   T)r©   r¤   r¼   r®   )r¸   r½   r¦   r§   r¨   ÚsectionÚantipatternÚantipatternsr¾   rŠ   Úpatternsr   s          €€€€€r   Úvalidate_file_contentÚHTreeAssertVisitor.create_c_file_validator.<locals>.validate_file_content  s•   ø€ Û#�ä&4°WÓ&=Ñ#�˜GÙ)¨)¸eÓI�Ü—y’y ×2Ó2Ù˜×)Ñ)¨7¸%È9ÔUñ $ó  ,�ä*8¸Ó*EÑ'�˜KÙ)¨)¸eÓI�Ü—9’9˜[×2Ó2Ù˜×)Ñ)¨;¸dÈiÔXò  ,r   c                 óÌ   >• U R                   nT(       d	  T(       d  U $ [        USS9 nUR                  5       nS S S 5        [        W5      nT" X5        g ! , (       d  f       N"= f)NÚutf8)Úencoding)Úc_fileÚopenÚreadÚ_strip_c_comments)r   rÊ   Úfr½   rÃ   rÄ   rÅ   s       €€€r   Úvalidate_c_fileÚBTreeAssertVisitor.create_c_file_validator.<locals>.validate_c_file  sM   ø€ Ø—]‘]ˆFÞ¦à�ä�f vÒ.°!ØŸ&™&›(�÷ /ä'¨Ó0ˆGÙ! &Õ2÷ /Õ.ús   ¨AÁ
A#)r¯   r°   )r   rÏ   rÃ   r¾   rŠ   rÄ   rÅ   s   ` @@@@@r   Úcreate_c_file_validatorÚ)TreeAssertVisitor.create_c_file_validatorí   s>   ý€ Ø!%×!1Ñ!1°4×3GÑ3GÐˆ�,ò	ö	÷	Yñ 	Y÷		3ð Ðr   c                 óÆ  • UR                   nSU;   aI  US    H@  n[        R                  " X5      b  M  [        R                  " UR
                  SU-  5        MB     SU;   aK  US    HB  n[        R                  " X5      nUc  M  [        R                  " UR
                  SU-  5        MD     SU;   a  U R                  R                  US   5        SU;   a  U R                  R                  US   5        SU;   ag  US   nUb^  SS	K	J
n  U" 5       nU" UR                  5      (       + nXX:w  a4  U" UR                  5        [        R                  " UR
                  S
5        g g g g )NÚtest_assert_path_existsz+Expected path '%s' not found in result treeÚtest_fail_if_path_existsz)Unexpected path '%s' found in result treeÚtest_assert_c_code_hasÚtest_fail_if_c_code_hasÚ"test_body_needs_exception_handlingr   )ÚHasNoExceptionHandlingVisitorz,Node had unexpected exception handling value)Ú
directivesr   rv   r   rµ   r¶   r¯   Úextendr°   ÚCompiler.ParseTreeTransformsrÙ   Úbody)	r   r%   rÚ   rw   Ú
first_nodeÚvaluerÙ   Úvisitorr   s	            r   Ú_check_directivesÚ#TreeAssertVisitor._check_directives"  sM  € Ø—_‘_ˆ
Ø$¨
Ó2Ø"Ð#<Ô=�Ü×&Ò& tÓ2Ó:Ü—L’LØŸ™ØEÈÑLöNñ >ð
 &¨Ó3Ø"Ð#=Ô>�Ü%×0Ò0°Ó<�
ØÓ)Ü—L’LØ"Ÿ™ØCÀdÑJöLñ ?ð $ zÓ1Ø×Ñ×#Ñ# JÐ/GÑ$HÔIØ$¨
Ó2Ø× Ñ ×'Ñ'¨
Ð3LÑ(MÔNØ/°:Ó=ØÐCÑDˆEØÑ ÝWÙ7Ó9�Ù$ T§Y¡YÓ/Ô/�Ø“?Ù˜DŸI™IÔ&Ü—L’LØŸ™ØFõð #ð	 !ð >r   c                 ól   • UR                   U l        U R                  U5        U R                  U5        U$ r<   )r¶   r®   rá   r$   ©r   r%   s     r   Úvisit_ModuleNodeÚ"TreeAssertVisitor.visit_ModuleNodeB  s/   € ØŸ8™8ˆÔØ×Ñ˜tÔ$Ø×Ñ˜4Ô Øˆr   c                 óJ   • U R                  U5        U R                  U5        U$ r<   )rá   r$   rä   s     r   Úvisit_CompilerDirectivesMixinÚ/TreeAssertVisitor.visit_CompilerDirectivesMixinH  s#   € Ø×Ñ˜tÔ$Ø×Ñ˜4Ô Øˆr   )r°   r¯   r®   )r#   r*   r+   r,   r   rÑ   rá   rå   rè   r   Úrecurse_to_childrenr(   r-   r.   r/   s   @r   r«   r«   ã   s+   ø† õ"ò3òjò@òð
 "×5Ñ5†Jr   r«   c                 óØ  • [         R                  /[         R                  [        R                  R	                  US5      /[         R                  [        R                  R	                  US5      /S.nUc  [
        R                  " 5       n/ S pT[        U S5       n U GH   nUS S S:X  Ga  UR                  5       R                  S5      R                  5       R                  S5      R                  S	[        R                  R                  5      n[        R                  R	                  X5      n	[        R                  R                  [        R                  R                  U	5      5      (       d3  [        R                  " [        R                  R                  U	5      5        Ub  US pZU
R                  5         [        U	S
5      nGM*  Ub  UR!                  U5        GMA  UR                  5       S;   d$  UR#                  5       R%                  S5      (       a  GM|  [&        R(                  " UR                  S5      5      nU(       d  GM«  / nSnU H:  nU(       a  Xã;   a  UR+                  X>   5        M$  UR-                  U5        US:H  nM<     UR-                  U5        GM     Ub  UR                  5         S S S 5        X4$ ! Ub  UR                  5         f f = f! , (       d  f       X4$ = f)Nz	cython.pyzcythonize.py)ÚPYTHONÚCYTHONÚ	CYTHONIZEÚrbé   s   #####ó   #rÈ   r¢   Úwb)r   s   """s   '''TÚ|)rF   Ú
executableÚosrw   r4   ÚtempfileÚmkdtemprË   r¥   Údecoder€   ÚsepÚexistsÚdirnameÚmakedirsÚcloserH   Úlstripr   ÚshlexrY   rÛ   r"   )Ú	tree_fileÚworkdirÚcython_rootÚprogramsÚheaderÚcur_filerÎ   rq   Úfilenamerw   Úto_closeÚcommandÚargsÚnext_is_commandÚargs                  r   Úunpack_source_treer  P  s1  € ä—>‘>Ð"Ü—>‘>¤2§7¡7§<¡<°¸[Ó#IÐJÜ—n‘n¤b§g¡g§l¡l°;ÀÓ&OÐPñ€Hð �Ü×"Ò"Ó$ˆØ˜4ˆHÜ	ˆi˜Ô	 !ð	!Ü�Ø˜˜�8˜xÔ'Ø#Ÿz™z›|×1Ñ1°$Ó7×=Ñ=Ó?×FÑFÀvÓN×VÑVÐWZÔ\^×\cÑ\c×\gÑ\gÓh�HÜŸ7™7Ÿ<™<¨Ó:�DÜŸ7™7Ÿ>™>¬"¯'©'¯/©/¸$Ó*?×@Ñ@ÜŸš¤B§G¡G§O¡O°DÓ$9Ô:ØÑ+Ø-5°t (Ø Ÿ™Ô(Ü# D¨$Ó/“HØÑ)Ø—N‘N 4×(Ø—Z‘Z“\Ð%:Ó:¸d¿k¹k»m×>VÑ>VÐW[×>\Ñ>\Úä#Ÿkšk¨$¯+©+°fÓ*=Ó>�GÞ"¢HØ�DØ&*�OÛ&˜Þ*¨s«Ø ŸK™K¨©Ö6à ŸK™K¨Ô,Ø.1°S©jšOñ  'ð —M‘M $×'ñ3 ð6 Ñ#Ø—‘Ô ÷= 
ð> ˆ?Ðøð Ñ#Ø—‘Õ ð $ú÷; 
Ô	ð> ˆ?Ðús%   ÂKÂHK Ê"KË KËKË
K)c                 óö   • [        U[        5      (       a  SnSnSnOSnSnSnUc  UnU(       a  [        R                  " U5      n[	        XX5S9 nUR                  U5        SSS5        g! , (       d  f       g= f)z�Write some content (text or bytes) to the file
at `file_path` without translating `'\n'` into `os.linesep`.

The default encoding is `'utf-8'`.
rò   Nr6   r1   zutf-8)ÚmoderÉ   Únewline)rW   ÚbytesÚtextwrapÚdedentrË   rH   )r¸   r½   r  rÉ   r  r  Údefault_encodingrÎ   s           r   Ú
write_filer  |  sv   € ô �'œ5×!Ñ!Øˆð ˆØÑàˆð ˆØ"ÐàÑØ#ˆæÜ—/’/ 'Ó*ˆä	ˆi¨XÒ	GÈ1Ø	�‰�Ô÷ 
H×	GÖ	Gús   ÁA*Á*
A8c                 ó2  • [        XX4S9   [        R                  R                  U5      nUb#  U[        R                  R                  U 5      :¼  a5  [        XX4S9  Uc  M  U[        R                  R                  U 5      :¼  a  M4  gg! [         a    Sn Njf = f)zË
Write `content` to the file `file_path` without translating `'\n'`
into `os.linesep` and make sure it is newer than the file `newer_than`.

The default encoding is `'utf-8'` (same as for `write_file`).
)r  rÉ   N)r  rõ   rw   ÚgetmtimeÚOSError)r¸   Ú
newer_thanr½   r  rÉ   Ú
other_times         r   Úwrite_newer_filer  š  sƒ   € ô ˆy¨&ÒDðÜ—W‘W×%Ñ% jÓ1ˆ
ð
 Ñ
 
¬b¯g©g×.>Ñ.>¸yÓ.IÓ IÜ�9¨fÒHð Ó
 
¬b¯g©g×.>Ñ.>¸yÓ.I× Iøô	 ó àŠ
ðús   ŒB ÂBÂBc                   ó   • \ rS rSrS rSrg)ÚDictEvalScopei­  c                 ó&   • UR                   U l        g r<   )ÚgetÚlookup)r   Ú	namespaces     r   r   ÚDictEvalScope.__init__®  s   € Ø—m‘mˆ�r   )r  N)r#   r*   r+   r,   r   r-   r—   r   r   r  r  ­  s   † õ$r   r  c                 ót  • [        U 5      n[        U[        R                  5      (       a9  [	        UR
                  5      S:X  d   UR
                  5       eUR
                  S   n[        U[        R                  5      (       a  UR                  nUR                  U(       a  [        U5      5      $ [        5      $ )z3
Parse code and evaluate it in a compile time env.
r   r   )Úparse_python_coderW   r   ÚStatListNoder]   ÚstatsÚExprStatNodeÚexprÚcompile_time_valuer  Úempty_eval_scope)r‚   r   r%   s      r   Úcompiled_evalr*  ´  sŠ   € ô ˜TÓ"€Dä�$œ×*Ñ*×+Ñ+Ü�4—:‘:‹ !Ó#Ð/ T§Z¡ZÓ/Ð#Ø�z‰z˜!‰}ˆÜ�$œ×*Ñ*×+Ñ+Ø�y‰yˆà×"Ñ"¾y¤=°Ó#;Ó_Ð_ÔN^Ó_Ð_r   c                 óŠ  • [        S5      n " S S[        5      n[        U5      nUR                  U" 5       5         [        R
                  " 5        n[        X/S9nUR                  5       nSSS5        W(       a  US   eW$ ! , (       d  f       N= f! [        R                   a  n[        UR                  5      eSnAff = f)z¢
Compiles code far enough to get errors from the parser and post-parse stage.
Is useful for checking for syntax errors, however it doesn't generate runable
code.
Útestc                   ó   • \ rS rSr/ rSrg)Ú*parse_python_code.<locals>.DummyModuleNodeiÊ  r—   N)r#   r*   r+   r,   Úchild_attrsr-   r—   r   r   ÚDummyModuleNoder.  Ê  s   † Ø‹r   r0  r}   Nr   )r	   Úobjectr   rå   r   r�   r   Ú
substituteÚCompileErrorÚSyntaxErrorÚmessage_only)r‚   Úcontextr0  Ú
post_parser„   r   rŽ   s          r   r#  r#  Ã  s©   € ô ! Ó(€Gôœ&ô ä˜7Ó#€JØ×Ñ¡Ó 1Ô2ð	*Ü× Ò Ô" fÜ! $°Ñ>ˆFØ×&Ñ&Ó(ˆF÷ #ö Ø˜‘)ˆOàˆM÷ #Õ"ûô ×Ñó *Ü˜!Ÿ.™.Ó)Ð)ûð*ús/   ½B ÁBÁ-B Â
BÂB ÂCÂ(B=Â=C)FNr<   )+rõ   r¤   Úunittestrÿ   rF   rö   r  r>   Ú	functoolsr   ÚCompilerr   r   ÚCompiler.TreeFragmentr   r   r	   ÚCompiler.Visitorr
   r   r   r   rÜ   r   r   r7   ÚTestCaser9   rM   r™   ÚcompileÚsubrÍ   Ú_strip_cython_code_from_htmlr©   r«   r  r  r  r  r)  r*  r#  r—   r   r   Ú<module>rA     s*  ðÛ 	Û 	Û Û Û 
Û Û Û Ý å Ý "ß XÑ Xß ;ß %Ý 3ô�[ô ò.-ô	X�×!Ñ!ô 	XôT �ô T ôn�Jô ñL ˜BŸJšJØ‡F‚Fˆ6�2ð ó 	ó÷ �#€róÐ ñ  ' r§z¢zØ‡F‚Fˆ8�Rð 
ó 
	ó(÷ �#€ró Ð ò
ôj6Ð(ô j6òZ)ôXô<I÷&$ñ $ñ ! Ó$Ð ô`ó*r   