a
    yd)$                     @   sJ  d Z ddl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 ddlm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 ddlmZ ddlmZ g dZejjZdZ ej!Z"ej!Z#dd Z$dd Z%dd Z&ej'j&j e&_ e(ej'j)Z*G dd de*Z)dd Z+ej,fddZ-e.edd ZG dd de/Z0e1  dS )z@Extensions to the 'distutils' for large or complex distributions    N)DistutilsOptionError)convert_path   )SetuptoolsDeprecationWarning)	Extension)Distribution)Require)PackageFinderPEP420PackageFinder)monkey)logging)setupr   Commandr   r   r   find_packagesfind_namespace_packagesc                 C   s:   G dd dt jj}|| }|jdd |jr6t| d S )Nc                       s6   e Zd ZdZ fddZd	 fdd	Zdd Z  ZS )
z4_install_setup_requires.<locals>.MinimalDistributionzl
        A minimal version of a distribution for supporting the
        fetch_build_eggs interface.
        c                    s<   d} fddt |t  @ D }t | | j  d S )N)Zdependency_linkssetup_requiresc                    s   i | ]}| | qS  r   ).0kattrsr   2lib/python3.9/site-packages/setuptools/__init__.py
<dictcomp>7       zQ_install_setup_requires.<locals>.MinimalDistribution.__init__.<locals>.<dictcomp>)setsuper__init__Zset_defaultsZ_disable)selfr   Z_inclZfiltered	__class__r   r   r   5   s    z=_install_setup_requires.<locals>.MinimalDistribution.__init__Nc                    s:   zt  |\}}|dfW S  ty4   |df Y S 0 dS )zAIgnore ``pyproject.toml``, they are not related to setup_requiresr   N)r   Z _split_standard_project_metadata	Exception)r   	filenamesZcfgZtomlr   r   r   _get_project_config_files<   s
    
zN_install_setup_requires.<locals>.MinimalDistribution._get_project_config_filesc                 S   s   dS )zl
            Disable finalize_options to avoid building the working set.
            Ref #2158.
            Nr   )r   r   r   r   finalize_optionsD   s    zE_install_setup_requires.<locals>.MinimalDistribution.finalize_options)N)__name__
__module____qualname____doc__r   r"   r#   __classcell__r   r   r   r   MinimalDistribution/   s   r)   T)Zignore_option_errors)	distutilscorer   Zparse_config_filesr   _fetch_build_eggs)r   r)   distr   r   r   _install_setup_requires,   s
    r.   c              
   C   st   z|  | j W n^ tyn } zFd}d|jjv rXt|drF|| n| d| d  W Y d }~n
d }~0 0 d S )Na  
        It is possible a package already installed in your system
        contains an version that is invalid according to PEP 440.
        You can try `pip install --use-pep517` as a workaround for this problem,
        or rely on a new virtual environment.

        If the problem refers to a package that is not installed yet,
        please contact that package's maintainers or distributors.
        ZInvalidVersionadd_note
)Zfetch_build_eggsr   r    r   r$   hasattrr/   Zannounce)r-   exmsgr   r   r   r,   R   s    	
r,   c                  K   s"   t   t|  tjjf i | S N)r   Z	configurer.   r*   r+   r   r   r   r   r   r   g   s    r   c                       s@   e Zd ZdZdZ fddZdddZdd	 ZdddZ  Z	S )r   a
  
    Setuptools internal actions are organized using a *command design pattern*.
    This means that each action (or group of closely related actions) executed during
    the build should be implemented as a ``Command`` subclass.

    These commands are abstractions and do not necessarily correspond to a command that
    can (or should) be executed via a terminal, in a CLI fashion (although historically
    they would).

    When creating a new command from scratch, custom defined classes **SHOULD** inherit
    from ``setuptools.Command`` and implement a few mandatory methods.
    Between these mandatory methods, are listed:

    .. method:: initialize_options(self)

        Set or (reset) all options/attributes/caches used by the command
        to their default values. Note that these values may be overwritten during
        the build.

    .. method:: finalize_options(self)

        Set final values for all options/attributes used by the command.
        Most of the time, each option/attribute/cache should only be set if it does not
        have any value yet (e.g. ``if self.attr is None: self.attr = val``).

    .. method:: run(self)

        Execute the actions intended by the command.
        (Side effects **SHOULD** only take place when ``run`` is executed,
        for example, creating new files or writing to the terminal output).

    A useful analogy for command classes is to think of them as subroutines with local
    variables called "options".  The options are "declared" in ``initialize_options()``
    and "defined" (given their final values, aka "finalized") in ``finalize_options()``,
    both of which must be defined by every command class. The "body" of the subroutine,
    (where it does all the work) is the ``run()`` method.
    Between ``initialize_options()`` and ``finalize_options()``, ``setuptools`` may set
    the values for options/attributes based on user's input (or circumstance),
    which means that the implementation should be careful to not overwrite values in
    ``finalize_options`` unless necessary.

    Please note that other commands (or other parts of setuptools) may also overwrite
    the values of the command's options/attributes multiple times during the build
    process.
    Therefore it is important to consistently implement ``initialize_options()`` and
    ``finalize_options()``. For example, all derived attributes (or attributes that
    depend on the value of other attributes) **SHOULD** be recomputed in
    ``finalize_options``.

    When overwriting existing commands, custom defined classes **MUST** abide by the
    same APIs implemented by the original class. They also **SHOULD** inherit from the
    original class.
    Fc                    s   t  | t| | dS )zj
        Construct the command for dist, updating
        vars(self) with any keyword parameters.
        N)r   r   varsupdate)r   r-   kwr   r   r   r      s    zCommand.__init__Nc                 C   sB   t | |}|d u r"t| || |S t|ts>td|||f |S )Nz'%s' must be a %s (got `%s`))getattrsetattr
isinstancestrr   )r   optionZwhatdefaultvalr   r   r   _ensure_stringlike   s    

zCommand._ensure_stringlikec                 C   sp   t | |}|du rdS t|tr6t| |td| n6t|trTtdd |D }nd}|sltd||f dS )a  Ensure that 'option' is a list of strings.  If 'option' is
        currently a string, we split it either on /,\s*/ or /\s+/, so
        "foo bar baz", "foo,bar,baz", and "foo,   bar baz" all become
        ["foo", "bar", "baz"].

        ..
           TODO: This method seems to be similar to the one in ``distutils.cmd``
           Probably it is just here for backward compatibility with old Python versions?

        :meta private:
        Nz,\s*|\s+c                 s   s   | ]}t |tV  qd S r4   )r:   r;   )r   vr   r   r   	<genexpr>   r   z-Command.ensure_string_list.<locals>.<genexpr>Fz''%s' must be a list of strings (got %r))	r8   r:   r;   r9   resplitlistallr   )r   r<   r>   okr   r   r   ensure_string_list   s    



zCommand.ensure_string_listr   c                 K   s    t | ||}t|| |S r4   )_Commandreinitialize_commandr5   r6   )r   ZcommandZreinit_subcommandsr7   cmdr   r   r   rI      s    zCommand.reinitialize_command)N)r   )
r$   r%   r&   r'   Zcommand_consumes_argumentsr   r?   rG   rI   r(   r   r   r   r   r   t   s   6
r   c                 C   s&   dd t j| ddD }tt jj|S )z%
    Find all files under 'path'
    c                 s   s,   | ]$\}}}|D ]}t j||V  qqd S r4   )ospathjoin)r   basedirsfilesfiler   r   r   rA      s   z#_find_all_simple.<locals>.<genexpr>T)followlinks)rK   walkfilterrL   isfile)rL   Zresultsr   r   r   _find_all_simple   s    rV   c                 C   s6   t | }| tjkr.tjtjj| d}t||}t|S )z
    Find all files under 'dir' and return the list of full filenames.
    Unless dir is '.', return full filenames with dir prepended.
    )start)	rV   rK   curdir	functoolspartialrL   relpathmaprD   )dirrP   Zmake_relr   r   r   findall   s
    

r^   c                 C   s   t jdddd t| S )NzAccess to implementation detaila  
        The function `convert_path` is not provided by setuptools itself,
        and therefore not part of the public API.

        Its direct usage by 3rd-party packages is considered improper and the function
        may be removed in the future.
        )i        )Zdue_date)r   emit_convert_path)pathnamer   r   r   r      s    r   c                   @   s   e Zd ZdZdS )sicz;Treat this string as-is (https://en.wikipedia.org/wiki/Sic)N)r$   r%   r&   r'   r   r   r   r   rd   	  s   rd   )2r'   rY   rK   rB   Z_distutils_hack.override_distutils_hackZdistutils.corer*   Zdistutils.errorsr   Zdistutils.utilr   rb   warningsr   Zsetuptools.versionZ
setuptoolsZsetuptools.extensionr   Zsetuptools.distr   Zsetuptools.dependsr   Zsetuptools.discoveryr	   r
    r   r   __all__version__version__Zbootstrap_install_fromfindr   r   r.   r,   r   r+   Zget_unpatchedr   rH   rV   rX   r^   wrapsr;   rd   Z	patch_allr   r   r   r   <module>   s@   &m
