a
    ñ»jøc  ã                   @  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 ddlmZ ddlm	Z	 ddl
mZ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 ddlmZ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�rddl(m)Z) ddl*m+Z+ ededef f Z,ede,f Z-eded d�Z.dCdddœdd„Z/ddddœd d!„Z0dDddd#d$d%d&œd'd(„Z1ddd)œd*d+„Z2d%dd,œd-d.„Z3dEdd/d0d1œd2d3„Z4ddd4d5œd6d7„Z5G d8d9„ d9ee. ƒZ6G d:d;„ d;e6d< ƒZ7G d=d>„ d>e6d ƒZ8G d?d@„ d@e%ƒZ9G dAdB„ dBe%ƒZ:dS )Fa<  
Load setuptools configuration from ``setup.cfg`` files.

**API will be made private in the future**

To read project metadata, consider using
``build.util.project_wheel_metadata`` (https://pypi.org/project/build/).
For simple scenarios, you can also try parsing the file directly
with the help of ``configparser``.
é    )ÚannotationsN)Údefaultdict)Úpartial©Úwraps)	ÚTYPE_CHECKINGÚCallableÚAnyÚDictÚGenericÚIterableÚTupleÚTypeVarÚUnioné   )ÚStrPath)Ú	FileErrorÚOptionError)Údefault_environment)ÚInvalidRequirementÚRequirement)ÚSpecifierSet)ÚInvalidVersionÚVersion)ÚSetuptoolsDeprecationWarningé   )Úexpand)ÚDistributionMetadata©ÚDistributionÚstrÚTarget)r   r   )ÚboundFr   Údict)ÚfilepathÚreturnc                 C  s8   ddl m} |ƒ }|r| ¡ ng }t|| ||ƒ}t|ƒ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   r   )Úsetuptools.distr   Úfind_config_filesÚ_applyÚconfiguration_to_dict)r$   Zfind_othersÚignore_option_errorsr   ÚdistÚ	filenamesÚhandlers© r.   ú@E:\soccer\ml_env\Lib\site-packages\setuptools/config/setupcfg.pyÚread_configuration8   s
    r0   r   )r+   r$   r%   c                 C  s   t | |ƒ |  ¡  | S )z`Apply the configuration from a ``setup.cfg`` file into an existing
    distribution object.
    )r(   Z_finalize_requires)r+   r$   r.   r.   r/   Úapply_configurationR   s    
r1   r.   zIterable[StrPath]Úboolztuple[ConfigHandler, ...])r+   r$   Úother_filesr*   r%   c              	   C  s    ddl m} tj |¡}tj |¡s4td|› d�ƒ‚t ¡ }t tj 	|¡¡ g |¢|‘}z4|j
| |d� t| | j|d�}|  ¡  W t |¡ nt |¡ 0 |S )zHRead configuration from ``filepath`` and applies to the ``dist`` object.r   )Ú_DistributionzConfiguration file z does not exist.)r,   )r*   )r&   r4   ÚosÚpathÚabspathÚisfiler   ÚgetcwdÚchdirÚdirnameÚparse_config_filesÚparse_configurationÚcommand_optionsZ_finalize_license_files)r+   r$   r3   r*   r4   Zcurrent_directoryr,   r-   r.   r.   r/   r(   [   s    ÿ
r(   )Ú
target_objÚkeyc                 C  s*   d|› �}t  t| |¡}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.
    Úget_)Ú	functoolsr   Úgetattr)r?   r@   Zgetter_nameZby_attributeÚgetterr.   r.   r/   Ú_get_optiony   s    
rE   )r-   r%   c                 C  s<   t tƒ}| D ]*}|jD ]}t|j|ƒ}|||j |< qq|S )z»Returns configuration data gathered by given handlers as a dict.

    :param list[ConfigHandler] handlers: Handlers list,
        usually from parse_configuration()

    :rtype: dict
    )r   r#   Úset_optionsrE   r?   Úsection_prefix)r-   Zconfig_dictÚhandlerÚoptionÚvaluer.   r.   r/   r)   …   s    
r)   ÚAllCommandOptionsz2tuple[ConfigMetadataHandler, ConfigOptionsHandler])Údistributionr>   r%   c                 C  sˆ   t  | ¡�f}t| |||ƒ}| ¡  | js0|j| _t| j|||| j| jƒ}| ¡  | j 	|j|j¡ W d  ƒ n1 sv0    Y  ||fS )aÒ  Performs 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
    N)
r   ZEnsurePackagesDiscoveredÚConfigOptionsHandlerÚparseÚpackage_dirÚConfigMetadataHandlerÚmetadataÚsrc_rootÚ_referenced_filesÚupdate)rL   r>   r*   Úensure_discoveredÚoptionsÚmetar.   r.   r/   r=   —   s.    üúÿ"r=   Úlist)ÚlabelÚ
orig_valueÚparsedc              
     sª   d|v st ˆ ƒdkrdS tƒ  ¡ }z,tˆ d ƒ}|j|v rLtj| ˆ d d� W nV ty¤ } z>t‡ fdd„|D ƒƒr�tj	| ˆ d d�}t|ƒ|‚W Y d}~n
d}~0 0 dS )am  Because users sometimes misinterpret this configuration:

    [options.extras_require]
    foo = bar;python_version<"4"

    It looks like one requirement with an environment marker
    but because there is no newline, it's parsed as two requirements
    with a semicolon as separator.

    Therefore, if:
        * input string does not contain a newline AND
        * parsed result contains two requirements AND
        * parsing of the two parts from the result ("<first>;<second>")
        leads in a valid Requirement with a valid marker
    a UserWarning is shown to inform the user about the possible problem.
    Ú
r   Nr   )ÚfieldÚreqc                 3  s   | ]}ˆ d    |¡V  qdS )r   N©Ú
startswith)Ú.0Úmarker©r[   r.   r/   Ú	<genexpr>à   ó    z8_warn_accidental_env_marker_misconfig.<locals>.<genexpr>)
ÚlenÚ
marker_envÚkeysr   ÚnameÚ_AmbiguousMarkerÚemitr   ÚanyÚmessage)rY   rZ   r[   Úmarkersr^   ÚexÚmsgr.   rc   r/   Ú%_warn_accidental_env_marker_misconfigÅ   s    

rq   c                   @  sð   e Zd ZU dZded< i Zded< dddd	œd
d„Zeddœdd„ƒZe	dd„ ƒZ
dd„ Zed1dd„ƒZedd„ ƒZedd„ ƒZedd„ ƒZddœdd„Zddœd d!„Zed"d#„ ƒZed$d%„ ƒZed2d'd(„ƒZd)d*„ Zd+d,œd-d.„Zd/d0„ Zd&S )3ÚConfigHandlerz1Handles metadata supplied in configuration files.r    rG   zdict[str, str]Úaliasesr!   rK   úexpand.EnsurePackagesDiscovered)r?   rV   rU   c                 C  s4   || _ || _t|  |¡ƒ| _g | _|| _tƒ | _d S ©N)	r*   r?   r#   Ú_section_optionsÚsectionsrF   rU   ÚsetrS   ©Úselfr?   rV   r*   rU   r.   r.   r/   Ú__init__õ   s    zConfigHandler.__init__)rV   c                 c  s>   |  ¡ D ]0\}}| | j¡\}}}|r(q| d¡|fV  qd S )NÚ.)ÚitemsÚ	partitionrG   Úlstrip)ÚclsrV   Z	full_namerJ   ÚpreÚsepri   r.   r.   r/   rv     s
    zConfigHandler._section_optionsc                 C  s   t d| jj ƒ‚dS )ú.Metadata item name to parser function mapping.z!%s must provide .parsers propertyN)ÚNotImplementedErrorÚ	__class__Ú__name__©rz   r.   r.   r/   Úparsers  s    
ÿzConfigHandler.parsersc           	   
   C  sÈ   | j }| j ||¡}zt||ƒ}W n. tyP } zt|ƒ|‚W Y d }~n
d }~0 0 |rZd S z| j |dd„ ¡|ƒ}W n tf| j y�   Y d S 0 t	 
|j|¡}t|d| |ƒ}||ƒ | j |¡ d S )Nc                 S  s   | S ru   r.   )Úxr.   r.   r/   Ú<lambda>%  re   z+ConfigHandler.__setitem__.<locals>.<lambda>zset_%s)r?   rs   ÚgetrC   ÚAttributeErrorÚKeyErrorrˆ   Ú	Exceptionr*   rB   r   Ú__setattr__rF   Úappend)	rz   Zoption_namerJ   r?   Úcurrent_valueÚer[   Zsimple_setterÚsetterr.   r.   r/   Ú__setitem__  s      zConfigHandler.__setitem__ú,c                 C  s8   t |tƒr|S d|v r | ¡ }n
| |¡}dd„ |D ƒS )z×Represents 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
        r\   c                 S  s   g | ]}|  ¡ r|  ¡ ‘qS r.   ©Ústrip)ra   Úchunkr.   r.   r/   Ú
<listcomp>A  re   z-ConfigHandler._parse_list.<locals>.<listcomp>)Ú
isinstancerX   Ú
splitlinesÚsplit)r€   rJ   Ú	separatorr.   r.   r/   Ú_parse_list/  s    



zConfigHandler._parse_listc                 C  sR   d}i }|   |¡D ]:}| |¡\}}}||kr<td|› �ƒ‚| ¡ || ¡ < q|S )zPRepresents value as a dict.

        :param value:
        :rtype: dict
        ú=z&Unable to parse option value to dict: )rž   r~   r   r—   )r€   rJ   r�   ÚresultÚliner@   r‚   Úvalr.   r.   r/   Ú_parse_dictC  s    zConfigHandler._parse_dictc                 C  s   |  ¡ }|dv S )zQRepresents value as boolean.

        :param value:
        :rtype: bool
        )Ú1ÚtrueÚyes)Úlower©r€   rJ   r.   r.   r/   Ú_parse_boolT  s    zConfigHandler._parse_boolc                   s   ‡ fdd„}|S )zßReturns 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
        c                   s    d}|   |¡rtd ˆ ¡ƒ‚| S )Núfile:zCOnly strings are accepted for the {0} field, files are not accepted)r`   Ú
ValueErrorÚformat)rJ   Zexclude_directive©r@   r.   r/   Úparserj  s    
ÿÿz3ConfigHandler._exclude_files_parser.<locals>.parserr.   )r€   r@   r®   r.   r­   r/   Ú_exclude_files_parser^  s    	z#ConfigHandler._exclude_files_parserr   ©Úroot_dirc                 C  s\   d}t |tƒs|S | |¡s |S |t|ƒd… }dd„ | d¡D ƒ}| j |¡ t ||¡S )aO  Represents 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
        rª   Nc                 S  s   g | ]}|  ¡ ‘qS r.   r–   )ra   r6   r.   r.   r/   r™   ‹  re   z-ConfigHandler._parse_file.<locals>.<listcomp>r•   )	rš   r    r`   rf   rœ   rS   rT   r   Z
read_files)rz   rJ   r±   Zinclude_directiveÚspecZ	filepathsr.   r.   r/   Ú_parse_fileu  s    

zConfigHandler._parse_filec                 C  s:   d}|  |¡s|S | |d¡}| | jj¡ t |||¡S )z·Represents value as a module attribute.

        Examples:
            attr: package.attr
            attr: package.module.attr

        :param str value:
        :rtype: str
        zattr:Ú )r`   ÚreplacerT   rU   rO   r   Z	read_attr)rz   rJ   rO   r±   Zattr_directiveZ	attr_descr.   r.   r/   Ú_parse_attr�  s    

zConfigHandler._parse_attrc                   s   ‡ fdd„}|S )z¹Returns parser function to represents value as a list.

        Parses a value applying given methods one after another.

        :param parse_methods:
        :rtype: callable
        c                   s   | }ˆ D ]}||ƒ}q|S ru   r.   )rJ   r[   Úmethod©Úparse_methodsr.   r/   rN   ­  s    
z1ConfigHandler._get_parser_compound.<locals>.parser.   )r€   r¹   rN   r.   r¸   r/   Ú_get_parser_compound£  s    
z"ConfigHandler._get_parser_compoundc                 C  s,   i }|  ¡ D ]\}\}}|||ƒ||< q|S )a  Parses section options into a dictionary.

        Applies a given parser to each option in a section.

        :param dict section_options:
        :param callable values_parser: function with 2 args corresponding to key, value
        :rtype: dict
        )r}   )r€   Úsection_optionsÚvalues_parserrJ   r@   Ú_r¢   r.   r.   r/   Ú_parse_section_to_dict_with_key·  s    
z-ConfigHandler._parse_section_to_dict_with_keyNc                   s$   ˆ r‡ fdd„ndd„ }|   ||¡S )a   Parses section options into a dictionary.

        Optionally applies a given parser to each value.

        :param dict section_options:
        :param callable values_parser: function with 1 arg corresponding to option value
        :rtype: dict
        c                   s   ˆ |ƒS ru   r.   ©r½   Úv©r¼   r.   r/   rŠ   Ð  re   z6ConfigHandler._parse_section_to_dict.<locals>.<lambda>c                 S  s   |S ru   r.   r¿   r.   r.   r/   rŠ   Ð  re   ©r¾   )r€   r»   r¼   r®   r.   rÁ   r/   Ú_parse_section_to_dictÆ  s    
z$ConfigHandler._parse_section_to_dictc              	   C  sL   |  ¡ D ]>\}\}}t t¡� || |< W d  ƒ q1 s<0    Y  qdS )zQParses configuration file section.

        :param dict section_options:
        N)r}   Ú
contextlibÚsuppressr�   )rz   r»   ri   r½   rJ   r.   r.   r/   Úparse_sectionÓ  s    zConfigHandler.parse_sectionÚNone)r%   c                 C  sh   | j  ¡ D ]X\}}d}|r"d| }t| d|  dd¡dƒ}|du rZtd| j› d|› d�ƒ‚||ƒ q
dS )	zTParses configuration file items from one
        or more related sections.

        r´   z_%szparse_section%sr|   Ú__Nz*Unsupported distribution option section: [ú])rw   r}   rC   rµ   r   rG   )rz   Úsection_namer»   Zmethod_postfixZsection_parser_methodr.   r.   r/   rN   Ý  s$    üÿÿÿzConfigHandler.parsec                   s   t ˆ ƒ‡ ‡‡fdd„ƒ}|S )z¢this function will wrap around parameters that are deprecated

        :param msg: deprecation message
        :param func: function to be wrapped around
        c                    s.   ˆ  dd¡ tjdˆfi ˆ¤Ž ˆ | i |¤ŽS )NÚ
stacklevelr   z Deprecated config in `setup.cfg`)Ú
setdefaultÚ_DeprecatedConfigrk   )ÚargsÚkwargs©ÚfuncÚkwrp   r.   r/   Úconfig_handlerý  s    z@ConfigHandler._deprecated_config_handler.<locals>.config_handlerr   )rz   rÑ   rp   rÒ   rÓ   r.   rÐ   r/   Ú_deprecated_config_handlerö  s    z(ConfigHandler._deprecated_config_handler)r•   )N)r†   Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__rs   r{   Úclassmethodrv   Úpropertyrˆ   r”   rž   r£   r©   r¯   r³   r¶   rº   r¾   rÃ   rÆ   rN   rÔ   r.   r.   r.   r/   rr   å   s8   



	



rr   c                      s^   e Zd ZdZdddddœZdZdejfd	d
dddddœ‡ fdd„Ze	dd„ ƒZ
dd„ Z‡  ZS )rP   rQ   ÚurlÚdescriptionÚclassifiersÚ	platforms)Z	home_pageÚsummaryÚ
classifierÚplatformFNr   rK   r2   rt   zdict | Noner   )r?   rV   r*   rU   rO   r±   c                   s"   t ƒ  ||||¡ || _|| _d S ru   )Úsuperr{   rO   r±   )rz   r?   rV   r*   rU   rO   r±   ©r…   r.   r/   r{     s    	zConfigMetadataHandler.__init__c                 C  sL   | j }t| j| jd�}| j}| j}|||||  ||¡|dƒ|||| j|dœS )rƒ   r°   Úlicense)rÞ   ÚkeywordsÚprovidesÚ	obsoletesrÝ   rä   Zlicense_filesrÜ   Úlong_descriptionÚversionZproject_urls)rž   r   r³   r±   r£   r¯   rº   Ú_parse_version)rz   Ú
parse_listZ
parse_fileÚ
parse_dictZexclude_files_parserr.   r.   r/   rˆ   #  s     
õzConfigMetadataHandler.parsersc              
   C  s‚   |   || j¡}||krj| ¡ }zt|ƒ W n: tyd } z"td|› d|› �ƒ|‚W Y d}~n
d}~0 0 |S t |  || j	| j¡¡S )zSParses `version` option value.

        :param value:
        :rtype: str

        zVersion loaded from z does not comply with PEP 440: N)
r³   r±   r—   r   r   r   r   ré   r¶   rO   )rz   rJ   ré   r’   r.   r.   r/   rê   9  s    ÿÿýz$ConfigMetadataHandler._parse_version)r†   rÕ   rÖ   rG   rs   Zstrict_moder5   Úcurdirr{   rÚ   rˆ   rê   Ú__classcell__r.   r.   rã   r/   rP     s   üù
rP   r   c                      s¤   e Zd ZdZdddddœ‡ fdd„Zed	d
„ ƒZdd„ Zdddœdd„Ze	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‡  ZS )%rM   rV   r   rK   r2   rt   )r?   rV   r*   rU   c                   s$   t ƒ  ||||¡ |j| _i | _d S ru   )râ   r{   rR   r±   rO   ry   rã   r.   r/   r{   V  s    zConfigOptionsHandler.__init__c                 C  s   | j |dd�S )Nú;)r�   )rž   r¨   r.   r.   r/   Ú_parse_list_semicolona  s    z*ConfigOptionsHandler._parse_list_semicolonc                 C  s   | j || jd�S )Nr°   )r³   r±   )rz   rJ   r.   r.   r/   Ú_parse_file_in_roote  s    z(ConfigOptionsHandler._parse_file_in_rootr    )rY   rJ   c                 C  s*   |   |  |¡¡}t|||ƒ dd„ |D ƒS )Nc                 S  s   g | ]}|  d ¡s|‘qS )ú#r_   )ra   r¡   r.   r.   r/   r™   n  re   zAConfigOptionsHandler._parse_requirements_list.<locals>.<listcomp>)rð   rñ   rq   )rz   rY   rJ   r[   r.   r.   r/   Ú_parse_requirements_listh  s    z-ConfigOptionsHandler._parse_requirements_listc                 C  sT   | j }| j}| j}| j}|||||||  |d¡t| jdƒ| j| j| j| j	|t
|dœS )rƒ   zeThe namespace_packages parameter is deprecated, consider using implicit namespaces instead (PEP 420).Úinstall_requires)Zzip_safeZinclude_package_datarO   ÚscriptsZeager_resourcesZdependency_linksÚnamespace_packagesrô   Zsetup_requiresZtests_requireÚpackagesÚentry_pointsÚ
py_modulesZpython_requiresÚcmdclass)rž   r©   r£   Ú_parse_cmdclassrÔ   r   ró   rð   Ú_parse_packagesrñ   r   )rz   rë   Z
parse_boolrì   Zparse_cmdclassr.   r.   r/   rˆ   p  s2    þÿêzConfigOptionsHandler.parsersc                 C  s   | j j}t |  |¡|| j¡S ru   )rU   rO   r   rú   r£   r±   )rz   rJ   rO   r.   r.   r/   rû   ‘  s    z$ConfigOptionsHandler._parse_cmdclassc                 C  sb   ddg}|  ¡ }||vr"|  |¡S |  | j di ¡¡}|j||d k| j| jd� tj	f i |¤ŽS )zTParses `packages` option value.

        :param value:
        :rtype: list
        zfind:zfind_namespace:zpackages.findr   )Ú
namespacesr±   Zfill_package_dir)
r—   rž   Úparse_section_packages__findrw   r‹   rT   r±   rO   r   Zfind_packages)rz   rJ   Zfind_directivesZtrimmed_valueÚfind_kwargsr.   r.   r/   rü   •  s    
ÿ
ýz$ConfigOptionsHandler._parse_packagesc                   sR   |   || j¡}g d¢‰ t‡ fdd„| ¡ D ƒƒ}| d¡}|durN|d |d< |S )zœParses `packages.find` configuration file section.

        To be used in conjunction with _parse_packages().

        :param dict section_options:
        )ÚwhereÚincludeÚexcludec                   s$   g | ]\}}|ˆ v r|r||f‘qS r.   r.   )ra   ÚkrÀ   ©Z
valid_keysr.   r/   r™   ¹  s   zEConfigOptionsHandler.parse_section_packages__find.<locals>.<listcomp>r   Nr   )rÃ   rž   r#   r}   r‹   )rz   r»   Zsection_datarÿ   r   r.   r  r/   rþ   ®  s    ÿ
z1ConfigOptionsHandler.parse_section_packages__findc                 C  s   |   || j¡}|| d< dS )z`Parses `entry_points` configuration file section.

        :param dict section_options:
        rø   N)rÃ   rž   ©rz   r»   r[   r.   r.   r/   Úparse_section_entry_pointsÃ  s    z/ConfigOptionsHandler.parse_section_entry_pointsc                 C  s   |   || j¡}t |¡S ru   )rÃ   rž   r   Zcanonic_package_data)rz   r»   Úpackage_datar.   r.   r/   Ú_parse_package_dataË  s    z(ConfigOptionsHandler._parse_package_datac                 C  s   |   |¡| d< dS )z`Parses `package_data` configuration file section.

        :param dict section_options:
        r  N©r  ©rz   r»   r.   r.   r/   Úparse_section_package_dataÏ  s    z/ConfigOptionsHandler.parse_section_package_datac                 C  s   |   |¡| d< dS )zhParses `exclude_package_data` configuration file section.

        :param dict section_options:
        Zexclude_package_dataNr	  r
  r.   r.   r/   Ú"parse_section_exclude_package_dataÖ  s    z7ConfigOptionsHandler.parse_section_exclude_package_datac                   s    ˆ   |‡ fdd„¡}|ˆ d< dS )zbParses `extras_require` configuration file section.

        :param dict section_options:
        c                   s   ˆ   d| › d�|¡S )Nzextras_require[rÉ   )ró   )r  rÀ   r‡   r.   r/   rŠ   ä  re   zCConfigOptionsHandler.parse_section_extras_require.<locals>.<lambda>Zextras_requireNrÂ   r  r.   r‡   r/   Úparse_section_extras_requireÝ  s
    
þz1ConfigOptionsHandler.parse_section_extras_requirec                 C  s$   |   || j¡}t || j¡| d< dS )z^Parses `data_files` configuration file section.

        :param dict section_options:
        Ú
data_filesN)rÃ   rž   r   Zcanonic_data_filesr±   r  r.   r.   r/   Úparse_section_data_filesé  s    z-ConfigOptionsHandler.parse_section_data_files)r†   rÕ   rÖ   rG   r{   rÙ   rð   rñ   ró   rÚ   rˆ   rû   rü   rþ   r  r  r  r  r  r  rî   r.   r.   rã   r/   rM   S  s"   

 rM   c                   @  s$   e Zd ZdZdZdZedd„ ƒZdS )rj   zAmbiguous requirement marker.zá
    One of the parsed requirements in `{field}` looks like a valid environment marker:

        {req!r}

    Please make sure that the configuration file is correct.
    You can use dangling lines to avoid this problem.
    z'userguide/declarative_config.html#opt-2c                 K  s"   d| j › �}| j| j| j||d�S )Nz%https://setuptools.pypa.io/en/latest/)Zsee_urlZformat_args)Ú	_SEE_DOCSÚ_formatÚ_SUMMARYÚ_DETAILS)r€   rÒ   Údocsr.   r.   r/   rm      s    z_AmbiguousMarker.messageN)r†   rÕ   rÖ   r  r  r  rÙ   rm   r.   r.   r.   r/   rj   ò  s
   rj   c                   @  s   e Zd ZdZdS )rÍ   z!userguide/declarative_config.htmlN)r†   rÕ   rÖ   r  r.   r.   r.   r/   rÍ     s   rÍ   )FF)r.   F)F);r×   Ú
__future__r   rÄ   rB   r5   Úcollectionsr   r   r   Útypingr   r   r	   r
   r   r   r   r   r   Ú_pathr   Úerrorsr   r   Zextern.packaging.markersr   rg   Zextern.packaging.requirementsr   r   Zextern.packaging.specifiersr   Zextern.packaging.versionr   r   Úwarningsr   r´   r   Údistutils.distr   r&   r   ZSingleCommandOptionsrK   r!   r0   r1   r(   rE   r)   r=   rq   rr   rP   rM   rj   rÍ   r.   r.   r.   r/   Ú<module>   sR   , ÿ  ü ý.   #M  