B
    `d	&                 @   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lmZmZmZ yd dlmZ W n" ek
r   G dd dZY nX d	d
 ZG dd dejeZdddZdd ZdS )    )glob)convert_pathN)six)mapfilterfilterfalse)	Mixin2to3c               @   s   e Zd ZdddZdS )r   Tc             C   s   dS )z
do nothingN )selffilesZdoctestsr	   r	   ?/tmp/pip-unpacked-wheel-k1jh9j23/setuptools/command/build_py.pyrun_2to3   s    zMixin2to3.run_2to3N)T)__name__
__module____qualname__r   r	   r	   r	   r   r      s   r   c             C   s   t | t | jtjB  d S )N)oschmodstatst_modeS_IWRITE)targetr	   r	   r   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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   sF   t j|  | jj| _| jjp i | _d| jkr6| jd= g | _g | _d S )N
data_files)	origr   finalize_optionsdistributionpackage_dataexclude_package_data__dict___build_py__updated_files_build_py__doctests_2to3)r
   r	   r	   r   r   &   s    

zbuild_py.finalize_optionsc             C   sx   | j s| jsdS | j r|   | jr4|   |   | | jd | | jd | | jd | t	j
j| dd dS )z?Build modules, packages, and copy data files to build directoryNFTr   )Zinclude_bytecode)
py_modulespackagesZbuild_modulesZbuild_packagesbuild_package_datar   r    r!   byte_compiler   r   get_outputs)r
   r	   r	   r   run0   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)   D   s    
zbuild_py.__getattr__c             C   sJ   t jrt|t jr|d}tj| |||\}}|rB| j	| ||fS )N.)
r   PY2
isinstancestring_typessplitr   r   build_moduler    append)r
   moduleZmodule_filepackageoutfilecopiedr	   r	   r   r0   K   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listr   _get_pkg_data_filesr#   )r
   r	   r	   r   r(   U   s    zbuild_py._get_data_filesc                sJ   |  | tjj| jg|d  } fdd| | D }| ||fS )Nr+   c                s   g | ]}t j| qS r	   )r   pathrelpath).0file)src_dirr	   r   
<listcomp>c   s   z0build_py._get_pkg_data_files.<locals>.<listcomp>)get_package_dirr   r9   join	build_libr/   find_data_files)r
   r3   	build_dir	filenamesr	   )r=   r   r8   Z   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_iterabler   r   r9   isfilemanifest_filesgetexclude_data_files)r
   r3   r=   patternsZglobs_expandedZglobs_matchesZ
glob_filesr   r	   r	   r   rB   h   s    
zbuild_py.find_data_filesc       
      C   s   x| j D ]\}}}}xz|D ]r}tj||}| tj| tj||}| ||\}}	t| tj|}|	r|| j	j
kr| j| qW qW dS )z$Copy data files into build directoryN)r   r   r9   r@   mkpathdirname	copy_filer   abspathr   Zconvert_2to3_doctestsr!   r1   )
r
   r3   r=   rC   rD   filenamer   srcfileoutfr5   r	   r	   r   r$   y   s    
zbuild_py.build_package_datac             C   s   i  | _ }| jjsd S i }x$| jp$dD ]}||t| |< q&W | d | d}x|jj	D ]}t
jt|\}}d }|}	x:|r||kr||kr|}t
j|\}}
t
j|
|}qW ||kr^|dr||	krq^||| g | q^W d S )Nr	   egg_infoz.py)rJ   r   Zinclude_package_datar#   assert_relativer?   run_commandget_finalized_commandfilelistr   r   r9   r/   r@   endswith
setdefaultr1   )r
   ZmfZsrc_dirsr3   Zei_cmdr9   dfprevZoldfZdfr	   r	   r   r6      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 |< |rF| jjsJ|S x,| jjD ]}||ksn||d rTP qTW |S t	|d}|
 }W dQ R X d|krt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   Znamespace_packages
startswithioopenread	distutilserrorsDistutilsError)r
   r3   package_dirZinit_pypkgr]   contentsr	   r	   r   rc      s&    


zbuild_py.check_packagec             C   s   i | _ tj|  d S )N)ra   r   r   initialize_options)r
   r	   r	   r   rn      s    zbuild_py.initialize_optionsc             C   s0   t j| |}| jjd k	r,tj| jj|S |S )N)r   r   r?   r   Zsrc_rootr   r9   r@   )r
   r3   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 )N)fnmatchr   )r;   pattern)r   r	   r   	<genexpr>   s   z.build_py.exclude_data_files.<locals>.<genexpr>c             3   s   | ]}| kr|V  qd S )Nr	   )r;   fn)badr	   r   rr      s   )r7   rE   r   rF   rG   rH   set_unique_everseen)r
   r3   r=   r   rM   Zmatch_groupsmatchesZkeepersr	   )rt   r   r   rL      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 )N)r   r9   r@   r   )r;   rq   )r=   r	   r   rr      s   z2build_py._get_platform_patterns.<locals>.<genexpr>)rF   rG   rK   )specr3   r=   Zraw_patternsr	   )r=   r   rE      s
    

zbuild_py._get_platform_patternsN)r   r   r   __doc__r   r'   r)   r0   r(   r8   rB   r$   r6   r_   rc   rn   r?   rL   staticmethodrE   r	   r	   r	   r   r      s    

r   c             c   sj   t  }|j}|dkr:xPt|j| D ]}|| |V  q"W n,x*| D ]"}||}||kr@|| |V  q@W dS )zHList unique elements, preserving order. Remember all elements ever seen.N)ru   addr   __contains__)iterablekeyseenZseen_addelementkr	   r	   r   rv      s    
rv   c             C   s:   t j| s| S ddlm} td |  }||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   r9   isabsdistutils.errorsr   textwrapdedentlstrip)r9   r   msgr	   r	   r   rV     s    rV   )N)r   distutils.utilr   Zdistutils.command.build_pycommandr   r   r   rp   r   re   r   rh   rF   r   Zsetuptools.externr   Zsetuptools.extern.six.movesr   r   r   Zsetuptools.lib2to3_exr   ImportErrorr   rv   rV   r	   r	   r	   r   <module>   s(    Z
