o
    j=                     @  s  d dl mZ d dl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	m
Z
 d dlmZ d dlm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 d dlm  mZ d dlZ d dl!m"Z" dZ#dddZ$G dd dejZdd Z%G dd dZ&dS )    )annotationsN)IterableIterator)partial)glob)Path)Any)unique_everseen   )StrPathStrPathT)Distribution)SetuptoolsDeprecationWarning)convert_path)z*.pyizpy.typedreturnNonec                 C  s   t | t | jtjB  d S N)oschmodstatst_modeS_IWRITE)target r   \/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/setuptools/command/build_py.pymake_writable   s   r   c                      s  e Zd ZU dZded< dZded< dZded	< dRddZ				dSdT fddZdRddZ	dUd"d#Z
d$d% ZdVd'd(ZdWd+d,Zd-d. ZdXdY fd1d2ZdZd4d5Zd[d7d8Zd[d9d:ZdRd;d<ZdRd=d>Zd\dCdDZdRdEdFZdGdH ZdIdJ Zd]dKdLZdMdN Zed^dPdQZ  ZS )_build_pyaX  Enhanced 'build_py' command that includes data files with packages

    The data files are specified via a 'package_data' argument to 'setup()'.
    See 'setuptools.dist.Distribution' for more details.

    Also, this version of the 'build_py' command allows you to specify both
    'py_modules' and 'packages' in the same setup operation.
    r   distributionFbooleditable_modeNzStrPath | Noneexisting_egg_info_dirr   r   c                 C  s>   t j|  | jj| _| jjpi | _d| jv r| jd= d S d S )N
data_files)origr   finalize_optionsr   package_dataexclude_package_data__dict__selfr   r   r   r#   .   s   

zbuild_py.finalize_optionsT   infiler   outfiler   preserve_modepreserve_timeslink
str | Nonelevelobjecttuple[StrPathT | str, bool]c                   s:   |rt t| }t t| }t ||||||S r   )strr   resolvesuper	copy_file)r(   r*   r+   r,   r-   r.   r0   	__class__r   r   r6   5   s   
zbuild_py.copy_filec                 C  sT   | j s| jr	| jrdS | j r|   | jr|   |   | tjj	| dd dS )z?Build modules, packages, and copy data files to build directoryNF)include_bytecode)
Z
py_modulespackagesr   Zbuild_modulesZbuild_packagesbuild_package_databyte_compiler"   r   get_outputsr'   r   r   r   runF   s   zbuild_py.runattrr3   r   c                 C  s&   |dkr|   | _| jS tj| |S )zlazily compute data filesr!   )_get_data_filesr!   r"   r   __getattr__)r(   r?   r   r   r   rA   W   s   
zbuild_py.__getattr__c                 C  s   |    tt| j| jpdS )z?Generate list of '(package,src_dir,build_dir,filenames)' tuplesr   )analyze_manifestlistmap_get_pkg_data_filesr:   r'   r   r   r   r@   ^   s   zbuild_py._get_data_files%list[tuple[str, str, str, list[str]]]c                 C  s$   | j di  tt| j| jpdS )z
        Generate list of ``(package,src_dir,build_dir,filenames)`` tuples,
        but without triggering any attempt to analyze or build the manifest.
        manifest_filesr   )r&   
setdefaultrC   rD   rE   r:   r'   r   r   r   get_data_files_without_manifestc   s   z(build_py.get_data_files_without_manifestpackagetuple[str, str, str, list[str]]c                   sJ   |  | tjj| jg|d  } fdd| | D }| ||fS )N.c                   s   g | ]	}t j| qS r   )r   pathrelpath).0filesrc_dirr   r   
<listcomp>u   s    z0build_py._get_pkg_data_files.<locals>.<listcomp>)get_package_dirr   rM   join	build_libsplitfind_data_files)r(   rJ   	build_dir	filenamesr   rQ   r   rE   m   s   


zbuild_py._get_pkg_data_filesc                 C  sd   | j | j||td}tttdd|}tj|}t	t
jj|}t| j|g |}| |||S )z6Return filenames for package's data files in 'src_dir')extra_patternsT)	recursive)_get_platform_patternsr$   _IMPLICIT_DATA_FILESrD   r   r   	itertoolschainfrom_iterablefilterr   rM   isfilerG   getexclude_data_files)r(   rJ   rR   patternsZglobs_expandedZglobs_matchesZ
glob_filesfilesr   r   r   rX   {   s   zbuild_py.find_data_filesr9   	list[str]c                   s"   | j rt|   S t |S )1See :class:`setuptools.commands.build.SubCommand`)r   rC   get_output_mappingkeysr5   r=   )r(   r9   r7   r   r   r=      s   zbuild_py.get_outputsdict[str, str]c                 C  s*   t |  |  }tt|tddS )ri   r   )key)r_   r`    _get_package_data_output_mapping_get_module_mappingdictsortedoperator
itemgetter)r(   mappingr   r   r   rj      s
   zbuild_py.get_output_mappingIterator[tuple[str, str]]c                 c  s>    |   D ]\}}}|d}| | j||}||fV  qdS )z5Iterate over all modules producing (dest, src) pairs.rL   N)Zfind_all_modulesrW   Zget_module_outfilerV   )r(   rJ   moduleZmodule_filefilenamer   r   r   ro      s   
zbuild_py._get_module_mappingc                 c  sJ    | j D ]\}}}}|D ]}tj||}tj||}||fV  qqdS )z6Iterate over package data producing (dest, src) pairs.N)r!   r   rM   rU   )r(   rJ   rR   rY   rZ   rw   r   srcfiler   r   r   rn      s   z)build_py._get_package_data_output_mappingc                 C  s@   |   D ]\}}| tj| | ||\}}t| qdS )z$Copy data files into build directoryN)rn   Zmkpathr   rM   dirnamer6   r   )r(   r   rx   Z_outfZ_copiedr   r   r   r;      s
   
zbuild_py.build_package_datac                 C  sh  i | _ | jjs	d S i }| jpdD ]}||t| |< q| jr8t| jd r8| j}t|d}|j	dd
 }n| d | d}|j}|jj}t }| ||D ]_}tjt|\}	}
d }|
}|	r|	|kr|	|vr|	}tj|	\}	}tj||
}
|	r|	|kr|	|vsl|	|v r|
|kr||
rqRn|||	 |
}|r|| | j ||	 g | qRd S )Nr   zSOURCES.txtzutf-8)encodingegg_info)rG   r   Zinclude_package_datar:   assert_relativerT   r    r   exists	read_text
splitlinesrun_commandget_finalized_commandr{   filelistrg   _IncludePackageDataAbuse_filter_build_filesr   rM   rW   rU   	is_moduleimportable_subpackagewarnrH   append)r(   Zsrc_dirsrJ   egg_info_dirmanifestrg   Zei_cmdcheckrM   dfprevZoldfZdf
importabler   r   r   rB      sL   




zbuild_py.analyze_manifestrg   Iterable[str]r{   Iterator[str]c                 #  sn    |  d}|| j|j|jf}dd |D }|D ]}tj| tj|r1t fdd|D r4|V  qdS )a}  
        ``build_meta`` may try to create egg_info outside of the project directory,
        and this can be problematic for certain plugins (reported in issue #3500).

        Extensions might also include between their sources files created on the
        ``build_lib`` and ``build_temp`` directories.

        This function should filter this case of invalid files out.
        buildc                 S  s   g | ]
}|rt j|qS r   )r   rM   normpath)rO   pr   r   r   rS      s    z0build_py._filter_build_files.<locals>.<listcomp>c                 3  s    | ]}| vV  qd S r   r   )rO   r   Z	norm_pathr   r   	<genexpr>   s    z/build_py._filter_build_files.<locals>.<genexpr>N)	r   rV   Z
build_tempZ
build_baser   rM   r   isabsall)r(   rg   r{   r   Z
build_dirsZ	norm_dirsrP   r   r   r   r      s   
"zbuild_py._filter_build_filesc                 C  s   d S r   r   r'   r   r   r   get_data_files   s   zbuild_py.get_data_filesc                 C  s   z| j | W S  ty   Y nw tj| ||}|| j |< |r#| jjs%|S | jjD ]}||ks6||d r8 nq)|S t|d}|	 }W d   n1 sOw   Y  d|vrbt
jd| d|S )z8Check namespace packages' __init__ for declare_namespacerL   rbNs   declare_namespacezNamespace package problem: z is a namespace package, but its
__init__.py does not call declare_namespace()! Please fix it.
(See the setuptools manual under "Namespace Packages" for details.)
")packages_checkedKeyErrorr"   r   check_packager   namespace_packages
startswithopenread	distutilserrorsZDistutilsError)r(   rJ   Zpackage_dirZinit_pypkgr   contentsr   r   r   r      s,   


zbuild_py.check_packagec                 C  s"   i | _ tj|  d| _d | _d S )NF)r   r"   r   initialize_optionsr   r    r'   r   r   r   r     s   
zbuild_py.initialize_optionsc                 C  s0   t j| |}| jjd urtj| jj|S |S r   )r"   r   rT   r   Zsrc_rootr   rM   rU   )r(   rJ   resr   r   r   rT     s   zbuild_py.get_package_dirc                   s\   t | | j||}fdd|D }tj|}t|  fddD }t t|S )z6Filter filenames for package's data files in 'src_dir'c                 3  s    | ]	}t  |V  qd S r   )fnmatchrb   rO   pattern)rg   r   r   r   $      z.build_py.exclude_data_files.<locals>.<genexpr>c                 3  s    | ]	}| vr|V  qd S r   r   )rO   fn)badr   r   r   (  r   )rC   r]   r%   r_   r`   ra   setr	   )r(   rJ   rR   rg   rf   Zmatch_groupsmatchesZkeepersr   )r   rg   r   re     s   zbuild_py.exclude_data_filesr   c                   s0   t || dg | |g } fdd|D S )z
        yield platform-specific path patterns (suitable for glob
        or fn_match) from a glob-based spec (such as
        self.package_data or self.exclude_package_data)
        matching package in src_dir.
         c                 3  s"    | ]}t j t|V  qd S r   )r   rM   rU   r   r   rQ   r   r   r   9  s
    
z2build_py._get_platform_patterns.<locals>.<genexpr>)r_   r`   rd   )specrJ   rR   r[   Zraw_patternsr   rQ   r   r]   ,  s   


zbuild_py._get_platform_patternsr   r   )TTNr)   )r*   r   r+   r   r,   r   r-   r   r.   r/   r0   r1   r   r2   )r?   r3   r   r   )r   rF   )rJ   r3   r   rK   )T)r9   r   r   rh   )r   rl   )r   ru   )rg   r   r{   r   r   r   )rJ   r3   r   r3   )r   )__name__
__module____qualname____doc____annotations__r   r    r#   r6   r>   rA   r@   rI   rE   rX   r=   rj   ro   rn   r;   rB   r   r   r   r   rT   re   staticmethodr]   __classcell__r   r   r7   r   r       s>   
 	











)

r   c                 C  s6   t j| s| S ddlm} td |  }||)Nr   )DistutilsSetupErrorz
        Error: setup script specifies an absolute path:

            %s

        setup() arguments must *always* be /-separated paths relative to the
        setup.py directory, *never* absolute paths.
        )r   rM   r   distutils.errorsr   textwrapdedentlstrip)rM   r   msgr   r   r   r|   @  s   	r|   c                   @  sB   e Zd ZdZG dd deZdddZdd	 Zd
d Zdd Z	dS )r   z>Inform users that package or module is included as 'data file'c                   @  s   e Zd ZdZdZdS )z!_IncludePackageDataAbuse._WarningzU
        Package {importable!r} is absent from the `packages` configuration.
        a|  
        ############################
        # Package would be ignored #
        ############################
        Python recognizes {importable!r} as an importable package[^1],
        but it is absent from setuptools' `packages` configuration.

        This leads to an ambiguous overall configuration. If you want to distribute this
        package, please make sure that {importable!r} is explicitly added
        to the `packages` configuration field.

        Alternatively, you can also rely on setuptools' discovery methods
        (for example by using `find_namespace_packages(...)`/`find_namespace:`
        instead of `find_packages(...)`/`find:`).

        You can read more about "package discovery" on setuptools documentation page:

        - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html

        If you don't want {importable!r} to be distributed and are
        already explicitly excluding {importable!r} via
        `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`,
        you can try to use `exclude_package_data`, or `include-package-data=False` in
        combination with a more fine grained `package-data` configuration.

        You can read more about "package data files" on setuptools documentation page:

        - https://setuptools.pypa.io/en/latest/userguide/datafiles.html


        [^1]: For Python, any directory (with suitable naming) can be imported,
              even if it does not contain any `.py` files.
              On the other hand, currently there is no concept of package data
              directory, all directories are treated like packages.
        N)r   r   r   Z_SUMMARYZ_DETAILSr   r   r   r   _WarningX  s    r   r   r   c                 C  s   t t  | _d S r   )r   r3   _already_warnedr'   r   r   r   __init__  s   z!_IncludePackageDataAbuse.__init__c                 C  s    | do|d td   S )Nz.py)endswithlenisidentifier)r(   rP   r   r   r   r     s    z"_IncludePackageDataAbuse.is_modulec                 C  s6   t |j}tttj|j}|rd|g|S d S )NrL   )	r   parentrC   r_   	takewhiler3   r   partsrU   )r(   r   rP   r   r   r   r   r   r     s
   
z._IncludePackageDataAbuse.importable_subpackagec                 C  s,   || j vr| jj|d | j | d S d S )N)r   )r   r   emitadd)r(   r   r   r   r   r     s   
z_IncludePackageDataAbuse.warnNr   )
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   U  s    
+r   r   )'
__future__r   r   r_   rr   r   r   r   collections.abcr   r   	functoolsr   r   pathlibr   typingr   Zmore_itertoolsr	   _pathr   r   distr   warningsr   Zdistutils.command.build_pycommandr   r"   r   r   Zdistutils.utilr   r^   r   r|   r   r   r   r   r   <module>   s4    
  "