3

T'íc{iã
@s¶dZddlZddlZddlZddlZddlZddlZddlm	Z	ddl
mZddlm
Z
mZmZmZmZmZmZddlmZmZddlmZddlmZmZmZmZdd	lmZm Z ddl!Z!dd
l"m#Z#ddl$m%Z%ddl&m'Z'dd
l(m)Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1m2Z2ddl3m4Z4ddl5m6Z6m7Z7ddl8m9Z9m:Z:ddl;m<Z<ddl=m>Z>m?Z?m@Z@e6jAeBƒZCGdd„dƒZDeEeEdœdd„ZFdYeEe)e
dœdd„ZGeEeEdœdd „ZHe%eEeed!œd"d#„ZIeEeEeeeeJeKd$œd%d&„ZLe%dd'œd(d)„ZMe+eeEe?e#eed*œd+d,„ZNeeEe>e+eeEeEe#eeed-œd.d/„ZOe-eeEe>eKe+eeEe#eeed0œ	d1d2„ZPe-eeEe>eKe#eeed3œd4d5„ZQe-eEeKd6œd7d8„ZRe-eEe#eeed9œd:d;„ZSe-eKe#eeed<œd=d>„ZTe-e#eeed?œd@dA„ZUe%e-e#eeedBœdCdD„ZVGdEdF„dFe9ƒZWGdGdH„dHe:ƒZXGdIdJ„dJe4ƒZYe%eEeeEddKœdLdM„ZZe%e)ddNœdOdP„Z[e%eeEefd'œdQdR„Z\eeEddSœdTdU„Z]eBdVkr²ddl6Z^e^j_ƒe]ej`dWd…dXdS)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~eZdZdZeddœdd„Zeeee	ee
effdœdd„ƒZeedœd	d
„ƒZ
eeeefdœdd„ƒZddœd
d„ZdS)ÚInventoryAdapterz!Inventory adapter for environmentN)ÚenvÚreturncCs,||_t|dƒs(i|j_i|j_i|j_dS)NÚintersphinx_cache)r'Úhasattrr)Úintersphinx_inventoryÚintersphinx_named_inventory)Úselfr'©r.ú8/tmp/pip-build-gk9425m9/sphinx/sphinx/ext/intersphinx.pyÚ__init__7s

zInventoryAdapter.__init__)r(cCs|jjS)N)r'r))r-r.r.r/Úcache?szInventoryAdapter.cachecCs|jjS)N)r'r+)r-r.r.r/Úmain_inventoryCszInventoryAdapter.main_inventorycCs|jjS)N)r'r,)r-r.r.r/Únamed_inventoryGsz InventoryAdapter.named_inventorycCs|jjjƒ|jjjƒdS)N)r'r+Úclearr,)r-r.r.r/r4KszInventoryAdapter.clear)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rr0ÚpropertyrÚstrr	Úintr#r1r2r3r4r.r.r.r/r&4s"r&)Úurlr(cCs6tt|ƒƒ}d|dkr.|djdƒ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_authPsrB)r<Úconfigr(cCsBtj|d||jd}|jƒ|j|j_tj|jjdd|j_|jS)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_urles

rOcCs^t|ƒ}|jdkr|St|ƒ}|jr>dj|j|j|jƒ|d<ndj|j|jƒ|d<t|ƒSdS)a5Gets 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<ÚpartsrAr.r.r/Ú
_get_safe_url~s
rU)ÚappÚuriÚinvr(c
+Cs€d|k}|st|ƒ}y0d|kr.t||jd}nttj|j|ƒdƒ}Wn8tk
r|}zd||jt	|ƒf|_
‚WYdd}~XnXy¼t|dƒrÒ|j}||krÒt
jtdƒ||ƒ||tj|ƒtj|ƒdfkrÒtj|ƒ}|\y"|rätjntj}tj|||ƒ}Wn2tk
r,}	ztd	|	ƒ|	‚WYdd}	~	XnXWdQRXWn<tk
rv}zd
||jjt	|ƒf|_
‚WYdd}~XnX|SdS)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)rBrOrCÚopenrÚjoinÚsrcdirÚ	ExceptionÚ	__class__r:Úargsr*r<ÚloggerÚinforÚdirnameÚ	posixpathr"ÚloadÚ
ValueErrorr5)
rVrWrXZlocaluriÚfÚerrZnewinvr\ÚinvdataÚexcr.r.r/Úfetch_inventory—s:

.rk)ÚnamerWÚinvsr1rVÚnowr(cCs<||jjd}g}z²x¬|D]¤}|s0tj|tƒ}d|ksP||ksP||d|krt|ƒ}	tjtdƒ|	ƒyt	|||ƒ}
Wn0t
k
r¨}z|j|jƒwWYdd}~XnX|
r|||
f||<dSqWdS|gkrÒndt
|ƒt
|ƒkrtjtdƒƒxB|D]}tj|ŽqøWn*djd	d
„|Dƒƒ}
tjtdƒd|
ƒXdS)Ni€Qz://r>z(loading intersphinx inventory from %s...TFzXencountered some issues with some of the inventories, but they had working alternatives:Ú
cSs g|]}|d|dd…‘qS)rr>Nr.)Ú.0rgr.r.r/ú
<listcomp>Þsz)fetch_inventory_group.<locals>.<listcomp>zAfailed to reach any of the inventories with the following issues:)rCÚintersphinx_cache_limitrdr\rrUrarbrrkr^Úappendr`ÚlenÚwarning)rlrWrmr1rVrnZ
cache_timeZfailuresrXZsafe_inv_urlrirhZfailZissuesr.r.r/Úfetch_inventory_group¾s6
 
rv)rVr(cCsttjƒƒ}t|jjƒ}tjjƒ\}g}x:|jj	j
ƒD]*\}\}}|j|jt
||||j||ƒƒq6Wdd„tjj|ƒDƒ}WdQRXt|ƒr|jƒt|jj
ƒƒ}	tdd„|	Dƒƒ}
dd„|	Dƒ}xN|
|D]B\}}}
|ræ|
|j|<x(|
jƒD]\}}|jj|iƒj|ƒqðWqÎWdS)z3Load all intersphinx mappings into the environment.cSsg|]}|jƒ‘qSr.)Úresult)rprgr.r.r/rqîsz!load_mappings.<locals>.<listcomp>Ncss|]}|dr|VqdS)rNr.)rpÚvr.r.r/ú	<genexpr>ûsz load_mappings.<locals>.<genexpr>cSsg|]}|ds|‘qS)rr.)rprxr.r.r/rqüs)r;Útimer&Zbuilderr'Ú
concurrentÚfuturesZThreadPoolExecutorrCÚintersphinx_mappingÚvaluesrsZsubmitrvr1Zas_completedÚanyr4r?Úsortedr3Úitemsr2Ú
setdefaultÚupdate)rVrnZinventoriesÚpoolr|rlrWrmÚupdatedZcached_valsZ
named_valsZunnamed_valsÚ_xriÚtypeZobjectsr.r.r/Ú
load_mappingsãs$ 
	
rˆ)ÚdomainÚinv_nameÚdataÚnodeÚcontnoder(cCs|\}}}}d|kr4|jdƒr4tjt|ddƒ|ƒ}|rJtdƒ||f}	ntdƒ|f}	tjddd||	d}
|jd	ƒr‚|
j|ƒnŽ|d
ks |jdkrþ|dd
krþ|j	ƒ}|dk	rò|j
|dƒrò|
j|j|t|ƒdd…|t|ƒdd…ƒƒn
|
j|ƒn|
j|j||ƒƒ|
S)Nz://ZrefdocÚ.z(in %s v%s)z(in %s)ÚF)ZinternalZrefuriÚreftitleZrefexplicitú-ÚstdÚreftypeÚkeywordú:r>)
rGrr\rrr
Ú	referencersrlZastextÚ
startswithr_rt)r‰rŠr‹rŒrÚprojÚversionrWZdispnamerÚnewnodeÚtitler.r.r/Ú_create_element_from_results$
rœ)rŠÚ	inventoryr‰ÚobjtypesÚtargetrŒrr(c
sŽxˆ|D]€}||krq|||kr.|||}nJ|dkr|jƒ‰tt‡fdd„||jƒƒƒ}	|	r|||	d}qxqnqt|||||ƒSWdS)Nzstd:termcs|jƒˆkS)N)Úlower)Úk)Útarget_lowerr.r/Ú<lambda>2sz8_resolve_reference_in_domain_by_target.<locals>.<lambda>r)r r?ÚfilterÚkeysrœ)
rŠrr‰ržrŸrŒrZobjtyper‹Zinsensitive_matchesr.)r¢r/Ú&_resolve_reference_in_domain_by_target"s
r¦)	r'rŠrÚhonor_disabled_refsr‰ržrŒrr(c
s¶ˆjdkrd|kr|jdƒˆjdkr8d|kr8|jdƒ‡fdd„|Dƒ}|rh|jj‰‡fd	d„|Dƒ}t||ˆ||d
||ƒ}|dk	rŒ|Sˆj|ƒ}	|	dkr¢dSt||ˆ||	||ƒS)Nr’Z	cmdoptionÚoptionÚpyÚ	attributeÚmethodcsg|]}djˆj|ƒ‘qS)z{}:{})rRrl)rpÚt)r‰r.r/rqQsz0_resolve_reference_in_domain.<locals>.<listcomp>csg|]}|ˆkr|‘qSr.r.)rpÚo)Údisabledr.r/rqVsÚ	reftarget)rlrsrCÚintersphinx_disabled_reftypesr¦Zget_full_qualified_name)
r'rŠrr§r‰ržrŒrÚresZfull_qualified_namer.)r®r‰r/Ú_resolve_reference_in_domainBs"




r²)r'rŠrr§rŒrr(c
Csî|o
|dk}|r d|jjkr dS|d}|dkrŽxX|jjƒD]J\}}|rZ|d|jjkrZq<t|jƒ}	t||||||	||ƒ}
|
dk	r<|
Sq<WdS|jdƒ}|s dS|r¸|d|jjkr¸dS|j|ƒ}|j	|ƒ}	|	sÔdSt||||||	||ƒSdS)NÚ*r“rz:*Ú	refdomain)
rCr°Údomainsrr?Zobject_typesr²rGÚ
get_domainZobjtypes_for_role)r'rŠrr§rŒrÚtypÚdomain_namer‰ržr±r.r.r/Ú_resolve_referencefs>



r¹)r'rŠr(cCs|t|ƒjkS)N)r&r3)r'rŠr.r.r/Úinventory_existssrº)r'rŠrŒrr(cCs*t||ƒst‚t||t|ƒj|d||ƒS)zÁAttempt 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(cCst|dt|ƒj|||ƒS)zˆAttempt 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¢sr½)r'rŒrr(cCsnt|d||ƒ}|dk	r|S|d}d|kr.dS|jddƒ\}}t||ƒsLdS||d<t||||ƒ}||d<|S)agAttempt 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	newtargetZres_invr.r.r/Ú"resolve_reference_detect_inventory¯s
r¾)rVr'rŒrr(cCst|||ƒS)zBAttempt to resolve a missing reference via intersphinx references.)r¾)rVr'rŒrr.r.r/Úmissing_referenceÌsr¿cs:eZdZdZeeeeee	e
efdœ‡fdd„Z‡Z
S)ÚIntersphinxDispatcherzyCustom dispatcher for external role.

    This enables :external:***:/:external+***: roles on parsing reST document.
    )Ú	role_nameÚlanguage_moduleÚlinenoÚreporterr(cs8t|ƒdkr"|jdƒr"t|ƒgfStƒj||||ƒSdS)Né	ú	external:ú	external+)rÆrÇ)rtr—ÚIntersphinxRoleÚsuperÚrole)r-rÁrÂrÃrÄ)r_r.r/rÊÙszIntersphinxDispatcher.role)r5r6r7r8r:rr;rr	r%rrrÊÚ
__classcell__r.r.)r_r/rÀÓsrÀc@s¶eZdZejdƒZeddœdd„Zee	e
e	efdœdd„Zeee
eefd	œd
d„Zee
eeefd	œdd
„Zeeedœdd„Zeeefee	e
e	efdœdd„ZdS)rÈz(\+([^:]+))?:(.*)N)Ú	orig_namer(cCs
||_dS)N)rÌ)r-rÌr.r.r/r0çszIntersphinxRole.__init__)r(cCsÒ|j|jjƒkst‚|j|jƒ\}}|r\t|j|ƒr\tjt	dƒ||jj
|jfdggfS|j|ƒ}|dkr”tjt	dƒ||jj
|jfdggfS|j
|ƒ\}}x&|D]}t|tƒr¨d|d<||d<q¨W||fS)Nz4inventory for external cross-reference not found: %s)Úlocationz/role for external cross-reference not found: %sTÚintersphinxr)rlrÌr r»Úget_inventory_and_name_suffixrºr'rarurÚdocnamerÃÚ
get_role_nameÚinvoke_roleÚ
isinstancer)r-rZname_suffixrÁrwÚmessagesrŒr.r.r/Úrunês"



zIntersphinxRole.run)rlr(cCsH|jdƒst|ƒ‚|ddks&t|ƒ‚tjj|dƒjddƒ\}}||fS)NZexternaléz:+éé)r—r»rÈÚ_re_inv_refÚ	fullmatchÚgroup)r-rlrXÚsuffixr.r.r/rÏsz-IntersphinxRole.get_inventory_and_name_suffixcCs’|jdƒ}t|ƒdkr<|jjjdƒ}|r.|jnd}|d}n"t|ƒdkrZ|d}|d}ndS|rv|j||ƒrv||fS|jd|ƒrŠd|fSdSdS)Nr•r>Údefault_domainrr×r’)r@rtr'Z	temp_datarGrlÚis_existent_role)r-rlÚnamesrÝr‰rÊr.r.r/rÑs


zIntersphinxRole.get_role_name)r¸rÁr(cCs<y"|jj|ƒ}||jkrdSdSWntk
r6dSXdS)NTF)r'r¶Zrolesr)r-r¸rÁr‰r.r.r/rÞ!s
z IntersphinxRole.is_existent_role)rÊr(cCsT|jj|dƒ}|rH|j|dƒ}|dj|ƒ|j|j|j|j|j|j	ƒSggfSdS)Nrr>r•)
r'r¶rÊr\ZrawtextÚtextrÃZinlinerÚoptionsÚcontent)r-rÊr‰Z	role_funcr.r.r/rÒ+szIntersphinxRole.invoke_role)r5r6r7ÚreÚcompilerÙr:r0r	rrrrÕrrÏrÑÚboolrÞrÒr.r.r.r/rÈás

rÈc@s*eZdZdZejdZeddœdd„ZdS)ÚIntersphinxRoleResolverz€pending_xref node resolver for intersphinx role.

    This resolves pending_xref nodes generated by :intersphinx:***: role.
    r>N)Úkwargsr(cKsÌxÆ|jjtƒD]¶}d|krqttj|djƒƒ}|d}|dk	rbt|j|ƒsPt	‚t
|j|||ƒ}nt|jd||ƒ}|dkrº|d}tdƒ|d||df}t
j||d	|d
|j|ƒq|j|ƒqWdS)NrÎrrFr“z-external %s:%s reference target not found: %sr´r¯Úref)rÍr‡Úsubtype)ÚdocumentZtraverserr
r
rÚdeepcopyrºr'r»r¼r½rraruZreplace_self)r-rçrŒrrŠršr·Úmsgr.r.r/rÕ>s zIntersphinxRoleResolver.run)r5r6r7r8rZdefault_priorityrrÕr.r.r.r/ræ6s
ræ)rVrÐÚsourcer(cCstƒ}|jƒdS)z“Enable IntersphinxDispatcher.

    .. note:: The installed dispatcher will uninstalled on disabling sphinx_domain
              automatically.
    N)rÀÚenable)rVrÐríZ
dispatcherr.r.r/Úinstall_dispatcherSsrï)rVrCr(cCsîxè|jjƒjƒD]Ö\}}yŒt|ttfƒr`||}\}}t|tƒsptjt	dƒ|ƒ|jj
|ƒwnd||}}}t|tƒs|||fff|j|<n|||ff|j|<Wqtk
rä}z$tjt	dƒ||ƒ|jj
|ƒWYdd}~XqXqWdS)Nz0intersphinx identifier %r is not string. Ignoredz3Failed to read intersphinx_mapping[%s], ignored: %r)r}ÚcopyrrÓr?Útupler:rarurÚpopr^)rVrCÚkeyÚvaluerlrWrXrjr.r.r/Únormalize_intersphinx_mapping]s 


rõcCs„|jdidƒ|jdddƒ|jdddƒ|jdgdƒ|jdtd	d
|jdtƒ|jdtƒ|jd
tƒ|jtƒtj	dddœS)Nr}TrréFrHr°z
config-initedi )Úpriorityzbuilder-initedzsource-readzmissing-referencer>)r™Zenv_versionZparallel_read_safe)
Zadd_config_valueÚconnectrõrˆrïr¿Zadd_post_transformræÚsphinxZ__display_version__)rVr.r.r/Úsetupus
rú)Úargvr(cs<t|ƒdkr$tdtjdtjdƒGdd„dƒ‰G‡fdd„dƒ}y„|d}t|ƒd	|ƒ}xht|pfiƒD]X}t|ƒxJt||jƒƒD]6\}}td
||ddkr®d
|dnd	|dfƒqˆWqjWWnntk
r}z"t|j	d|j	dd…ƒWYdd}~Xn0t
k
r6}ztd|ƒWYdd}~XnXdS)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@seZdZUdZedZdZdS)z inspect_main.<locals>.MockConfigNF)r5r6r7rHr;Z
tls_verifyÚ
user_agentr.r.r.r/Ú
MockConfigŽs
rþcs&eZdZdZ”ƒZeddœdd„ZdS)zinspect_main.<locals>.MockApprN)rìr(cSst|tjddS)N)rü)ÚprintÚsysÚstderr)r-rìr.r.r/Úwarn—sz"inspect_main.<locals>.MockApp.warn)r5r6r7r]rCr:rr.)rþr.r/ÚMockApp“srrrz	%-40s %s%srØr‘z%-40s: r×NzUnknown error: %r)rtrÿrrÚexitrkr€rrfr`r^)rûrÚfilenameriróÚentryZeinforjr.)rþr/Úinspect_main†s&

,rÚ__main__r>)rû)N)ar8Úconcurrent.futuresr{rKrdrãrrzÚosrÚtypesrÚtypingrrrrrr	r
Úurllib.parserrZdocutilsr
Zdocutils.nodesrrrrZdocutils.utilsrrrùZsphinx.addnodesrZsphinx.applicationrZsphinx.builders.htmlrZ
sphinx.configrZsphinx.domainsrZsphinx.environmentrZ
sphinx.errorsrZ
sphinx.localerrZ!sphinx.transforms.post_transformsrZsphinx.utilrrZsphinx.util.docutilsr r!Zsphinx.util.inventoryr"Zsphinx.util.typingr#r$r%Ú	getLoggerr5rar&r:rBrOrUrkÚfloatrårvrˆrœr¦r²r¹rºr¼r½r¾r¿rÀrÈrærïrõrúrZ_loggingÚbasicConfigrûr.r.r.r/Ú<module>sš$
(#!
'
U
#