U
    \Shp                  
   @  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	Z	ddl
mZ ddl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 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" 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rddl-m.Z. ddlm/Z/m0Z0 ddl1m2Z2m3Z3m4Z4 ddlm5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@Z@mAZA e/e0eBdf eCe?f ZDe&EeFZGG dd dZHdddddZIdrdd d!d"d#d$ZJdddd%d&ZKd'ddd(d)d*d+ZLd,dd-d.d'd/d0d1d2d3ZMd'd4d5d6d7ZNd8d,d9d:d;d<d=d>d?ZOd,d(d8d@dd:d;dAdBdCdDZPdEd,d(d0d8d@d:d;dAdF	dGdHZQdEd,d(d0d:d;dAdIdJdKZRdEdd0dLdMdNZSdEdd:d;dAdOdPdQZTdEd0d:d;dAdRdSdTZUdEd:d;dAdUdVdWZVd'dEd:d;dAdXdYdZZWG d[d\ d\e)ZXG d]d^ d^e*ZYG d_d` d`e$ZZd'ddad4dbdcddZ[d'ded4dfdgdhZ\d'did5djdkZ]dad4dldmdnZ^eFdokrddl&Z_e_`  e^ejadpd dq dS )sa  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.
    )annotationsN)path)IOTYPE_CHECKINGAnyIterablecast)urlsplit
urlunsplit)nodes)relative_path)pending_xref)INVENTORY_FILENAME)ExtensionError)___)ReferencesResolver)loggingrequests)CustomReSTDispatcher
SphinxRole)InventoryFile)
ModuleType)TupleUnion)NodeTextElementsystem_message)Reporter)Sphinx)Config)Domain)BuildEnvironment)	InventoryInventoryItemRoleFunctionc                   @  sd   e Zd ZdZdddddZeddd	d
ZeddddZeddddZddddZ	dS )InventoryAdapterz!Inventory adapter for environmentr"   None)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/   I/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/ext/intersphinx.py__init__A   s
    
zInventoryAdapter.__init__dict[str, InventoryCacheEntry]r)   c                 C  s   | j jS )aA  Intersphinx cache.

        - Key is the URI of the remote inventory
        - Element one is the key given in the Sphinx intersphinx_mapping
          configuration value
        - Element two is a time value for cache invalidation, a float
        - Element three is the loaded remote inventory, type Inventory
        )r(   r*   r.   r/   r/   r0   cacheK   s    
zInventoryAdapter.cacher#   c                 C  s   | j jS N)r(   r,   r4   r/   r/   r0   main_inventoryW   s    zInventoryAdapter.main_inventoryzdict[str, Inventory]c                 C  s   | j jS r6   )r(   r-   r4   r/   r/   r0   named_inventory[   s    z InventoryAdapter.named_inventoryc                 C  s   | j j  | j j  d S r6   )r(   r,   clearr-   r4   r/   r/   r0   r9   _   s    zInventoryAdapter.clearN)
__name__
__module____qualname____doc__r1   propertyr5   r7   r8   r9   r/   r/   r/   r0   r&   >   s   
r&   str)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/   r0   _strip_basic_authd   s    rF   zConfig | Noner   )r@   configr)   c                 C  sN   t j| d|j|j|j|jf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timeoutZ_user_agentZ	_tls_info)decode_content)r   getintersphinx_timeout
user_agent
tls_verifytls_cacertsraise_for_statusr@   raw	functoolspartialread)r@   rG   rr/   r/   r0   _read_from_urly   s    

rV   c                 C  sf   t | }|jdkr| S t|}|jrD|j d|j d|j |d< n|j d|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``
    NrA   :rB   )r	   usernamerC   porthostnamer
   )r@   partsrE   r/   r/   r0   _get_safe_url   s    
 r\   r   r#   )appuriinvr)   c           
      C  s  d|k}|st |}z0d|kr.t|| jd}ntt| j|d}W n8 tk
r| } zd||jt	|f|_
 W 5 d}~X Y nX zt|dr|j}||krttd|| ||t|t|d fkrt|}|\ z"|rtjntj}t|||}W n2 tk
r, }	 ztd	|	 |	W 5 d}	~	X Y nX W 5 Q R X W n< tk
rv } zd
||jjt	|f|_
 W 5 d}~X Y nX |S dS )z6Fetch, parse and return an intersphinx inventory file.://)rG   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)rF   rV   rG   openr   joinsrcdir	Exception	__class__r?   argsr+   r@   loggerinfor   dirname	posixpathr   load
ValueErrorr:   )
r]   r^   r_   ZlocaluriferrZnewinvrd   invdataexcr/   r/   r0   fetch_inventory   sF      

.  rs   z
str | Noneztuple[str | None, ...]r2   intbool)namer^   invsr5   r]   nowr)   c                 C  sF  ||j jd  }g }z|D ]}
|
s.t|t	}
d|
ksN||ksN|| d |k rt
|
}ttd	| zt|||
}W n6 tk
r } z||j W Y qW 5 d }~X Y nX |r| ||f||<  W d
S qW dS |g krnbt|t|k rttd |D ]}tj|  qn*ddd |D }	ttdd |	  X d S )NiQ zXencountered some issues with some of the inventories, but they had working alternatives:
c                 S  s    g | ]}|d  |dd  qS )r   rB   Nr/   .0ro   r/   r/   r0   
<listcomp>   s     z)fetch_inventory_group.<locals>.<listcomp>zAfailed to reach any of the inventories with the following issues:r`   rB   z(loading intersphinx inventory from %s...TF)rG   intersphinx_cache_limitlenri   rj   r   rd   warningrl   r   r\   rs   rf   appendrh   )rv   r^   rw   r5   r]   rx   Z
cache_timeZfailuresZfailZissuesr_   Zsafe_inv_urlrq   rp   r/   r/   r0   fetch_inventory_group   s<     
r   r'   )r]   r)   c                 C  s"  t t }t| jj}|j}tj V}g }| j	j
 D ](\}\}}||t||||| | q:dd tj|D }	W 5 Q R X t|	r|  g }
g }| D ],\}}}|r|
||f q|||f qt|
| D ]<\}}|r||j|< | D ]\}}|j|i | qqdS )z3Load all intersphinx mappings into the environment.c                 S  s   g | ]}|  qS r/   )resultrz   r/   r/   r0   r|     s     z!load_mappings.<locals>.<listcomp>N)rt   timer&   Zbuilderr(   r5   
concurrentfuturesZThreadPoolExecutorrG   intersphinx_mappingvaluesr   Zsubmitr   Zas_completedanyr9   sortedr8   itemsr7   
setdefaultupdate)r]   rx   Zinventoriesr*   poolr   rv   r^   rw   updatedZ
named_valsZunnamed_valsZ_expiryrq   typeobjectsr/   r/   r0   load_mappings   s:           
	
r   r!   r$   r   r   znodes.reference)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 )Nr`   Zrefdoc.z(in %s v%s)z(in %s) F)ZinternalZrefurireftitleZrefexplicit-stdreftypekeywordrW   rB   )rK   r   rd   r   r   r   	referencer   rv   Zastext
startswithrg   r~   )r   r   r   r   r   Zprojversionr^   Zdispnamer   newnodetitler/   r/   r0   _create_element_from_result'  s,    

r   zIterable[str]znodes.reference | None)r   	inventoryr   objtypestargetr   r   r)   c           
        s   |D ]}||krq||| kr,|| | }nJ|dkr|   tt fdd||  }	|	r|| |	d  }qvqnqt|| |||  S d S )Nzstd:termc                   s   |    kS r6   )lower)kZtarget_lowerr/   r0   <lambda>U      z8_resolve_reference_in_domain_by_target.<locals>.<lambda>r   )r   rC   filterkeysr   )
r   r   r   r   r   r   r   objtyper   Zinsensitive_matchesr/   r   r0   &_resolve_reference_in_domain_by_targetE  s     
r   r"   )	r(   r   r   honor_disabled_refsr   r   r   r   r)   c                   s   i  |}|jdkr$d|kr$d |d< |jdkr>d|kr>d |d< |jfdd|D }|rxt| 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   i | ]}  d | dqS )rW   Nr/   r{   obj_type)domain_namer/   r0   
<dictcomp>w  s      z0_resolve_reference_in_domain.<locals>.<dictcomp>c                   s   i | ]}| kr|d qS r6   r/   r   )disabledr/   r0   r   |  s    	reftarget)fromkeysrv   setrG   intersphinx_disabled_reftypesr   r   Zget_full_qualified_name)r(   r   r   r   r   r   r   r   Z	obj_typesresZfull_qualified_namer/   )r   r   r0   _resolve_reference_in_domaine  s8    



  

  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r| j D ]N\}}|rX|d | j jkrXq:|j }	t| |||||	||}
|
d k	r:|
  S q:d S |d}|sd S |r|d | j jkrd S | |}|	|}	|	sd S t| |||||	||S d S )N*r   r   z:*	refdomain)
rG   r   domainsr   Zobject_typesr   r   rK   
get_domainZobjtypes_for_role)r(   r   r   r   r   r   typr   r   r   r   r/   r/   r0   _resolve_reference  sN    
  



  r   )r(   r   r)   c                 C  s   |t | jkS r6   )r&   r8   )r(   r   r/   r/   r0   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&   r8   )r(   r   r   r   r/   r/   r0   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&   r7   )r(   r   r   r   r/   r/   r0   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   rW   rB   )r   rD   r   r   )r(   r   r   r   r   r   Z	newtargetZres_invr/   r/   r0   "resolve_reference_detect_inventory  s    
r   )r]   r(   r   r   r)   c                 C  s   t |||S )zBAttempt to resolve a missing reference via intersphinx references.)r   )r]   r(   r   r   r/   r/   r0   missing_reference  s    r   c                      s.   e Zd ZdZdddddd fdd	Z  ZS )
IntersphinxDispatcherzyCustom dispatcher for external role.

    This enables :external:***:/:external+***: roles on parsing reST document.
    r?   r   rt   r   z)tuple[RoleFunction, list[system_message]])	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+)r~   r   IntersphinxRolesuperrole)r.   r   r   r   r   rg   r/   r0   r     s    zIntersphinxDispatcher.role)r:   r;   r<   r=   r   __classcell__r/   r/   r   r0   r     s   r   c                   @  sv   e Zd ZedZdddddZddd	d
ZdddddZdddddZ	ddddddZ
dddddZdS )r   z(\+([^:]+))?:(.*)r?   r'   )	orig_namer)   c                 C  s
   || _ d S r6   )r   )r.   r   r/   r/   r0   r1     s    zIntersphinxRole.__init__z'tuple[list[Node], list[system_message]]r3   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 | |\}}|D ]}t|trd|d< ||d< q||fS )Nz4inventory for external cross-reference not found: %s)locationz/role for external cross-reference not found: %sTintersphinxr   )rv   r   r   r   get_inventory_and_name_suffixr   r(   ri   r   r   docnamer   get_role_nameinvoke_role
isinstancer   )r.   r   Zname_suffixr   r   messagesr   r/   r/   r0   run  s(    
 


zIntersphinxRole.runztuple[str | None, str])rv   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.   rv   r_   suffixr/   r/   r0   r   +  s    z-IntersphinxRole.get_inventory_and_name_suffixztuple[str, str] | Nonec                 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 )NrW   rB   default_domainr   r   r   )rD   r~   r(   Z	temp_datarK   rv   is_existent_role)r.   rv   namesr   r   r   r/   r/   r0   r   7  s    


zIntersphinxRole.get_role_nameru   )r   r   r)   c                 C  s4   z| j |}||jkW S  tk
r.   Y dS X d S )NF)r(   r   Zrolesr   )r.   r   r   r   r/   r/   r0   r   L  s
    z IntersphinxRole.is_existent_roleztuple[str, str])r   r)   c                 C  sT   | j |d }|rH||d }|d|| j| j| j| j| j| j	S g g fS d S )Nr   rB   rW   )
r(   r   r   rd   Zrawtexttextr   Zinlineroptionscontent)r.   r   r   Z	role_funcr/   r/   r0   r   S  s      zIntersphinxRole.invoke_roleN)r:   r;   r<   recompiler   r1   r   r   r   r   r   r/   r/   r/   r0   r     s   
r   c                   @  s*   e Zd ZdZejd ZdddddZdS )	IntersphinxRoleResolverzpending_xref node resolver for intersphinx role.

    This resolves pending_xref nodes generated by :intersphinx:***: role.
    rB   r   r'   )kwargsr)   c                 K  s   | j tD ]}d|krqttj|d  }|d }|d k	r`t| j|sNt	t
| j|||}nt| jd||}|d kr|d }td|d ||d f }tj||d	|d
 || q|| q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   ri   r   Zreplace_self)r.   r   r   r   r   r   r   msgr/   r/   r0   r   f  s"    zIntersphinxRoleResolver.runN)r:   r;   r<   r=   r   Zdefault_priorityr   r/   r/   r/   r0   r   ^  s   
r   z	list[str])r]   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)r]   r   r   
dispatcherr/   r/   r0   install_dispatcher{  s    r   r    )r]   rG   r)   c           	      C  s  |j   D ]\}}zt|ttfr`|| }\}}t|tstt	d| |j 
| W qn*d ||  }}}d||fd}t| t|ts|||fff|j |< n|||ff|j |< W q tk
r  } z"tt	d|| |j 
| W 5 d }~X Y qX qd S )Nz0intersphinx identifier %r is not string. IgnoredzThe pre-Sphinx 1.0 'intersphinx_mapping' format is deprecated and will be removed in Sphinx 8. Update to the current format as described in the documentation. Hint: "intersphinx_mapping = {'<name>': ze}".https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html#confval-intersphinx_mappingz3Failed to read intersphinx_mapping[%s], ignored: %r)r   copyr   r   rC   tupler?   ri   r   r   poprf   )	r]   rG   keyvaluerv   r^   r_   r   rr   r/   r/   r0   normalize_intersphinx_mapping  s(    



r   zdict[str, Any]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   Tr}      FrL   r   zstd:doczconfig-initedi   )priorityzbuilder-initedzsource-readzmissing-referencerB   )r   Zenv_versionZparallel_read_safe)
Zadd_config_valueconnectr   r   r   r   Zadd_post_transformr   sphinxZ__display_version__)r]   r/   r/   r0   setup  s    
r  )argvr)   c              
     s0  t | dk r"tdtjd tdG dd d G  fddd}z|| d }t| d	|}t|pbi D ]T}t| t||  D ]6\}}td
||d dkrd|d  nd	|d f  qqfW nl tk
r } z t|j	d |j	dd   W 5 d}~X Y n0 t
k
r* } ztd|  W 5 d}~X Y nX dS )z-Debug functionality to print out an inventoryrB   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ded< dZdZdZdS )z inspect_main.<locals>.MockConfigNz
int | NonerL   F)r:   r;   r<   rL   __annotations__rN   rO   rM   r/   r/   r/   r0   
MockConfig  s   
r
  c                      s&   e Zd ZdZ  ZdddddZdS )zinspect_main.<locals>.MockAppr   r?   r'   )r   r)   c                 S  s   t |tjd d S )Nr  )printsysstderr)r.   r   r/   r/   r0   warn  s    z"inspect_main.<locals>.MockApp.warnN)r:   r;   r<   re   rG   r  r/   r
  r/   r0   MockApp  s   r  r   r   z	%-40s %s%sr   r   z%-40s: r   NzUnknown error: %r)r~   r  r  r  
SystemExitrs   r   r   rn   rh   rf   )r  r  filenamerq   r   entryZeinforr   r/   r  r0   inspect_main  s*    ,r  __main__rB   )r  )N)br=   
__future__r   concurrent.futuresr   rR   rl   r   r  r   osr   typingr   r   r   r   r   urllib.parser	   r
   Zdocutilsr   Zdocutils.utilsr   r  Zsphinx.addnodesr   Zsphinx.builders.htmlr   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   typesr   r   r   Zdocutils.nodesr   r   r   r   Zsphinx.applicationr   Zsphinx.configr    Zsphinx.domainsr!   Zsphinx.environmentr"   Zsphinx.util.typingr#   r$   r%   r?   rt   ZInventoryCacheEntry	getLoggerr:   ri   r&   rF   rV   r\   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  Z_loggingbasicConfigr  r/   r/   r/   r0   <module>   sx   
&'*) +)R
!$
