
`@_/                 @   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 y d  d l m Z Wn% e k
 r Gd d   d  Z Yn XGd d	   d	 e j e  Z d
 d   Z d S)    )glob)convert_pathN)map)	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   A/tmp/pip-build-tw3_dw7d/setuptools/setuptools/command/build_py.pyrun_2to3   s    zMixin2to3.run_2to3N)__name__
__module____qualname__r
   r   r   r   r	   r      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 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   sc   t  j j |   |  j j |  _ |  j j p. i  |  _ d |  j k rM |  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   s   |  j  r |  j r d S|  j  r+ |  j   |  j rH |  j   |  j   |  j |  j d  |  j |  j d  |  j |  j d  |  j t	 j
 j |  d d  d S)z?Build modules, packages, and copy data files to build directoryNFTZinclude_bytecoder   )
py_modulespackagesZbuild_modulesZbuild_packagesbuild_package_datar
   r   r   byte_compiler   r   get_outputs)r   r   r   r	   run*   s    	
	

zbuild_py.runc             C   s5   | d k r" |  j    |  _ |  j St j j |  |  S)zlazily compute data filesr   )_get_data_filesr   r   r   __getattr__)r   attrr   r   r	   r   >   s    zbuild_py.__getattr__c             C   sA   t  j j |  | | |  \ } } | r7 |  j j |  | | f S)N)r   r   build_moduler   append)r   moduleZmodule_filepackageoutfilecopiedr   r   r	   r!   E   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listr   _get_pkg_data_filesr   )r   r   r   r	   r   L   s    
zbuild_py._get_data_filesc                si   |  j  |    t j j |  j g | j d    }   f d d   |  j |    D } |   | | f S)N.c                s%   g  |  ] } t  j j |     q Sr   )ospathrelpath).0file)src_dirr   r	   
<listcomp>Z   s   	z0build_py._get_pkg_data_files.<locals>.<listcomp>)get_package_dirr+   r,   join	build_libsplitfind_data_files)r   r$   	build_dir	filenamesr   )r0   r	   r)   Q   s
    %zbuild_py._get_pkg_data_filesc             C   s   |  j  j d g   |  j  j | g   } |  j j | g   d d  } x6 | D]. } | j t t j j | t |     qN W|  j	 | | |  S)z6Return filenames for package's data files in 'src_dir' N)
r   getmanifest_filesextendr   r+   r,   r3   r   exclude_data_files)r   r$   r0   globsr   patternr   r   r	   r6   _   s    ,zbuild_py.find_data_filesc       
      C   s   x |  j  D] \ } } } } x | D] } t j j | |  } |  j t j j |   t j j | |  } |  j | |  \ } }	 t j j |  } |	 r# | |  j j	 k r# |  j
 j |  q# Wq
 Wd S)z$Copy data files into build directoryN)r   r+   r,   r3   mkpathdirname	copy_fileabspathr   Zconvert_2to3_doctestsr   r"   )
r   r$   r0   r7   r8   filenametargetsrcfileoutfr&   r   r   r	   r   i   s    zbuild_py.build_package_datac             C   sV  i  |  _  } |  j j s d  Si  } x0 |  j p2 f  D] } | | t |  j |   <q3 W|  j d  |  j d  } x | j j	 D] } t
 j j t |   \ } } d  } | }	 xU | r| | k r| | k r| } t
 j j |  \ } }
 t
 j j |
 |  } q W| | k r | j d  r1| |	 k r1q | j | | g   j |  q Wd  S)Negg_infoz.py)r;   r   Zinclude_package_datar   assert_relativer2   run_commandget_finalized_commandfilelistr   r+   r,   r5   r3   endswith
setdefaultr"   )r   ZmfZsrc_dirsr$   Zei_cmdr,   dfprevZoldfdfr   r   r	   r'   v   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  | SWn t k
 r# Yn Xt j j |  | |  } | |  j  | <| s] |  j j ra | Sx8 |  j j D]& } | | k s | j | d  rn Pqn W| St j	 | d   } | j
   } Wd QRXd | k r t 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   Znamespace_packages
startswithioopenread	distutilserrorsDistutilsError)r   r$   package_dirZinit_pypkgrP   contentsr   r   r	   rW      s&    	zbuild_py.check_packagec             C   s   i  |  _  t j j |   d  S)N)rU   r   r   initialize_options)r   r   r   r	   rb      s    	zbuild_py.initialize_optionsc             C   sD   t  j j |  |  } |  j j d  k	 r@ t j j |  j j |  S| S)N)r   r   r2   r   Zsrc_rootr+   r,   r3   )r   r$   resr   r   r	   r2      s    zbuild_py.get_package_dirc                sv   |  j  j d g   |  j  j | g   } t   f d d   | D    t j t j      f d d    D S)z6Filter filenames for package's data files in 'src_dir'r9   c             3   sC   |  ]9 } t  j   t j j  t |    D] } | Vq. q d  S)N)fnmatchfilterr+   r,   r3   r   )r.   r?   item)r   r0   r   r	   	<genexpr>   s   z.build_py.exclude_data_files.<locals>.<genexpr>c                s3   g  |  ]) } |   k r t   |  r |  q Sr   )next)r.   fn)badseenr   r	   r1      s   	z/build_py.exclude_data_files.<locals>.<listcomp>)r   r:   setcollectionsdefaultdict	itertoolscount)r   r$   r0   r   r>   r   )rj   r   rk   r0   r	   r=      s    zbuild_py.exclude_data_filesN)r   r   r   __doc__r   r   r   r!   r   r)   r6   r   r'   rS   rW   rb   r2   r=   r   r   r   r	   r      s   

r   c             C   sO   t  j j |   s |  Sd 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.errorsrr   textwrapdedentlstrip)r,   rr   msgr   r   r	   rI      s    rI   )r   distutils.utilr   Zdistutils.command.build_pycommandr   r   r+   rd   ru   rY   rt   r\   rm   ro   Zsetuptools.extern.six.movesr   Zsetuptools.lib2to3_exr   ImportErrorrI   r   r   r   r	   <module>   s    