B
    d                 @   s  d 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 ddlm	Z	m
Z
mZ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! dddgZ"d+ee#e$ddddZ%d,ee#e$ddddZ&e#e#ddddZ'd-ee
e#e
ddddZ(e#e
dddZ)G dd dZ*G d d dej+Z,G d!d dZ-e.d"Z/d.e#ee# ee#ddf d#d$d%Z0e#e#d&d'd(Z1d)d* Z2dS )/zSphinx test suite utilities    N)StringIO)IOAnyDict	GeneratorListOptionalPattern)ElementTree)nodes)Node)
directivesroles)applicationlocale)ModuleAnalyzer)path)relpathStructSphinxTestApp#SphinxTestAppWrapperForSkipBuilding)regextextflagsreturnc             C   s"   t | ||std| |f d S )Nz%r did not match %r)researchAssertionError)r   r   r    r   `/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/testing/util.pyassert_re_search   s    r    c             C   s"   t | ||rtd| |f d S )Nz%r did match %r)r   r   r   )r   r   r   r   r   r   assert_not_re_search   s    r!   )thingprefixr   c             C   s   |  |std| |f d S )Nz%r does not start with %r)
startswithr   )r"   r#   r   r   r   assert_startswith#   s    
r%    )nodeclsxpathkwargsr   c       	      K   s  |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rTt | ttjfstd| t| t|kstd|t| t|f xt|D ]0\}}|d	|  }t| | |fd|i| qW nHt |t	r~| |kstd
||| f nt | |std||| f |rt | tjstd| xX|
 D ]L\}}|| kstd||| f | | |kstd|||| | f qW d 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 %r is not %r: %rz$The node%s is not subclass of %r: %rz'The node%s does not have any attributesz)The node%s does not have %r attribute: %rzThe node%s[%s] is not %r: %r)
isinstancelistassert_nodetupler   ZElementr   len	enumeratestritems)	r'   r(   r)   r*   iZnodeclsr   keyvaluer   r   r   r.   (   s>    

(
"
r.   )r   r   c          	   C   s0   t jdd t jdtd t| S Q R X d S )NF)recordignore)category)warningscatch_warningsfilterwarningsDeprecationWarningr
   parse)r   r   r   r   etree_parseN   s    r?   c               @   s   e Zd ZeddddZdS )r   N)r*   r   c             K   s   | j | d S )N)__dict__update)selfr*   r   r   r   __init__U   s    zStruct.__init__)__name__
__module____qualname__r   rC   r   r   r   r   r   T   s   c                   s   e Zd ZU dZeed< eed< deee ee e	ee
 ee ee eee  ee edd fd	d
Zde	ddddZed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.
    Z_statusZ_warninghtmlNFr   )buildernamesrcdirbuilddirfreshenvconfoverridesstatuswarningtagsdocutilsconfparallelr   c                s   |	d k	r|d  |	 |d kr&|d }|}||}|jdd |d}|jdd |d krbi }d}tjd d  | _tj | _	t
j | _dd ttjD | _y(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>)rQ   )
write_textjoinpathmakedirssysr   _saved_pathr   _directivescopy_saved_directivesr   _roles_saved_rolesdirr   GenericNodeVisitor_saved_nodeclassessuperrC   	Exceptioncleanup)rB   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   ZconfdiroutdirZ
doctreedirZwarningiserror)	__class__r   r   rC   a   s.    

zSphinxTestApp.__init__)rS   r   c             C   s   t j  tj  | jtjd d < tj	dd  | j
t_| jt_xVttjD ]H}|drN|| jkrNttjd|dd    ttjd|dd    qNW d S )NZautodoc_fodderrT      Zdepart_)r   cacheclearr   Ztranslatorsr\   r[   r   modulespopr_   r   r]   ra   r   r`   rb   r   rc   r$   rd   delattr)rB   rS   methodr   r   r   rg      s    



zSphinxTestApp.cleanup)r   c             C   s   d| j j| jjf S )Nz<%s buildername=%r>)ri   rD   buildername)rB   r   r   r   __repr__   s    zSphinxTestApp.__repr__)
rG   NNFNNNNNr   )F)rD   rE   rF   __doc__r   __annotations__r2   r   r   boolr   r   r   intrC   rg   rs   __classcell__r   r   )ri   r   r   Y   s    
         6 c               @   sB   e Zd ZdZeddddZeedddZee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.
    N)app_r   c             C   s
   || _ d S )N)app)rB   ry   r   r   r   rC      s    z,SphinxTestAppWrapperForSkipBuilding.__init__)rr   r   c             C   s   t | j|S )N)getattrrz   )rB   rr   r   r   r   __getattr__   s    z/SphinxTestAppWrapperForSkipBuilding.__getattr__)argsr*   r   c             O   s   | j j s| j j|| d S )N)rz   rh   listdirbuild)rB   r}   r*   r   r   r   r      s    z)SphinxTestAppWrapperForSkipBuilding.build)
rD   rE   rF   rt   r   rC   r2   r   r|   r   r   r   r   r   r      s   zu(".*?")|u(\'.*?\'))rootsuffixr   c             #   sZ   xTt j| ddD ]B\}}}t|}x. fdd|D D ]}|| }t|| V  q6W qW d S )NT)followlinksc                s   g | ]} r|  r|qS r   )endswith)rU   f)r   r   r   
<listcomp>   s    zfind_files.<locals>.<listcomp>)os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 )Nr   )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)3rt   r   r   r   r[   r:   ior   typingr   r   r   r   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   __all__r2   rw   r    r!   r%   r.   r?   r   ZSphinxr   r   compileZ_unicode_literals_rer   r   r   r   r   r   r   <module>   s8   $
&E
"