B
    di              
   @   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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 ddlmZmZ ddlmZ ddlmZmZmZmZ dd	lmZ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.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9m:Z: ddl;m<Z< ddl=m>Z>m?Z?m@Z@ e6AeBZCG dd dZDeEeEdddZFdYeEee) edddZGeEeEddd ZHe%eEeed!d"d#ZIeEeEeeeeJeKd$d%d&ZLe%dd'd(d)ZMe+eeE e?e#eed*d+d,ZNeeE e>e+eeE eEe#eee d-d.d/ZOe-eeE e>eKe+eeE e#eee d0	d1d2ZPe-eeE e>eKe#eee d3d4d5ZQe-eEeKd6d7d8ZRe-eEe#eee d9d:d;ZSe-eKe#eee d<d=d>ZTe-e#eee d?d@dAZUe%e-e#eee dBdCdDZVG dEdF dFe9ZWG dGdH dHe:ZXG dIdJ dJe4ZYe%eEeeE ddKdLdMZZe%e)ddNdOdPZ[e%eeEef d'dQdRZ\eeE ddSdTdUZ]eBdVkrddl6Z^e^_  e]ej`dWd dX dS )Za  Insert links to objects documented in remote Sphinx documentation.

This works as follows:

* Each Sphinx HTML build creates a file named "objects.inv" that contains a
  mapping from object names to URIs relative to the HTML set's root.

* Projects using the Intersphinx extension can specify links to such mapping
  files in the `intersphinx_mapping` config value.  The mapping will then be
  used to resolve otherwise missing references to objects into links to the
  other documentation.

* By default, the mapping file is assumed to be at the same location as the
  rest of the documentation; however, the location of the mapping file can
  also be specified individually, e.g. if the docs should be buildable
  without Internet access.
    N)path)
ModuleType)IOAnyDictListOptionalTuplecast)urlsplit
urlunsplit)nodes)ElementNodeTextElementsystem_message)Reporterrelative_path)pending_xref)Sphinx)INVENTORY_FILENAME)Config)Domain)BuildEnvironment)ExtensionError)___)ReferencesResolver)loggingrequests)CustomReSTDispatcher
SphinxRole)InventoryFile)	InventoryInventoryItemRoleFunctionc               @   s~   e Zd ZdZeddddZeeee	ee
ef f dddZeedd	d
Zeeeef dddZddddZdS )InventoryAdapterz!Inventory adapter for environmentN)envreturnc             C   s,   || _ t|ds(i | j _i | j _i | j _d S )Nintersphinx_cache)r'   hasattrr)   intersphinx_inventoryintersphinx_named_inventory)selfr'    r.   c/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/ext/intersphinx.py__init__7   s
    
zInventoryAdapter.__init__)r(   c             C   s   | j jS )N)r'   r)   )r-   r.   r.   r/   cache?   s    zInventoryAdapter.cachec             C   s   | j jS )N)r'   r+   )r-   r.   r.   r/   main_inventoryC   s    zInventoryAdapter.main_inventoryc             C   s   | j jS )N)r'   r,   )r-   r.   r.   r/   named_inventoryG   s    z InventoryAdapter.named_inventoryc             C   s   | j j  | j j  d S )N)r'   r+   clearr,   )r-   r.   r.   r/   r4   K   s    zInventoryAdapter.clear)__name__
__module____qualname____doc__r   r0   propertyr   strr	   intr#   r1   r2   r3   r4   r.   r.   r.   r/   r&   4   s   "r&   )urlr(   c             C   s6   t t| }d|d kr.|d dd |d< t|S )a  Returns *url* with basic auth credentials removed. Also returns the
    basic auth username and password if they're present in *url*.

    E.g.: https://user:pass@example.com => https://example.com

    *url* need not include basic auth credentials.

    :param url: url which may or may not contain basic auth credentials
    :type url: ``str``

    :return: *url* with any basic auth creds removed
    :rtype: ``str``
    @   )listr   splitr   )r<   fragsr.   r.   r/   _strip_basic_authP   s    rB   )r<   configr(   c             C   sB   t j| d||jd}|  |j|j_tj|jjdd|j_|jS )u  Reads data from *url* with an HTTP *GET*.

    This function supports fetching from resources which use basic HTTP auth as
    laid out by RFC1738 § 3.1. See § 5 for grammar definitions for URLs.

    .. seealso:

       https://www.ietf.org/rfc/rfc1738.txt

    :param url: URL of an HTTP resource
    :type url: ``str``

    :return: data read from resource described by *url*
    :rtype: ``file``-like object
    T)streamrC   timeout)decode_content)	r   getintersphinx_timeoutraise_for_statusr<   raw	functoolspartialread)r<   rC   rr.   r.   r/   _read_from_urle   s
    
rO   c             C   s^   t | }|jdkr| S t|}|jr>d|j|j|j|d< nd|j|j|d< t|S dS )a5  Gets version of *url* with basic auth passwords obscured. This function
    returns results suitable for printing and logging.

    E.g.: https://user:12345@example.com => https://user@example.com

    :param url: a url
    :type url: ``str``

    :return: *url* with password removed
    :rtype: ``str``
    Nz{}@{}:{}r>   z{}@{})r   usernamer?   portformathostnamer   )r<   partsrA   r.   r.   r/   _get_safe_url~   s    
rU   )appuriinvr(   c       
      C   s  d|k}|st |}y0d|kr.t|| jd}ntt| j|d}W n8 tk
r| } zd||jt	|f|_
 W dd}~X Y nX yt|dr|j}||krttd|| ||t|t|d fkrt|}|\ y"|rtjntj}t|||}W n2 tk
r, }	 ztd	|	 |	W dd}	~	X Y nX W dQ R X W n< tk
rv } zd
||jjt	|f|_
 W dd}~X Y nX |S dS )z6Fetch, parse and return an intersphinx inventory file.z://)rC   rbz4intersphinx inventory %r not fetchable due to %s: %sNr<   z)intersphinx inventory has moved: %s -> %s/z,unknown or unsupported inventory version: %rz3intersphinx inventory %r not readable due to %s: %s)rB   rO   rC   openr   joinsrcdir	Exception	__class__r:   argsr*   r<   loggerinfor   dirname	posixpathr"   load
ValueErrorr5   )
rV   rW   rX   ZlocaluriferrZnewinvr\   invdataexcr.   r.   r/   fetch_inventory   s:    

.rk   )namerW   invsr1   rV   nowr(   c             C   s<  ||j jd  }g }zx|D ]}|s0t|t}d|ksP||ksP|| d |k rt|}	ttd|	 yt	|||}
W n0 t
k
r } z||j wW d d }~X Y nX |
r| ||
f||< dS qW dS |g krndt|t|k rttd xB|D ]}tj|  qW n*dd	d
 |D }ttdd |  X d S )NiQ z://r>   z(loading intersphinx inventory from %s...TFzXencountered some issues with some of the inventories, but they had working alternatives:
c             S   s    g | ]}|d  |dd  qS )r   r>   Nr.   ).0rg   r.   r.   r/   
<listcomp>   s    z)fetch_inventory_group.<locals>.<listcomp>zAfailed to reach any of the inventories with the following issues:)rC   intersphinx_cache_limitrd   r\   r   rU   ra   rb   r   rk   r^   appendr`   lenwarning)rl   rW   rm   r1   rV   rn   Z
cache_timeZfailuresrX   Zsafe_inv_urlri   rh   ZfailZissuesr.   r.   r/   fetch_inventory_group   s6    
 
rv   )rV   r(   c             C   s  t t }t| jj}tj \}g }x:| jj	
 D ]*\}\}}||t||||j| | q6W dd tj|D }W dQ R X t|r|  t|j
 }	tdd |	D }
dd |	D }xN|
| D ]B\}}}|r||j|< x(| D ]\}}|j|i | qW qW dS )z3Load all intersphinx mappings into the environment.c             S   s   g | ]}|  qS r.   )result)rp   rg   r.   r.   r/   rq      s    z!load_mappings.<locals>.<listcomp>Nc             s   s   | ]}|d  r|V  qdS )r   Nr.   )rp   vr.   r.   r/   	<genexpr>   s    z load_mappings.<locals>.<genexpr>c             S   s   g | ]}|d  s|qS )r   r.   )rp   rx   r.   r.   r/   rq      s    )r;   timer&   builderr'   
concurrentfuturesThreadPoolExecutorrC   intersphinx_mappingvaluesrs   submitrv   r1   as_completedanyr4   r?   sortedr3   itemsr2   
setdefaultupdate)rV   rn   Zinventoriespoolr}   rl   rW   rm   updatedZcached_valsZ
named_valsZunnamed_valsZ_xri   typeobjectsr.   r.   r/   load_mappings   s$     
	
r   )domaininv_namedatanodecontnoder(   c             C   s  |\}}}}d|kr4| dr4tt|d d|}|rJtd||f }	ntd|f }	tjddd||	d}
| d	r|
| n|d
ks| jdkr|d dkr|	 }|d k	r|
|d r|
||t|d d  |t|d d   n
|
| n|
||| |
S )Nz://Zrefdoc.z(in %s v%s)z(in %s) F)ZinternalZrefurireftitleZrefexplicit-stdreftypekeyword:r>   )rG   r   r\   r   r   r   	referencers   rl   Zastext
startswithr_   rt   )r   r   r   r   r   ZprojversionrW   Zdispnamer   newnodetitler.   r.   r/   _create_element_from_result  s$    
r   )r   	inventoryr   objtypestargetr   r   r(   c       
         s   x|D ]}||krq||| kr.|| | }nJ|dkr|   tt fdd||  }	|	r|| |	d  }qxqnqt|| |||S W d S )Nzstd:termc                s   |    kS )N)lower)k)target_lowerr.   r/   <lambda>2      z8_resolve_reference_in_domain_by_target.<locals>.<lambda>r   )r   r?   filterkeysr   )
r   r   r   r   r   r   r   objtyper   Zinsensitive_matchesr.   )r   r/   &_resolve_reference_in_domain_by_target"  s    
r   )	r'   r   r   honor_disabled_refsr   r   r   r   r(   c       
         s   j dkrd|kr|d j dkr8d|kr8|d fdd|D }|rh| jj  fd	d|D }t||||d
 ||}|d k	r|S |}	|	d krd S t||||	||S )Nr   Z	cmdoptionoptionpy	attributemethodc                s   g | ]}d   j|qS )z{}:{})rR   rl   )rp   t)r   r.   r/   rq   Q  s    z0_resolve_reference_in_domain.<locals>.<listcomp>c                s   g | ]}| kr|qS r.   r.   )rp   o)disabledr.   r/   rq   V  s    	reftarget)rl   rs   rC   intersphinx_disabled_reftypesr   Zget_full_qualified_name)
r'   r   r   r   r   r   r   r   resZfull_qualified_namer.   )r   r   r/   _resolve_reference_in_domainB  s"    




r   )r'   r   r   r   r   r   r(   c          
   C   s   |o
|d k}|r d| j jkr d S |d }|dkrxX| j D ]J\}}|rZ|d | j jkrZq<t|j}	t| |||||	||}
|
d k	r<|
S q<W d S |d}|sd S |r|d | j jkrd S | |}|	|}	|	sd S t| |||||	||S d S )N*r   r   z:*	refdomain)
rC   r   domainsr   r?   Zobject_typesr   rG   
get_domainZobjtypes_for_role)r'   r   r   r   r   r   typdomain_namer   r   r   r.   r.   r/   _resolve_referencef  s>    



r   )r'   r   r(   c             C   s   |t | jkS )N)r&   r3   )r'   r   r.   r.   r/   inventory_exists  s    r   )r'   r   r   r   r(   c             C   s*   t | |stt| |t| j| d||S )zAttempt to resolve a missing reference via intersphinx references.

    Resolution is tried in the given inventory with the target as is.

    Requires ``inventory_exists(env, inv_name)``.
    F)r   AssertionErrorr   r&   r3   )r'   r   r   r   r.   r.   r/   resolve_reference_in_inventory  s    
r   )r'   r   r   r   r(   c             C   s   t | dt| j|||S )zAttempt to resolve a missing reference via intersphinx references.

    Resolution is tried with the target as is in any inventory.
    N)r   r&   r2   )r'   r   r   r   r.   r.   r/   resolve_reference_any_inventory  s    r   )r'   r   r   r(   c             C   sn   t | d||}|dk	r|S |d }d|kr.dS |dd\}}t| |sLdS ||d< t| |||}||d< |S )ag  Attempt to resolve a missing reference via intersphinx references.

    Resolution is tried first with the target as is in any inventory.
    If this does not succeed, then the target is split by the first ``:``,
    to form ``inv_name:newtarget``. If ``inv_name`` is a named inventory, then resolution
    is tried in that inventory with the new target.
    TNr   r   r>   )r   r@   r   r   )r'   r   r   r   r   r   Z	newtargetZres_invr.   r.   r/   "resolve_reference_detect_inventory  s    
r   )rV   r'   r   r   r(   c             C   s   t |||S )zBAttempt to resolve a missing reference via intersphinx references.)r   )rV   r'   r   r   r.   r.   r/   missing_reference  s    r   c                   s:   e Zd ZdZeeeeee	e
e f d fddZ  ZS )IntersphinxDispatcherzyCustom dispatcher for external role.

    This enables :external:***:/:external+***: roles on parsing reST document.
    )	role_namelanguage_modulelinenoreporterr(   c                s8   t |dkr"|dr"t|g fS t ||||S d S )N	   )z	external:z	external+)rt   r   IntersphinxRolesuperrole)r-   r   r   r   r   )r_   r.   r/   r     s    zIntersphinxDispatcher.role)r5   r6   r7   r8   r:   r   r;   r   r	   r%   r   r   r   __classcell__r.   r.   )r_   r/   r     s   r   c               @   s   e Zd ZedZeddddZee	e
 e	e f dddZeeee ef d	d
dZeeeeef  d	ddZeeedddZeeef ee	e
 e	e f dddZdS )r   z(\+([^:]+))?:(.*)N)	orig_namer(   c             C   s
   || _ d S )N)r   )r-   r   r.   r.   r/   r0     s    zIntersphinxRole.__init__)r(   c             C   s   | j | j kst| | j\}}|rZt| j|sZtjt	d|| jj
| jfd g g fS | |}|d krtjt	d|| jj
| jfd g g fS | |\}}x&|D ]}t|trd|d< ||d< qW ||fS )Nz4inventory for external cross-reference not found: %s)locationz/role for external cross-reference not found: %sTintersphinxr   )rl   r   r   r   get_inventory_and_name_suffixr   r'   ra   ru   r   docnamer   get_role_nameinvoke_role
isinstancer   )r-   r   Zname_suffixr   rw   messagesr   r.   r.   r/   run  s"    



zIntersphinxRole.run)rl   r(   c             C   sH   | dst||d dks&t|tj|ddd\}}||fS )NZexternal   z:+      )r   r   r   _re_inv_ref	fullmatchgroup)r-   rl   rX   suffixr.   r.   r/   r      s    z-IntersphinxRole.get_inventory_and_name_suffixc             C   s   | d}t|dkr<| jjd}|r.|jnd }|d }n"t|dkrZ|d }|d }nd S |rv| ||rv||fS | d|rd|fS d S d S )Nr   r>   default_domainr   r   r   )r@   rt   r'   Z	temp_datarG   rl   is_existent_role)r-   rl   namesr   r   r   r.   r.   r/   r     s    


zIntersphinxRole.get_role_name)r   r   r(   c             C   s<   y"| j |}||jkrdS dS W n tk
r6   dS X d S )NTF)r'   r   Zrolesr   )r-   r   r   r   r.   r.   r/   r   !  s    
z IntersphinxRole.is_existent_role)r   r(   c             C   sT   | j |d }|rH||d }|d|| j| j| j| j| j| j	S g g fS d S )Nr   r>   r   )
r'   r   r   r\   Zrawtexttextr   Zinlineroptionscontent)r-   r   r   Z	role_funcr.   r.   r/   r   +  s    zIntersphinxRole.invoke_role)r5   r6   r7   recompiler   r:   r0   r	   r   r   r   r   r   r   r   boolr   r   r.   r.   r.   r/   r     s   

r   c               @   s*   e Zd ZdZejd ZeddddZdS )IntersphinxRoleResolverzpending_xref node resolver for intersphinx role.

    This resolves pending_xref nodes generated by :intersphinx:***: role.
    r>   N)kwargsr(   c             K   s   x| j tD ]}d|krqttj|d  }|d }|d k	rbt| j|sPt	t
| j|||}nt| jd||}|d kr|d }td|d ||d f }tj||d	|d
 || q|| qW d S )Nr   r   r   Fr   z-external %s:%s reference target not found: %sr   r   ref)r   r   subtype)Zdocumentfindallr   r
   r   r   deepcopyr   r'   r   r   r   r   ra   ru   Zreplace_self)r-   r   r   r   r   r   r   msgr.   r.   r/   r   >  s     zIntersphinxRoleResolver.run)r5   r6   r7   r8   r   Zdefault_priorityr   r   r.   r.   r.   r/   r   6  s   
r   )rV   r   sourcer(   c             C   s   t  }|  dS )zEnable IntersphinxDispatcher.

    .. note:: The installed dispatcher will be uninstalled on disabling sphinx_domain
              automatically.
    N)r   enable)rV   r   r   Z
dispatcherr.   r.   r/   install_dispatcherS  s    r   )rV   rC   r(   c             C   s   x|j   D ]\}}yt|ttfr`|| }\}}t|tsptt	d| |j 
| wnd ||  }}}t|ts|||fff|j |< n|||ff|j |< W q tk
r } z"tt	d|| |j 
| W d d }~X Y qX qW d S )Nz0intersphinx identifier %r is not string. Ignoredz3Failed to read intersphinx_mapping[%s], ignored: %r)r   copyr   r   r?   tupler:   ra   ru   r   popr^   )rV   rC   keyvaluerl   rW   rX   rj   r.   r.   r/   normalize_intersphinx_mapping]  s     


r   c             C   s   |  di d |  ddd |  dd d |  ddgd | jd	td
d | dt | dt | dt | t tj	dddS )Nr   Trr      FrH   r   zstd:doczconfig-initedi   )priorityzbuilder-initedzsource-readzmissing-referencer>   )r   Zenv_versionZparallel_read_safe)
Zadd_config_valueconnectr   r   r   r   Zadd_post_transformr   sphinxZ__display_version__)rV   r.   r.   r/   setupu  s    
r   )argvr(   c          
      s<  t | dk r$tdtjd td G dd d G  fddd}y| d }t| d	|}xht|pfi D ]X}t| xJt||  D ]6\}}td
||d dkrd|d  nd	|d f  qW qjW W nn tk
r } z t|j	d |j	dd   W dd}~X Y n0 t
k
r6 } ztd|  W dd}~X Y nX dS )z-Debug functionality to print out an inventoryr>   zXPrint out an inventory file.
Error: must specify local path or URL to an inventory file.)filec               @   s&   e Zd ZU dZee ed< dZdZdS )z inspect_main.<locals>.MockConfigNrH   F)	r5   r6   r7   rH   r   r;   __annotations__Z
tls_verify
user_agentr.   r.   r.   r/   
MockConfig  s   
r  c                   s&   e Zd ZdZ  ZeddddZdS )zinspect_main.<locals>.MockAppr   N)r   r(   c             S   s   t |tjd d S )N)r   )printsysstderr)r-   r   r.   r.   r/   warn  s    z"inspect_main.<locals>.MockApp.warn)r5   r6   r7   r]   rC   r:   r  r.   )r  r.   r/   MockApp  s   r  r   r   z	%-40s %s%sr   r   z%-40s: r   NzUnknown error: %r)rt   r  r  r  exitrk   r   r   rf   r`   r^   )r   r  filenameri   r   entryZeinforj   r.   )r  r/   inspect_main  s&    

,r  __main__r>   )r   )N)ar8   concurrent.futuresr|   rK   rd   r   r  rz   osr   typesr   typingr   r   r   r   r   r	   r
   urllib.parser   r   Zdocutilsr   Zdocutils.nodesr   r   r   r   Zdocutils.utilsr   r   r   Zsphinx.addnodesr   Zsphinx.applicationr   Zsphinx.builders.htmlr   Zsphinx.configr   Zsphinx.domainsr   Zsphinx.environmentr   Zsphinx.errorsr   Zsphinx.localer   r   Z!sphinx.transforms.post_transformsr   Zsphinx.utilr   r   Zsphinx.util.docutilsr    r!   Zsphinx.util.inventoryr"   Zsphinx.util.typingr#   r$   r%   	getLoggerr5   ra   r&   r:   rB   rO   rU   rk   floatr   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  Z_loggingbasicConfigr   r.   r.   r.   r/   <module>   s   $
(#!
'
U
#
