B
    d}T                 @   s   d 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 ddl	m
Z
mZmZmZmZmZ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!m"Z" ddl#m$Z$ ddl%m&Z& e
rddl'm(Z( ddl)m*Z* e+e,Z-dZ.e/ej0ej1fZ2e3dZ4G dd deZ5ee6dddZ7G dd dZ8G dd dZ9e:ee$ ee:ef dddZ;de9dddd Z<de9ddd!d"Z=de9ddd#d$Z>de9ddd%d&Z?ed e9ddd'd(Z@de9ddd)d*ZAdd+ee: ee: ee: ee: d,d-d.ZBdee:ef d/d0d1ZCdS )2z"Build configuration file handling.    N)OrderedDict)getenvpath)TYPE_CHECKINGAnyCallableDict	GeneratorIteratorList
NamedTupleOptionalSetTupleUnion)ConfigErrorExtensionError)___)logging)format_date)cdfs_encoding)Tags)NoneType)Sphinx)BuildEnvironmentzconf.pyz^((\d{4}-)?)(\d{4})(?=[ ,])c               @   s.   e Zd ZU eed< eed< eeef ed< dS )ConfigValuenamevaluerebuildN)__name__
__module____qualname__str__annotations__r   r   bool r'   r'   Z/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/config.pyr      s   
r   )objreturnc             C   sj   t | trdS t | trDxL|  D ]\}}t|r:t|s"dS q"W n"t | tttfrft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>-   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               @   s:   e Zd ZdZeddddZeeeef e	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'))
    N)
candidatesr*   c             G   s
   || _ d S )N)r9   )selfr9   r'   r'   r(   __init__8   s    zENUM.__init__)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 )N)r9   )r,   item)r:   r'   r(   r.   =   s    zENUM.match.<locals>.<genexpr>)r/   r3   r4   r6   r9   )r:   r   r'   )r:   r(   match;   s    z
ENUM.match)r!   r"   r#   __doc__r$   r;   r   r   r   r&   r=   r'   r'   r'   r(   r8   2   s   r8   c            :   @   sz  e Zd ZU dZddg fddg fddegfdd d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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	g fg d	g fddg fddg fi dg 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!8Z	e
eef ed"< i i fe
eef e
eef d	d#d$d%ZedKeee
 ee d d&d'd(Zeeed)d*d+Zd	d,d-d.Zd	d,d/d0Zd	d,d1d2Zeed3d4d5Zeed3d6d7Zeed	d)d8d9Zed	d3d:d;Zeed3d<d=Zeed	d	f d,d>d?Zeeeeef ed	d@dAdBZeee e f e!e dCdDdEZ"e
d,dFdGZ#e
d	dHdIdJZ$d	S )LConfiga  Configuration file abstraction.

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

    It is exposed via the :py:attr:`sphinx.application.Application.config` and
    :py:attr:`sphinx.environment.Environment.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 )N)project_copyright)cr'   r'   r(   <lambda>X       zConfig.<lambda>NenZlocalesz{root}.{language}{ext}Fgettextindexc             C   s   | j S )N)
master_doc)configr'   r'   r(   rG   e   rH   z.rstrestructuredtextz	utf-8-sigz**Tdomainr6   Zhidedefaultpy   ZqDejamantext)	languagesZbuilders)8projectauthorrE   	copyrightversionreleasetodayZ	today_fmtlanguagelocale_dirsZfigure_language_filenameZ gettext_allow_fuzzy_translationsrL   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math_number_allZmath_eqref_formatZmath_numfigZ
tls_verifyZtls_cacerts
user_agentZsmartquotesZsmartquotes_actionZsmartquotes_excludesZoption_emphasise_placeholdersconfig_values)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,)r1   rj   r?   ri   copyvalues_raw_configgetrk   r/   r$   popsplitrl   )r:   rM   rj   r'   r'   r(   r;      s    

zConfig.__init__)confdirrj   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_filerq   loggerwarning)clsrt   rj   ru   filename	namespacer'   r'   r(   read   s    

zConfig.read)r   r   r*   c          
   C   sf  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(yt|S  tk
r$ } zttd
||f |W d d }~X Y nX n:t|r6|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=valuerm   z/invalid number %r for config value %r, ignoringzAcannot override config setting %r with unsupported type, ignoring)r/   r$   ro   r   r&   typer1   
ValueErrorr   r3   rs   intcallable)r:   r   r   Zdefvalueexcr'   r'   r(   convert_overrides   s@    
 



"

zConfig.convert_overrides)r*   c             C   s   ddddg}x~|D ]v}yB|| j kr<| || j | | j|< n|| jkrV| j| | j|< W q tk
r } ztd| W dd}~X Y qX qW dS )zs
        Initialize some limited config variables before initializing i18n and loading
        extensions.
        rf   rd   r]   r^   z%sN)rj   r   __dict__rp   r   rz   r{   )r:   	variablesr   r   r'   r'   r(   pre_init_values   s    


zConfig.pre_init_valuesc             C   s   | j }x| j D ]\}}ypd|krH|dd\}}|||i |< wn|| jkrdttd| wt	|t
r| ||||< n|||< W q tk
r } ztd| W d d }~X Y qX qW x$|D ]}|| jkr|| | j|< qW d S )N.rR   z-unknown config value %r in override, ignoringz%s)rp   rj   r2   rs   
setdefaultro   rz   r{   r   r/   r$   r   r   r   )r:   rM   Zvalnamer   Zrealvalnamer7   r   r   r'   r'   r(   init_values   s&    


"

zConfig.init_valuesc             C   sD   | j }x.|D ]&}|| jkr|| jkr|| | j|< qW td|  dS )zc
        Initialize additional config variables that are added after init_values() called.
        N)rp   r   ro   check_confval_types)r:   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AttributeErrorro   r   r   )r:   r   rP   r'   r'   r(   __getattr__  s    

zConfig.__getattr__c             C   s
   t | |S )N)getattr)r:   r   r'   r'   r(   __getitem__  s    zConfig.__getitem__c             C   s   t | || d S )N)setattr)r:   r   r   r'   r'   r(   __setitem__   s    zConfig.__setitem__c             C   s   t | | d S )N)delattr)r:   r   r'   r'   r(   __delitem__#  s    zConfig.__delitem__c             C   s
   || j kS )N)ro   )r:   r   r'   r'   r(   __contains__&  s    zConfig.__contains__c             c   s4   x.| j  D ] \}}t|t| ||d V  qW d S )NrR   )ro   r2   r   r   )r:   r   r   r'   r'   r(   __iter__)  s    zConfig.__iter__)r   rP   r    typesr*   c             C   s0   || j krttd| n|||f| j |< d S )NzConfig value %r already present)ro   r   r   )r:   r   rP   r    r   r'   r'   r(   add-  s    
z
Config.add)r    r*   c                s"   t  tr g  fdd| D S )Nc             3   s   | ]}|j  kr|V  qd S )N)r    )r,   r   )r    r'   r(   r.   6  s    z Config.filter.<locals>.<genexpr>)r/   r$   )r:   r    r'   )r    r(   filter3  s    
zConfig.filterc             C   s   i }x2| j  D ]$\}}|ds4t|s,q|||< qW i |d< xB| j D ]4\}}t| |}t|sjd}||d df|d |< qLW |S )z'Obtains serializable data for pickling.r   ro   NrR   )r   r2   r   r+   ro   r   )r:   r   r7   r   
real_valuer'   r'   r(   __getstate__8  s    
zConfig.__getstate__)stater*   c             C   s   | j | d S )N)r   update)r:   r   r'   r'   r(   __setstate__O  s    zConfig.__setstate__)NN)%r!   r"   r#   r>   r$   r   r&   r8   r   ri   r   r   r%   r;   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r
   r   r   r   r'   r'   r'   r(   r?   B   s   

	
















()
 r?   )r}   ru   r*   c             C   s(  i }| |d< ||d< t t|  y:t| d&}t| | td}t|| W dQ R X W n t	k
r } zt
d}t|| |W dd}~X Y n tk
r } zt
d}t||W dd}~X Y nR tk
r    Y n> tk
r } zt
d}t|t  |W dd}~X Y nX W dQ R X |S )	zEvaluate a config file.__file__ru   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}   ru   r~   fcodeerrmsgr   r'   r'   r(   ry   S  s(    .ry   r   )apprM   r*   c             C   sr   |j }t|tr t|di|_ nNt|ttfrDtdd |D |_ n*t|tr\t|j |_ nt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   g | ]}|d fqS )Nr'   )r,   sr'   r'   r(   
<listcomp>  s    z)convert_source_suffix.<locals>.<listcomp>zeThe config value `source_suffix' expects a string, list of strings, or dictionary. But `%r' is given.)
r`   r/   r$   r   r3   r4   r1   rz   r{   r   )r   rM   r`   r'   r'   r(   convert_source_suffixp  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 )N)r/   r1   )r,   vr'   r'   r(   r.     s    z,convert_highlight_options.<locals>.<genexpr>N)rc   r6   ro   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   c             C   sJ   t ddk	rFx8dD ]0}||krdtddd }t||| ||< qW 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_copyrightz\g<1>%sz%YrI   )r]   )r   r   copyright_year_resub)r   rM   kreplacer'   r'   r(   correct_copyright_year  s
    
r   c       
      C   s  x|D ]}|j |j \}}}t|r0||}|dkr>|s>q|tkrHq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r0d
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W 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   currentr9   T)oncezNThe config value `{name}' has type `{current.__name__}'; expected {permitted}.c             S   s   g | ]}d  |jqS )z`{}')formatr!   )r,   rF   r'   r'   r(   r     s    z'check_confval_types.<locals>.<listcomp>r   z	{}, or {}z, z or )r   r   	permittedzZThe config value `{name}' has type `{current.__name__}', defaults to `{default.__name__}'.)r   r   rP   )ro   r   r   r   r/   r8   r=   r   r   rz   r{   r   r9   r   r5   	__bases__discardobjectlenrv   )
r   rM   ZconfvalrP   r    annotationsr   Zcommon_basesZwrapped_annotationsr   r'   r'   r(   r     sL    


r   c             C   s0   |j }|r,| j|s,ttd| d |_ d S )Nz%primary_domain %r not found, ignored.)re   registryZ
has_domainrz   r{   r   )r   rM   re   r'   r'   r(   check_primary_domain  s    r   r   )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docnamesrz   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(   rk     s    rk   )Dr>   rer   r   collectionsr   osr   r   typingr   r   r   r   r	   r
   r   r   r   r   r   r   Zsphinx.errorsr   r   Zsphinx.localer   r   Zsphinx.utilr   Zsphinx.util.i18nr   Zsphinx.util.osutilr   r   Zsphinx.util.tagsr   Zsphinx.util.typingr   Zsphinx.applicationr   Zsphinx.environmentr   	getLoggerr!   rz   rw   r   
ModuleTypeFunctionTyper0   r   r   r   r&   r+   r8   r?   r$   ry   r   r   r   r   r   r   r   rk   r'   r'   r'   r(   <module>   sH   8

  7
