o
    h/"                     @   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   W/var/www/html/olx_land/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_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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