
§|j|%  ã               @   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-5c7ija6t/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_namespacezÁNamespace 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"   Ø