
\c        	   @  sr  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" rd d l# 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/ e re0 Z1 n  e% e1 e% e1 e( e1 e1 e1 e1 f f f Z2 n  e j3 e4  Z5 d e6 f d     YZ7 d   Z8 d d  Z: d   Z; d   Z< d   Z= d   Z> d   Z? d   Z@ d   ZA e4 d k rnd d l Z e jB   eA d e jC d  n  d S(    s  
    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.
i(   t   print_functionN(   t   path(   t   nodes(   t   relative_path(   t   PY3t	   iteritemst   string_types(   t   urlsplitt
   urlunsplit(   t   INVENTORY_FILENAME(   t   RemovedInSphinx20Warning(   t   _t   __(   t   requestst   logging(   t   InventoryFile(   t   Anyt   Dictt   IOt   Listt   Tuplet   Union(   t   Sphinx(   t   Config(   t   BuildEnvironmentt   InventoryAdapterc           B  sM   e  Z d  Z d   Z e d    Z e d    Z e d    Z d   Z RS(   s!   Inventory adapter for environmentc         C  sC   | |  _  t | d  s? i  |  j  _ i  |  j  _ i  |  j  _ n  d  S(   Nt   intersphinx_cache(   t   envt   hasattrR   t   intersphinx_inventoryt   intersphinx_named_inventory(   t   selfR   (    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   __init__B   s
    	c         C  s
   |  j  j S(   N(   R   R   (   R   (    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   cacheK   s    c         C  s
   |  j  j S(   N(   R   R   (   R   (    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   main_inventoryP   s    c         C  s
   |  j  j S(   N(   R   R   (   R   (    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   named_inventoryU   s    c         C  s$   |  j  j j   |  j  j j   d  S(   N(   R   R   t   clearR   (   R   (    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyR$   Z   s    (	   t   __name__t
   __module__t   __doc__R    t   propertyR!   R"   R#   R$   (    (    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyR   ?   s   		c         C  sJ   t  t |    } d | d k r@ | d j d  d | d <n  t |  S(   s  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``
    t   @i   (   t   listR   t   splitR   (   t   urlt   frags(    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   _strip_basic_auth`   s    c         C  se   t  j |  d t d | d | j } | j   | j | j _ t j | j j	 d t | j _	 | j S(   s  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   streamt   configt   timeoutt   decode_content(
   R   t   gett   Truet   intersphinx_timeoutt   raise_for_statusR,   t   rawt	   functoolst   partialt   read(   R,   R0   t   r(    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   _read_from_urlv   s
    $
!c         C  s   t  |   } | j d k r |  St |  } | j rY d j | j | j | j  | d <n d j | j | j  | d <t |  Sd S(   s5  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``
    s   {0}@{1}:{2}i   s   {0}@{1}N(   R   t   usernamet   NoneR*   t   portt   formatt   hostnameR   (   R,   t   partsR-   (    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   _get_safe_url   s    	%c   
   	   C  s  d | k } | s! t  |  } n  yF d | k rH t | d |  j } n t t j |  j |  d  } Wn4 t k
 r } d | | j t	 |  f | _
   n Xy t | d  r| j } | | k rt j d | |  | | t j |  t j |  d f k rt j |  } qqn  | \ y1 | r4t j p:t j } t j | | |  } Wn# t k
 rx}	 t d |	   n XWd	 QXWn7 t k
 r} d
 | | j j t	 |  f | _
   n X| Sd	 S(   s6   Fetch, parse and return an intersphinx inventory file.s   ://R0   t   rbs4   intersphinx inventory %r not fetchable due to %s: %sR,   s)   intersphinx inventory has moved: %s -> %st   /s,   unknown or unsupported inventory version: %rNs3   intersphinx inventory %r not readable due to %s: %s(   R.   R<   R0   t   openR   t   joint   srcdirt	   Exceptiont	   __class__t   strt   argsR   R,   t   loggert   infot   dirnamet	   posixpathR   t   loadt
   ValueErrorR%   (
   t   appt   urit   invt   localurit   ft   errt   newinvRG   t   invdatat   exc(    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   fetch_inventory   s:    "	+c         C  sV  t  t j    } | |  j j d } t |  j j  } t } xCt |  j j	  D]/\ } } d } d } d }	 t | t t f  r | | } \ } }	 t | t  s t j t d  |  qQ q n d | | } } }	 t |	 t  s |	 f }
 n |	 }
 g  } x |
 D] }	 |	 s(t j | t  }	 n  d |	 k sZ| | j k sZ| j | d | k  rt |	  } t j d |  y t |  | |	  } Wn& t k
 r} | j | j  qn X| r| | | f | j | <t } PqqqW| g  k rqQ t |  t |
  k  r7t j d  xg | D] } t j |   qWqQ d j g  | D] } | d | d ^ qD } t j t d	  d |  qQ W| rR| j   t | j j    } t  d
   | D  } g  | D] } | d s| ^ q} xm | | D]^ \ } } } | r| | j! | <n  x6 t |  D]( \ } } | j" j# | i   j$ |  qWqWn  d S(   s3   Load all intersphinx mappings into the environment.iQ s0   intersphinx identifier %r is not string. Ignoreds   ://i   s(   loading intersphinx inventory from %s...sX   encountered some issues with some of the inventories, but they had working alternatives:s   
i    sA   failed to reach any of the inventories with the following issues:c         s  s   |  ] } | d  r | Vq d S(   i    N(    (   t   .0t   v(    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pys	   <genexpr>  s    N(%   t   intt   timeR0   t   intersphinx_cache_limitR   t   builderR   t   FalseR   t   intersphinx_mappingR>   t
   isinstanceR*   t   tupleR   RM   t   warningR   RP   RG   R	   R!   RC   RN   R\   RI   t   appendRL   R4   t   lenR$   t   valuest   sortedR#   R"   t
   setdefaultt   update(   RS   t   nowt
   cache_timet   inventoriesRm   t   keyt   valuet   nameRT   RU   t   invst   failurest   safe_inv_urlRZ   RX   t   failRW   t   issuest   cached_valst
   named_valsR^   t   unnamed_valst   _xt   typet   objects(    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   load_mappings   sj    	.
	#c         C  s  | d } t  |  } d } | d d k rt g  | j j   D]) } | j D] } d | j | f ^ qI q< } d } nb | j d  } | s d S| j |  j | d  } | s d Sg  | D] } d | | f ^ q } d | k r | j	 d  n  | j
 | f g }	 | rD| j |  j |  }
 |
 rD|	 j	 | j
 |
 f  qDn  d } d	 | k r| j d	 d
  \ } } | | j k r| } |	 j	 | j | | f  | r| | d <| j |  j |  }
 |
 r|	 j	 | j | |
 f  qqqn  x|	 D]\ } } x| D]} | | k s| | | k r3qn  | | | \ } } } } d | k r| j d  rt j t | d d  |  } n  | rt d  | | f } n t d  | f } t j d d d t d | d | } | j d  r| j	 |  n | d k s'| d k r| d d k r| j   } | r| j | d	  r| j	 | j | t |  d
 | t |  d
   q| j	 |  n | j	 | j | |   | SWqW| d k	 r| j d t  rt |  rt | d t j  rt j | | d j  | d <qn  d S(   sB   Attempt to resolve a missing reference via intersphinx references.t	   reftargett   reftypet   anys   %s:%st	   refdomainNs   std:cmdoptions
   std:optiont   :i   s   ://t   refdoct   .s   (in %s v%s)s   (in %s)t    t   internalt   refurit   reftitlet   refexplicitt   -t   stdt   keywordi    (   R   R>   t   domainsRj   t   object_typesRs   R3   t
   get_domaint   objtypes_for_roleRh   R"   t   get_full_qualified_nameR+   R#   R   RG   R   R   R   t	   referenceRc   t   astextt
   startswithRJ   Ri   R4   Re   t   Textt	   rawsource(   RS   R   t   nodet   contnodet   targetRp   t   objtypest   domaint   objtypet   to_tryt   full_qualified_namet   in_sett   setnamet	   newtargett	   inventoryt   projt   versionRT   t   dispnameR   t   newnodet   title(    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   missing_reference$  st    
)	#
&"$	"c         C  su   |  j  d i  t  |  j  d d t  |  j  d d  t  |  j d t  |  j d t  i t j d 6d d	 6t d
 6S(   NRd   Ra   i   R5   s   missing-references   builder-initedR   i   t   env_versiont   parallel_read_safe(	   t   add_config_valueR4   Rc   R>   t   connectR   R   t   sphinxt   __display_version__(   RS   (    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   setupp  s    
c         C  s(   t  j d t d d t |  d  d S(   s-   Debug functionality to print out an inventorysO   sphinx.ext.intersphinx.debug() is deprecated. Please use inspect_main() insteadt
   stackleveli   i   N(   t   warningst   warnR
   t   inspect_main(   t   argv(    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   debug~  s    	c           sg  t  |   d k  r5 t d d t j t j d  n  d t f d     Y  d t f   f d     Y} y |  d } t |   d	 |  } x t | p i   D]p } t |  x] t | | j    D]E \ } } t d
 | | d d k r d | d p d	 | d f  q Wq WWnO t	 k
 rB} t | j
 d | j
 d  n! t k
 rb} t d |  n Xd S(   s-   Debug functionality to print out an inventoryi   sX   Print out an inventory file.
Error: must specify local path or URL to an inventory file.t   filet
   MockConfigc           B  s   e  Z d  Z e Z RS(   N(   R%   R&   R>   R5   Rc   t
   tls_verify(    (    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyR     s   t   MockAppc             s    e  Z d  Z     Z d   Z RS(   R   c         S  s   t  | d t j d  S(   NR   (   t   printt   syst   stderr(   R   t   msg(    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyR     s    (   R%   R&   RH   R0   R   (    (   R   (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyR     s   	i    R   s   	%-40s %s%si   R   s   %-40s: i   s   Unknown error: %rN(   Ri   R   R   R   t   exitt   objectR\   Rk   t   itemsRR   RL   RI   (   R   R   t   filenameRZ   Rq   t   entryt   einfoR[   (    (   R   s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyR     s&    	


#	!t   __main__R   i   (D   R'   t
   __future__R    R8   RP   R   R`   R   t   osR   t   docutilsR   t   docutils.utilsR   t   sixR   R   R   t   six.moves.urllib.parseR   R   R   t   sphinx.builders.htmlR	   t   sphinx.deprecationR
   t   sphinx.localeR   R   t   sphinx.utilR   R   t   sphinx.util.inventoryR   Rc   t   typingR   R   R   R   R   R   t   sphinx.applicationR   t   sphinx.configR   t   sphinx.environmentR   RK   t   unicodet	   Inventoryt	   getLoggerR%   RM   R   R   R.   R>   R<   RC   R\   R   R   R   R   R   t   basicConfigR   (    (    (    s5   lib/python2.7/site-packages/sphinx/ext/intersphinx.pyt   <module>   sP   .	-!			(	R	L				$
