B
    \T?                 @   sb  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	 ddl
mZ ddlmZ ddl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mZ ddlmZmZ ddl m!Z! e"e#Z$G dd de%Z&dd Z'd%ddZ(dd Z)dd Z*dd Z+dd Z,dd Z-dd Z.d d! Z/e#d"kr^ddlZe0  e/ej1d#d d$ dS )&a  
    sphinx.ext.intersphinx
    ~~~~~~~~~~~~~~~~~~~~~~

    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.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    )print_functionN)path)nodes)relative_path)PY3	iteritemsstring_types)urlsplit
urlunsplit)INVENTORY_FILENAME)RemovedInSphinx20Warning)___)requestslogging)InventoryFilec               @   sD   e Zd ZdZdd Zedd Zedd Zedd	 Zd
d Z	dS )InventoryAdapterz!Inventory adapter for environmentc             C   s,   || _ t|ds(i | j _i | j _i | j _d S )Nintersphinx_cache)envhasattrr   intersphinx_inventoryintersphinx_named_inventory)selfr    r   5lib/python3.7/site-packages/sphinx/ext/intersphinx.py__init__B   s
    
zInventoryAdapter.__init__c             C   s   | j jS )N)r   r   )r   r   r   r   cacheK   s    zInventoryAdapter.cachec             C   s   | j jS )N)r   r   )r   r   r   r   main_inventoryP   s    zInventoryAdapter.main_inventoryc             C   s   | j jS )N)r   r   )r   r   r   r   named_inventoryU   s    z InventoryAdapter.named_inventoryc             C   s   | j j  | j j  d S )N)r   r   clearr   )r   r   r   r   r   Z   s    zInventoryAdapter.clearN)
__name__
__module____qualname____doc__r   propertyr   r   r   r   r   r   r   r   r   ?   s   	r   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
   )urlfragsr   r   r   _strip_basic_auth`   s    r+   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)streamconfigZtimeout)Zdecode_content)	r   getintersphinx_timeoutZraise_for_statusr)   raw	functoolspartialread)r)   r-   rr   r   r   _read_from_urlv   s
    
r5   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{0}@{1}:{2}r&   z{0}@{1})r	   Zusernamer'   ZportformatZhostnamer
   )r)   partsr*   r   r   r   _get_safe_url   s    
r8   c       
      C   sz  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d|| ||t|t|d fkrt|}|Z y"|rtjptj}t|||}W n0 tk
r& }	 ztd	|	 W dd}	~	X Y nX W dQ R X W n< tk
rp } 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://)r-   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)r+   r5   r-   openr   joinsrcdir	Exception	__class__strargsr   r)   loggerinfodirname	posixpathr   load
ValueErrorr    )
appuriinvZlocaluriferrZnewinvr<   invdataexcr   r   r   fetch_inventory   s:    

,rO   c             C   sr  t t }|| jjd  }t| jj}d}xt| jjD ]\}}d}d}d}	t	|t
tfr|| }\}}	t	|tsttd| q<nd||  }}}	t	|	ts|	f}
n|	}
g }x|
D ]}	|	st|t}	d|	ks||jks|j| d |k rt|	}td| yt| ||	}W n2 tk
rJ } z||j wW dd}~X Y nX |r|||f|j|< d}P qW |g krvq<t|t|
k rtd	 xD|D ]}tj|  qW q<d
dd |D }ttdd
 |  q<W |rn|  t
|j }tdd |D }dd |D }xT|| D ]H\}}}|r<||j|< x*t|D ]\}}|j |i !| qFW q"W dS )z3Load all intersphinx mappings into the environment.iQ FNz0intersphinx identifier %r is not string. Ignoredz://r&   z(loading intersphinx inventory from %s...TzXencountered some issues with some of the inventories, but they had working alternatives:
c             S   s    g | ]}|d  |dd  qS )r   r&   Nr   ).0rK   r   r   r   
<listcomp>  s    z!load_mappings.<locals>.<listcomp>zAfailed to reach any of the inventories with the following issues:c             s   s   | ]}|d  r|V  qdS )r   Nr   )rQ   vr   r   r   	<genexpr>  s    z load_mappings.<locals>.<genexpr>c             S   s   g | ]}|d  s|qS )r   r   )rQ   rS   r   r   r   rR     s    )"inttimer-   intersphinx_cache_limitr   Zbuilderr   r   intersphinx_mapping
isinstancer'   tupler   rB   Zwarningr   rE   r<   r   r   r8   rC   rO   r>   appendrA   lenr   valuessortedr   r   
setdefaultupdate)rH   ZnowZ
cache_timeinventoriesr`   keyvaluenamerI   rJ   ZinvsZfailuresZsafe_inv_urlrM   rL   ZfailZissuesZcached_valsZ
named_valsZunnamed_valsZ_xtypeZobjectsr   r   r   load_mappings   sj    





	
rf   c          
      s  |d }t |}d}|d dkr:dd |j D }d n@|d  sLdS | |d }|shdS  fdd|D }d	|kr|d
 |j|fg} r| |}|r||j|f d}	d|kr:|	dd\}
}|
|j
kr:|
}	||j
|
 |f  r:||d< | |}|r:||j
|
 |f xh|D ]^\}}xP|D ]F}||ksT||| krvqT|| | \}}}}d|kr|drtt|d d|}|rtd||f }ntd|f }tjddd||d}|dr|| n|dks* dkr|d dkr| }|	r|||	d r||||t|	d d |t|	d d  n
|| n|||| |S W qBW |	dk	r|ddst|rt|d tjrt||d j|d< dS )zBAttempt to resolve a missing reference via intersphinx references.Z	reftargetNZreftypeanyc             S   s&   g | ]}|j D ]}d |j|f qqS )z%s:%s)Zobject_typesrd   )rQ   domainobjtyper   r   r   rR   ,  s   z%missing_reference.<locals>.<listcomp>Z	refdomainc                s   g | ]}d  |f qS )z%s:%sr   )rQ   ri   )rh   r   r   rR   8  s    zstd:cmdoptionz
std:option:r&   z://Zrefdoc.z(in %s v%s)z(in %s) F)ZinternalZrefurireftitleZrefexplicit-ZstdkeywordTr   )r   Zdomainsr]   r.   Z
get_domainZobjtypes_for_roler[   r   Zget_full_qualified_namer(   r   r   r<   r   r   r   Z	referenceZastext
startswithr?   r\   rY   ZTextZ	rawsource)rH   r   ZnodeZcontnodetargetra   ZobjtypesZto_tryZfull_qualified_nameZin_setZsetnameZ	newtargetZ	inventoryri   ZprojversionrI   Zdispnamerm   Znewnodetitler   )rh   r   missing_reference$  sr    



rt   c             C   sP   |  di d |  ddd |  dd d | dt | dt tjd	dd
S )NrX   TrW      Fr/   zmissing-referencezbuilder-initedr&   )rr   Zenv_versionZparallel_read_safe)Zadd_config_valueZconnectrt   rf   sphinxZ__display_version__)rH   r   r   r   setupp  s    rw   c             C   s$   t jdtdd t| dd  dS )z-Debug functionality to print out an inventoryzOsphinx.ext.intersphinx.debug() is deprecated. Please use inspect_main() instead   )
stacklevelr&   N)warningswarnr   inspect_main)argvr   r   r   debug~  s    
r~   c          
      s@  t | dk r$tdtjd td G dd dt G  fdddt}y| d }t| d	|}xht|pji D ]X}t| xJt||  D ]6\}}td
||d dkrd|d  pd	|d f  qW qnW W nn t	k
r } z t|j
d |j
dd   W dd}~X Y n0 tk
r: } 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dZdZdS )z inspect_main.<locals>.MockConfigNF)r    r!   r"   r/   Z
tls_verifyr   r   r   r   
MockConfig  s   r   c                   s   e Zd ZdZ  Zdd ZdS )zinspect_main.<locals>.MockApprl   c             S   s   t |tjd d S )N)r   )printsysstderr)r   msgr   r   r   r{     s    z"inspect_main.<locals>.MockApp.warnN)r    r!   r"   r=   r-   r{   r   )r   r   r   MockApp  s   r   r   rl   z	%-40s %s%s   rn   z%-40s: rx   NzUnknown error: %r)r\   r   r   r   exitobjectrO   r^   itemsrG   rA   r>   )r}   r   filenamerM   rb   entryZeinforN   r   )r   r   r|     s&    

,r|   __main__r&   )r}   )N)2r#   Z
__future__r   r1   rE   r   rV   rz   osr   Zdocutilsr   Zdocutils.utilsr   Zsixr   r   r   Zsix.moves.urllib.parser	   r
   rv   Zsphinx.builders.htmlr   Zsphinx.deprecationr   Zsphinx.localer   r   Zsphinx.utilr   r   Zsphinx.util.inventoryr   Z	getLoggerr    rB   r   r   r+   r5   r8   rO   rf   rt   rw   r~   r|   ZbasicConfigr}   r   r   r   r   <module>   s@   
!
(RL	$
