
    FeY                       d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
mZmZmZ ddlmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ 	 ddlmZ e
r ddlZddlmZm Z m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z'  ejP                  e)      Z*dZ+e,ejZ                  ej\                  fZ/ G d de      Z0d#dZ1 G d d      Z2 G d d      Z3d$dZ4d%dZ5d%dZ6d%dZ7d&dZ8d'dZ9d(dZ:d%d Z;	 	 	 	 	 	 d)d!Z<d*d"Z=y# e$ r	 ddlmZ Y w xY w)+z"Build configuration file handling.    )annotationsN)getenvpath)TYPE_CHECKINGAnyCallable
NamedTuple)ConfigErrorExtensionError)___)logging)fs_encoding)NoneType)chdir)_chdir)	GeneratorIteratorSequence)Sphinx)BuildEnvironment)Tagszconf.pyc                  ,    e Zd ZU ded<   ded<   ded<   y)ConfigValuestrnamer   value
bool | strrebuildN)__name__
__module____qualname____annotations__     //usr/lib/python3/dist-packages/sphinx/config.pyr   r   $   s    
IJr%   r   c                   t        | t              ryt        | t              r1| j                         D ]  \  }}t	        |      rt	        |      r y yt        | t
        t        t        f      rt        d | D              S y)z'Check if object is serializable or not.Fc              3  2   K   | ]  }t        |        y wN)is_serializable).0is     r&   	<genexpr>z"is_serializable.<locals>.<genexpr>3   s     3!?1%3s   T)	
isinstanceUNSERIALIZABLE_TYPESdictitemsr*   listtuplesetall)objkeyr   s      r&   r*   r*   *   sq    #+,	C	))+ 	JC"3'u/E	  
C$s+	,3s333r%   c                       e Zd ZdZddZddZy)ENUMzRepresents the candidates which a config value should be one of.

    Example:
        app.add_config_value('latex_show_urls', 'no', None, ENUM('no', 'footnote', 'inline'))
    c                    || _         y r)   
candidates)selfr<   s     r&   __init__zENUM.__init__>   s	    $r%   c                t     t        |t        t        f      rt         fd|D              S | j                  v S )Nc              3  :   K   | ]  }|j                   v   y wr)   r;   )r+   itemr=   s     r&   r-   zENUM.match.<locals>.<genexpr>C   s     A4tt.As   )r.   r2   r3   r5   r<   )r=   r   s   ` r&   matchz
ENUM.matchA   s1    edE]+A5AAADOO++r%   N)r<   zstr | bool | NonereturnNone)r   zstr | list | tuplerC   bool)r    r!   r"   __doc__r>   rB   r$   r%   r&   r9   r9   8   s    
%,r%   r9   c            
         e Zd ZU dZi dddg fdddg fddd	eeegfd
d d	eeegfdddg fdddg fdddg fdddegfdddegfddgdg fdddegfdddg fddd edddd      fdddg fd d! dg fd"d#d$idefd%d&dg fi d'g degfd(d)gdegfd*ddegfd+ddg fd,ddg fd-dde	gfd.d/d ed/d0d1      fd2ddg fd3ddg fd4dd	egfd5d6dg fd7i dg fd8g d	g fd9dd	egfd:ddg fd;g dg fd<g d	g fi d=ddegfd>ddegfd?ddg fd@dAde
gfdBddegfdCi dg fdDddg fdEddg fdFg deeegfdGg deeegfdHddg fdIdJdg fdKi dg fdLddedhfdMddg fdNddegfdOddg fddg fddg fddegfddg fdPdg fdQgdRdSgdTdg fddg fdUZdVedW<   	 	 dh	 	 	 didXZe	 	 dh	 	 	 djdY       ZdkdZZdld[Zdld\Zdld]Zdmd^Zdmd_Zdnd`ZdodaZdpdbZdqdcZdrddZdsdeZdtdfZdudgZy)vConfiga  Configuration file abstraction.

    The config object makes the values of all config values available as
    attributes.

    It is exposed via the :py:class:`~sphinx.application.Sphinx`\ ``.config``
    and :py:class:`sphinx.environment.BuildEnvironment`\ ``.config`` attributes.
    For example, to get the value of :confval:`language`, use either
    ``app.config.language`` or ``env.config.language``.
    projectPythonenvauthorunknownproject_copyright html	copyrightc                    | j                   S r)   )rN   )cs    r&   <lambda>zConfig.<lambda>^   s     3 3 r%   versionreleasetoday	today_fmtNlanguageenlocale_dirslocalesfigure_language_filenamez{root}.{language}{ext} gettext_allow_fuzzy_translationsFgettexttranslation_progress_classesT
translateduntranslated
master_docindexroot_docc                    | j                   S r)   )rc   )configs    r&   rT   zConfig.<lambda>m   s    F$5$5 r%   source_suffixz.rstrestructuredtextsource_encodingz	utf-8-sigexclude_patternsinclude_patternsz**default_roleadd_function_parenthesesadd_module_namestoc_object_entriestoc_object_entries_show_parentsdomainr5   hidetrim_footnote_reference_spaceshow_authorspygments_stylehighlight_languagedefaulthighlight_optionstemplates_pathtemplate_bridgekeep_warningssuppress_warningsmodindex_common_prefix
rst_epilog
rst_prologtrim_doctest_flagsprimary_domainpyneeds_sphinxneeds_extensionsmanpages_urlnitpickynitpick_ignorenitpick_ignore_regexnumfignumfig_secnum_depth   numfig_formatmaximum_signature_line_lengthmath_number_allmath_eqref_formatmath_numfigqDejamantext)	languagesbuilders)
tls_verifytls_cacerts
user_agentsmartquotessmartquotes_actionsmartquotes_excludesoption_emphasise_placeholderszdict[str, tuple]config_valuesc                   |xs i }|t        |      ni | _        t        j                  j	                         | _        || _        |j                  dd       | _        d| j                  v rit        | j                  d   t              r.| j                  j                  d      j                  d      |d<   n| j                  j                  d      |d<   |j                  dg       | _        y )Nsetup
extensions,)r0   	overridesrH   r   copyvalues_raw_configgetr   r.   r   popsplitr   )r=   rg   r   s      r&   r>   zConfig.__init__   s    2,5,Air**//1!&,jj$&?
4>>)$..6<'+~~'9'9,'G'M'Mc'R|$'+~~'9'9,'G|$%+ZZb%Ar%   c                *   t        j                  |t              }t        j                  |      st	        t        d      |z        t        ||      }|j                  dd      #t        j                  t        d             d|d<    | ||xs i       S )z/Create a Config object from configuration file.z4config directory doesn't contain a conf.py file (%s)rY   .zInvalid configuration value found: 'language = None'. Update your configuration to a valid language code. Falling back to 'en' (English).rZ   )
r   joinCONFIG_FILENAMEisfiler
   r   eval_config_filer   loggerwarning)clsconfdirr   tagsfilename	namespaces         r&   readzConfig.read   s     99Wo6{{8$b!WX%& ' '$Xt4	 ==S)1NN2 @ A B %)Ij!9io2..r%   c                   t        |t              s|S | j                  |   d   }| j                  |   d   t        k(  r|S | j                  |   d   t        t        hk(  r|dk(  ry|dk(  ry|S t        |      t        u s| j                  |   d   t        gk(  r|dk(  ryt	        |      S t        |t              rt        t        d      ||dz   fz        t        |t              r|j                  d	      S t        |t              r	 t        |      S t        |      r|S |'t        |t              st        t        d      |z        |S # t        $ r}t        t        d
      ||fz        |d }~ww xY w)Nr      0F1TzZcannot override dictionary config setting %r, ignoring (use %r to set individual elements)z
.key=valuer   z/invalid number %r for config value %r, ignoringzAcannot override config setting %r with unsupported type, ignoring)r.   r   r   r   rE   typer0   
ValueErrorr   r2   r   intcallable)r=   r   r   defvalueexcs        r&   convert_overrideszConfig.convert_overrides   s   %%L{{4(+H{{4 #s*T"1%$4C< c\ Lh4'4;;t+<Q+?D6+IC< ;&Hd+  %S "T"&|(;!<"= > > Hd+{{3''Hc*=u:% (#%j3.G  %5 "68<"= > >  " =$R(Y%Z&+T]&3 49<==s   
E
 
	E2E--E2c                >   g d}|D ]h  }	 || j                   v r-| j                  || j                   |         | j                  |<   n*|| j                  v r| j                  |   | j                  |<   j y# t        $ r }t
        j                  d|       Y d}~d}~ww xY w)zs
        Initialize some limited config variables before initializing i18n and loading
        extensions.
        )r   r}   rY   r[   %sN)r   r   __dict__r   r   r   r   )r=   	variablesr   r   s       r&   pre_init_valueszConfig.pre_init_values   s    
 U	 	*D*4>>)*.*@*@t~~VZG[*\DMM$'T---*.*:*:4*@DMM$'	*  *tS))*s   A%A33	B<BBc                   | j                   }| j                  j                         D ]  \  }}	 d|v r+|j                  dd      \  }}||j	                  |i       |<   6|| j
                  vr t        j                  t        d      |       dt        |t              r| j                  ||      ||<   n|||<    |D ]#  }|| j
                  v s||   | j                  |<   % y # t        $ r }t        j                  d|       Y d }~d }~ww xY w)N.r   z-unknown config value %r in override, ignoringr   )r   r   r1   r   
setdefaultr   r   r   r   r.   r   r   r   r   )r=   rg   valnamer   realvalnamer7   r   r   s           r&   init_valueszConfig.init_values   s
   !!"nn224 	*NGU*'>'.}}S!'<$K>CF%%k26s;$++-NN2&U#V#*,eS)&*&<&<We&LF7O&+F7O	*   	3Dt{{"&,Tld#	3  *tS))*s#   .C!-C!+C!!	D
*DD
c                    | j                   }|D ]2  }|| j                  vs|| j                  v s!||   | j                  |<   4 t        d|        y)zc
        Initialize additional config variables that are added after init_values() called.
        N)r   r   r   check_confval_types)r=   rg   r   s      r&   post_init_valueszConfig.post_init_values  sS     !! 	3D4==(TT[[-@&,Tld#	3 	D$'r%   c                    |j                  d      rt        |      || j                  vrt        t        d      |z        | j                  |   d   }t	        |      r ||       S |S )Nr   zNo such config value: %sr   )
startswithAttributeErrorr   r   r   )r=   r   rx   s      r&   __getattr__zConfig.__getattr__  se    ??3 &&t{{" $>!?$!FGG++d#A&G4= r%   c                    t        | |      S r)   )getattrr=   r   s     r&   __getitem__zConfig.__getitem__&  s    tT""r%   c                    t        | ||       y r)   )setattrr=   r   r   s      r&   __setitem__zConfig.__setitem__)  s    dE"r%   c                    t        | |       y r)   )delattrr   s     r&   __delitem__zConfig.__delitem__,  s    dr%   c                    || j                   v S r)   )r   r   s     r&   __contains__zConfig.__contains__/  s    t{{""r%   c              #     K   | j                   j                         D ]!  \  }}t        |t        | |      |d          # y w)Nr   )r   r1   r   r   r   s      r&   __iter__zConfig.__iter__2  sB     ;;,,. 	CKD%dGD$$7qBB	Cs   A Ac                r    || j                   v rt        t        d      |z        |||f| j                   |<   y )NzConfig value %r already present)r   r   r   )r=   r   rx   r   typess        r&   addz
Config.add6  s9    4;; $E!F!MNN$gu5Dr%   c                @    t        t              rgfd| D        S )Nc              3  @   K   | ]  }|j                   v s|  y wr)   )r   )r+   r   r   s     r&   r-   z Config.filter.<locals>.<genexpr>>  s     D%5==G+CDs   )r.   r   )r=   r   s    `r&   filterzConfig.filter;  s    gs#iGD4DDr%   c                .   i }| j                   j                         D ]'  \  }}|j                  d      st        |      s#|||<   ) i |d<   | j                  j                         D ],  \  }}t        | |      }t        |      sd}||d   df|d   |<   . |S )z'Obtains serializable data for pickling.r   r   Nr   )r   r1   r   r*   r   r   )r=   r   r7   r   
real_values        r&   __getstate__zConfig.__getstate__@  s     ----/ 	&JC~~c"/%*@ %		&  ++++- 	CJC s+J":.!
 (258T&BHXs#	C r%   c                :    | j                   j                  |       y r)   )r   update)r=   states     r&   __setstate__zConfig.__setstate__W  s    U#r%   )NN)rg   dict[str, Any] | Noner   r   rC   rD   )r   zstr | os.PathLike[str]r   zdict | Noner   Tags | NonerC   rH   )r   r   r   r   rC   r   )rC   rD   )r   r   rC   r   )r   r   r   r   rC   rD   )r   r   rC   rD   )r   r   rC   rE   )rC   z"Generator[ConfigValue, None, None])
r   r   rx   r   r   r   r   r   rC   rD   )r   zstr | Sequence[str]rC   zIterator[ConfigValue])rC   r0   )r   r0   rC   rD   ) r    r!   r"   rF   r   r3   r2   r9   r   rE   r   r4   r   r   r#   r>   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r%   r&   rH   rH   H   s   	 C'HeR(C' 	9eR(C' 	b&3t*<=	C'
 	3Vc5$=OPC' 	Br?C' 	Br?C' 	"eRC' 	dEC5)C' 	T53%(C' 	UB/C' 	#%=use$LC' 	+UIr,BC'  	')-dE<)X)Z!C'& 	wr*'C'( 	5ubA)C'* 	6#56sC+C', 	K3-C'. 	R./C'0 	dVUSE21C'2 	use,3C'4 	#T5"$55C'6 	T5"-7C'8 	tUTF39C': 	*He,05&,I,K;C'> 	(%);?C'@ 	r*AC'B 	4#/CC'D 	y%4EC'F 	b%_GC'H 	2vr*IC'J 	D&3%0KC'L 	%+MC'N 	b%_OC'P 	!2vr"2QC'R 	tUSE*SC'T 	tUSE*UC'V 	tUB/WC'X 	4
3YC'Z 	tcU+[C'\ 	RrN]C'^ 	ub)_C'` 	UD"%aC'b 	2tc4%78cC'd 	TCu+= >eC'f 	5%$gC'h 	5"~iC'j 	"eRkC'l 	($T{)CmC'n 	E5"-oC'p 	dEC51qC'r 	eR(sC't UB'eR(USE*eR($eR004v/4fo"?!&!, +0);EC'M# CJ 8<48B1B=AB LP!%//*0/ /*'R*3,	(###C6
E
.$r%   rH   c                \   i }| |d<   ||d<   t        t        j                  |             5  	 t        | d      5 }t	        |j                         | j                  t              d      }t        ||       ddd       ddd       |S # 1 sw Y   xY w# t        $ r}t        d      }t        ||z        |d}~wt        $ r}t        d      }t        |      |d}~wt        $ r  t        $ r1}t        d      }t        |t        j                         z        |d}~ww xY w# 1 sw Y   |S xY w)	zEvaluate a config file.__file__r   rbexecNz7There is a syntax error in your configuration file: %s
zKThe configuration file (or one of the modules it imports) called sys.exit()z=There is a programmable error in your configuration file:

%s)r   r   dirnameopencompiler   encoder   r   SyntaxErrorr   r
   
SystemExit	Exception	traceback
format_exc)r   r   r   fcodeerrmsgr   s           r&   r   r   [  s+    "I$IjIf	t||H%	& E	Eh% &qvvx)EvNT9%&E( #& &  	2OPCcCi(c1 	, ) *Cc"+ 	 	EVWCcI$8$8$::;D	E!E( sW   D!B;B4BB	B	DB55DCD-,DDD!!D+c                   |j                   }t        |t              r
|di|_         yt        |t        t        f      r|D ci c]  }|d c}|_         yt        |t
              s"t        j                  t        d|z               yyc c}w )zConvert old styled source_suffix to new styled one.

    * old style: str or list
    * new style: a dict which maps from fileext to filetype
    NzeThe config value `source_suffix' expects a string, list of strings, or dictionary. But `%r' is given.)	rh   r.   r   r2   r3   r0   r   r   r   )apprg   rh   ss       r&   convert_source_suffixr  x  s     ((M-%
 !.t4	MD%=	11>?A4?t,r /1>? @ 	A -  @s   
Bc                    |j                   }|r5t        d |j                         D              s|j                  |i|_         yyy)zConvert old styled highlight_options to new styled one.

    * old style: options
    * new style: a dict which maps from language name to options
    c              3  <   K   | ]  }t        |t                y wr)   )r.   r0   )r+   vs     r&   r-   z,convert_highlight_options.<locals>.<genexpr>  s     I1:a.Is   N)ry   r5   r   rw   )r  rg   optionss      r&   convert_highlight_optionsr    sD     &&GsI8HII$*$=$=$+$-  Jwr%   c                    t        d      t        d      t        d      t        d      d}|j                  |j                         ||_        y)z$Initialize :confval:`numfig_format`.z
Section %szFig. %szTable %sz
Listing %s)sectionfiguretablez
code-blockN)r   r   r   )r  rg   r   s      r&   init_numfig_formatr    sC     !, |
m#$\?4M --.(Fr%   c                $   t        d      x}yt        t        j                  t	        |            j
                        dD ]K  }||v s||   }t        |t              rt        |      ||<   -fd|D        } t        |      |      ||<   M y)zCorrect values of copyright year that are not coherent with
    the SOURCE_DATE_EPOCH environment variable (if set)

    See https://reproducible-builds.org/specs/source-date-epoch/
    SOURCE_DATE_EPOCHN)rQ   epub_copyrightc              3  6   K   | ]  }t        |        y wr)   )_substitute_copyright_year)r+   xsource_date_epoch_years     r&   r-   z)correct_copyright_year.<locals>.<genexpr>  s     ^ST3A7MN^s   )	r   r   timegmtimer   tm_yearr.   r  r   )_apprg   source_date_epochkr   r1   r  s         @r&   correct_copyright_yearr     s     $$788A S1B-C!D!L!LM, /;)/E%%6u>TUq	^X]^'DK.q	/r%   c                    t        |       dk  s| dd j                         s| S | dd dv r|| dd z   S | d   dk7  r| S | dd j                         r| d   dv r| dd |z   | dd z   S | S )zReplace the year in a single copyright line.

    Legal formats are:

    * ``YYYY``
    * ``YYYY,``
    * ``YYYY ``
    * ``YYYY-YYYY,``
    * ``YYYY-YYYY ``

    The final year in the string is replaced with ``replace_year``.
       N   >   rO    r   -	   z ,)lenisdigit)copyright_linereplace_years     r&   r  r    s     >QnRa&8&@&@&Ban,nQR000aCa""$):d)Bbq!L0>!"3EEEr%   c           
        |D ]z  }|j                   |j                     \  }}}t        |      r ||      }||s9|t        u rBt	        |t
              rp |j                  |j                        rot        d      }t        j                  |j                  |j                  |j                  |j                        d       t        |j                        t        |      u rt        |j                        |v rt        t        |j                        j                  t        |j                        fz         t        t        |      j                        z  }|j!                  t"               |rr|rt        d      }|D cg c]  }d|j$                   d }	}t'        |	      d	kD  rd
j)                  |	dd       d|	d    z   }
ndj)                  |	      }
t        j                  |j                  |j                  t        |j                        |
      d       !t        d      }t        j                  |j                  |j                  t        |j                        t        |            d       } yc c}w )zCheck all values for deviation from the default value's type, since
    that can result in TypeErrors all over the place NB.
    NzTThe config value `{name}` has to be a one of {candidates}, but `{current}` is given.)r   currentr<   T)oncezNThe config value `{name}' has type `{current.__name__}'; expected {permitted}.`'r   z, z, or z or )r   r,  	permittedzZThe config value `{name}' has type `{current.__name__}', defaults to `{default.__name__}'.)r   r,  rx   )r   r   r   r   r.   r9   rB   r   r   r   r   formatr<   r   r4   	__bases__discardobjectr    r'  r   )r  rg   confvalrx   r   r   r  common_basesrS   wrapped_annotationsr1  s              r&   r   r     sQ     /M(.gll(C%+GfoG?;#T*$;$$W]]3 5 6szzw||29--5@5K5K  *  MSW  Y GMM"d7m3GMM"k1W]] 3 = =gmmAT@V VWW 7 789L  ( 1 2BM&NQ1::,a'8&N#&N*+a/!%+>s+C!D%*+>r+B*C#D"EI !',? @Iszzw||26w}}2E4=  *  ?EI  K  = >szzw||26w}}2E26w-  *  AGK  M[/MB 'Os   Jc                    |j                   }|rC| j                  j                  |      s't        j	                  t        d      |       d |_         y y y )Nz%primary_domain %r not found, ignored.)r   registry
has_domainr   r   r   )r  rg   r   s      r&   check_primary_domainr<    sE    **Ncll55nErABNS $ F~r%   c                    | j                   j                  dk(  r_d| j                  j                  vrGd| j                  j                  v r/t        j                  t        d             d| j                   _        |S )zjAdjust root_doc to 'contents' to support an old project which does not have
    any root_doc setting.
    rd   contentszkSince v2.0, Sphinx uses "index" as root_doc by default. Please add "root_doc = 'contents'" to your conf.py.)rg   re   rI   docnamesr   r   r   )r  rK   addedchangedremoveds        r&   check_root_docrC    sf    
 	

w&3;;///#++...r R S 	T(

Nr%   c                Z   | j                  dt        d       | j                  dt        d       | j                  dt        d       | j                  dt        d       | j                  dt
        d       | j                  dt        d       | j                  dt               ddddS )Nzconfig-initedi   )priorityzenv-get-outdatedbuiltinT)rU   parallel_read_safeparallel_write_safe)connectr  r  r  r   r   r<  rC  )r  s    r&   r   r   $  s    KK!6KEKK!:SKIKK!3cKBKK!7#KFKK!4sKCKK!5KDKK"N3 "# r%   )r6   r   rC   rE   )r   r   r   r   rC   dict[str, Any])r  r   rg   rH   rC   rD   )r  r   rg   rH   rC   rD   )r)  r   r*  r   rC   r   )r  zSphinx | Nonerg   rH   rC   rD   )r  r   rK   r   r@  set[str]rA  rK  rB  rK  rC   rK  )r  r   rC   rJ  )>rF   
__future__r   r  r   r   osr   r   typingr   r   r   r	   sphinx.errorsr
   r   sphinx.localer   r   sphinx.utilr   sphinx.util.osutilr   sphinx.util.typingr   
contextlibr   ImportErrorr   collections.abcr   r   r   sphinx.applicationr   sphinx.environmentr   sphinx.util.tagsr   	getLoggerr    r   r   r   
ModuleTypeFunctionTyper/   r   r*   r9   rH   r   r  r  r  r   r  r   r<  rC  r   r$   r%   r&   <module>r]     s   ( "     ; ; 5   * '3  ==)3%			8	$e..0B0BC * , , P$ P$f:A,
-	)/*83Ml%$/7<Dc  323s   C3 3D D