B
    \N                 @   s  d 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	 ddl
mZmZmZ ddlmZmZmZmZmZmZ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  ddl!m"Z" ddl#m$Z$ ddl%m&Z&m'Z' e (e)Z*dZ+eej,ej-f Z.e/dZ0ere1Z2edde1fdefdee3e2f fgZ4dd Z5G dd de6Z7egZ8er`e89e G dd de6Z:dd Z;dd Z<dd Z=d d! Z>d"d# Z?d$d% Z@d&d' ZAdS )(z
    sphinx.config
    ~~~~~~~~~~~~~

    Build configuration file handling.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    N)OrderedDict)pathgetenv)Any
NamedTupleUnion)PY2PY3	iteritemsstring_typesbinary_type	text_typeinteger_typesclass_types)RemovedInSphinx30Warning)ConfigErrorExtensionError)___)logging)format_date)cd)	execfile_NoneTypezconf.pyz^((\d{4}-)?)(\d{4})(?=[ ,])ConfigValuenamevaluerebuildc             C   sj   t | trdS t | trDxLt| 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i r!   ,lib/python3.7/site-packages/sphinx/config.py	<genexpr>>   s    z"is_serializable.<locals>.<genexpr>T)	
isinstanceUNSERIALIZABLE_TYPESdictr
   r   listtuplesetall)objkeyr   r!   r!   r"   r   4   s    


r   c               @   s    e Zd ZdZdd Zdd ZdS )ENUMzrepresents the config value should be a one of candidates.

    Example:
        app.add_config_value('latex_show_urls', 'no', None, ENUM('no', 'footnote', 'inline'))
    c             G   s
   || _ d S )N)
candidates)selfr.   r!   r!   r"   __init__I   s    zENUM.__init__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)r.   )r   item)r/   r!   r"   r#   P   s    zENUM.match.<locals>.<genexpr>)r$   r'   r(   r*   r.   )r/   r   r!   )r/   r"   matchM   s    z
ENUM.matchN)__name__
__module____qualname____doc__r0   r2   r!   r!   r!   r"   r-   C   s   r-   c            3   @   s<  e Zd ZdZeddg fddg fddg fddg fddg fddg fddefddefdgdg fd	degfd
dg fddidefddg fi dg fg dg fddefddg fddg fddg fddg fddefddg fi dg fg dg fddefddg fg dg fg dg fddefddefddg fddegfddefi dg fddg fd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fddg fddg fddg fddg fddg fdgddgddg fd0Z	dd Z
ed;ddZdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: 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: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 ZhtmlNZlocalesz{root}.{language}{ext}contentsz.rstZrestructuredtextz	utf-8-sigTFdefaultpy   ZqDeZjaZmantext)Z	languagesZbuilders)0ZprojectZauthor	copyrightversionreleaseZtodayZ	today_fmtlanguagelocale_dirsZfigure_language_filenameZ
master_docsource_suffixZsource_encodingZsource_parsersZexclude_patternsZdefault_roleZadd_function_parenthesesZadd_module_namesZtrim_footnote_reference_spaceZshow_authorsZpygments_styleZhighlight_languageZhighlight_optionsZtemplates_pathZtemplate_bridgeZkeep_warningssuppress_warningsZmodindex_common_prefixZ
rst_epilogZ
rst_prologZtrim_doctest_flagsZprimary_domainneeds_sphinxZneeds_extensionsZmanpages_urlZnitpickyZnitpick_ignoreZnumfigZnumfig_secnum_depthnumfig_formatZmath_number_allZmath_eqref_formatZmath_numfigZ
tls_verifyZtls_cacertsZsmartquotesZsmartquotes_actionZsmartquotes_excludesc             G   s   t |dkrJtjdtdd |\}}}}|d kr6i }qtt|||}nDt |dkrbi i  }}n,t |dkr~|d i  }}n|d d \}}|| _tj	
 | _|| _|dd | _d|krt|d tr|dd	|d< n|d|d< |dg | _d S )
N   zfThe argument of Config() class has been changed. Use Config.read() to read configuration from conf.py.   )
stacklevelr   r?   setup
extensions,)lenwarningswarnr   eval_config_filer   join	overridesr7   config_valuescopyvalues_raw_configgetrM   r$   r   popsplitrN   )r/   argsdirnamefilenamerU   tagsconfigr!   r!   r"   r0      s*    
zConfig.__init__c             C   s$   t |t}t||}| ||p i S )z/Create a Config object from configuration file.)r   rT   CONFIG_FILENAMErS   )clsZconfdirrU   r`   r_   	namespacer!   r!   r"   read   s    
zConfig.readc             C   s   t jdtdd td |  d S )NzFConfig.check_types() is deprecated. Use check_confval_types() instead.rK   )rL   )rQ   rR   r   check_confval_types)r/   r!   r!   r"   check_types   s    
zConfig.check_typesc             C   s   t jdtdd t|  d S )NzBConfig.check_unicode() is deprecated. Use check_unicode() instead.rK   )rL   )rQ   rR   r   check_unicode)r/   r!   r!   r"   rh      s    
zConfig.check_unicodec             C   s   t |ts|S | j| d }| j| d tkr2|S t |trVttd||d f nt |trj|dS t |t	ryt
|S  tk
r   ttd||f Y qX n6t|dr|S |d k	rt |tsttd| n|S d S )	Nr   rK   zZcannot override dictionary config setting %r, ignoring (use %r to set individual elements)z
.key=valuerO   z/invalid number %r for config value %r, ignoring__call__zAcannot override config setting %r with unsupported type, ignoring)r$   r   rX   r   r&   
ValueErrorr   r'   r\   r   inthasattr)r/   r   r   Zdefvaluer!   r!   r"   convert_overrides   s,    






zConfig.convert_overridesc             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 )zh
        Initialize some limited config variables before initialize i18n and loading extensions
        rH   rG   rD   rE   z%sN)rU   rm   __dict__rY   rj   loggerwarning)r/   Z	variablesr   excr!   r!   r"   pre_init_values   s    


zConfig.pre_init_valuesc             C   s   | j }xt| 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.r?   z-unknown config value %r in override, ignoringz%s)rY   r
   rU   r\   
setdefaultrX   ro   rp   r   r$   r   rm   rj   rn   )r/   ra   Zvalnamer   Zrealvalnamer,   rq   r   r!   r!   r"   init_values  s&    


"

zConfig.init_valuesc             C   sP   | drt||| jkr,ttd| | j| d }t|drL|| S |S )Nr   zNo such config value: %sr   ri   )
startswithAttributeErrorrX   r   rl   )r/   r   r=   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)rX   )r/   r   r!   r!   r"   __contains__3  s    zConfig.__contains__c             c   s4   x.t | jD ] \}}t|t| ||d V  qW d S )Nr?   )r
   rX   r   ry   )r/   r   r   r!   r!   r"   __iter__7  s    zConfig.__iter__c             C   s0   || j krttd| n|||f| j |< d S )NzConfig value %r already present)rX   r   r   )r/   r   r=   r   typesr!   r!   r"   add<  s    
z
Config.addc                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#   G  s    z Config.filter.<locals>.<genexpr>)r$   r   )r/   r   r!   )r   r"   filterC  s    
zConfig.filterc             C   s   i }x2t | jD ]$\}}|ds4t|s,q|||< qW i |d< xBt | jD ]4\}}t| |}t|sjd}||d df|d |< qLW |S )z'Obtains serializable data for pickling.r   rX   Nr?   )r
   rn   rv   r   rX   ry   )r/   rn   r,   r   Z
real_valuer!   r!   r"   __getstate__I  s    
zConfig.__getstate__c             C   s   | j | d S )N)rn   update)r/   stater!   r!   r"   __setstate__a  s    zConfig.__setstate__)NN)r3   r4   r5   r6   r&   string_classesstrr   r   rV   r0   classmethodre   rg   rh   rm   rr   ru   rx   rz   r|   r~   r   r   r   r   r   r   r!   r!   r!   r"   r7   Z   s   




!r7   c             C   s   i }| |d< ||d< t t|  yt| | W n tk
rx } z(td}tr\|td7 }t|| W dd}~X Y nN tk
r   td}t|Y n, t	k
r   td}t|t
  Y nX W dQ R X |S )zEvaluate a config file.__file__r`   z6There is a syntax error in your configuration file: %sz+
Did you change the syntax from 2.x to 3.x?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   r^   r   SyntaxErrorr   r	   r   
SystemExit	Exception	traceback
format_exc)r_   r`   rd   errmsgr!   r!   r"   rS   f  s$     rS   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 )zThis converts 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>zhThe config value `source_suffix' expected to a string, list of strings or dictionary. But `%r' is given.)
rF   r$   r   r   r'   r(   r&   ro   rp   r   )appra   rF   r!   r!   r"   convert_source_suffix  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)ZsectionZfiguretablez
code-blockN)r   r   rI   )r   ra   rI   r!   r!   r"   init_numfig_format  s    r   c             C   sF   t ddk	rBx4dD ],}||krdt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)rA   Zepub_copyrightz\g<1>%sz%Y)r   r   copyright_year_resub)r   ra   kreplacer!   r!   r"   correct_copyright_year  s
    
r   c          	   C   sR  xJ|D ]@}|j |j \}}}t|dr2||}|dkr@|s@q|tkrJqt|tr||jstd}t	
|j|j|j|j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}t	
|j|jt|jtdd |D d qtd	}t	
|j|jt|jt|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.
    ri   NzTThe config value `{name}` has to be a one of {candidates}, but `{current}` is given.)r   currentr.   zQThe config value `{name}' has type `{current.__name__}', expected to {permitted}.c             S   s   g | ]
}|j qS r!   )r3   )r   cr!   r!   r"   r     s    z'check_confval_types.<locals>.<listcomp>)r   r   Z	permittedzZThe config value `{name}' has type `{current.__name__}', defaults to `{default.__name__}'.)r   r   r=   )rX   r   rl   r   r$   r-   r2   r   r   ro   rp   formatr.   typer)   	__bases__discardobjectr   )r   ra   Zconfvalr=   r   Zannotationsr   Zcommon_basesr!   r!   r"   rf     s@    


rf   c             C   sL   t d}x<t| jD ].\}}t|tr||rtt	d|d qW dS )zcheck all string values for non-ASCII characters in bytestrings,
    since that can result in UnicodeErrors all over the place
    s   [\x80-\xff]zthe config value %r is set to a string with non-ASCII characters; this can lead to Unicode errors occurring. Please use Unicode strings, e.g. %r.ZContentN)
recompiler
   rY   r$   r   searchro   rp   r   )ra   Znonascii_rer   r   r!   r!   r"   rh     s
    

rh   c             C   s<   |  dt |  dt |  dt |  dt ddddS )Nzconfig-initedZbuiltinT)rB   Zparallel_read_safeZparallel_write_safe)Zconnectr   r   r   rf   )r   r!   r!   r"   rM     s    rM   )Br6   r   r   r   rQ   collectionsr   osr   r   typingr   r   r   Zsixr   r	   r
   r   r   r   r   r   Zsphinx.deprecationr   Zsphinx.errorsr   r   Zsphinx.localer   r   Zsphinx.utilr   Zsphinx.util.i18nr   Zsphinx.util.osutilr   Zsphinx.util.pycompatr   r   Z	getLoggerr3   ro   rb   
ModuleTypeFunctionTyper%   r   r   r   Zunicodeboolr   r   r   r-   r   appendr7   rS   r   r   r   rf   rh   rM   r!   r!   r!   r"   <module>
   sN   (



  1