U
    ªÃT_|%  ã                   @   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mZ d dlmZmZmZ zd dlmZ W n" ek
r¬   G dd„ dƒZY nX 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-sr6cxcdi/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                   @   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_outputsr   r	   r	   r   Úrun+   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#   ?   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   r*   F   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"   P   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	   )ÚosÚpathÚrelpath)Ú.0Úfile©Úsrc_dirr	   r   Ú
<listcomp>]   s   ÿz0build_py._get_pkg_data_files.<locals>.<listcomp>)Úget_package_dirr3   r4   ÚjoinÚ	build_libr)   Úfind_data_files)r
   r-   Ú	build_dirÚ	filenamesr	   r8   r   r2   U   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   r3   r4   ÚisfileÚmanifest_filesÚgetÚexclude_data_files)r
   r-   r9   ÚpatternsZglobs_expandedZglobs_matchesZ
glob_filesr   r	   r	   r   r>   c   s    ý
þzbuild_py.find_data_filesc           
      C   sˆ   | j D ]|\}}}}|D ]j}tj ||¡}|  tj |¡¡ tj ||¡}|  ||¡\}}	tj |¡}|	r|| jj	kr| j
 |¡ qqdS )z$Copy data files into build directoryN)r   r3   r4   r<   ÚmkpathÚdirnameÚ	copy_fileÚabspathr   Zconvert_2to3_doctestsr   r+   )
r
   r-   r9   r?   r@   ÚfilenameÚtargetÚsrcfileÚoutfr/   r	   r	   r   r   t   s    
ÿzbuild_py.build_package_datac                 C   sè   i  | _ }| jjsd S i }| jp"dD ]}||t|  |¡ƒ< q$|  d¡ |  d¡}|jj	D ]Š}t
j t|ƒ¡\}}d }|}	|r°||kr°||kr°|}t
j |¡\}}
t
j |
|¡}qx||krX| d¡rÌ||	krÌqX| || g ¡ |¡ qXd S )Nr	   Úegg_infoz.py)rF   r   Zinclude_package_datar   Úassert_relativer;   Úrun_commandÚget_finalized_commandÚfilelistr   r3   r4   r)   r<   ÚendswithÚ
setdefaultr+   )r
   ZmfZsrc_dirsr-   Zei_cmdr4   ÚdÚfÚprevZoldfZdfr	   r	   r   r0   �   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¶   z| j | W S  tk
r    Y nX tj | ||¡}|| j |< |rH| jjsL|S | jjD ]}||ksn| |d ¡rT qxqT|S t 	|d¡�}| 
¡ }W 5 Q R X d|kr²tj d|f ¡‚|S )z8Check namespace packages' __init__ for declare_namespacer%   Úrbs   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ÚpkgrZ   Úcontentsr	   r	   r   ra   œ   s*    
ýÿzbuild_py.check_packagec                 C   s   i | _ tj | ¡ d S r\   )r_   r   r   Úinitialize_optionsr   r	   r	   r   rl   º   s    zbuild_py.initialize_optionsc                 C   s0   t j | |¡}| jjd k	r,tj | jj|¡S |S r\   )r   r   r;   r   Zsrc_rootr3   r4   r<   )r
   r-   Ú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 r\   )Úfnmatchr   ©r6   Úpattern)r   r	   r   Ú	<genexpr>Ì   s   ÿz.build_py.exclude_data_files.<locals>.<genexpr>c                 3   s   | ]}|ˆ kr|V  qd S r\   r	   )r6   Úfn)Úbadr	   r   rq   Ó   s   þ)r1   rA   r   rB   rC   rD   ÚsetÚ_unique_everseen)r
   r-   r9   r   rI   Zmatch_groupsÚmatchesZkeepersr	   )rs   r   r   rH   Ä   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 r\   )r3   r4   r<   r   ro   r8   r	   r   rq   ç   s   ÿz2build_py._get_platform_patterns.<locals>.<genexpr>)rB   rC   rG   )Úspecr-   r9   Zraw_patternsr	   r8   r   rA   Û   s    

þ
ýzbuild_py._get_platform_patternsN)r   r   r   Ú__doc__r   r!   r#   r*   r"   r2   r>   r   r0   r]   ra   rl   r;   rH   ÚstaticmethodrA   r	   r	   r	   r   r      s"   	

r   c                 c   sb   t ƒ }|j}|dkr6t|j| ƒD ]}||ƒ |V  q n(| D ]"}||ƒ}||kr:||ƒ |V  q:dS )zHList unique elements, preserving order. Remember all elements ever seen.N)rt   Úaddr   Ú__contains__)ÚiterableÚkeyÚseenÚseen_addÚelementÚkr	   r	   r   ru   ï   s    
ru   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.
        )r3   r4   ÚisabsÚdistutils.errorsrƒ   ÚtextwrapÚdedentÚlstrip)r4   rƒ   Úmsgr	   r	   r   rS     s    ùrS   )N)r   Údistutils.utilr   Zdistutils.command.build_pyÚcommandr   r   r3   rn   r†   rc   r…   rf   rB   Zsetuptools.externr   Zsetuptools.extern.six.movesr   r   r   Zsetuptools.lib2to3_exr   ÚImportErrorru   rS   r	   r	   r	   r   Ú<module>   s$    Y
