o
    Ëý°j/"  ã                   @   s”   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mZ dd„ ZG dd„ dejƒZd	d
„ ZdS )é    )Úglob)Úconvert_pathN)Úunique_everseenc                 C   s   t  | t  | ¡jtjB ¡ d S ©N)ÚosÚchmodÚstatÚst_modeÚS_IWRITE)Útarget© r   úŽ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/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   )Úinclude_bytecode)	Ú
py_modulesÚpackagesÚbuild_modulesÚbuild_packagesÚbuild_package_dataÚbyte_compiler   r   Ú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$   4   s   
zbuild_py.__getattr__c                 C   s.   t j | |||¡\}}|r| j |¡ ||fS r   )r   r   Úbuild_moduler   Úappend)r   ÚmoduleÚ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#   A   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/   r0   r   r   r   r   r   Úget_data_files_without_manifestF   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>X   s    ÿÿz0build_py._get_pkg_data_files.<locals>.<listcomp>)Úget_package_dirr   r5   ÚjoinÚ	build_libÚsplitÚfind_data_files)r   r*   Ú	build_dirÚ	filenamesr   r9   r   r0   P   s   


þzbuild_py._get_pkg_data_filesc                 C   sX   |   | j||¡}tt|ƒ}tj |¡}ttj	j
|ƒ}t | j |g ¡|¡}|  |||¡S )z6Return filenames for package's data files in 'src_dir')Ú_get_platform_patternsr   r/   r   Ú	itertoolsÚchainÚfrom_iterableÚfilterr   r5   Úisfiler1   ÚgetÚexclude_data_files)r   r*   r:   ÚpatternsÚglobs_expandedÚglobs_matchesÚ
glob_filesÚfilesr   r   r   r@   ^   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   r5   r=   ÚmkpathÚdirnameÚ	copy_filer   Úabspath)
r   r*   r:   rA   rB   Úfilenamer   ÚsrcfileÚoutfr,   r   r   r   r   o   s   úÿzbuild_py.build_package_datac                 C   sú   i  | _ }| jjsd S i }| jpdD ]}||t|  |¡ƒ< q|  d¡ |  d¡}|jj	D ]N}t
j t|ƒ¡\}}d }|}	|ra||kra||vra|}t
j |¡\}}
t
j |
|¡}|ra||kra||vsF||v rz| d¡ro||	kroq,| || g ¡ |¡ q,d S )Nr   Úegg_infoz.py)r1   r   Úinclude_package_datar   Úassert_relativer<   Úrun_commandÚget_finalized_commandÚfilelistrO   r   r5   r?   r=   Úendswithr2   r'   )r   ÚmfÚsrc_dirsr*   Úei_cmdr5   ÚdÚfÚprevÚoldfÚdfr   r   r   r-   z   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_namespacer4   ÚrbNs   declare_namespacezÁNamespace 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ÚerrorsÚDistutilsError)r   r*   Úpackage_dirÚinit_pyÚpkgrb   Úcontentsr   r   r   rj   •   s0   ÿ
ÿ
ÿýÿzbuild_py.check_packagec                 C   s   i | _ tj | ¡ d S r   )rh   r   r   Úinitialize_optionsr   r   r   r   rw   ³   s   zbuild_py.initialize_optionsc                 C   s0   t j | |¡}| jjd urtj | jj|¡S |S r   )r   r   r<   r   Úsrc_rootr   r5   r=   )r   r*   Úresr   r   r   r<   ·   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   )ÚfnmatchrG   ©r7   Úpattern)rO   r   r   Ú	<genexpr>Å   ó   € z.build_py.exclude_data_files.<locals>.<genexpr>c                 3   s   � | ]	}|ˆ vr|V  qd S r   r   )r7   Úfn)Úbadr   r   r}   É   r~   )r.   rC   r   rD   rE   rF   Úsetr   )r   r*   r:   rO   rK   Úmatch_groupsÚmatchesÚkeepersr   )r€   rO   r   rJ   ½   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   r5   r=   r   r{   r9   r   r   r}   Ù   s
   € ÿ
þz2build_py._get_platform_patterns.<locals>.<genexpr>)rD   rE   rI   )Úspecr*   r:   Úraw_patternsr   r9   r   rC   Í   s   

þ
ýzbuild_py._get_platform_patternsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   r$   r&   r#   r3   r0   r@   r   r-   rf   rj   rw   r<   rJ   ÚstaticmethodrC   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   r5   ÚisabsÚdistutils.errorsr�   ÚtextwrapÚdedentÚlstrip)r5   r�   Úmsgr   r   r   rY   à   s   ÿ	öÿrY   )r   Údistutils.utilr   Údistutils.command.build_pyÚcommandr   r   r   rz   r�   rm   r�   rp   rD   r   Ú setuptools.extern.more_itertoolsr   r   rY   r   r   r   r   Ú<module>   s     O