U
    \ShX                     @  s  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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 zddlmZ W n  e k
r   ddlm!Z Y nX e
rddl"m#Z# ddl$m%Z% ddl&m'Z' e(e)Z*dZ+e,ej-ej.fZ/G dd deZ0dddddZ1G dd dZ2G dd dZ3dddd d!d"Z4d#dd$d%d&d'Z5d#dd$d%d(d)Z6d#dd$d%d*d+Z7d#dd$d,d-d.Z8dddd/d0d1Z9d2dd$d%d3d4Z:d#dd$d%d5d6Z;d#d7d8d8d8d8d9d:d;Z<d#dd<d=d>Z=dS )?z"Build configuration file handling.    )annotationsN)getenvpath)TYPE_CHECKINGAnyCallable	GeneratorIterator
NamedTuple)ConfigErrorExtensionError)___)logging)fs_encoding)Tags)NoneType)chdir)_chdir)Sequence)Sphinx)BuildEnvironmentzconf.pyc                   @  s&   e Zd ZU ded< ded< ded< dS )ConfigValuestrnamer   value
bool | strrebuildN)__name__
__module____qualname____annotations__ r"   r"   @/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/config.pyr   #   s   
r   r   bool)objreturnc                 C  sh   t | trdS t | trB|  D ]\}}t|r8t|s  dS q n"t | tttfrdtdd | D S dS )z'Check if object is serializable or not.Fc                 s  s   | ]}t |V  qd S N)is_serializable).0ir"   r"   r#   	<genexpr>2   s     z"is_serializable.<locals>.<genexpr>T)	
isinstanceUNSERIALIZABLE_TYPESdictitemsr(   listtuplesetall)r%   keyr   r"   r"   r#   r(   )   s    


r(   c                   @  s0   e Zd ZdZdddddZddd	d
dZdS )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'))
    z
str | boolNone)
candidatesr&   c                 G  s
   || _ d S r'   r7   )selfr7   r"   r"   r#   __init__=   s    zENUM.__init__zstr | list | tupler$   )r   r&   c                   s2   t |ttfr$t fdd|D S | jkS d S )Nc                 3  s   | ]}| j kV  qd S r'   r8   )r)   itemr9   r"   r#   r+   B   s     zENUM.match.<locals>.<genexpr>)r,   r0   r1   r3   r7   )r9   r   r"   r<   r#   match@   s    z
ENUM.matchN)r   r   r    __doc__r:   r=   r"   r"   r"   r#   r5   7   s   r5   c                <   @  sj  e Zd ZU dZddg fddg fddeeegfdd deeegfddg fddg fddg fd	degfd
degfdgdg fddegfddg fddeddddfddg fdd dg fddidefddg fg degfdgdegfd	degfddg fddg fdde	gfddedddfddg fddg fd	degfddg fi dg fg dg fd	degfddg fg dg fg dg fd	degfd	degfddg fdde
gfd	d	egfi d	g fd	dg fdd	g fg d	eeegfg d	eeegfddg fddg fi dg fd	ded	hfddg fd	degfddg fddg fd	dg fd	degfddg fddg fdgd d!gd"dg fddg fd#:Zd$ed%< i i fd&d&d'd(d)d*ZedZd+d,d-d d.d/d0Zd+d1d1d2d3d4Zd'd5d6d7Zd'd5d8d9Zd'd5d:d;Zd+d1d<d=d>Zd+d1d<d?d@Zd+d1d'd2dAdBZd+d'd<dCdDZd+dEd<dFdGZdHd5dIdJZd+d1dKd1d'dLdMdNZdOdPdQdRdSZdTd5dUdVZdTd'dWdXdYZd	S )[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``.
    Pythonenvunknown htmlc                 C  s   | j S r'   )project_copyright)cr"   r"   r#   <lambda>]       zConfig.<lambda>NenZlocalesz{root}.{language}{ext}FgettextTZ
translatedZuntranslatedindexc                 C  s   | j S r'   )
master_doc)configr"   r"   r#   rG   l   rH   z.rstrestructuredtextz	utf-8-sigz**domainr3   Zhidedefaultpy   ZqDejamantext)	languagesZbuilders):projectauthorrE   	copyrightversionreleasetodayZ	today_fmtlanguagelocale_dirsZfigure_language_filenameZ gettext_allow_fuzzy_translationsZtranslation_progress_classesrL   root_docsource_suffixZsource_encodingZexclude_patternsZinclude_patternsZdefault_roleZadd_function_parenthesesZadd_module_namesZtoc_object_entriesZtoc_object_entries_show_parentsZtrim_footnote_reference_spaceZshow_authorspygments_stylehighlight_languagehighlight_optionsZtemplates_pathZtemplate_bridgeZkeep_warningssuppress_warningsZmodindex_common_prefixZ
rst_epilogZ
rst_prologZtrim_doctest_flagsprimary_domainneeds_sphinxZneeds_extensionsZmanpages_urlZnitpickyZnitpick_ignoreZnitpick_ignore_regexZnumfigZnumfig_secnum_depthnumfig_formatZmaximum_signature_line_lengthZmath_number_allZmath_eqref_formatZmath_numfigZ
tls_verifyZtls_cacerts
user_agentZsmartquotesZsmartquotes_actionZsmartquotes_excludesZoption_emphasise_placeholderszdict[str, tuple]config_valuesdict[str, Any]r6   )rM   	overridesr&   c                 C  s~   t || _tj | _|| _|dd | _d| jkrlt	| jd t
r\| jdd|d< n| jd|d< |dg | _d S )Nsetup
extensions,)r.   rk   r?   ri   copyvalues_raw_configgetrl   r,   r   popsplitrm   )r9   rM   rk   r"   r"   r#   r:      s    

zConfig.__init__r   zdict | NoneTags | None)confdirrk   tagsr&   c                 C  sd   t |t}t |s&ttd| t||}|dddkrVt	td d|d< | ||p`i S )z/Create a Config object from configuration file.z4config directory doesn't contain a conf.py file (%s)r]   .NzInvalid configuration value found: 'language = None'. Update your configuration to a valid language code. Falling back to 'en' (English).rI   )
r   joinCONFIG_FILENAMEisfiler   r   eval_config_filerr   loggerwarning)clsrv   rk   rw   filename	namespacer"   r"   r#   read   s    

zConfig.readr   )r   r   r&   c              
   C  sh  t |ts|S | j| d }| j| d tkr2|S | j| d tthkrh|dkrTdS |dkr`dS |S  nt|tks| j| d tgkr|dkrdS t|S nt |trttd||d f nt |t	r|
d	S t |tr*z
t|W S  tk
r& } zttd
||f |W 5 d }~X Y nX n:t|r8|S |d k	r`t |ts`ttd| n|S d S )Nr      0F1TzZcannot override dictionary config setting %r, ignoring (use %r to set individual elements)z
.key=valuern   z/invalid number %r for config value %r, ignoringzAcannot override config setting %r with unsupported type, ignoring)r,   r   rp   r   r$   typer.   
ValueErrorr   r0   rt   intcallable)r9   r   r   Zdefvalueexcr"   r"   r#   convert_overrides   sJ    
 






zConfig.convert_overrides)r&   c                 C  s   ddddg}|D ]v}zB|| j kr:| || j | | j|< n|| jkrT| j| | j|< W q tk
r } ztd| W 5 d}~X Y qX qdS )zs
        Initialize some limited config variables before initializing i18n and loading
        extensions.
        rf   rd   r]   r^   %sN)rk   r   __dict__rq   r   r|   r}   )r9   	variablesr   r   r"   r"   r#   pre_init_values   s    

zConfig.pre_init_valuesc                 C  s   | j }| j D ]\}}zrd|krF|dd\}}|||i |< W q|| jkrdttd| W qt	|t
r| ||||< n|||< W q tk
r } ztd| W 5 d }~X Y qX q|D ]}|| jkr|| | j|< qd S )N.rR   z-unknown config value %r in override, ignoringr   )rq   rk   r/   rt   
setdefaultrp   r|   r}   r   r,   r   r   r   r   )r9   rM   Zvalnamer   Zrealvalnamer4   r   r   r"   r"   r#   init_values   s(    


 
zConfig.init_valuesc                 C  s@   | j }|D ]&}|| jkr
|| jkr
|| | j|< q
td|  dS )zc
        Initialize additional config variables that are added after init_values() called.
        N)rq   r   rp   check_confval_types)r9   rM   r   r"   r"   r#   post_init_values  s
    zConfig.post_init_values)r   r&   c                 C  sN   | drt||| jkr,ttd| | j| d }t|rJ|| S |S )Nr   zNo such config value: %sr   )
startswithAttributeErrorrp   r   r   )r9   r   rP   r"   r"   r#   __getattr__  s    

zConfig.__getattr__c                 C  s
   t | |S r'   )getattrr9   r   r"   r"   r#   __getitem__$  s    zConfig.__getitem__c                 C  s   t | || d S r'   )setattrr9   r   r   r"   r"   r#   __setitem__'  s    zConfig.__setitem__c                 C  s   t | | d S r'   )delattrr   r"   r"   r#   __delitem__*  s    zConfig.__delitem__r$   c                 C  s
   || j kS r'   )rp   r   r"   r"   r#   __contains__-  s    zConfig.__contains__z"Generator[ConfigValue, None, None]c                 c  s0   | j  D ] \}}t|t| ||d V  q
d S )NrR   )rp   r/   r   r   r   r"   r"   r#   __iter__0  s    zConfig.__iter__r   )r   rP   r   typesr&   c                 C  s.   || j krttd| |||f| j |< d S )NzConfig value %r already present)rp   r   r   )r9   r   rP   r   r   r"   r"   r#   add4  s    
z
Config.addzstr | list[str]zIterator[ConfigValue])r   r&   c                   s"   t  tr g  fdd| D S )Nc                 3  s   | ]}|j  kr|V  qd S r'   r   )r)   r   r   r"   r#   r+   <  s     
 z Config.filter.<locals>.<genexpr>)r,   r   )r9   r   r"   r   r#   filter9  s    
zConfig.filterr.   c                 C  s   i }| j  D ]$\}}|ds2t|s*q|||< qi |d< | j D ]4\}}t| |}t|sdd}||d df|d |< qF|S )z'Obtains serializable data for pickling.r   rp   NrR   )r   r/   r   r(   rp   r   )r9   r   r4   r   
real_valuer"   r"   r#   __getstate__>  s    

zConfig.__getstate__)stater&   c                 C  s   | j | d S r'   )r   update)r9   r   r"   r"   r#   __setstate__U  s    zConfig.__setstate__)NN) r   r   r    r>   r   r1   r0   r5   r   r$   r   r2   r   ri   r!   r:   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r?   G   s   
















 E   )
r?   r   ru   rj   )r   rw   r&   c                 C  s(  i }| |d< ||d< t t|  z:t| d&}t| | td}t|| W 5 Q R X W n t	k
r } zt
d}t|| |W 5 d}~X Y n tk
r } zt
d}t||W 5 d}~X Y nR tk
r    Y n> tk
r } zt
d}t|t  |W 5 d}~X Y nX W 5 Q R X |S )	zEvaluate a config file.__file__rw   rbexecz7There is a syntax error in your configuration file: %s
NzKThe 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   rw   r   fcodeerrmsgr   r"   r"   r#   r{   Y  s(    .r{   r   r6   )apprM   r&   c                 C  s\   |j }t|tr|di|_ n<t|ttfr<dd |D |_ nt|tsXttd|  dS )zConvert old styled source_suffix to new styled one.

    * old style: str or list
    * new style: a dict which maps from fileext to filetype
    Nc                 S  s   i | ]
}|d qS r'   r"   )r)   sr"   r"   r#   
<dictcomp>  s      z)convert_source_suffix.<locals>.<dictcomp>zeThe config value `source_suffix' expects a string, list of strings, or dictionary. But `%r' is given.)	r`   r,   r   r0   r1   r.   r|   r}   r   )r   rM   r`   r"   r"   r#   convert_source_suffixv  s    

r   c                 C  s0   |j }|r,tdd | D s,|j|i|_ dS )zConvert old styled highlight_options to new styled one.

    * old style: options
    * new style: a dict which maps from language name to options
    c                 s  s   | ]}t |tV  qd S r'   )r,   r.   )r)   vr"   r"   r#   r+     s     z,convert_highlight_options.<locals>.<genexpr>N)rc   r3   rp   rb   )r   rM   optionsr"   r"   r#   convert_highlight_options  s    r   c                 C  s4   t dt dt dt dd}||j ||_dS )z$Initialize :confval:`numfig_format`.z
Section %szFig. %szTable %sz
Listing %s)sectionZfiguretablez
code-blockN)r   r   rg   )r   rM   rg   r"   r"   r#   init_numfig_format  s    r   )_apprM   r&   c                   s   t d }dkrdS ttt|j dD ]P}||kr,|| }t|trZt| ||< q, fdd|D }t||||< q,dS )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)rY   Zepub_copyrightc                 3  s   | ]}t | V  qd S r'   )_substitute_copyright_year)r)   xZsource_date_epoch_yearr"   r#   r+     s     z)correct_copyright_year.<locals>.<genexpr>)	r   r   timegmtimer   tm_yearr,   r   r   )r   rM   source_date_epochkr   r/   r"   r   r#   correct_copyright_year  s    
r   )copyright_linereplace_yearr&   c                 C  s|   | dd   s| S | d dkr0|| dd  S | d dkr@| S | dd   rx| d dkrx| dd | | dd  S | S )zReplace the year in a single copyright line.

    Legal formats are:

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

    The final year in the string is replaced with ``replace_year``.
    N   z ,-   	   )isdigit)r   r   r"   r"   r#   r     s    r   zSphinx | Nonec           
      C  s  |D ]}|j |j \}}}t|r,||}|dkr:|s:q|tkrDqt|tr||jstd}t	j
|j|j|j|jddd qt|jt|krqt|j|krqtt|jjt|jf tt|j@ }|t |rq|r\td}dd |D }t|d	kr.d
|dd d|d   }	n
d|}	t	j
|j|jt|j|	ddd qtd}t	j
|j|jt|jt|ddd qdS )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   currentr7   T)oncezNThe config value `{name}' has type `{current.__name__}'; expected {permitted}.c                 S  s   g | ]}d |j  dqS )`')r   )r)   rF   r"   r"   r#   
<listcomp>  s     z'check_confval_types.<locals>.<listcomp>r   z, z, or z or )r   r   	permittedzZThe config value `{name}' has type `{current.__name__}', defaults to `{default.__name__}'.)r   r   rP   )rp   r   r   r   r,   r5   r=   r   r   r|   r}   formatr7   r   r2   	__bases__discardobjectlenrx   )
r   rM   ZconfvalrP   r   r   r   Zcommon_basesZwrapped_annotationsr   r"   r"   r#   r     s`    



r   c                 C  s0   |j }|r,| j|s,ttd| d |_ d S )Nz%primary_domain %r not found, ignored.)re   registryZ
has_domainr|   r}   r   )r   rM   re   r"   r"   r#   check_primary_domain
  s    r   r   zset[str])r   rA   addedchangedremovedr&   c                 C  s>   | j jdkr:d| jjkr:d| jjkr:ttd d| j _|S )zjAdjust root_doc to 'contents' to support an old project which does not have
    any root_doc setting.
    rK   contentszkSince v2.0, Sphinx uses "index" as root_doc by default. Please add "root_doc = 'contents'" to your conf.py.)rM   r_   rW   Zdocnamesr|   r}   r   )r   rA   r   r   r   r"   r"   r#   check_root_doc  s    

r   )r   r&   c                 C  sx   | j dtdd | j dtdd | j dtdd | j dtdd | j dtdd | j dtdd |  dt ddddS )Nzconfig-initedi   )priorityzenv-get-outdatedbuiltinT)rZ   Zparallel_read_safeZparallel_write_safe)connectr   r   r   r   r   r   r   )r   r"   r"   r#   rl      s    rl   )>r>   
__future__r   r   r   r   osr   r   typingr   r   r   r   r	   r
   Zsphinx.errorsr   r   Zsphinx.localer   r   Zsphinx.utilr   Zsphinx.util.osutilr   Zsphinx.util.tagsr   Zsphinx.util.typingr   
contextlibr   ImportErrorr   collections.abcr   Zsphinx.applicationr   Zsphinx.environmentr   	getLoggerr   r|   ry   r   
ModuleTypeFunctionTyper-   r   r(   r5   r?   r{   r   r   r   r   r   r   r   r   rl   r"   r"   r"   r#   <module>   sN    
  6