
    O&iW                        d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZmZ dd
l m!Z! ddl"Z"ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 e
rddl1m2Z2  e(j3        e4          Z5 ej6        dej7                  Z8 ej6        dej7                  Z9de:de:de;fdZ< G d de,          Z= G d de=          Z> G d de=          Z? G d d e=          Z@ G d! d"e=          ZA G d# d$e=          ZB ejC                    ZD G d% d&          ZE G d' d(          ZF G d) d*ejG                  ZH G d+ d,e$          ZId-d.dee:ef         fd/ZJdS )0zfMimic doctest in Sphinx.

The extension automatically execute code snippets and checks their results.
    N)StringIO)path)TYPE_CHECKINGAnyCallableDictIterableListOptionalSequenceSetTupleType)nodes)ElementNodeTextElement)
directives)InvalidSpecifierSpecifierSet)Version)Builder)__)logging)bold)SphinxDirective)relpath)
OptionSpec)Sphinxz^\s*<BLANKLINE>z#\s*doctest:.+$specversionreturnc                 >    t          |          t          |           v S )aY  Check `spec` satisfies `version` or not.

    This obeys PEP-440 specifiers:
    https://peps.python.org/pep-0440/#version-specifiers

    Some examples:

        >>> is_allowed_version('<=3.5', '3.3')
        True
        >>> is_allowed_version('<=3.2', '3.3')
        False
        >>> is_allowed_version('>3.2, <4.0', '3.3')
        True
    )r   r   )r    r!   s     _/home/geonatureadmin/si_en_reseau/tutos/venv/lib/python3.11/site-packages/sphinx/ext/doctest.pyis_allowed_versionr%   (   s     7|D1111    c                   :    e Zd ZdZdZdZdZdZdee	         fdZ
dS )TestDirectivez4
    Base class for doctest-related directives.
    Tr      r"   c                    d                     | j                  }d }| j        dk    rcd|v r|}t                              d|          }t
                              |          r(d| j        vr|s|}t
                              d|          }t          j	        }| j        dv s	d| j        v rt          j
        }| j        r+d | j        d	                             d
          D             }ndg} |||| j        |          }|                     |           |||d<   | j        dk    rd|d<   n!| j        dk    rd|d<   n| j        dk    rd|d<   i |d<   | j        dv rd| j        v r| j        d                             d
d                                          }|D ]}|d	         |dd          }	}|dvr<| j        j        j                            t'          d          |z  | j                   T|	t*          j        vr<| j        j        j                            t'          d          |	z  | j                   t*          j        |dd                   }
|d	         dk    |d         |
<   | j        dk    rd| j        v r	 | j        d         }d                     d t.          j        d d          D                       }t3          ||          st*          j        d!         }
d"|d         |
<   nK# t4          $ r> | j        j        j                            t'          d#          |z  | j                   Y nw xY wd$| j        v r| j        d$         |d$<   d%| j        v rd"|d&<   nd| j        v rd'|d&<   |gS )(N
doctestz<BLANKLINE> no-trim-doctest-flags)	testsetuptestcleanuphidec                 6    g | ]}|                                 S  )strip).0xs     r$   
<listcomp>z%TestDirective.run.<locals>.<listcomp>X   s     FFFAaggiiFFFr&   r   ,default)testnodetypegroupstestpyconlanguagetestcodepython
testoutputnoneoptions)r,   rA    r)   z+-z"missing '+' or '-' in '%s' option.)linez'%s' is not a valid option.+	pyversion.c                 ,    g | ]}t          |          S r3   )str)r5   vs     r$   r7   z%TestDirective.run.<locals>.<listcomp>|   s    *P*P*Pa3q66*P*P*Pr&      SKIPTz$'%s' is not a valid pyversion optionskipiftrim-doctest-flags
trim_flagsF)joincontentnameblankline_resubdoctestopt_researchrC   r   literal_blockcomment	argumentssplitset_source_inforeplacestatedocumentreporterwarningr   linenor,   OPTIONFLAGS_BY_NAMEsysversion_infor%   r   )selfcoder<   nodetyper;   nodeoption_stringsoptionprefixoption_nameflagr    python_versions                r$   runzTestDirective.runF   s    yy&&9	!!$$#''D11##D)) 3.ET\.Y.Y  D$((T22&+&99444$,8N8N}H> 	!FF):)@)@)E)EFFFFF[Fxd6JJJT"""DL9	!!&DY*$$'DY,&&%DY9111i4<6O6O!\)4<<S#FFLLNNN( ; ;&,Qi%%J'088?@@6I![ 9 * * * g&AAAJ'088899KG![ 9 * * * 26!"":>)/c)9Y%%9	!!kT\&A&A	&|K0!$*P*P3;KBQB;O*P*P*P!Q!Q)$?? 1"6v>D,0DOD)# & & &
#,44=>>E 5 & & & & && t|##!\(3DN4<//!%D$44!&Dvs   =A+K) )AL10L1N)__name__
__module____qualname____doc__has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer
   r   rp   r3   r&   r$   r(   r(   <   s]          K $DT$Z D D D D D Dr&   r(   c                   ,    e Zd ZU dej        iZeed<   dS )TestsetupDirectiverN   option_specNrq   rr   rs   r   unchanged_requiredr{   r   __annotations__r3   r&   r$   rz   rz      6         */K     r&   rz   c                   ,    e Zd ZU dej        iZeed<   dS )TestcleanupDirectiverN   r{   Nr|   r3   r&   r$   r   r      r   r&   r   c                   h    e Zd ZU ej        ej        ej        ej        ej        ej        dZee	d<   dS )DoctestDirectiver1   r.   rC   rG   rN   rO   r{   N
rq   rr   rs   r   rn   	unchangedr}   r{   r   r~   r3   r&   r$   r   r      T         !+'2/(o K     r&   r   c                   \    e Zd ZU ej        ej        ej        ej        ej        dZeed<   dS )TestcodeDirective)r1   r.   rG   rN   rO   r{   N)	rq   rr   rs   r   rn   r}   r{   r   r~   r3   r&   r$   r   r      sN         !+2/(o K     r&   r   c                   h    e Zd ZU ej        ej        ej        ej        ej        ej        dZee	d<   dS )TestoutputDirectiver   r{   Nr   r3   r&   r$   r   r      r   r&   r   c                   @    e Zd ZdeddfdZddddeddfd	Zdefd
ZdS )	TestGrouprS   r"   Nc                 >    || _         g | _        g | _        g | _        d S N)rS   setuptestscleanup)rf   rS   s     r$   __init__zTestGroup.__init__   s"    	%'
+-
')r&   Frg   TestCodeprependc                 B   |j         dk    r;|r| j                            d|           d S | j                            |           d S |j         dk    r| j                            |           d S |j         dk    r| j                            |g           d S |j         dk    r| j                            |d g           d S |j         dk    r;| j        r0t          | j        d                   dk    r|| j        d         d	<   d S d S d S t          t          d
                    )Nr/   r   r0   r,   r?   rA      r)   zinvalid TestCode type)	typer   insertappendr   r   lenRuntimeErrorr   )rf   rg   r   s      r$   add_codezTestGroup.add_code   s@   9## (
!!!T*****
!!$'''''Y-''L%%%%%Y)##Jtf%%%%%Y*$$JtTl+++++Y,&&z )c$*R.11Q66$(
2q!!!) )66 r"9::;;;r&   c           	      H    d| j         d| j        d| j        d| j        d	S )NzTestGroup(name=z, setup=z
, cleanup=z, tests=))rS   r   r   r   rf   s    r$   __repr__zTestGroup.__repr__   s/     IIItzzz4<<<= 	=r&   )F)rq   rr   rs   rJ   r   boolr   r   r3   r&   r$   r   r      s        *S *T * * * *< <Z <$ <4 < < < <$=# = = = = = =r&   r   c                   J    e Zd Z	 d
dededededee         ddfdZdefd	ZdS )r   Nrg   r   filenamerb   rC   r"   c                 P    || _         || _        || _        || _        |pi | _        d S r   rg   r   r   rb   rC   )rf   rg   r   r   rb   rC   s         r$   r   zTestCode.__init__   s-    		 }"r&   c                 X    d| j         d| j        d| j        d| j        d| j        dS )Nz	TestCode(z, z, filename=z	, lineno=z
, options=r   r   r   s    r$   r   zTestCode.__repr__   s9     IIItyyy$---dlllL 	Lr&   r   )	rq   rr   rs   rJ   intr   r   r   r   r3   r&   r$   r   r      s        8<% %S % %s %%'/~%AE% % % %L# L L L L L Lr&   r   c            	       V     e Zd Zd	dededeeef         f fdZ	 d	dede	de	fdZ
 xZS )
SphinxDocTestRunnerNoutverboser"   c                    t                      }t          j        }|t          _        	 t                                          |          }|t          _        n# |t          _        w xY w ||                                           |S r   )r   rd   stdoutsuper	summarizegetvalue)rf   r   r   	string_io
old_stdoutres	__class__s         r$   r   zSphinxDocTestRunner.summarize   ss    JJ	Z

	$''##G,,C#CJJCJ####I  !!!
s   !A A%r   module_globalsc                 f   | j                             |          }|r|                    d          | j        j        k    r]	 | j        j        t          |                    d                             }|j                            d          S # t          $ r Y nw xY w| 
                    ||          S )NrS   
examplenumT)%_DocTestRunner__LINECACHE_FILENAME_REmatchgroupr<   rS   examplesr   source
splitlines
IndexErrorsave_linecache_getlines)rf   r   r   mexamples        r$   *_DocTestRunner__patched_linecache_getlinesz>SphinxDocTestRunner._DocTestRunner__patched_linecache_getlines   s     6<<XFF 		7DIN227),S1F1F-G-GH ~00666     ++HnEEEs   2B 
BBr   )rq   rr   rs   r   r   r   r   r   rJ   r   r   __classcell__)r   s   @r$   r   r      s        
 
X 
 
S#X
 
 
 
 
 
 JNF F3 FCFFRUF F F F F F F Fr&   r   c                   ^   e Zd ZdZdZ ed          Zd"dZdeddfdZ	deddfd	Z
d#d
edee         defdZdee         fdZd"dZ	 d$dee         dee         deddfdZded
edefdZededee         fd            ZdedefdZd
ededdfdZdedededededefdZd eddfd!ZdS )%DocTestBuilderz2
    Runs test snippets in the documentation.
    r,   zZTesting of doctests in the sources finished, look at the results in %(outdir)s/output.txt.r"   Nc           	         | j         j        | _        | j        t          _        | j         j        t          j        dd<   d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        t          j        d          }t#          t          j        | j        d          dd          | _        | j                            d|d	d
t-          |          z  d           d S )Nr   singlez%Y-%m-%d %H:%M:%Sz
output.txtwzutf-8)encodingz"Results of doctest builder run on z#
===================================r+   )configdoctest_default_flagsoptcompiler,   doctest_pathrd   r   r   total_failurestotal_triessetup_failuressetup_triescleanup_failurescleanup_triestimestrftimeopenrQ   outdiroutfilewriter   )rf   dates     r$   initzDocTestBuilder.init  s    ;4 ,01	 !}011DIdk<@@#PWXXX DD#D		///3 	4 	4 	4 	4 	4r&   textc                 r    t                               |d           | j                            |           d S NT)nonl)loggerinfor   r   rf   r   s     r$   _outzDocTestBuilder._out/  s4    Dt$$$4     r&   c                     | j         j        s| j         j        rt                              |           nt                              |d           | j                            |           d S r   )appquietwarningiserrorr   ra   r   r   r   r   s     r$   	_warn_outzDocTestBuilder._warn_out3  sa    8> 	)TX4 	)NN4    KK4K(((4     r&   docnametypc                     dS )Nr-   r3   )rf   r   r   s      r$   get_target_urizDocTestBuilder.get_target_uri:  s    rr&   c                     | j         j        S r   )env
found_docsr   s    r$   get_outdated_docsz DocTestBuilder.get_outdated_docs=  s    x""r&   c           
      ~   dt           dt          fd}| j         || j                  | j         || j                  | j         || j                  | j         || j                  f}|                     d|z             | j                                         | j        s| j        s| j        rd| j	        _
        d S d S )NrK   r"   c                     | dk    rdndS )Nr)   sr-   r3   )rK   s    r$   r   z DocTestBuilder.finish.<locals>.sB  s    q&&33b(r&   z}
Doctest summary
===============
%5d test%s
%5d failure%s in tests
%5d failure%s in setup code
%5d failure%s in cleanup code
r)   )r   rJ   r   r   r   r   r   r   closer   
statuscode)rf   r   repls      r$   finishzDocTestBuilder.finish@  s    	) 	) 	) 	) 	) 	) !!D$4"5"5#QQt':%;%;#QQt':%;%;%qq)>'?'?A 			   	 	 	 	 	$$"5 	$9N 	$"#DH	$ 	$r&   updatebuild_docnamesupdated_docnamesmethodc                     |t          | j        j                  }t                              t          d                     |D ]2}| j                            |          }|                     ||           3d S )Nzrunning tests...)sortedr   all_docsr   r   r   get_doctreetest_doc)rf   r   r   r   r   doctrees         r$   r   zDocTestBuilder.writeU  sz    !#DH$566ND+,,---% 	, 	,Gh**733GMM'7++++	, 	,r&   ri   c                     	 t          |j        | j        j                                      dd          d         }n+# t
          $ r | j                            |d          }Y nw xY w|S )zsTry to get the file which actually contains the doctest, not the
        filename of the document it's included in.:docstring of r)   )maxsplitr   F)r   r   r   srcdirrsplit	Exceptiondoc2path)rf   ri   r   r   s       r$   get_filename_for_nodez$DocTestBuilder.get_filename_for_node`  sr    	9t{DHO<<(155a9HH 	9 	9 	9x((%88HHH	9s   := %A%$A%c                 f    dt          j        | j        pd          v rdS | j        
| j        dz
  S dS )z0Get the real line number or admit we don't know.r  r-   Nr)   )r   basenamer   rE   ri   s    r$   get_line_numberzDocTestBuilder.get_line_numberj  s@    
 t}T[->B????
 49 9q= tr&   c                     d|vrdS |d         }i }| j         j        rt          | j         j        |           t          ||          }| j         j        rt          | j         j        |           |S )NrN   F)r   doctest_global_setupexecevaldoctest_global_cleanup)rf   ri   	conditioncontextshould_skips        r$   skippedzDocTestBuilder.skippedz  s{    45XI&(G{/ @T[5w???y'22K{1 BT[7AAAr&   r  c           
      d   i }g }t          d| j                  | _        t          d| j                  | _        t          d| j                  | _        | j        j        | j        _        | j        j        | j        _        | j        j        rdt          dt          fd}ndt          dt          fd}|
                    |          D ]G}|                     |          rd|v r|d         n|                                }|                     ||          }|                     |          }	|s>t                              t#          d          |                    d	d
          ||	           t'          ||                    d	d
          ||	|                    d                    }
|                    ddg          }d|v r|                    |
           |D ]3}||vrt+          |          ||<   ||                             |
           4I|D ].}
|                                D ]}|                    |
           /| j        j        rKt'          | j        j        dd d          }
|                                D ]}|                    |
d           | j        j        rIt'          | j        j        dd d          }
|                                D ]}|                    |
           |sd S |                     d|ddt7          |          z  d           |                                D ]}|                     |           | j                            | j        d          \  }}| xj        |z  c_        | xj        |z  c_        | j        j         rD| j                            | j        d          \  }}| xj!        |z  c_!        | xj"        |z  c_"        | j        j         rF| j                            | j        d          \  }}| xj#        |z  c_#        | xj$        |z  c_$        d S d S )NF)r   optionflagsri   r"   c                     t          | t          j        t          j        f          rd| v pt          | t          j                  S Nr:   )
isinstancer   rX   rY   doctest_blockr  s    r$   r  z*DocTestBuilder.test_doc.<locals>.condition  s@    "4%*=u})MNN /&$.:tU%899:r&   c                 V    t          | t          j        t          j        f          od| v S r  )r  r   rX   rY   r  s    r$   r  z*DocTestBuilder.test_doc.<locals>.condition  s+    !$)<em(LMM /&$./r&   r<   z#no code/output in %s block at %s:%sr:   r,   rC   )r   r   rb   rC   r;   r9   *r/   r   )r   rb   T)r   r0   z
Document: z
-----------r+   )r   )%r   r   setup_runnertest_runnercleanup_runner_fakeoutr   doctest_test_doctest_blocksr   r   findallr  astextr  r  r   ra   r   getr   r   r   r   valuesr  r  r   r   
test_groupr   r   r   triesr   r   r   r   )rf   r   r  r;   add_to_all_groupsr  ri   r   r   line_numberrg   node_groups	groupnamer   res_fres_ts                   r$   r  zDocTestBuilder.test_doc  s   ')/<@HF F F.u;?8E E E1%>BhH H H %)$5$>!'+'8'A$;2 	/: : : : : : :
/ / / / / / OOI.. 	1 	1D||D!! %+t^^T&\\F11$@@H..t44K 6r"GHH#xx	BB'6 6 6 F.))L)L%-k$(HHY$7$79 9 9D ((8i[99Kk!!!((...( 1 1	F**(1)(<(<F9%y!**400001 & 	% 	%D % %t$$$$%;+ 	3DK<'$qB B BD 3 3tT2222;- 	%DK>)DD D DD % %t$$$$ 	F			77C#g,,...0 	1 	1 	1]]__ 	# 	#EOOE""""(2249e2LLuu$E!! 	&+55di5NNLE55(%$ 	(.88AE 9 G GLE5!!U*!!%'		( 	(r&   rg   rS   r   flagsdont_inheritc                 2    t          ||| j        ||          S r   )r   r   )rf   rg   rS   r   r5  r6  s         r$   r   zDocTestBuilder.compile  s    tT49e\BBBr&   r   c           	          i dt           dt          t                   dt           dt          f fd} | j        j        d          sd S j        D ]}t          |          dk    r	 t          	                    |d         j
        i j        |d         j        |d         j                  }n]# t          $ rP t                              t#          d	          |d         j
        |d         j        |d         j        f
           Y w xY w|j        s|j        D ]B}|d         j                                        }|                    |j                   ||_        Cd _        n|d         r|d         j
        nd}|d         r|d         j        ni }d|t.          j        <   t          j                            |          }	|	r|	                    d          }
nd }
t/          j        |d         j
        ||
|d         j        |          }t/          j        |gi j        |d         j        |d         j        d           }d _        |_         j                             | j!        d            | j"        j#        d           d S )Nrunner	testcodeswhatr"   c                 f   g }|D ]8}t          j        |j        d|j                  }|                    |           9|sdS t          j        |i j        d|d|d         j        dd           }	|_        | j	        }d
_
        |                     |
j        d	           | j	        |k    rdS dS )
Nr-   )rb   Tz (z code)r   r  Fr   clear_globs)r,   Examplerg   rb   r   DocTestrS   r   globsfailuresr   rp   r   )r9  r:  r;  r   r?   r   sim_doctestold_fr   nsrf   s           r$   run_setup_cleanupz4DocTestBuilder.test_group.<locals>.run_setup_cleanup  s    H% ) )!/(-HOTTT(((( t!/(B<AJJJ*M*3A,*?DJ JK !#KOEDIJJ{EJJJJ&&u4r&   r   r)   r   z!ignoring invalid doctest code: %r)locationr   r-   Tmsg)exc_msgrb   rC   r  Fr=  r   )$r   r
   r   r   r$  r   r   r   parserget_doctestrg   rS   r   rb   r  r   ra   r   r   rC   copyr   r   r,   DONT_ACCEPT_BLANKLINE_EXCEPTION_REr   r   r?  r@  rA  r%  rp   r   r&  r   )rf   r   rF  rg   r<   r   new_optoutputrC   r   rI  rE  s   ``         @r$   r-  zDocTestBuilder.test_group  s   	c 	d8n 	C 	TX 	 	 	 	 	 	 	 	( ! !2EKII 	F K &	N &	ND4yyA~~!--d1glB
.21g.>QP PDD    NN2&I#J#JDQRGL-1!W-=tAw~,N # P P PH } #} . .G"1go2244GNN7?333&-GOO$		 *.a8ab-1!W<$q'//"9=56(..v66 #ggennGG"G!/$q',15aR R Ry"ej'+Aw'7aO O"	DJ  4>u MMMM 	$-u}iHHHHHs   ,AB11AD
D)r"   Nr   )r   ) rq   rr   rs   rt   rS   r   epilogr   rJ   r   r   r   r   r   r   r   r	   r   r   r   r  staticmethodr   r  r   r   r  r  r   r   r   r-  r3   r&   r$   r   r   
  sf         DR 4 5 5F4 4 4 4:! ! ! ! ! !!c !d ! ! ! ! c      #3s8 # # # #$ $ $ $, %	, 	,HSM 	,Xc] 	,	,)-	, 	, 	, 	,$       d x}    \G     L( L(d L(t L( L( L( L(\CC Cs C# Cc CQU CZ] C C C CEI	 EId EI EI EI EI EI EIr&   r   r   r   c                    |                      dt                     |                      dt                     |                      dt                     |                      dt                     |                      dt
                     |                     t                     |                     dg d           |                     dd	d           |                     d
dd           |                     ddd           |                     dt          j
        t          j        z  t          j        z  d           t          j        ddS )Nr/   r0   r,   r?   rA   r   Fr(  r9   r  r-   r  r   T)r!   parallel_read_safe)add_directiverz   r   r   r   r   add_builderr   add_config_valuer,   DONT_ACCEPT_TRUE_FOR_1ELLIPSISIGNORE_EXCEPTION_DETAILsphinx__display_version__)r   s    r$   r   r      s1   k#5666m%9:::i!1222j"3444l$7888OON###U3336	5III/U;;;12u===&)99G<[[   1NNNr&   )Krt   r,   rerd   r   ior   osr   typingr   r   r   r   r	   r
   r   r   r   r   r   docutilsr   docutils.nodesr   r   r   docutils.parsers.rstr   packaging.specifiersr   r   packaging.versionr   r[  sphinx.buildersr   sphinx.localer   sphinx.utilr   sphinx.util.consoler   sphinx.util.docutilsr   sphinx.util.osutilr   sphinx.util.typingr   sphinx.applicationr   	getLoggerrq   r   r   	MULTILINErT   rV   rJ   r   r%   r(   rz   r   r   r   r   DocTestParserrJ  r   r   DocTestRunnerr   r   r   r3   r&   r$   <module>rr     so   
  				 



             & & & & & & & & & & & & & & & & & & & & & & & & & &       5 5 5 5 5 5 5 5 5 5 + + + + + + ? ? ? ? ? ? ? ? % % % % % %  # # # # # #             $ $ $ $ $ $ 0 0 0 0 0 0 & & & & & & ) ) ) ) ) ) *)))))) 
	8	$	$rz,bl;;
-r|<<2S 23 24 2 2 2 2(N N N N NO N N Nb           =       }              -    
		 	 
= = = = = = = =<L L L L L L L LF F F F F'/ F F F@SI SI SI SI SIW SI SI SIlOx ODcN O O O O O Or&   