U
    \ShJ                     @  s  d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ ddlmZmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ e
rddlm Z  dddgZ!d4dddddddZ"d5dddddddZ#ddddddZ$d6dddddd d!d"Z%ddd#d$d%Z&G d&d dZ'G d'd dej(Z)G d(d dZ*e+d)Z,d7dd*d+d,d-d.Z-ddd/d0d1Z.d2d3 Z/dS )8zSphinx test suite utilities    )annotationsN)IOTYPE_CHECKINGAny	Generator)ElementTree)nodes)Node)
directivesroles)applicationlocale)ModuleAnalyzerpath)relpath)StringIOStructSphinxTestApp#SphinxTestAppWrapperForSkipBuildingz
re.PatternstrintNone)regextextflagsreturnc                 C  s$   t | ||s t| d|d S )Nz did not match researchAssertionErrorr   r   r    r"   F/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/testing/util.pyassert_re_search   s    r$   c                 C  s$   t | ||r t| d|d S )Nz did match r   r!   r"   r"   r#   assert_not_re_search"   s    r%   )thingprefixr   c                 C  s    |  |st| d|d S )Nz does not start with )
startswithr    )r&   r'   r"   r"   r#   assert_startswith'   s    
r)    r	   r   )nodeclsxpathkwargsr   c           	      K  s6  |rt |trt| |d fd|i| |dd  rt |d tr`t| |d fd|i| n^t | tjsxtd| t| dkstd|t| f t| d |dd  fd|d i| nt |trPt | ttjfstd| t| t|kstd|t| t|f t|D ]0\}}|d	|  }t| | |fd|i| qnXt |t	r| |kstd
|d|d| n&t | |std| d|d| |r2t | tjstd| |
 D ]`\}}|| kstd| d|d| | | |kstd| d| d|d| | qd S )Nr   r-      z%The node%s does not have any childrenz&The node%s has %d child nodes, not onez[0]z"The node%s does not have any itemsz%The node%s has %d child nodes, not %rz[%d]z	The node z is not z: zThe nodez is not subclass of z'The node%s does not have any attributesz does not have z attribute: [z	] is not )
isinstancelistassert_nodetupler   ZElementr    len	enumerater   items)	r+   r,   r-   r.   iZnodeclsr   keyvaluer"   r"   r#   r3   ,   sN    
( &r3   )r   r   c              
   C  s<   t jdd& t jdtd t| W  5 Q R  S Q R X d S )NF)recordignore)category)warningscatch_warningsfilterwarningsDeprecationWarningr   parser   r"   r"   r#   etree_parseR   s    rC   c                   @  s   e Zd ZdddddZdS )r   r   r   )r.   r   c                 K  s   | j | d S N)__dict__update)selfr.   r"   r"   r#   __init__Y   s    zStruct.__init__N)__name__
__module____qualname__rH   r"   r"   r"   r#   r   X   s   c                      s   e Zd ZU dZded< ded< dd	d
d
ddddddddd fddZddddddZd	dddZd dddd fddZ  Z	S )!r   z
    A subclass of :class:`Sphinx` that runs on the test root, with some
    better default values for the initialization parameters.
    r   Z_statusZ_warninghtmlNFr   r   zpath | Noneboolzdict | Nonez	IO | Nonezlist[str] | None
str | Noner   r   )buildernamesrcdirbuilddirfreshenvconfoverridesstatuswarningtagsdocutilsconfparallelr   c                   s  |d k	st |d | _|	d k	r*| j|	 |d kr:|d }|}||}|jdd |d}|jdd |d krvi }d}tjd d  | _tj	
 | _tj
 | _dd ttjD | _z(t j||||||||||||
d	 W n tk
r   |    Y nX d S )
Nzdocutils.confZ_buildT)exist_okdoctreesFc                 S  s   h | ]}| d r|qS )visit_)r(   ).0vr"   r"   r#   	<setcomp>   s    
z)SphinxTestApp.__init__.<locals>.<setcomp>)rX   )r    docutils_conf_path
write_textjoinpathmakedirssysr   _saved_pathr
   _directivescopy_saved_directivesr   _roles_saved_rolesdirr   GenericNodeVisitor_saved_nodeclassessuperrH   	Exceptioncleanup)rG   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   ZconfdiroutdirZ
doctreedirZwarningiserror	__class__r"   r#   rH   e   s@    


      
zSphinxTestApp.__init__)rZ   r   c                 C  s   t j  tj  | jtjd d < tj	dd  | j
t_| jt_ttjD ]H}|drL|| jkrLttjd|dd    ttjd|dd    qLzt| j W n tk
r   Y nX d S )NZautodoc_fodderr[      Zdepart_)r   cacheclearr   Ztranslatorsrd   rc   r   modulespoprg   r
   re   ri   r   rh   rj   r   rk   r(   rl   delattrosremover_   FileNotFoundError)rG   rZ   methodr"   r"   r#   ro      s     


zSphinxTestApp.cleanup)r   c                 C  s   d| j j d| jjdS )N<z buildername=>)rr   rI   Zbuildername)rG   r"   r"   r#   __repr__   s    zSphinxTestApp.__repr__)	force_all	filenamesr   c                   s   | j j  t || d S rD   )envZ_pickled_doctree_cacheru   rm   build)rG   r   r   rq   r"   r#   r      s    zSphinxTestApp.build)
rL   NNFNNNNNr   )F)FN)
rI   rJ   rK   __doc____annotations__rH   ro   r   r   __classcell__r"   r"   rq   r#   r   ]   s"   
          (.c                   @  sB   e Zd ZdZdddddZddd	d
dZddddddZdS )r   z
    This class is a wrapper for SphinxTestApp to speed up the test by skipping
    `app.build` process if it is already built and there is even one output
    file.
    r   r   )app_r   c                 C  s
   || _ d S rD   )app)rG   r   r"   r"   r#   rH      s    z,SphinxTestAppWrapperForSkipBuilding.__init__r   r   )r   r   c                 C  s   t | j|S rD   )getattrr   )rG   r   r"   r"   r#   __getattr__   s    z/SphinxTestAppWrapperForSkipBuilding.__getattr__)argsr.   r   c                 O  s   | j j s| j j|| d S rD   )r   rp   listdirr   )rG   r   r.   r"   r"   r#   r      s    z)SphinxTestAppWrapperForSkipBuilding.buildN)rI   rJ   rK   r   rH   r   r   r"   r"   r"   r#   r      s   zu(".*?")|u(\'.*?\')rN   zGenerator[str, None, None])rootsuffixr   c                 #  sR   t j| ddD ]>\}}}t|} fdd|D D ]}|| }t|| V  q2qd S )NT)followlinksc                   s   g | ]} r|  r|qS r"   )endswith)r\   fr   r"   r#   
<listcomp>   s      
 zfind_files.<locals>.<listcomp>)ry   walkr   r   )r   r   dirpath_dirsfilesr   Zfpathr"   r   r#   
find_files   s
    r   )r   r   c                 C  s   t dd| S )Nz.*?mr*   )r   sub)r   r"   r"   r#   strip_escseq   s    r   c                   s   t   fdd}|S )zA
    A simple decorator that does nothing, for tests to use.
    c                    s
    | |S rD   r"   )r   r.   r   r"   r#   wrapper   s    z!simple_decorator.<locals>.wrapper)	functoolswraps)r   r   r"   r   r#   simple_decorator   s    r   )r   )r   )Nr*   )N)0r   
__future__r   r   ry   r   rc   r>   typingr   r   r   r   Z	xml.etreer   Zdocutilsr   Zdocutils.nodesr	   Zdocutils.parsers.rstr
   r   Zsphinxr   r   Zsphinx.pycoder   Zsphinx.testing.pathr   Zsphinx.util.osutilr   ior   __all__r$   r%   r)   r3   rC   r   ZSphinxr   r   compileZ_unicode_literals_rer   r   r   r"   r"   r"   r#   <module>   sB     &O
