U
    ߧ+dc                     @   s  d Z ddlmZ ddlmZ ddlmZ ddl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ZddlZddlZddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z( ddl)m*Z* ddlm+Z+ ddlm,Z, dd Z-G dd dZ.G dd de.eZ/G dd deZG dd deZ0dd Z1dd Z2d d! Z3d"d# Z4d$d% Z5d&d' Z6d(d) Z7d*d+ Z8d5d-d.Z9d/d0 Z:d1d2 Z;G d3d4 d4e,Z<dS )6zUsetuptools.command.egg_info

Create a distribution's .egg-info directory and contents    )FileList)DistutilsInternalError)convert_path)logN)six)map)Command)sdist)walk_revctrl)edit_config)	bdist_egg)parse_requirements	safe_nameparse_versionsafe_versionyield_lines
EntryPointiter_entry_pointsto_filename)glob)	packaging)SetuptoolsDeprecationWarningc                 C   s  d}|  tjj}ttj}d|f }t|D ]\}}|t|d k}|dkrr|r`|d7 }q0|d||f 7 }q0d}t|}	||	k r|| }
|
dkr||d 7 }n |
d	kr||7 }n|
d
kr|d }||	k r|| dkr|d }||	k r|| dkr|d }||	k r,|| dkr,|d }q||	krF|t|
7 }nR||d | }d}|d dkrxd}|dd }|t|7 }|d|f 7 }|}n|t|
7 }|d7 }q~|s0||7 }q0|d7 }tj|tj	tj
B dS )z
    Translate a file path glob like '*.txt' in to a regular expression.
    This differs from fnmatch.translate which allows wildcards to match
    directory separators. It also knows about '**/' which matches any number of
    directories.
     z[^%s]   **z.*z
(?:%s+%s)*r   *?[!]^Nz[%s]z\Z)flags)splitospathsepreescape	enumeratelencompile	MULTILINEDOTALL)r   patchunksr%   Z
valid_charcchunk
last_chunkiZ	chunk_lencharZinner_iinner
char_class r6   ?/tmp/pip-unpacked-wheel-cmbdiwe1/setuptools/command/egg_info.pytranslate_pattern$   sV    







r8   c                   @   s8   e Zd ZdZdZedd Zdd Zdd ZeeZ	dS )
InfoCommonNc                 C   s   t | j S N)r   distributionget_nameselfr6   r6   r7   name{   s    zInfoCommon.namec                 C   s2   | j  }| jr$|| jr$t|S t|| j S r:   )r;   get_versionvtagsendswithr   r>   versionr6   r6   r7   tagged_version   s    
zInfoCommon.tagged_versionc                 C   s,   d}| j r|| j 7 }| jr(|td7 }|S )Nr   z-%Y%m%d)	tag_buildtag_datetimestrftimerC   r6   r6   r7   tags   s    
zInfoCommon.tags)
__name__
__module____qualname__rF   rG   propertyr?   rE   rJ   rA   r6   r6   r6   r7   r9   w   s   
r9   c                   @   s   e Zd ZdZddddgZdgZddiZdd	 Zed
d Z	e	j
dd Z	dd Zdd ZdddZdd Zdd Zdd Zdd Zdd ZdS ) egg_infoz+create a distribution's .egg-info directory)z	egg-base=ezLdirectory containing .egg-info directories (default: top of the source tree))tag-datedz0Add date stamp (e.g. 20050528) to version number)z
tag-build=bz-Specify explicit tag to add to version number)no-dateDz"Don't include date stamp [default]rQ   rT   c                 C   s"   d | _ d | _d | _d | _d| _d S )NF)egg_baseegg_namerO   egg_versionbroken_egg_infor=   r6   r6   r7   initialize_options   s
    zegg_info.initialize_optionsc                 C   s   d S r:   r6   r=   r6   r6   r7   tag_svn_revision   s    zegg_info.tag_svn_revisionc                 C   s   d S r:   r6   )r>   valuer6   r6   r7   r[      s    c                 C   s0   t  }|  |d< d|d< t|t|d dS )z
        Materialize the value of date into the
        build tag. Install build keys in a deterministic order
        to avoid arbitrary reordering on subsequent builds.
        rF   r   rG   )rO   N)collectionsOrderedDictrJ   r   dict)r>   filenamerO   r6   r6   r7   save_version_info   s    zegg_info.save_version_infoc                 C   sB  | j | _|  | _t| j}z6t|tjj}|r4dnd}t	t
|| j| jf  W n, tk
r~   tjd| j| jf Y nX | jd kr| jj}|pi dtj| _| d t| jd | _| jtjkrtj| j| j| _d| jkr|   | j| jj_| jj}|d k	r>|j| j kr>| j|_t| j|_ d | j_d S )Nz%s==%sz%s===%sz2Invalid distribution name or version syntax: %s-%sr   rV   	.egg-info-)!r?   rW   rE   rX   r   
isinstancer   rD   Versionlistr   
ValueError	distutilserrorsDistutilsOptionErrorrV   r;   package_dirgetr#   curdirensure_dirnamer   rO   r$   joincheck_broken_egg_infometadataZ_patched_distkeylower_version_parsed_version)r>   parsed_versionZ
is_versionspecdirspdr6   r6   r7   finalize_options   s>    







zegg_info.finalize_optionsFc                 C   sL   |r|  ||| n4tj|rH|dkr>|s>td|| dS | | dS )a  Write `data` to `filename` or delete if empty

        If `data` is non-empty, this routine is the same as ``write_file()``.
        If `data` is empty but not ``None``, this is the same as calling
        ``delete_file(filename)`.  If `data` is ``None``, then this is a no-op
        unless `filename` exists, in which case a warning is issued about the
        orphaned file (if `force` is false), or deleted (if `force` is true).
        Nz$%s not set in setup(), but %s exists)
write_filer#   r$   existsr   warndelete_file)r>   whatr`   dataforcer6   r6   r7   write_or_delete_file   s    	  zegg_info.write_or_delete_filec                 C   sD   t d|| tjr|d}| js@t|d}|| |  dS )zWrite `data` to `filename` (if not a dry run) after announcing it

        `what` is used in a log message to identify what is being written
        to the file.
        zwriting %s to %sutf-8wbN)	r   infor   PY3encodedry_runopenwriteclose)r>   r   r`   r   fr6   r6   r7   r{     s    


zegg_info.write_filec                 C   s    t d| | jst| dS )z8Delete `filename` (if not a dry run) after announcing itzdeleting %sN)r   r   r   r#   unlink)r>   r`   r6   r6   r7   r~     s    zegg_info.delete_filec                 C   s   |  | j t| jd  | jj}tdD ]4}|j|d | }|| |j	tj
| j|j	 q*tj
| jd}tj
|r| | |   d S )Nzegg_info.writers)	installerznative_libs.txt)mkpathrO   r#   utimer;   Zfetch_build_eggr   requireresolver?   r$   ro   r|   r~   find_sources)r>   r   epwriternlr6   r6   r7   run  s    
zegg_info.runc                 C   s4   t j| jd}t| j}||_|  |j| _dS )z"Generate SOURCES.txt manifest filezSOURCES.txtN)	r#   r$   ro   rO   manifest_makerr;   manifestr   filelist)r>   Zmanifest_filenamemmr6   r6   r7   r   *  s
    
zegg_info.find_sourcesc                 C   sT   | j d }| jtjkr&tj| j|}tj|rPtd|| j	 | j	| _
|| _	d S )Nrb   aB  ------------------------------------------------------------------------------
Note: Your current .egg-info directory has a '-' in its name;
this will not work correctly with "setup.py develop".

Please rename %s to %s to correct this problem.
------------------------------------------------------------------------------)rW   rV   r#   rm   r$   ro   r|   r   r}   rO   rY   )r>   Zbeir6   r6   r7   rp   2  s    
 zegg_info.check_broken_egg_infoN)F)rK   rL   rM   descriptionuser_optionsboolean_optionsnegative_optrZ   rN   r[   setterra   rz   r   r{   r~   r   r   rp   r6   r6   r6   r7   rO      s.    


1
rO   c                   @   s|   e 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 )r   c                 C   s   |  |\}}}}|dkrR| dd|  |D ]}| |s2td| q2n|dkr| dd|  |D ]}| |srtd| qrn|dkr| d	d|  |D ]}| |std
| qnJ|dkr| dd|  |D ]}| |std| qn|dkr`| d|d|f  |D ]"}| 	||s:td|| q:n|dkr| d|d|f  |D ]"}| 
||std|| qnp|dkr| d|  | |std| n>|dkr| d|  | |std| ntd| d S )Nincludezinclude  z%warning: no files found matching '%s'excludezexclude z9warning: no previously-included files found matching '%s'zglobal-includezglobal-include z>warning: no files found matching '%s' anywhere in distributionzglobal-excludezglobal-exclude zRwarning: no previously-included files matching '%s' found anywhere in distributionzrecursive-includezrecursive-include %s %sz:warning: no files found matching '%s' under directory '%s'zrecursive-excludezrecursive-exclude %s %szNwarning: no previously-included files matching '%s' found under directory '%s'graftzgraft z+warning: no directories found matching '%s'prunezprune z6no previously-included directories found matching '%s'z'this cannot happen: invalid action '%s')Z_parse_template_linedebug_printro   r   r   r}   r   global_includeglobal_excluderecursive_includerecursive_excluder   r   r   )r>   lineactionpatternsdirZdir_patternpatternr6   r6   r7   process_template_lineE  s|    








 

 


zFileList.process_template_linec                 C   sR   d}t t| jd ddD ]2}|| j| r| d| j|   | j|= d}q|S )z
        Remove all files from the file list that match the predicate.
        Return True if any matching files were removed
        Fr   z
 removing T)ranger)   filesr   )r>   	predicatefoundr2   r6   r6   r7   _remove_files  s    zFileList._remove_filesc                 C   s$   dd t |D }| | t|S )z#Include files that match 'pattern'.c                 S   s   g | ]}t j|s|qS r6   r#   r$   isdir.0r   r6   r6   r7   
<listcomp>  s      z$FileList.include.<locals>.<listcomp>r   extendboolr>   r   r   r6   r6   r7   r     s    
zFileList.includec                 C   s   t |}| |jS )z#Exclude files that match 'pattern'.)r8   r   matchr>   r   r   r6   r6   r7   r     s    zFileList.excludec                 C   s8   t j|d|}dd t|ddD }| | t|S )zN
        Include all files anywhere in 'dir/' that match the pattern.
        r   c                 S   s   g | ]}t j|s|qS r6   r   r   r6   r6   r7   r     s    z.FileList.recursive_include.<locals>.<listcomp>T)	recursive)r#   r$   ro   r   r   r   )r>   r   r   Zfull_patternr   r6   r6   r7   r     s    
zFileList.recursive_includec                 C   s    t tj|d|}| |jS )zM
        Exclude any file anywhere in 'dir/' that match the pattern.
        r   r8   r#   r$   ro   r   r   )r>   r   r   r   r6   r6   r7   r     s    zFileList.recursive_excludec                 C   s$   dd t |D }| | t|S )zInclude all files from 'dir/'.c                 S   s"   g | ]}t j|D ]}|qqS r6   )rh   r   findall)r   Z	match_diritemr6   r6   r7   r     s    z"FileList.graft.<locals>.<listcomp>r   )r>   r   r   r6   r6   r7   r     s
    
zFileList.graftc                 C   s   t tj|d}| |jS )zFilter out files from 'dir/'.r   r   )r>   r   r   r6   r6   r7   r     s    zFileList.prunec                    sJ   | j dkr|   ttjd|  fdd| j D }| | t|S )z
        Include all files anywhere in the current directory that match the
        pattern. This is very inefficient on large file trees.
        Nr   c                    s   g | ]}  |r|qS r6   r   r   r   r6   r7   r     s     
 z+FileList.global_include.<locals>.<listcomp>)allfilesr   r8   r#   r$   ro   r   r   r   r6   r   r7   r     s    

zFileList.global_includec                 C   s   t tjd|}| |jS )zD
        Exclude all files anywhere that match the pattern.
        r   r   r   r6   r6   r7   r     s    zFileList.global_excludec                 C   s8   | dr|d d }t|}| |r4| j| d S )Nr   )rB   r   
_safe_pathr   append)r>   r   r$   r6   r6   r7   r     s
    

zFileList.appendc                 C   s   | j t| j| d S r:   )r   r   filterr   )r>   pathsr6   r6   r7   r     s    zFileList.extendc                 C   s   t t| j| j| _dS )z
        Replace self.files with only safe paths

        Because some owners of FileList manipulate the underlying
        ``files`` attribute directly, this method must be called to
        repair those paths.
        N)rf   r   r   r   r=   r6   r6   r7   _repair  s    zFileList._repairc              	   C   s   d}t |}|d kr(td|  dS t |d}|d krNt||d dS z"tj|shtj|rnW dS W n& tk
r   t||t	
  Y nX d S )Nz!'%s' not %s encodable -- skippingz''%s' in unexpected encoding -- skippingFr   T)unicode_utilsfilesys_decoder   r}   Z
try_encoder#   r$   r|   UnicodeEncodeErrorsysgetfilesystemencoding)r>   r$   Zenc_warnZu_pathZ	utf8_pathr6   r6   r7   r     s    

zFileList._safe_pathN)rK   rL   rM   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r6   r6   r7   r   B  s   I


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	e
dd Zdd Zdd ZdS )r   zMANIFEST.inc                 C   s   d| _ d| _d| _d| _d S )Nr   )Zuse_defaultsr   Zmanifest_onlyZforce_manifestr=   r6   r6   r7   rZ   	  s    z!manifest_maker.initialize_optionsc                 C   s   d S r:   r6   r=   r6   r6   r7   rz     s    zmanifest_maker.finalize_optionsc                 C   sd   t  | _tj| js|   |   tj| jr<| 	  | 
  | j  | j  |   d S r:   )r   r   r#   r$   r|   r   write_manifestadd_defaultstemplateZread_templateprune_file_listsortZremove_duplicatesr=   r6   r6   r7   r     s    

zmanifest_maker.runc                 C   s   t |}|tjdS )N/)r   r   replacer#   r%   )r>   r$   r6   r6   r7   _manifest_normalize  s    
z"manifest_maker._manifest_normalizec                    sB    j    fdd j jD }d j } t j|f| dS )zo
        Write the file list in 'self.filelist' to the manifest file
        named by 'self.manifest'.
        c                    s   g | ]}  |qS r6   )r   r   r=   r6   r7   r   *  s     z1manifest_maker.write_manifest.<locals>.<listcomp>zwriting manifest file '%s'N)r   r   r   r   executer{   )r>   r   msgr6   r=   r7   r   "  s    

zmanifest_maker.write_manifestc                 C   s   |  |st| | d S r:   )_should_suppress_warningr	   r}   )r>   r   r6   r6   r7   r}   .  s    
zmanifest_maker.warnc                 C   s   t d| S )z;
        suppress missing-file warnings from sdist
        zstandard file .*not found)r&   r   )r   r6   r6   r7   r   2  s    z'manifest_maker._should_suppress_warningc                 C   s   t |  |   | j| j | j| j tt }|rJ| j	| nt
j| jr`|   t
jdrx| jd | d}| j|j d S )Nzsetup.pyrO   )r	   r   Zcheck_licenser   r   r   r   rf   r
   r   r#   r$   r|   Zread_manifestget_finalized_commandr   rO   )r>   ZrcfilesZei_cmdr6   r6   r7   r   9  s    


zmanifest_maker.add_defaultsc                 C   sZ   |  d}| j }| j|j | j| ttj	}| jj
d| d | dd d S )Nbuildz(^|z)(RCS|CVS|\.svn)r   )Zis_regex)r   r;   get_fullnamer   r   
build_baser&   r'   r#   r%   Zexclude_pattern)r>   r   base_dirr%   r6   r6   r7   r   L  s    

zmanifest_maker.prune_file_listN)rK   rL   rM   r   rZ   rz   r   r   r   r}   staticmethodr   r   r   r6   r6   r6   r7   r     s   
r   c              	   C   s8   d |}|d}t| d}|| W 5 Q R X dS )z{Create a file with the specified name and write 'contents' (a
    sequence of strings without line terminators) to it.
    
r   r   N)ro   r   r   r   )r`   contentsr   r6   r6   r7   r{   V  s    

r{   c              	   C   s|   t d| | jsx| jj}| j|j |_}| j|j |_}z|	| j
 W 5 || |_|_X t| jdd }t| j
| d S )Nz
writing %sZzip_safe)r   r   r   r;   rq   rX   rD   rW   r?   write_pkg_inforO   getattrr   Zwrite_safety_flag)cmdbasenamer`   rq   ZoldverZoldnamesafer6   r6   r7   r   c  s    r   c                 C   s   t j|rtd d S )NzsWARNING: 'depends.txt' is not used by setuptools 0.6!
Use the install_requires/extras_require setup() args instead.)r#   r$   r|   r   r}   r   r   r`   r6   r6   r7   warn_depends_obsoletev  s    r   c                 C   s0   t |pd}dd }t|t|}| | d S )Nr6   c                 S   s   | d S )Nr   r6   )r   r6   r6   r7   <lambda>      z%_write_requirements.<locals>.<lambda>)r   r   sorted
writelines)streamreqslinesZ	append_crr6   r6   r7   _write_requirements~  s    r   c                 C   sj   | j }t }t||j |jp"i }t|D ]&}|djf t	  t|||  q,| 
d||  d S )Nz
[{extra}]
requirements)r;   r   StringIOr   Zinstall_requiresextras_requirer   r   formatvarsr   getvalue)r   r   r`   distr   r   extrar6   r6   r7   write_requirements  s    
r   c                 C   s,   t  }t|| jj | d||  d S )Nzsetup-requirements)ior   r   r;   Zsetup_requiresr   r   )r   r   r`   r   r6   r6   r7   write_setup_requirements  s    r   c                 C   s:   t dd | j D }| d|dt|d  d S )Nc                 S   s   g | ]}| d dd qS ).r   r   )r"   )r   kr6   r6   r7   r     s   z(write_toplevel_names.<locals>.<listcomp>ztop-level namesr   )r_   fromkeysr;   Ziter_distribution_namesr{   ro   r   )r   r   r`   pkgsr6   r6   r7   write_toplevel_names  s    r  c                 C   s   t | ||d d S )NT)	write_argr   r6   r6   r7   overwrite_arg  s    r  Fc                 C   sH   t j|d }t| j|d }|d k	r4d|d }| |||| d S )Nr   r   )r#   r$   splitextr   r;   ro   r   )r   r   r`   r   argnamer\   r6   r6   r7   r    s
    r  c                 C   s   | j j}t|tjs|d kr"|}nn|d k	rg }t| D ]J\}}t|tjsrt||}d	tt
t| }|d||f  q:d	|}| d||d d S )Nr   z	[%s]
%s

r   zentry pointsT)r;   entry_pointsrd   r   string_typesr   itemsr   parse_groupro   r   strvaluesr   r   )r   r   r`   r   r   sectionr   r6   r6   r7   write_entries  s    
r  c               
   C   sj   t dt tjdrftd>} | D ]2}t	d|}|r(t
|d  W  5 Q R  S q(W 5 Q R X dS )zd
    Get a -r### off of PKG-INFO Version in case this is an sdist of
    a subversion revision.
    z$get_pkg_info_revision is deprecated.zPKG-INFOzVersion:.*-r(\d+)\s*$r   r   )warningsr}   EggInfoDeprecationWarningr#   r$   r|   r   r   r&   r   intgroup)r   r   r   r6   r6   r7   get_pkg_info_revision  s    *r  c                   @   s   e Zd ZdZdS )r  zqClass for warning about deprecations in eggInfo in setupTools. Not ignored by default, unlike DeprecationWarning.N)rK   rL   rM   __doc__r6   r6   r6   r7   r    s   r  )F)=r  distutils.filelistr   Z	_FileListdistutils.errorsr   distutils.utilr   rh   r   r#   r&   r   r   r  rH   r]   Zsetuptools.externr   Zsetuptools.extern.six.movesr   
setuptoolsr   Zsetuptools.command.sdistr	   r
   Zsetuptools.command.setoptr   Zsetuptools.commandr   pkg_resourcesr   r   r   r   r   r   r   r   Zsetuptools.unicode_utilsr   Zsetuptools.globr   r   r   r8   r9   rO   r   r{   r   r   r   r   r   r  r  r  r  r  r  r6   r6   r6   r7   <module>   sX   (S 2 EP

