
(h	&                 @   s5  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 l m Z m Z m Z y d  d l m Z Wn% e k
 r Gd d   d  Z Yn Xd	 d
   Z Gd 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-kmztzv_d/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             C   s'   t  j |  t  j |   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   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   run0   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)   D   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   r0   K   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(   U   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	   )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   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   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] \ } } } } x | D] } t j j | |  } |  j t j j |   t j j | |  } |  j | |  \ } }	 t |  t j j |  } |	 r# | |  j	 j
 k r# |  j j |  q# Wq
 Wd 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   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)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oldf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  | 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
   r3   package_dirZinit_pypkgr]   contentsr	   r	   r   rd      s&    	zbuild_py.check_packagec             C   s   i  |  _  t j j |   d  S)N)rb   r   r   initialize_options)r
   r	   r	   r   ro      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   r?   r   Zsrc_rootr   r9   r@   )r
   r3   resr	   r	   r   r?      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   )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   rs      s   )r7   rE   r   rF   rG   rH   set_unique_everseen)r
   r3   r=   r   rM   Zmatch_groupsmatchesZkeepersr	   )ru   r   r   rL      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)r   r9   r@   r   )r;   rr   )r=   r	   r   rs      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`   rd   ro   r?   rL   staticmethodrE   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)rv   addr   __contains__)iterablekeyseenZseen_addelementkr	   r	   r   rw      s    		

rw   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   r9   isabsdistutils.errorsr   textwrapdedentlstrip)r9   r   msgr	   r	   r   rV     s    rV   )r   distutils.utilr   Zdistutils.command.build_pycommandr   r   r   rq   r   rf   r   ri   rF   r   Zsetuptools.externr   Zsetuptools.extern.six.movesr   r   r   Zsetuptools.lib2to3_exr   ImportErrorr   rw   rV   r	   r	   r	   r   <module>   s&   