3
A|e/"                 @   s   d dl m Z  d dlmZ d dljj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 j| t j| jtjB  d S )N)oschmodstatst_modeS_IWRITE)target r   _/var/www/html/StaffProfile/staffvenv/lib/python3.6/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jp i | _d| jkr6| 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   sR   | j  r| j rdS | j r"| j  | jr8| j  | j  | jtjj| dd dS )z?Build modules, packages, and copy data files to build directoryNr   )Zinclude_bytecode)	
py_modulespackagesZbuild_modulesZbuild_packagesbuild_package_databyte_compiler   r   get_outputs)r   r   r   r   run$   s    zbuild_py.runc             C   s&   |dkr| j  | _| jS tj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j| |||\}}|r&| jj| ||fS )N)r   r   build_moduler   append)r   moduleZmodule_filepackageoutfilecopiedr   r   r   r!   ;   s    zbuild_py.build_modulec             C   s   | j   tt| j| jpf S )z?Generate list of '(package,src_dir,build_dir,filenames)' tuples)analyze_manifestlistmap_get_pkg_data_filesr   )r   r   r   r   r   A   s    zbuild_py._get_data_filesc             C   s$   | j jdi  tt| j| jpf S )z
        Generate list of ``(package,src_dir,build_dir,filenames)`` tuples,
        but without triggering any attempt to analyze or build the manifest.
        manifest_files)r   
setdefaultr(   r)   r*   r   )r   r   r   r   get_data_files_without_manifestF   s    z(build_py.get_data_files_without_manifestc                sJ   | j | tjj| jg|jd  } fdd| j| D }| ||fS )N.c                s   g | ]}t jj| qS r   )r   pathrelpath).0file)src_dirr   r   
<listcomp>Y   s   z0build_py._get_pkg_data_files.<locals>.<listcomp>)get_package_dirr   r/   joinZ	build_libsplitfind_data_files)r   r$   	build_dir	filenamesr   )r3   r   r*   P   s
    

zbuild_py._get_pkg_data_filesc             C   sX   | j | j||}tt|}tjj|}ttj	j
|}tj| jj|g |}| j|||S )z6Return filenames for package's data files in 'src_dir')_get_platform_patternsr   r)   r   	itertoolschainfrom_iterablefilterr   r/   isfiler+   getexclude_data_files)r   r$   r3   patternsZglobs_expandedZglobs_matchesZ
glob_filesfilesr   r   r   r8   ^   s    
zbuild_py.find_data_filesc       
      C   s|   xv| j D ]l\}}}}x^|D ]V}tjj||}| jtjj| tjj||}| j||\}}	t| tjj|}qW qW dS )z$Copy data files into build directoryN)	r   r   r/   r6   mkpathdirname	copy_filer   abspath)
r   r$   r3   r9   r:   filenamer
   Zsrcfileoutfr&   r   r   r   r   o   s    
zbuild_py.build_package_datac             C   s   i  | _ }| jjsd S i }x$| jp$f D ]}||t| j|< q&W | jd | jd}x|jj	D ]}t
jjt|\}}d }|}	x:|r||kr||kr|}t
jj|\}}
t
jj|
|}qW ||kr^|jdr||	krq^|j|| g j| q^W d S )Negg_infoz.py)r+   r   include_package_datar   assert_relativer5   run_commandget_finalized_commandfilelistrD   r   r/   r7   r6   endswithr,   r"   )r   ZmfZsrc_dirsr$   ei_cmdr/   dfprevZoldfdfr   r   r   r'   z   s(    


zbuild_py.analyze_manifestc             C   s   d S )Nr   )r   r   r   r   get_data_files   s    zbuild_py.get_data_filesc             C   s   y
| j | S  tk
r   Y nX tjj| ||}|| j |< | sJ| jj rN|S x,| jjD ]}||ksr|j|d rXP qXW |S tj	|d}|j
 }W dQ R X d|krtjjd|f |S )z8Check namespace packages' __init__ for declare_namespacer.   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_dirZinit_pypkgrT   contentsr   r   r   r[      s&    


zbuild_py.check_packagec             C   s   i | _ tjj|  d S )N)rY   r   r   initialize_options)r   r   r   r   rg      s    zbuild_py.initialize_optionsc             C   s0   t jj| |}| jjd k	r,tjj| jj|S |S )N)r   r   r5   r   src_rootr   r/   r6   )r   r$   resr   r   r   r5      s    zbuild_py.get_package_dirc                s\   t | j| j||}fdd|D }tjj|}t|  fddD }t t|S )z6Filter filenames for package's data files in 'src_dir'c             3   s   | ]}t j |V  qd S )N)fnmatchr?   )r1   pattern)rD   r   r   	<genexpr>   s    z.build_py.exclude_data_files.<locals>.<genexpr>c             3   s   | ]}| kr|V  qd S )Nr   )r1   fn)badr   r   rl      s    )r(   r;   r   r<   r=   r>   setr   )r   r$   r3   rD   rC   Zmatch_groupsmatchesZkeepersr   )rn   rD   r   rB      s    zbuild_py.exclude_data_filesc                s.   t j| jdg | j|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j t|V  qd S )N)r   r/   r6   r   )r1   rk   )r3   r   r   rl      s   z2build_py._get_platform_patterns.<locals>.<genexpr>)r<   r=   rA   )specr$   r3   Zraw_patternsr   )r3   r   r;      s
    

zbuild_py._get_platform_patternsN)__name__
__module____qualname____doc__r   r   r   r!   r   r-   r*   r8   r   r'   rW   r[   rg   r5   rB   staticmethodr;   r   r   r   r   r      s"   
r   c             C   s:   t jj| s| S ddlm} tjdj |  }||d S )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   r/   isabsdistutils.errorsrx   textwrapdedentlstrip)r/   rx   msgr   r   r   rM      s    rM   )r   distutils.utilr   Zdistutils.command.build_pycommandr   r   r   rj   r{   r^   rz   ra   r<   r    setuptools.extern.more_itertoolsr   r   rM   r   r   r   r   <module>   s    O