o
     zqf%E                     @   s  d Z ddlZddl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 ddl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 er\ddlmZ ddlm Z  e!e"Z#dede$fddZ%de$dede&fddZ'	d/dddeddfddZ(			d0deded fddZ)			d1de$dee d e&ded de$f
d!d"Z*G d#d$ d$Z+d%d& Z,ed e&fd'd(Z-G d)d* d*ej.Z/G d+d, d,eZ0G d-d. d.eZ1dS )2ac  
Load setuptools configuration from ``pyproject.toml`` files.

**PRIVATE MODULE**: API reserved for setuptools internal usage only.

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 ``tomllib`` or ``tomli``.
    N)contextmanager)partial)TYPE_CHECKINGCallableDictMappingOptionalSet   )StrPath)	FileErrorInvalidConfigError)SetuptoolsWarning   )expand)_PREVIOUSLY_DEFINED_MissingDynamic)applyDistribution)Selffilepathreturnc                 C   sD   ddl m} t| d}||W  d    S 1 sw   Y  d S )Nr
   )tomllibrb)compat.py310r   openload)r   r   file r   ^/root/parts/websockify/install/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py	load_file    s   $r!   configc              
   C   s   ddl m} |jd}t|dr|  z|| W S  |jyR } z*d|j }|j	
ddkr=t| t|j d|j	 d	}t| d
| d d }~ww )Nr   )_validate_pyprojectztrove-classifier_disable_downloadzconfiguration error: `projectzinvalid pyproject.toml config: .
) r#   FORMAT_FUNCTIONSgethasattrr$   validateValidationErrorsummarynamestrip_loggerdebugdetails
ValueError)r"   r   	validatortrove_classifierexr/   errorr   r   r    r-   '   s   

r-   Fdistr   c                 C   s   t |d|| }t| ||S )zeApply the configuration from a ``pyproject.toml`` file into an existing
    distribution object.
    T)read_configuration_apply)r:   r   ignore_option_errorsr"   r   r   r    apply_configuration<   s   r>   Tc           
      C   s6  t j| } t j| std| dt| pi }|di }|di }|di }|r2|s4|s4i S d|di v r@t  d|v rJt	jdd	 |r\t
|d
ddur\|d|j n|dd ||d< ||d< t| |d|id}t||  W d   n1 sw   Y  |rt j| }	t||	||S |S )a  Read given configuration file and returns options from it as a dict.

    :param str|unicode filepath: Path to configuration file in the ``pyproject.toml``
        format.

    :param bool expand: Whether to expand directives and other computed values
        (i.e. post-process the given configuration)

    :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.

    :param Distribution|None: Distribution object to which the configuration refers.
        If not given a dummy object will be created and discarded after the
        configuration is read. This is used for auto-discovery of packages and in the
        case a dynamic configuration (e.g. ``attr`` or ``cmdclass``) is expanded.
        When ``expand=False`` this object is simply ignored.

    :rtype: dict
    zConfiguration file z does not exist.r&   tool
setuptoolstools	distutilsz[tool.distutils])subjectinclude_package_dataNzinclude-package-dataT)r&   r?   )ospathabspathisfiler   r!   r+   _ToolsTypoInMetadataemit_ExperimentalConfigurationgetattr
setdefaultrD   _ignore_errorsr-   dirnameexpand_configuration)
r   r   r=   r:   asdictproject_table
tool_tablesetuptools_tablesubsetroot_dirr   r   r    r;   H   s4   
r;   rV   r=   c                 C   s   t | ||| S )a  Given a configuration with unresolved fields (e.g. dynamic, cmdclass, ...)
    find their final values.

    :param dict config: Dict containing the configuration for the distribution
    :param str root_dir: Top-level directory for the distribution/project
        (the same directory where ``pyproject.toml`` is place)
    :param bool ignore_option_errors: see :func:`read_configuration`
    :param Distribution|None: Distribution object to which the configuration refers.
        If not given a dummy object will be created and discarded after the
        configuration is read. Used in the case a dynamic configuration
        (e.g. ``attr`` or ``cmdclass``).

    :rtype: dict
    )_ConfigExpanderr   )r"   rV   r=   r:   r   r   r    rP      s   rP   c                
   @   sr  e Zd Z			d3dedee deded fdd	Zd4ddZdede	de
fddZd5ddZdd Zdd Zdd Zdee	e	f fddZdddee	e	f fddZddde	fd d!Zd"e	dee	e	f fd#d$Zddde	dee	e	f fd%d&Zdddee	e	f fd'd(Zddd
eee	e	f  fd)d*Zdddee	e	f d
eee	ef  fd+d,Zd6d-d.Zd6d/d0Zd6d1d2ZdS )7rW   NFr"   rV   r=   r:   r   c                 C   sp   || _ |pt | _|di | _| jdg | _|di di | _| jdi | _|| _	|| _
t | _d S )Nr&   dynamicr?   r@   )r"   rE   getcwdrV   r+   project_cfgrX   setuptools_cfgdynamic_cfgr=   _distset_referenced_files)selfr"   rV   r=   r:   r   r   r    __init__   s   z_ConfigExpander.__init__r   c                 C   s0   ddl m} | j| jdd d}| jp||S )Nr   r   r0   )src_rootr0   )setuptools.distr   rV   rZ   r+   r]   )r`   r   attrsr   r   r    _ensure_dist   s   z_ConfigExpander._ensure_dist	containerfieldfnc                 C   sL   ||v r$t | j ||| ||< W d    d S 1 sw   Y  d S d S N)rN   r=   )r`   rf   rg   rh   r   r   r    _process_field   s
   "z_ConfigExpander._process_fieldpackage-datac                 C   s   | j |i }t|S ri   )r[   r+   _expandcanonic_package_data)r`   rg   package_datar   r   r    _canonic_package_data   s   
z%_ConfigExpander._canonic_package_datac                 C   s   |    |   | d |  }t|| j| j}|}|j}|   | | | 	|| W d    n1 s8w   Y  |j
| j
 | jS )Nzexclude-package-data)_expand_packagesro   re   _EnsurePackagesDiscoveredrZ   r[   package_dir_expand_data_files_expand_cmdclass_expand_all_dynamicr_   updater"   )r`   r:   ctxensure_discoveredrr   r   r   r    r      s   

z_ConfigExpander.expandc                 C   s   | j d}|d u st|ttfrd S |d}t|trN| j|d< | j di |d< t| j	 t
jdi || j d< W d    d S 1 sGw   Y  d S d S )NpackagesfindrV   package-dirfill_package_dirr   )r[   r+   
isinstancelisttupledictrV   rM   rN   r=   rl   find_packages)r`   ry   rz   r   r   r    rp      s   


"z _ConfigExpander._expand_packagesc                 C   s$   t tj| jd}| | jd| d S )N)rV   z
data-files)r   rl   canonic_data_filesrV   rj   r[   )r`   
data_filesr   r   r    rs      s   z"_ConfigExpander._expand_data_filesrr   c                 C   s*   | j }ttj||d}| | jd| d S )N)rr   rV   cmdclass)rV   r   rl   r   rj   r[   )r`   rr   rV   r   r   r   r    rt      s   z _ConfigExpander._expand_cmdclassc              	      s   d fddj D }|j pi      d dd | D }j	| d S )N)versionreadmeentry-pointsscriptsgui-scriptsclassifiersdependenciesoptional-dependenciesc                    s$   i | ]}|vr|  |qS r   )_obtain.0rg   r:   rr   r`   specialr   r    
<dictcomp>   s
    z7_ConfigExpander._expand_all_dynamic.<locals>.<dictcomp>)r   r   r   r   optional_dependenciesc                 S   s   i | ]\}}|d ur||qS ri   r   )r   kvr   r   r    r     s    )
rX   rv   _obtain_entry_points_obtain_version_obtain_readme_obtain_classifiers_obtain_dependencies_obtain_optional_dependenciesitemsrZ   )r`   r:   rr   obtained_dynamicupdatesr   r   r    ru      s   

z#_ConfigExpander._expand_all_dynamicc                 C   s6   t | |}|d u r| jsd|d}t|d S d S )Nz#No configuration found for dynamic z.
Some dynamic fields need to be specified via `tool.setuptools.dynamic`
others must be specified via the equivalent attribute in `setup.py`.)r   r=   r   )r`   r:   rg   previousmsgr   r   r    _ensure_previously_set
  s   
z&_ConfigExpander._ensure_previously_set	specifierc                 C   s   ddl m} t| j? | j}d|v r,| j||d  t|d |W  d    S d|v r@t	|d ||W  d    S t
d| d|1 sMw   Y  d S )Nr   )always_iterabler   attrz	invalid `z`: ) setuptools.extern.more_itertoolsr   rN   r=   rV   r_   rv   rl   
read_files	read_attrr5   )r`   r   	directiverr   r   rV   r   r   r    _expand_directive  s   z!_ConfigExpander._expand_directivec                 C   s4   || j v r| d| | j | |S | || d S )Nztool.setuptools.dynamic.)r\   r   r   )r`   r:   rg   rr   r   r   r    r   #  s   
z_ConfigExpander._obtainc                 C   s,   d| j v rd| jv rt| |d|S d S )Nr   )rX   r\   rl   r   r   )r`   r:   rr   r   r   r    r   -  s   z_ConfigExpander._obtain_versionc                 C   sL   d| j vrd S | j}d|v r| |di |d dddS | |d d S )Nr   content-typez
text/x-rst)textr   )rX   r\   r   r+   r   )r`   r:   r\   r   r   r    r   3  s   
z_ConfigExpander._obtain_readmec                    s|   d}t fdd|D sd S |d|}|d u rd S t|di dtdtf fdd}|d	d
 |dd  S )N)r   r   r   c                 3   s    | ]}| j v V  qd S ri   )rX   r   r`   r   r    	<genexpr>E  s    z7_ConfigExpander._obtain_entry_points.<locals>.<genexpr>r   rg   groupc                    s<   |v r |}| jvrtt| || | < d S d S ri   )poprX   r   r   r4   )rg   r   valueexpandedgroupsr`   r   r    _set_scriptsO  s   

z:_ConfigExpander._obtain_entry_points.<locals>._set_scriptsr   console_scriptsr   gui_scripts)anyr   rl   entry_pointsstr)r`   r:   rr   fieldsr   r   r   r   r    r   A  s   


z$_ConfigExpander._obtain_entry_pointsc                 C   s(   d| j v r| |di }|r| S d S )Nr   )rX   r   
splitlinesr`   r:   r   r   r   r    r   [  
   
z#_ConfigExpander._obtain_classifiersc                 C   s(   d| j v r| |di }|rt|S d S )Nr   )rX   r   _parse_requirements_listr   r   r   r    r   b  r   z$_ConfigExpander._obtain_dependenciesc                    sV   d j vrd S d jv r# jd }t|tsJ  fdd| D S  |d d S )Nr   c              	      s*   i | ]\}}|t  d | |i qS )z.tool.setuptools.dynamic.optional-dependencies.)r   r   )r   r   r   r   r   r    r   o  s    zA_ConfigExpander._obtain_optional_dependencies.<locals>.<dictcomp>)rX   r\   r}   r   r   r   )r`   r:   optional_dependencies_mapr   r   r    r   i  s   




z-_ConfigExpander._obtain_optional_dependenciesNFN)r   r   )rk   )r:   r   )__name__
__module____qualname__r   r   r   boolra   re   r   r   rj   ro   r   rp   rs   r   rt   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r    rW      sP    










rW   c                 C   s   dd |   D S )Nc                 S   s&   g | ]}|  r|  d s|qS )#)r1   
startswith)r   liner   r   r    
<listcomp>~  s    z,_parse_requirements_list.<locals>.<listcomp>)r   )r   r   r   r    r   }  s   r   c              
   c   s^    | sd V  d S zd V  W d S  t y. } ztd|jj d|  W Y d }~d S d }~ww )Nzignored error: z - )	Exceptionr2   r3   	__class__r   )r=   r8   r   r   r    rN     s   (rN   c                       sD   e Zd Zdddedef fddZd fd	d
Z fddZ  ZS )rq   distributionr   rZ   r[   c                    s   t  | || _|| _d S ri   )superra   _project_cfg_setuptools_cfg)r`   r   rZ   r[   r   r   r    ra     s   
z"_EnsurePackagesDiscovered.__init__r   r   c                    s   | j | j}}|di }||jpi  ||_|j  |jjdu r+| j	
d|j_|jdu r6|
d|_|jdu rA|
d|_t  S )zWhen entering the context, the values of ``packages``, ``py_modules`` and
        ``package_dir`` that are missing in ``dist`` are copied from ``setuptools_cfg``.
        r{   Nr0   
py-modulesry   )r]   r   rM   rv   rr   set_defaults_ignore_ext_modulesmetadatar0   r   r+   
py_modulesry   r   	__enter__)r`   r:   cfgrr   r   r   r    r     s   



z#_EnsurePackagesDiscovered.__enter__c                    s4   | j d| jj | j d| jj t |||S )zWhen exiting the context, if values of ``packages``, ``py_modules`` and
        ``package_dir`` are missing in ``setuptools_cfg``, copy from ``dist``.
        ry   r   )r   rM   r]   ry   r   r   __exit__)r`   exc_type	exc_value	tracebackr   r   r    r     s   z"_EnsurePackagesDiscovered.__exit__)r   r   )r   r   r   r   ra   r   r   __classcell__r   r   r   r    rq     s    rq   c                   @      e Zd ZdZdS )rK   z``{subject}` in `pyproject.toml` is still *experimental* and likely to change in future releases.Nr   r   r   _SUMMARYr   r   r   r    rK         rK   c                   @   r   )rI   zNIgnoring [tools.setuptools] in pyproject.toml, did you mean [tool.setuptools]?Nr   r   r   r   r    rI     r   rI   )F)TFNr   )2__doc__loggingrE   
contextlibr   	functoolsr   typingr   r   r   r   r   r	   _pathr   errorsr   r   warningsr   r)   r   rl   _apply_pyprojecttomlr   r   r   r<   rc   r   typing_extensionsr   	getLoggerr   r2   r   r!   r   r-   r>   r;   rP   rW   r   rN   EnsurePackagesDiscoveredrq   rK   rI   r   r   r   r    <module>   sp     


H
 Y(