o
    JAf*                     @   s   d dl 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
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 d dlmZ d dlmZ dd	 ZG d
d dejZdd ZG dd dZdS )    )partial)glob)convert_pathN)Path)SetuptoolsDeprecationWarning)unique_everseenc                 C   s   t | t | jtjB  d S N)oschmodstatst_modeS_IWRITE)target r   @/usr/lib/python3.10/site-packages/setuptools/command/build_py.pymake_writable   s   r   c                   @   s   e Zd Z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dd Zdd Zdd Zdd Zdd Zdd Zed d! Zd"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.
    c                 C   s@   t j|  | jj| _| jjpi | _d| jv r| jd= g | _d S )N
data_files)origr   finalize_optionsdistributionpackage_dataexclude_package_data__dict___build_py__updated_filesselfr   r   r   r       s   


zbuild_py.finalize_optionsc                 C   sN   | j s| jsdS | j r|   | jr|   |   | tjj| dd dS )z?Build modules, packages, and copy data files to build directoryNr   )Zinclude_bytecode)	Z
py_modulespackagesZbuild_modulesZbuild_packagesbuild_package_databyte_compiler   r   Zget_outputsr   r   r   r   run(   s   zbuild_py.runc                 C   s&   |dkr|   | _| jS tj| |S )zlazily compute data filesr   )_get_data_filesr   r   r   __getattr__)r   attrr   r   r   r"   8   s   
zbuild_py.__getattr__c                 C   s.   t j| |||\}}|r| j| ||fS r   )r   r   build_moduler   append)r   moduleZmodule_filepackageoutfilecopiedr   r   r   r$   ?   s   zbuild_py.build_modulec                 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!   E   s   zbuild_py._get_data_filesc                 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   
setdefaultr+   r,   r-   r   r   r   r   r   get_data_files_without_manifestJ   s   z(build_py.get_data_files_without_manifestc                    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>\   s    z0build_py._get_pkg_data_files.<locals>.<listcomp>)get_package_dirr	   r2   joinZ	build_libsplitfind_data_files)r   r'   	build_dir	filenamesr   r6   r   r-   T   s   


zbuild_py._get_pkg_data_filesc                 C   s`   |  | j||}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'T)	recursive)_get_platform_patternsr   r,   r   r   	itertoolschainfrom_iterablefilterr	   r2   isfiler.   getexclude_data_files)r   r'   r7   patternsZglobs_expandedZglobs_matchesZ
glob_filesfilesr   r   r   r<   b   s   zbuild_py.find_data_filesc           
      C   st   | j D ]4\}}}}|D ]+}tj||}| tj| tj||}| ||\}}	t| tj|}qqdS )z$Copy data files into build directoryN)	r   r	   r2   r:   Zmkpathdirname	copy_filer   abspath)
r   r'   r7   r=   r>   filenamer   srcfileoutfr)   r   r   r   r   s   s   zbuild_py.build_package_datac                 C   s   i  | _ }| jjsd S i }| jpdD ]}||t| |< q| d t }| d}|j	j
D ]^}tjt|\}}d }	|}
|rd||	krd||vrd|}	tj|\}}tj||}|rd||	krd||vsI||v r||
krs||rrq/n||| |}|r|| ||| g | q/d S )Nr   egg_info)r.   r   Zinclude_package_datar   assert_relativer9   run_command_IncludePackageDataAbuseZget_finalized_commandfilelistrI   r	   r2   r;   r:   	is_moduleimportable_subpackagewarnr/   r%   )r   mfZsrc_dirsr'   checkZei_cmdr2   dfprevZoldfZdf
importabler   r   r   r*   ~   s:   




zbuild_py.analyze_manifestc                 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 sPw   Y  d|vrbtjd|f |S )z8Check namespace packages' __init__ for declare_namespacer1   rbNs   declare_namespacezNamespace package problem: %s 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ioopenread	distutilserrorsZDistutilsError)r   r'   Zpackage_dirZinit_pypkgr[   contentsr   r   r   rb      s0   

zbuild_py.check_packagec                 C   s   i | _ tj|  d S r   )r`   r   r   initialize_optionsr   r   r   r   rl      s   zbuild_py.initialize_optionsc                 C   s0   t j| |}| jjd urtj| jj|S |S r   )r   r   r9   r   Zsrc_rootr	   r2   r:   )r   r'   resr   r   r   r9      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   )fnmatchrD   r4   pattern)rI   r   r   	<genexpr>       z.build_py.exclude_data_files.<locals>.<genexpr>c                 3   s    | ]	}| vr|V  qd S r   r   )r4   fn)badr   r   rq      rr   )r+   r@   r   rA   rB   rC   setr   )r   r'   r7   rI   rH   Zmatch_groupsmatchesZkeepersr   )rt   rI   r   rG      s   zbuild_py.exclude_data_filesc                    s.   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	   r2   r:   r   ro   r6   r   r   rq      s
    
z2build_py._get_platform_patterns.<locals>.<genexpr>)rA   rB   rF   )specr'   r7   Zraw_patternsr   r6   r   r@      s   


zbuild_py._get_platform_patternsN)__name__
__module____qualname____doc__r   r    r"   r$   r!   r0   r-   r<   r   r*   r^   rb   rl   r9   rG   staticmethodr@   r   r   r   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	   r2   isabsdistutils.errorsr~   textwrapdedentlstrip)r2   r~   msgr   r   r   rQ      s   	rQ   c                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )rS   z>Inform users that package or module is included as 'data file'a      Installing {importable!r} as data is deprecated, please list it in `packages`.
    !!


    ############################
    # Package would be ignored #
    ############################
    Python recognizes {importable!r} as an importable package,
    but it is not listed in the `packages` configuration of setuptools.

    {importable!r} has been automatically added to the distribution only
    because it may contain data files, but this behavior is likely to change
    in future versions of setuptools (and therefore is considered deprecated).

    Please make sure that {importable!r} is included as a package by using
    the `packages` configuration field or the proper discovery methods
    (for example by using `find_namespace_packages(...)`/`find_namespace:`
    instead of `find_packages(...)`/`find:`).

    You can read more about "package discovery" and "data files" on setuptools
    documentation page.
    

!!
    c                 C   s   t  | _d S r   )ru   _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   r5   r   r   r   rU     s    z"_IncludePackageDataAbuse.is_modulec                 C   s6   t |j}tttj|j}|rd|g|S d S )Nr1   )	r   parentr+   rA   	takewhilestrr   partsr:   )r   r   r5   rj   r   r   r   r   rV     s
   
z._IncludePackageDataAbuse.importable_subpackagec                 C   sB   || j vrt| jj|d}tj|tdd | j | d S d S )N)r]      )
stacklevel)	r   r   r   MESSAGEformatwarningsrW   r   add)r   r]   r   r   r   r   rW   &  s
   
z_IncludePackageDataAbuse.warnN)	ry   rz   r{   r|   r   r   rU   rV   rW   r   r   r   r   rS      s    rS   )	functoolsr   r   Zdistutils.utilr   Zdistutils.command.build_pycommandr   r   r	   rn   r   re   r   rh   rA   r   r   pathlibr   Zsetuptools._deprecation_warningr   Z setuptools.extern.more_itertoolsr   r   rQ   rS   r   r   r   r   <module>   s(     U