a
    ɉxd&C                     @   sz   d 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T ddl	m
Z
mZ ddlmZ G dd deZG d	d
 d
eeZdS )zHdistutils.command.build_py

Implements the Distutils 'build_py' command.    N)Command)*)convert_path	Mixin2to3)logc                   @   s   e Zd ZdZg dZddgZddi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#d$Zd%d& Zd'd( Zd)d* Zd+d, Zd-S )/build_pyz5"build" pure Python modules (copy to build directory)))z
build-lib=dzdirectory to "build" (copy) to)compileczcompile .py to .pyc)
no-compileNz!don't compile .py files [default])z	optimize=Ozlalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0])forcefz2forcibly build everything (ignore file timestamps)r	   r   r   c                 C   s4   d | _ d | _d | _d | _d | _d| _d| _d | _d S )Nr   )	build_lib
py_modulespackagepackage_datapackage_dirr	   optimizer   self r   ^/var/www/html/Ranjet/env/lib/python3.9/site-packages/setuptools/_distutils/command/build_py.pyinitialize_options    s    zbuild_py.initialize_optionsc              	   C   s   |  ddd | jj| _| jj| _| jj| _i | _| jjr^| jj D ]\}}t|| j|< qF|  | _	t
| jtsz,t| j| _d| j  krdksn J W n ttfy   tdY n0 d S )Nbuild)r   r   )r   r   r      zoptimize must be 0, 1, or 2)set_undefined_optionsdistributionpackagesr   r   r   itemsr   get_data_files
data_files
isinstancer   int
ValueErrorAssertionErrorDistutilsOptionError)r   namepathr   r   r   finalize_options*   s$    



 zbuild_py.finalize_optionsc                 C   s:   | j r|   | jr$|   |   | | jdd d S Nr   )include_bytecode)r   build_modulesr   build_packagesbuild_package_databyte_compileget_outputsr   r   r   r   runC   s    zbuild_py.runc                    s   g }| j s|S | j D ]h}| |}tjj| jg|d  }d |rPt|d   fdd| ||D }|	||||f q|S )z?Generate list of '(package,src_dir,build_dir,filenames)' tuples.r      c                    s   g | ]}| d  qS Nr   ).0fileplenr   r   
<listcomp>s   s   z+build_py.get_data_files.<locals>.<listcomp>)
r   get_package_dirosr(   joinr   splitlenfind_data_filesappend)r   datar   src_dir	build_dir	filenamesr   r7   r   r    a   s    



zbuild_py.get_data_filesc                    sd   | j dg | j |g  }g  |D ]:}ttjt|t|}  fdd|D  q$ S )z6Return filenames for package's data files in 'src_dir' c                    s$   g | ]}| vrt j|r|qS r   )r;   r(   isfile)r5   fnfilesr   r   r9      s   z,build_py.find_data_files.<locals>.<listcomp>)	r   getglobr;   r(   r<   escaper   extend)r   r   rB   Zglobspatternfilelistr   rH   r   r?   y   s    zbuild_py.find_data_filesc                 C   s`   d}| j D ]P\}}}}|D ]>}tj||}| tj| | jtj|||dd qq
dS )z$Copy data files into build directoryNFpreserve_mode)r!   r;   r(   r<   mkpathdirname	copy_file)r   Zlastdirr   rB   rC   rD   filenametargetr   r   r   r.      s    zbuild_py.build_package_datac                 C   s   | d}| js&|r tjj| S dS ng }|rz| jd| }W n( tyj   |d|d  |d= Y q*0 |d| tjj| S q*| jd}|dur|d| |rtjj| S dS dS )zReturn the directory, relative to the top of the source
           distribution, where package 'package' should be found
           (at least according to the 'package_dir' option, if any).r2   rE   r   N)r=   r   r;   r(   r<   KeyErrorinsertrJ   )r   r   r(   tailZpdirr   r   r   r:      s(    
	zbuild_py.get_package_dirc                 C   sj   |dkr8t j|s td| t j|s8td| |rft j|d}t j|rZ|S td| d S )NrE   z%package directory '%s' does not existz>supposed package directory '%s' exists, but is not a directoryz__init__.pyz8package init file '%s' not found (or not a regular file))	r;   r(   existsDistutilsFileErrorisdirr<   rF   r   warn)r   r   r   init_pyr   r   r   check_package   s&    zbuild_py.check_packagec                 C   s&   t j|std|| dS dS d S )Nz!file %s (for module %s) not foundFT)r;   r(   rF   r   r^   )r   modulemodule_filer   r   r   check_module   s    zbuild_py.check_modulec           	      C   s   |  || ttjt|d}g }tj| jj}|D ]P}tj|}||krtj	tj
|d }||||f q>| d|  q>|S )Nz*.pyr   zexcluding %s)r`   rK   r;   r(   r<   rL   abspathr   script_namesplitextbasenamer@   debug_print)	r   r   r   Zmodule_filesmodulesZsetup_scriptr   Zabs_fra   r   r   r   find_package_modules   s    zbuild_py.find_package_modulesc              	   C   s   i }g }| j D ]}|d}d|dd }|d }z|| \}}W n  tyf   | |}d}Y n0 |s| ||}	|df||< |	r||d|	f tj||d }
| 	||
sq||||
f q|S )a  Finds individually-specified Python modules, ie. those listed by
        module name in 'self.py_modules'.  Returns a list of tuples (package,
        module_base, filename): 'package' is a tuple of the path through
        package-space to the module; 'module_base' is the bare (no
        packages, no dots) module name, and 'filename' is the path to the
        ".py" file (relative to the distribution root) that implements the
        module.
        r2   r   rW   r3   __init__.py)
r   r=   r<   rX   r:   r`   r@   r;   r(   rc   )r   r   ri   ra   r(   r   Zmodule_baser   checkedr_   rb   r   r   r   find_modules   s*    



zbuild_py.find_modulesc                 C   sN   g }| j r||   | jrJ| jD ]$}| |}| ||}|| q$|S )a4  Compute the list of all modules that will be built, whether
        they are specified one-module-at-a-time ('self.py_modules') or
        by whole packages ('self.packages').  Return a list of tuples
        (package, module, module_file), just like 'find_modules()' and
        'find_package_modules()' do.)r   rM   rn   r   r:   rj   )r   ri   r   r   mr   r   r   find_all_modules  s    

zbuild_py.find_all_modulesc                 C   s   dd |   D S )Nc                 S   s   g | ]}|d  qS )rW   r   )r5   ra   r   r   r   r9   -      z-build_py.get_source_files.<locals>.<listcomp>)rp   r   r   r   r   get_source_files,  s    zbuild_py.get_source_filesc                 C   s$   |gt | |d g }tjj| S )Nrl   )listr;   r(   r<   )r   rC   r   ra   Zoutfile_pathr   r   r   get_module_outfile/  s    zbuild_py.get_module_outfiler3   c                 C   s   |   }g }|D ]p\}}}|d}| | j||}|| |r| jr^|tjj|dd | j	dkr|tjj|| j	d q|dd | j
D 7 }|S )Nr2   rE   )optimizationr   c                 S   s,   g | ]$\}}}}|D ]}t j||qqS r   )r;   r(   r<   )r5   r   rB   rC   rD   rU   r   r   r   r9   B  s   
z(build_py.get_outputs.<locals>.<listcomp>)rp   r=   rt   r   r@   r	   	importlibutilcache_from_sourcer   r!   )r   r+   ri   outputsr   ra   rb   rU   r   r   r   r0   3  s&    





zbuild_py.get_outputsc                 C   sb   t |tr|d}nt |ttfs,td| | j||}tj	
|}| | | j||ddS )Nr2   z:'package' must be a string (dot-separated), list, or tupler   rP   )r"   strr=   rs   tuple	TypeErrorrt   r   r;   r(   rS   rR   rT   )r   ra   rb   r   outfiledirr   r   r   build_moduleJ  s    

zbuild_py.build_modulec                 C   s*   |   }|D ]\}}}| ||| qd S r4   )rn   r   )r   ri   r   ra   rb   r   r   r   r,   Y  s    zbuild_py.build_modulesc                 C   sP   | j D ]D}| |}| ||}|D ]$\}}}||ks:J | ||| q$qd S r4   )r   r:   rj   r   )r   r   r   ri   Zpackage_ra   rb   r   r   r   r-   b  s    


zbuild_py.build_packagesc                 C   s   t jr| d d S ddlm} | j}|d tjkr>|tj }| jrZ||d| j	|| j
d | jdkr|||| j| j	|| j
d d S )Nz%byte-compiling is disabled, skipping.r   )r/   rW   )r   r   prefixdry_run)sysdont_write_bytecoder^   distutils.utilr/   r   r;   sepr	   r   r   r   )r   rI   r/   r   r   r   r   r/   v  s    




zbuild_py.byte_compileN)r3   )__name__
__module____qualname__descriptionuser_optionsboolean_optionsnegative_optr   r)   r1   r    r?   r.   r:   r`   rc   rj   rn   rp   rr   rt   r0   r   r,   r-   r/   r   r   r   r   r      s.   


'4
	r   c                   @   s   e Zd Zdd Zdd ZdS )build_py_2to3c                 C   sL   g | _ | jr|   | jr*|   |   | | j  | | jdd d S r*   )	updated_filesr   r,   r   r-   r.   run_2to3r/   r0   r   r   r   r   r1     s    zbuild_py_2to3.runc                 C   s,   t | |||}|d r(| j|d  |S )Nr3   r   )r   r   r   r@   )r   ra   rb   r   resr   r   r   r     s    zbuild_py_2to3.build_moduleN)r   r   r   r1   r   r   r   r   r   r     s   r   )__doc__r;   importlib.utilrv   r   rK   distutils.corer   distutils.errorsr   r   r   	distutilsr   r   r   r   r   r   r   <module>   s     }