
|_|%                 @   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 m Z d  d l m Z m Z 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 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	   A/tmp/pip-build-3_sjtvrs/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 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   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   sk   t  j r* t | t  j  r* | j d  } t j j |  | | |  \ } } | ra |  j j	 |  | | f S)N.)
r   PY2
isinstancestring_typessplitr   r   build_moduler   append)r
   moduleZmodule_filepackageoutfilecopiedr	   r	   r   r)   F   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!   P   s    
zbuild_py._get_data_filesc                si   |  j  |    t j j |  j g | j d    }   f d d   |  j |    D } |   | | f S)Nr$   c                s%   g  |  ] } t  j j |     q Sr	   )ospathrelpath).0file)src_dirr	   r   
<listcomp>^   s   	z0build_py._get_pkg_data_files.<locals>.<listcomp>)get_package_dirr2   r3   join	build_libr(   find_data_files)r
   r,   	build_dir	filenamesr	   )r7   r   r1   U   s
    %zbuild_py._get_pkg_data_filesc             C   s   |  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_iterabler   r2   r3   isfilemanifest_filesgetexclude_data_files)r
   r,   r7   patternsZglobs_expandedZglobs_matchesZ
glob_filesr   r	   r	   r   r<   c   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   r2   r3   r:   mkpathdirname	copy_fileabspathr   Zconvert_2to3_doctestsr   r*   )
r
   r,   r7   r=   r>   filenametargetsrcfileoutfr.   r	   r	   r   r   t   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)rD   r   Zinclude_package_datar   assert_relativer9   run_commandget_finalized_commandfilelistr   r2   r3   r(   r:   endswith
setdefaultr*   )r
   ZmfZsrc_dirsr,   Zei_cmdr3   dfprevZoldfdfr	   r	   r   r/      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pkgrX   contentsr	   r	   r   r_      s&    	zbuild_py.check_packagec             C   s   i  |  _  t j j |   d  S)N)r]   r   r   initialize_options)r
   r	   r	   r   rj      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   r9   r   Zsrc_rootr2   r3   r:   )r
   r,   resr	   r	   r   r9      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   )r5   pattern)r   r	   r   	<genexpr>   s   z.build_py.exclude_data_files.<locals>.<genexpr>c             3   s!   |  ] } |   k r | Vq d  S)Nr	   )r5   fn)badr	   r   rn      s   )r0   r?   r   r@   rA   rB   set_unique_everseen)r
   r,   r7   r   rG   Zmatch_groupsmatchesZkeepersr	   )rp   r   r   rF      s    	

zbuild_py.exclude_data_filesc                sA   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)r2   r3   r:   r   )r5   rm   )r7   r	   r   rn      s   z2build_py._get_platform_patterns.<locals>.<genexpr>)r@   rA   rE   )specr,   r7   Zraw_patternsr	   )r7   r   r?      s
    zbuild_py._get_platform_patternsN)r   r   r   __doc__r   r    r"   r)   r!   r1   r<   r   r/   r[   r_   rj   r9   rF   staticmethodr?   r	   r	   r	   r   r      s    

r   c             c   s   t    } | j } | d k rM xd t | j |   D] } | |  | Vq1 Wn8 x5 |  D]- } | |  } | | k rT | |  | VqT Wd S)zHList unique elements, preserving order. Remember all elements ever seen.N)rq   addr   __contains__)iterablekeyseenZseen_addelementkr	   r	   r   rr      s    		

rr   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.
        )r2   r3   isabsdistutils.errorsr   textwrapdedentlstrip)r3   r   msgr	   r	   r   rQ     s    rQ   )r   distutils.utilr   Zdistutils.command.build_pycommandr   r   r2   rl   r   ra   r   rd   r@   Zsetuptools.externr   Zsetuptools.extern.six.movesr   r   r   Zsetuptools.lib2to3_exr   ImportErrorrr   rQ   r	   r	   r	   r   <module>   s"   