o $aO @sFdZddlZddlZddlZddlmZddlmZmZddl m Z m Z m Z m Z mZmZmZmZmZmZmZmZddlmZmZddlmZmZddlmZdd lmZdd l m!Z!m"Z"dd l#m$Z$dd l%m&Z&e rvdd l'm(Z(ddl)m*Z*e+e,Z-dZ.e/ej0ej1fZ2e3dZ4GdddeZ5de de6fddZ7GdddZ8GdddZ9de:dee$de e:e ffddZ;dd d!e9ddfd"d#Zdd d!e9ddfd(d)Z?dd d!e9ddfd*d+Z@dd d!e9ddfd,d-ZAdd d.d/d0ee:d1ee:d2ee:dee:f d3d4ZBdd de e:e ffd5d6ZCdS)7z sphinx.config ~~~~~~~~~~~~~ Build configuration file handling. :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. N) OrderedDict)getenvpath) TYPE_CHECKINGAnyCallableDict GeneratorIteratorList NamedTupleOptionalSetTupleUnion) ConfigErrorExtensionError)___)logging) format_date)cd fs_encoding)Tags)NoneType)Sphinx)BuildEnvironmentzconf.pyz^((\d{4}-)?)(\d{4})(?=[ ,])c@s.eZdZUeed<eed<eeefed<dS) ConfigValuenamevaluerebuildN)__name__ __module__ __qualname__str__annotations__rrboolr'r'//usr/lib/python3/dist-packages/sphinx/config.pyr&s robjreturncCsjt|trdSt|tr"|D]\}}t|rt|sdSqdSt|tttfr3tdd|DSdS)z'Check if object is serializable or not.Fcss|]}t|VqdSN)is_serializable).0ir'r'r( 5sz"is_serializable..T) isinstanceUNSERIALIZABLE_TYPESdictitemsr,listtuplesetall)r)keyrr'r'r(r,,s  r,c@s>eZdZdZdeddfddZdeeeefde fdd Z dS) 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')) candidatesr*NcGs ||_dSr+r:)selfr:r'r'r(__init__@ z ENUM.__init__rcs.t|ttfrtfdd|DS|jvS)Nc3s|]}|jvVqdSr+r;)r-itemr<r'r(r/EzENUM.match..)r0r4r5r7r:)r<rr'r@r(matchCs z ENUM.match) r!r"r#__doc__r$r=rr rr&rBr'r'r'r(r9:s r9c @s*eZdZUdZidddgfdddgfddd egfd d d d egfd ddgfdddgfdddgfdddegfdddegfddgdgfdddegfdddgfdddgfddd dgfddd idefd!d"dgfd#gdgfid$ddegfd%d&dgfd'd&dgfd(ddgfd)ddgfd*dd egfd+d,dgfd-idgfd.gd gfd/dd egfd0ddgfd1gdgfd2gd gfd3ddegfd4ddegfd5d&dgfd6d7degfid8ddegfd9idgfd:ddgfd;ddgfdddgfd?d@dgfdAidgfdBddgfdCddegfdDd&dgfdEd&dgfdFddgfdGddegfdHd&dgfdIdJdgfdKdLgdMdNgdOdgfiZeee fe dP<iifdQeeefdReeefdSdfdTdUZ e dydVedRedWe dSdfdXdYZdZed[edSefd\d]Zdzd^d_Zdzd`daZdZedSefdbdcZdZedSefdddeZdZed[edSdfdfdgZdZedSdfdhdiZdZedSefdjdkZdSeeddffdldmZdZed,edneeefdoedSdf dpdqZdneeeefdSeefdrdsZdSefdtduZ dvedSdfdwdxZ!dS){ConfigaConfiguration 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``. projectPythonenvauthorunknownproject_copyrighthtml copyrightcC|jSr+)rJ)cr'r'r(`zConfig.versionreleasetoday today_fmtNlanguage locale_dirslocalesfigure_language_filenamez{root}.{language}{ext} gettext_allow_fuzzy_translationsFgettext master_docindexroot_doccCrNr+)r\)configr'r'r(rPmrQ source_suffixz.rstrestructuredtextsource_encodingz utf-8-sigexclude_patterns default_roleadd_function_parenthesesTadd_module_namestrim_footnote_reference_space show_authorspygments_stylehighlight_languagedefaulthighlight_optionstemplates_pathtemplate_bridge keep_warningssuppress_warningsmodindex_common_prefix rst_epilog rst_prologtrim_doctest_flagsprimary_domainpy needs_sphinxneeds_extensions manpages_urlnitpickynitpick_ignorenitpick_ignore_regexnumfignumfig_secnum_depth numfig_formatmath_number_allmath_eqref_format math_numfig tls_verify tls_cacerts user_agent smartquotessmartquotes_actionqDesmartquotes_excludesjamantext) languagesbuilders config_valuesr_ overridesr*cCs~t||_tj|_||_|dd|_d|jvr6t |jdt r.|j d d|d<n|j d|d<|dg|_ dS)Nsetup extensions,)r2rrDrcopyvalues _raw_configgetrr0r$popsplitr)r<r_rr'r'r(r=s   zConfig.__init__confdirtagscCs>t|t}t|sttd|t||}|||piS)z/Create a Config object from configuration file.z4config directory doesn't contain a conf.py file (%s))rjoinCONFIG_FILENAMEisfilerreval_config_file)clsrrrfilename namespacer'r'r(reads   z Config.readrrc CsFt|ts|S|j|d}|j|dtkr|S|j|dtthkr2|dkr*dS|dkr0dS|St|tusB|j|dtgkrL|dkrHdSt|St|tr]ttd||dft|t rg| d St|t rzt |WSty}z ttd ||f|d}~wwt |d r|S|durt|tsttd ||S) Nr0F1TzZcannot override dictionary config setting %r, ignoring (use %r to set individual elements)z .key=valuerz/invalid number %r for config value %r, ignoring__call__zAcannot override config setting %r with unsupported type, ignoring) r0r$rrr&typer2 ValueErrorrr4rinthasattr)r<rrdefvalueexcr'r'r(convert_overridessN         zConfig.convert_overridesc Csgd}|D];}z!||jvr|||j||j|<n ||jvr(|j||j|<WqtyA}z td|WYd}~qd}~wwdS)zs Initialize some limited config variables before initializing i18n and loading extensions. )rwrprVrW%sN)rr__dict__rrloggerwarning)r< variablesrrr'r'r(pre_init_valuess  zConfig.pre_init_valuesc Cs|j}|jD]U\}}z9d|vr#|dd\}}|||i|<Wq||jvr2ttd|Wqt |t r@| ||||<n|||<Wqt y]}z td|WYd}~qd}~ww|D]}||jvrn|||j |<q`dS)N.rz-unknown config value %r in override, ignoringr)rrr3r setdefaultrrrrr0r$rrr)r<r_valnamer realvalnamer8rrr'r'r( init_valuess2    zConfig.init_valuescCsP|dr t|||jvrttd||j|d}t|dr&||S|S)NrzNo such config value: %srr) startswithAttributeErrorrrr)r<rrkr'r'r( __getattr__s   zConfig.__getattr__cCs t||Sr+)getattrr<rr'r'r( __getitem__r>zConfig.__getitem__cCst|||dSr+)setattrr<rrr'r'r( __setitem__ zConfig.__setitem__cCst||dSr+)delattrrr'r'r( __delitem__szConfig.__delitem__cCs ||jvSr+)rrr'r'r( __contains__r>zConfig.__contains__ccs2|jD]\}}t|t|||dVqdS)Nr)rr3rrrr'r'r(__iter__szConfig.__iter__r typescCs.||jvr ttd||||f|j|<dS)NzConfig value %r already present)rrr)r<rrkr rr'r'r(adds z Config.addcs"ttrgfdd|DS)Nc3s|] }|jvr|VqdSr+r )r-rrr'r(r/!sz Config.filter..)r0r$)r<r r'rr(filters z Config.filtercCsi}|jD]\}}|dst|sq|||<qi|d<|jD]\}}t||}t|s2d}||ddf|d|<q#|S)z'Obtains serializable data for pickling.rrNr)rr3rr,rr)r<rr8r real_valuer'r'r( __getstate__#s  zConfig.__getstate__statecCs|j|dSr+)rupdate)r<rr'r'r( __setstate__:rzConfig.__setstate__)NN)r*N)"r!r"r#rCr$rrrrrr%r= classmethodrrrrrrrrrr&rr rrrrr r rrrr'r'r'r(rDJs                           ! " # $ % & ' ( ) * + , - . / 1 2 3 4 5 6 7 89,>  )  &"rDrrc Cs,i}||d<||d<tt|{z't|d}t||td}t||Wdn1s3wYWnJt yP}z t d}t |||d}~wt yd}z t d}t ||d}~wt ykt y}z t d}t |t|d}~wwWd|S1swY|S) zEvaluate a config file.__file__rrbexecNz7There 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)rrdirnameopencompilerencoderr SyntaxErrorrr SystemExit Exception traceback format_exc)rrrfcodeerrmsgrr'r'r(r>s<     rapprr_cCsx|j}t|trt|di|_dSt|ttfr$tdd|D|_dSt|tr1t|j|_dStt d|dS)zConvert old styled source_suffix to new styled one. * old style: str or list * new style: a dict which maps from fileext to filetype NcSsg|]}|dfqSr+r')r-sr'r'r( jsz)convert_source_suffix..zeThe config value `source_suffix' expects a string, list of strings, or dictionary. But `%r' is given.) r`r0r$rr4r5r2rrr)rr_r`r'r'r(convert_source_suffix[s   rcCs8|j}|rtdd|Ds|j|i|_dSdSdS)zConvert old styled highlight_options to new styled one. * old style: options * new style: a dict which maps from language name to options css|]}t|tVqdSr+)r0r2)r-vr'r'r(r/{rAz,convert_highlight_options..N)rlr7rrj)rr_optionsr'r'r(convert_highlight_optionstsrcCs4tdtdtdtdd}||j||_dS)z$Initialize :confval:`numfig_format`.z Section %szFig. %szTable %sz Listing %s)sectionfiguretablez code-blockN)rrr)rr_rr'r'r(init_numfig_formats  rcCsFtddurdD]}||vrdtd}t|||||<qdSdS)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)rMepub_copyrightz\g<1>%sz%Y)rrcopyright_year_resub)rr_kreplacer'r'r(correct_copyright_years  rc Cs~|D]}|j|j\}}}t|dr||}|dur|sq|tur"qt|tr@||js?td}t |j |j|j|j dqt |jt |urJqt |j|vrRqtt |jjt |jftt |j@}|t|roq|rtd}dd|D}t|dkrd d |dd |d } nd |} t |j |jt |j| d qtd}t |j |jt |jt |dqdS)zCheck all values for deviation from the default value's type, since that can result in TypeErrors all over the place NB. rNzTThe config value `{name}` has to be a one of {candidates}, but `{current}` is given.)rcurrentr:zNThe config value `{name}' has type `{current.__name__}'; expected {permitted}.cSsg|]}d|jqS)z`{}')formatr!)r-rOr'r'r(rsz'check_confval_types..rz {}, or {}z, z or )rr permittedzZThe config value `{name}' has type `{current.__name__}', defaults to `{default.__name__}'.)rrrk)rrrrr0r9rBrrrrrr:rr6 __bases__discardobjectlenr) rr_confvalrkr annotationsr common_baseswrapped_annotationsrr'r'r(check_confval_typessZ             rcCs8|j}|r|j|sttd|d|_dSdSdS)Nz%primary_domain %r not found, ignored.)ruregistry has_domainrrr)rr_rur'r'r(check_primary_domains  rrGraddedchangedremovedcCs>|jjdkrd|jjvrd|jjvrttdd|j_|S)zjAdjust root_doc to 'contents' to support an old project which does not have any root_doc setting. r]contentszkSince v2.0, Sphinx uses "index" as root_doc by default. Please add "root_doc = 'contents'" to your conf.py.)r_r^rEdocnamesrrr)rrGrrrr'r'r(check_root_docs   r cCsx|jdtdd|jdtdd|jdtdd|jdtdd|jdtdd|jdtdd|dtddddS)Nz config-initedi )priorityzenv-get-outdatedbuiltinT)rRparallel_read_safeparallel_write_safe)connectrrrrrrr )rr'r'r(rs r)DrCrerr collectionsrosrrtypingrrrrr r r r r rrr sphinx.errorsrr sphinx.localerr sphinx.utilrsphinx.util.i18nrsphinx.util.osutilrrsphinx.util.tagsrsphinx.util.typingrsphinx.applicationrsphinx.environmentr getLoggerr!rrr ModuleType FunctionTyper1rrrr&r,r9rDr$rrrrrrrr rr'r'r'r(sR  8        "u   7