U Qab6P@sddlmZmZddlZddlZddlZddlZddlZddlm Z ddlm Z ddlm Z ddl m Z ddlmZmZddlmZmZdd lmZdd lmZmZeZdd d ZddZddZdddZGdddZGdddeZ GdddeZ!dS))absolute_importunicode_literalsN) defaultdict)partialwraps) import_module)DistutilsOptionErrorDistutilsFileError) LegacyVersionparse) SpecifierSet) string_typesPY3Fc Csddlm}m}tj|}tj|s4td|t}t tj |zJ|}|rb| ng}||krx| ||j ||dt||j|d}W5t |Xt|S)a,Read given configuration file and returns options from it as a dict. :param str|unicode filepath: Path to configuration file to get options from. :param bool find_others: Whether to search for other configuration files which could be on in various places. :param bool ignore_option_errors: Whether to silently ignore options, values of which could not be resolved (e.g. due to exceptions in directives such as file:, attr:, etc.). If False exceptions are propagated as expected. :rtype: dict r) Distribution _Distributionz%Configuration file %s does not exist.) filenames)ignore_option_errors)Zsetuptools.distrrospathabspathisfiler getcwdchdirdirnameZfind_config_filesappendZparse_config_filesparse_configurationcommand_optionsconfiguration_to_dict) filepathZ find_othersrrrZcurrent_directoryZdistrhandlersr!5/usr/lib/python3.8/site-packages/setuptools/config.pyread_configurations*     r#cCs.djft}tt||}t|||}|S)z Given a target object and option key, get that option from the target object, either through a get_{key} method or from an attribute directly. z get_{key})formatlocals functoolsrgetattr) target_objkeyZ getter_nameZ by_attributegetterr!r!r" _get_optionEs r+cCs<tt}|D]*}|jD]}t|j|}|||j|<qq |S)zReturns configuration data gathered by given handlers as a dict. :param list[ConfigHandler] handlers: Handlers list, usually from parse_configuration() :rtype: dict )rdict set_optionsr+r(section_prefix)r Z config_dictZhandlerZoptionvaluer!r!r"rQs   rcCs6t|||}|t|j|||j}|||fS)aPerforms additional parsing of configuration options for a distribution. Returns a list of used option handlers. :param Distribution distribution: :param dict command_options: :param bool ignore_option_errors: Whether to silently ignore options, values of which could not be resolved (e.g. due to exceptions in directives such as file:, attr:, etc.). If False exceptions are propagated as expected. :rtype: list )ConfigOptionsHandlerr ConfigMetadataHandlermetadata package_dir)Z distributionrroptionsmetar!r!r"rcsrc@seZdZdZdZiZd%ddZeddZdd Z e d&d d Z e d dZ e ddZ e ddZe ddZeddZeddZe d'ddZe ddZe d(ddZdd Zd!d"Zd#d$ZdS)) ConfigHandlerz1Handles metadata supplied in configuration files.NFcCs^i}|j}|D].\}}||s&q||dd}|||<q||_||_||_g|_dS)N.) r.items startswithreplacestriprr(sectionsr-)selfr(r4rr=r. section_namesection_optionsr!r!r"__init__s  zConfigHandler.__init__cCstd|jjdS).Metadata item name to parser function mapping.z!%s must provide .parsers propertyN)NotImplementedError __class____name__)r>r!r!r"parserss zConfigHandler.parsersc Cst}|j}|j||}t|||}||kr6t||r>dSd}|j|}|rz ||}Wn tk r~d}|jszYnX|rdSt|d|d}|dkrt |||n|||j |dS)NFTzset_%s) tupler(aliasesgetr'KeyErrorrF Exceptionrsetattrr-r) r>Z option_namer/unknownr(Z current_valueZ skip_optionparsersetterr!r!r" __setitem__s0   zConfigHandler.__setitem__,cCs8t|tr|Sd|kr |}n ||}dd|DS)zRepresents value as a list. Value is split either by separator (defaults to comma) or by lines. :param value: :param separator: List items separator character. :rtype: list  cSsg|]}|r|qSr!)r<).0chunkr!r!r" sz-ConfigHandler._parse_list..) isinstancelist splitlinessplit)clsr/ separatorr!r!r" _parse_lists   zConfigHandler._parse_listcCsPd}i}||D]8}||\}}}||kr:td||||<q|S)zPRepresents value as a dict. :param value: :rtype: dict =z(Unable to parse option value to dict: %s)r\ partitionr r<)rZr/r[resultliner)sepvalr!r!r" _parse_dictszConfigHandler._parse_dictcCs|}|dkS)zQRepresents value as boolean. :param value: :rtype: bool )1trueZyes)lower)rZr/r!r!r" _parse_boolszConfigHandler._parse_boolcsfdd}|S)zReturns a parser function to make sure field inputs are not files. Parses a value after getting the key so error messages are more informative. :param key: :rtype: callable cs d}||rtd|S)Nfile:zCOnly strings are accepted for the {0} field, files are not accepted)r: ValueErrorr$)r/Zexclude_directiver)r!r"rNs z3ConfigHandler._exclude_files_parser..parserr!)rZr)rNr!rjr"_exclude_files_parsers z#ConfigHandler._exclude_files_parsercs\d}t|ts|S||s |S|t|d}dd|dD}dfdd|DS)aORepresents value as a string, allowing including text from nearest files using `file:` directive. Directive is sandboxed and won't reach anything outside directory with setup.py. Examples: file: README.rst, CHANGELOG.md, src/file.txt :param str value: :rtype: str rhNcss|]}tj|VqdSN)rrrr<rSrr!r!r" %sz,ConfigHandler._parse_file..rQrRc3s.|]&}|stj|r|VqdS)TN) _assert_localrrr _read_filermrZr!r"rn&s   )rVrr:lenrYjoin)rZr/Zinclude_directivespecZ filepathsr!rqr" _parse_files  zConfigHandler._parse_filecCs|tstd|dS)Nz#`file:` directive can not access %s)r:rrr )rr!r!r"ro-szConfigHandler._assert_localc Cs.tj|dd}|W5QRSQRXdS)Nzutf-8)encoding)ioopenread)rfr!r!r"rp3szConfigHandler._read_filec Csd}||s|S||dd}|}d|}|p@d}t}|r|d|kr||d}|dd} t | dkrtj t| d}| d}q|}nd|krtj t|d}t j d|zt |} t| |}W5t j ddt _ X|S) zRepresents value as a module attribute. Examples: attr: package.attr attr: package.module.attr :param str value: :rtype: str zattr:r7r8rAr/N)r:r;r<rYpoprsrrrsplitrrrsysinsertrr') rZr/r3Zattr_directiveZ attrs_pathZ attr_nameZ module_name parent_pathZ custom_pathpartsmoduler!r!r" _parse_attr8s0        zConfigHandler._parse_attrcsfdd}|S)zReturns parser function to represents value as a list. Parses a value applying given methods one after another. :param parse_methods: :rtype: callable cs|}D] }||}q|Srlr!)r/parsedmethod parse_methodsr!r"r ns z1ConfigHandler._get_parser_compound..parser!)rZrr r!rr"_get_parser_compoundes z"ConfigHandler._get_parser_compoundcCs6i}|pdd}|D]\}\}}||||<q|S)zParses section options into a dictionary. Optionally applies a given parser to values. :param dict section_options: :param callable values_parser: :rtype: dict cSs|Srlr!)rbr!r!r"z6ConfigHandler._parse_section_to_dict..)r9)rZr@Z values_parserr/r)_rbr!r!r"_parse_section_to_dictxs  z$ConfigHandler._parse_section_to_dictc Cs<|D].\}\}}z |||<Wqtk r4YqXqdS)zQParses configuration file section. :param dict section_options: N)r9rJ)r>r@namerr/r!r!r" parse_sections  zConfigHandler.parse_sectioncCsb|jD]R\}}d}|r"d|}t|d|ddd}|dkrTtd|j|f||q dS)zTParses configuration file items from one or more related sections. r7z_%szparse_section%sr8__Nz0Unsupported distribution option section: [%s.%s])r=r9r'r;r r.)r>r?r@Zmethod_postfixZsection_parser_methodr!r!r"r s"zConfigHandler.parsecstfdd}|S)z this function will wrap around parameters that are deprecated :param msg: deprecation message :param warning_class: class of warning exception to be raised :param func: function to be wrapped around cst||Srl)warningswarn)argskwargsfuncmsg warning_classr!r"config_handlers z@ConfigHandler._deprecated_config_handler..config_handlerr)r>rrrrr!rr"_deprecated_config_handlersz(ConfigHandler._deprecated_config_handler)F)rQ)N)N)rE __module__ __qualname____doc__r.rHrApropertyrFrP classmethodr\rcrgrkru staticmethodrorprrrrr rr!r!r!r"r6~s<  &        ,   r6csHeZdZdZdddddZdZdfd d Zed d Zd dZ Z S)r1r2Zurl description classifiers platforms)Z home_pageZsummaryZ classifierplatformFNcstt||||||_dSrl)superr1rAr3)r>r(r4rr3rDr!r"rAszConfigMetadataHandler.__init__c CsL|j}|j}|j}|j}|||||dt|||||d|||j|d S)rBz[The requires parameter is deprecated, please use install_requires for runtime dependencies.license) rkeywordsZprovidesZrequiresZ obsoletesrrrZlong_descriptionversionZ project_urls)r\rurcrkrDeprecationWarningr_parse_version)r> parse_listZ parse_file parse_dictZexclude_files_parserr!r!r"rFs( zConfigMetadataHandler.parserscCs||}||krB|}tt|tr>d}t|jft|S|||j }t |r^|}t|t st |drd tt|}nd|}|S)zSParses `version` option value. :param value: :rtype: str zCVersion loaded from {value} does not comply with PEP 440: {version}__iter__r8z%s)rur<rVr r r r$r%rr3callablerhasattrrsmapstr)r>r/rZtmplr!r!r"rs    z$ConfigMetadataHandler._parse_version)FN) rErrr.rHZ strict_moderArrFr __classcell__r!r!rr"r1s r1c@s\eZdZdZeddZddZddZdd Zd d Z d d Z ddZ ddZ ddZ dS)r0r4cCsN|j}t|jdd}|j}|j}|||||||||||||||j|j|tdS)rB;r[)Zzip_safeZuse_2to3Zinclude_package_datar3Zuse_2to3_fixersZuse_2to3_exclude_fixersZconvert_2to3_doctestsZscriptsZeager_resourcesZdependency_linksZnamespace_packagesZinstall_requiresZsetup_requiresZ tests_requireZpackages entry_pointsZ py_modulesZpython_requires)r\rrgrc_parse_packagesrur )r>rZparse_list_semicolonZ parse_boolrr!r!r"rFs.zConfigOptionsHandler.parserscCszddg}|}||kr"||S||dk}|r>ts>td||jdi}|rdddlm}n ddlm }|f|S) zTParses `packages` option value. :param value: :rtype: list zfind:zfind_namespace:r|z8find_namespace: directive is unsupported on Python < 3.3z packages.findr)find_namespace_packages) find_packages) r<r\rr parse_section_packages__findr=rIZ setuptoolsrr)r>r/Zfind_directivesZ trimmed_valueZfindns find_kwargsrr!r!r"r1s     z$ConfigOptionsHandler._parse_packagescsT|||j}dddgtfdd|D}|d}|dk rP|d|d<|S)zParses `packages.find` configuration file section. To be used in conjunction with _parse_packages(). :param dict section_options: whereZincludeexcludecs$g|]\}}|kr|r||fqSr!r!rSkvZ valid_keysr!r"rUZszEConfigOptionsHandler.parse_section_packages__find..Nr)rr\r,r9rI)r>r@Z section_datarrr!rr"rMs   z1ConfigOptionsHandler.parse_section_packages__findcCs|||j}||d<dS)z`Parses `entry_points` configuration file section. :param dict section_options: rN)rr\r>r@rr!r!r"parse_section_entry_pointsbsz/ConfigOptionsHandler.parse_section_entry_pointscCs.|||j}|d}|r*||d<|d=|S)N*r7)rr\rI)r>r@rrootr!r!r"_parse_package_datajs  z(ConfigOptionsHandler._parse_package_datacCs|||d<dS)z`Parses `package_data` configuration file section. :param dict section_options: Z package_dataNrr>r@r!r!r"parse_section_package_datatsz/ConfigOptionsHandler.parse_section_package_datacCs|||d<dS)zhParses `exclude_package_data` configuration file section. :param dict section_options: Zexclude_package_dataNrrr!r!r""parse_section_exclude_package_data{sz7ConfigOptionsHandler.parse_section_exclude_package_datacCs"t|jdd}||||d<dS)zbParses `extras_require` configuration file section. :param dict section_options: rrZextras_requireN)rr\r)r>r@rr!r!r"parse_section_extras_requires z1ConfigOptionsHandler.parse_section_extras_requirecCs(|||j}dd|D|d<dS)z^Parses `data_files` configuration file section. :param dict section_options: cSsg|]\}}||fqSr!r!rr!r!r"rUszAConfigOptionsHandler.parse_section_data_files..Z data_filesN)rr\r9rr!r!r"parse_section_data_filessz-ConfigOptionsHandler.parse_section_data_filesN)rErrr.rrFrrrrrrrrr!r!r!r"r0s   r0)FF)F)"Z __future__rrrwrrrr& collectionsrrr importlibrZdistutils.errorsr r Z#setuptools.extern.packaging.versionr r Z&setuptools.extern.packaging.specifiersr Zsetuptools.extern.sixrrtypeZ __metaclass__r#r+rrr6r1r0r!r!r!r"s4      /  ?U