
|_`                 @   sd  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' j( Z( d d l) m* Z* d d l+ m, Z, d d   Z- Gd d   d e  Z. Gd d   d e  Z Gd d   d e  Z/ d d   Z0 d d   Z1 d d   Z2 d d    Z3 d! d"   Z4 d# d$   Z5 d% d&   Z6 d' d(   Z7 d) d* d+  Z8 d, d-   Z9 d. d/   Z: d S)0zUsetuptools.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)	packagingc             C   sd  d } |  j  t j j  } t j t j  } d | f } xt |  D]\ } } | t |  d k } | d k r | r | d 7} qG | d | | f 7} qG d } t |  }	 x| |	 k  r>| | }
 |
 d k r | | d 7} nJ|
 d	 k r | | 7} n1|
 d
 k r| d } | |	 k  r<| | d k r<| d } | |	 k  rb| | d k rb| d } x* | |	 k  r| | d k r| d } qeW| |	 k r| t j |
  7} q1| | d |  } d } | d d k rd } | d d  } | t j |  7} | d | f 7} | } n | t j |
  7} | d 7} q W| sG | | 7} qG Wt j | 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.*z
(?:%s+%s)*r   *?[!]^Nz[%s]z\Z(?ms))	splitospathsepreescape	enumeratelencompile)r   patchunksr"   Z
valid_charcchunk
last_chunkiZ	chunk_lencharZinner_iinnerZ
char_class r0   A/tmp/pip-build-3_sjtvrs/setuptools/setuptools/command/egg_info.pytranslate_pattern$   sT    



	r2   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$ d%   Z d& d'   Z d( S)-egg_infoz+create a distribution's .egg-info directory	egg-base=eLdirectory containing .egg-info directories (default: top of the source tree)tag-dated0Add date stamp (e.g. 20050528) to version number
tag-build=b-Specify explicit tag to add to version numberno-dateD"Don't include date stamp [default]c             C   sL   d  |  _  d  |  _ d  |  _ d  |  _ d  |  _ d |  _ d |  _ d  |  _ d  S)Nr   F)egg_nameegg_versionegg_baser3   	tag_buildtag_datebroken_egg_infovtags)selfr0   r0   r1   initialize_options   s    							zegg_info.initialize_optionsc             C   s   d  S)Nr0   )rG   r0   r0   r1   tag_svn_revision   s    zegg_info.tag_svn_revisionc             C   s   d  S)Nr0   )rG   valuer0   r0   r1   rI      s    c             C   sO   t  t d t  } |   } |  j   | 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.
        OrderedDictrC   r   rD   r3   N)getattrcollectionsdicttagsr   )rG   filenameZodictr3   r0   r0   r1   save_version_info   s
    	
zegg_info.save_version_infoc             C   s  t  |  j j    |  _ |  j   |  _ |  j   |  _ t |  j  } yK t	 | t
 j j  } | ri d n d } t t | |  j |  j f   Wn4 t k
 r t j j d |  j |  j f   Yn X|  j d  k r |  j j } | p i  j d t j  |  _ |  j d  t |  j  d |  _ |  j t j k rSt j j |  j |  j  |  _ d |  j k rl|  j   |  j |  j j _ |  j j } | d  k	 r| j  |  j j!   k r|  j | _" t |  j  | _# d  |  j _ d  S)Nz%s==%sz%s===%sz2Invalid distribution name or version syntax: %s-%sr   rB   z	.egg-info-)$r   distributionget_namer@   rO   rF   tagged_versionrA   r   
isinstancer   versionVersionlistr   
ValueError	distutilserrorsDistutilsOptionErrorrB   package_dirgetr    curdirensure_dirnamer   r3   r!   joincheck_broken_egg_infometadataZ_patched_distkeylower_version_parsed_version)rG   parsed_versionZ
is_versionspecdirspdr0   r0   r1   finalize_options   s8    !	
$zegg_info.finalize_optionsFc             C   si   | r |  j  | | |  nI t j j |  re | d k rX | rX t j d | |  d S|  j |  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)rG   whatrP   dataforcer0   r0   r1   write_or_delete_file   s    	zegg_info.write_or_delete_filec             C   s^   t  j d | |  t j r+ | j d  } |  j sZ t | d  } | j |  | j   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 %szutf-8wbN)	r   infor   PY3encodedry_runopenwriteclose)rG   rr   rP   rs   fr0   r0   r1   rn      s    		zegg_info.write_filec             C   s*   t  j d |  |  j s& t j |  d S)z8Delete `filename` (if not a dry run) after announcing itzdeleting %sN)r   rw   rz   r    unlink)rG   rP   r0   r0   r1   rq      s    	zegg_info.delete_filec             C   sE   |  j  j   } |  j r4 | j |  j  r4 t |  St | |  j  S)N)rS   get_versionrF   endswithr   )rG   rW   r0   r0   r1   rU     s    
zegg_info.tagged_versionc             C   s   |  j  |  j  |  j j } xX t d  D]J } | j d |  | j   } | |  | j t j	 j
 |  j | j   q) Wt j	 j
 |  j d  } t j	 j |  r |  j |  |  j   d  S)Nzegg_info.writers	installerznative_libs.txt)mkpathr3   rS   Zfetch_build_eggr   requireresolvenamer    r!   rb   ro   rq   find_sources)rG   r   epwriternlr0   r0   r1   run
  s    ,zegg_info.runc             C   s<   d } |  j  r | |  j  7} |  j r8 | t j d  7} | S)Nr   z-%Y%m%d)rC   rD   timestrftime)rG   rW   r0   r0   r1   rO     s    		zegg_info.tagsc             C   sJ   t  j j |  j d  } t |  j  } | | _ | j   | j |  _ d S)z"Generate SOURCES.txt manifest filezSOURCES.txtN)	r    r!   rb   r3   manifest_makerrS   manifestr   filelist)rG   Zmanifest_filenamemmr0   r0   r1   r   !  s
    	
zegg_info.find_sourcesc             C   s   |  j  d } |  j t j k r7 t j j |  j |  } t j j |  r t j d d d d d | |  j	  |  j	 |  _
 | |  _	 d  S)Nz	.egg-inforR   N   z
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.
)r@   rB   r    r`   r!   rb   ro   r   rp   r3   rE   )rG   Zbeir0   r0   r1   rc   )  s    zegg_info.check_broken_egg_infoN)r4   r5   r6   )r7   r8   r9   )r:   r;   r<   )r=   r>   r?   )__name__
__module____qualname__descriptionuser_optionsboolean_optionsnegative_optrH   propertyrI   setterrQ   rm   ru   rn   rq   rU   r   rO   r   rc   r0   r0   r0   r1   r3   v   s(   		/r3   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  |  j  |  \ } } } } | d k rt |  j d d j |   x| D]% } |  j |  sH t j d |  qH Wnc| d k r |  j d d j |   x:| D]% } |  j |  s t j d |  q Wn
| d k r&|  j d	 d j |   x| D]% } |  j |  s t j d
 |  q Wn| d k r|  j d d j |   x| D]% } |  j |  sSt j d |  qSWnX| d k r|  j d | d j |  f  x)| D]+ } |  j	 | |  st j d | |  qWn | d k rI|  j d | d j |  f  x | D]+ } |  j
 | |  st j d | |  qWn | d k r|  j d |  |  j |  st j d |  nO | d k r|  j d |  |  j |  st j 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_printrb   r   r   rp   r   global_includeglobal_excluderecursive_includerecursive_excluder   r   r   )rG   lineactionpatternsdirZdir_patternpatternr0   r0   r1   process_template_line<  sd    								
	
zFileList.process_template_linec             C   so   d } xb t  t |  j  d d d  D]A } | |  j |  r& |  j d |  j |  |  j | =d } q& W| S)z
        Remove all files from the file list that match the predicate.
        Return True if any matching files were removed
        Fr   z
 removing Tr   )ranger&   filesr   )rG   	predicatefoundr-   r0   r0   r1   _remove_files  s    &

zFileList._remove_filesc             C   s0   d d   t  |  D } |  j |  t |  S)z#Include files that match 'pattern'.c             S   s(   g  |  ] } t  j j |  s |  q Sr0   )r    r!   isdir).0r~   r0   r0   r1   
<listcomp>  s   	 z$FileList.include.<locals>.<listcomp>)r   extendbool)rG   r   r   r0   r0   r1   r     s    zFileList.includec             C   s   t  |  } |  j | j  S)z#Exclude files that match 'pattern'.)r2   r   match)rG   r   r   r0   r0   r1   r     s    zFileList.excludec             C   sN   t  j j | d |  } d d   t | d d D } |  j |  t |  S)zN
        Include all files anywhere in 'dir/' that match the pattern.
        z**c             S   s(   g  |  ] } t  j j |  s |  q Sr0   )r    r!   r   )r   r~   r0   r0   r1   r     s   	 z.FileList.recursive_include.<locals>.<listcomp>	recursiveT)r    r!   rb   r   r   r   )rG   r   r   Zfull_patternr   r0   r0   r1   r     s    zFileList.recursive_includec             C   s.   t  t j j | d |   } |  j | j  S)zM
        Exclude any file anywhere in 'dir/' that match the pattern.
        z**)r2   r    r!   rb   r   r   )rG   r   r   r   r0   r0   r1   r     s    zFileList.recursive_excludec             C   s)   t  j j |  } |  j |  t |  S)zInclude all files from 'dir/'.)r[   r   findallr   r   )rG   r   r   r0   r0   r1   r     s    zFileList.graftc             C   s+   t  t j j | d   } |  j | j  S)zFilter out files from 'dir/'.z**)r2   r    r!   rb   r   r   )rG   r   r   r0   r0   r1   r     s    zFileList.prunec                sg   |  j  d k r |  j   t t j j d |       f d d   |  j  D } |  j |  t |  S)z
        Include all files anywhere in the current directory that match the
        pattern. This is very inefficient on large file trees.
        Nz**c                s%   g  |  ] }   j  |  r |  q Sr0   )r   )r   r~   )r   r0   r1   r     s   	 z+FileList.global_include.<locals>.<listcomp>)allfilesr   r2   r    r!   rb   r   r   )rG   r   r   r0   )r   r1   r     s    
zFileList.global_includec             C   s+   t  t j j d |   } |  j | j  S)zD
        Exclude all files anywhere that match the pattern.
        z**)r2   r    r!   rb   r   r   )rG   r   r   r0   r0   r1   r     s    zFileList.global_excludec             C   sN   | j  d  r | d  d  } t |  } |  j |  rJ |  j j |  d  S)Nr   r   )r   r   
_safe_pathr   append)rG   itemr!   r0   r0   r1   r     s
    zFileList.appendc             C   s    |  j  j t |  j |   d  S)N)r   r   filterr   )rG   pathsr0   r0   r1   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)rY   r   r   r   )rG   r0   r0   r1   _repair  s    zFileList._repairc             C   s   d } t  j |  } | d  k r6 t j d |  d St  j | d  } | d  k rk t j | | d  d Sy, t j j |  s t j j |  r d SWn+ t k
 r t j | | t	 j
    Yn Xd  S)Nz!'%s' not %s encodable -- skippingz''%s' in unexpected encoding -- skippingFzutf-8T)unicode_utilsfilesys_decoder   rp   Z
try_encoder    r!   ro   UnicodeEncodeErrorsysgetfilesystemencoding)rG   r!   Zenc_warnZu_pathZ	utf8_pathr0   r0   r1   r     s    $zFileList._safe_pathN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r0   r0   r1   r   9  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_manifest)rG   r0   r0   r1   rH     s    			z!manifest_maker.initialize_optionsc             C   s   d  S)Nr0   )rG   r0   r0   r1   rm     s    zmanifest_maker.finalize_optionsc             C   s   t    |  _ t j j |  j  s+ |  j   |  j   t j j |  j  rT |  j	   |  j
   |  j j   |  j j   |  j   d  S)N)r   r   r    r!   ro   r   write_manifestadd_defaultstemplateZread_templateprune_file_listsortZremove_duplicates)rG   r0   r0   r1   r     s    



zmanifest_maker.runc             C   s"   t  j |  } | j t j d  S)N/)r   r   replacer    r"   )rG   r!   r0   r0   r1   _manifest_normalize  s    z"manifest_maker._manifest_normalizec                sY     j  j     f d d     j  j D } d   j }   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  |  ] }   j  |   q Sr0   )r   )r   r~   )rG   r0   r1   r     s   	 z1manifest_maker.write_manifest.<locals>.<listcomp>zwriting manifest file '%s'N)r   r   r   r   executern   )rG   r   msgr0   )rG   r1   r     s    zmanifest_maker.write_manifestc             C   s#   |  j  |  s t j |  |  d  S)N)_should_suppress_warningr	   rp   )rG   r   r0   r0   r1   rp   !  s    zmanifest_maker.warnc             C   s   t  j d |   S)z;
        suppress missing-file warnings from sdist
        zstandard file .*not found)r#   r   )r   r0   r0   r1   r   %  s    z'manifest_maker._should_suppress_warningc             C   s   t  j |   |  j j |  j  |  j j |  j  t t    } | r[ |  j j |  n t	 j
 j |  j  rz |  j   |  j d  } |  j j | j  d  S)Nr3   )r	   r   r   r   r   r   rY   r
   r   r    r!   ro   Zread_manifestget_finalized_commandr   r3   )rG   ZrcfilesZei_cmdr0   r0   r1   r   ,  s    
zmanifest_maker.add_defaultsc             C   sy   |  j  d  } |  j j   } |  j j | j  |  j j |  t j t j	  } |  j j
 d | d | d d d  S)Nbuildz(^|z)(RCS|CVS|\.svn)Zis_regexr   )r   rS   get_fullnamer   r   
build_baser#   r$   r    r"   Zexclude_pattern)rG   r   base_dirr"   r0   r0   r1   r   8  s    zmanifest_maker.prune_file_listN)r   r   r   r   rH   rm   r   r   r   rp   staticmethodr   r   r   r0   r0   r0   r1   r     s   r   c          	   C   sH   d j  |  } | j d  } t |  d   } | j |  Wd QRXd S)z{Create a file with the specified name and write 'contents' (a
    sequence of strings without line terminators) to it.
    
zutf-8rv   N)rb   ry   r{   r|   )rP   contentsr~   r0   r0   r1   rn   B  s    rn   c             C   s   t  j d |  |  j s |  j j } |  j | j | _ } |  j | j | _ } z | j	 |  j
  Wd  | | | _ | _ Xt |  j d d   } t j |  j
 |  d  S)Nz
writing %sZzip_safe)r   rw   rz   rS   rd   rA   rW   r@   r   write_pkg_infor3   rL   r   Zwrite_safety_flag)cmdbasenamerP   rd   ZoldverZoldnamesafer0   r0   r1   r   O  s    	r   c             C   s#   t  j j |  r t j d  d  S)NzsWARNING: 'depends.txt' is not used by setuptools 0.6!
Use the install_requires/extras_require setup() args instead.)r    r!   ro   r   rp   )r   r   rP   r0   r0   r1   warn_depends_obsoletea  s    r   c             C   sD   t  | p f   } d d   } t | t |   } |  j |  d  S)Nc             S   s   |  d S)Nr   r0   )r   r0   r0   r1   <lambda>k  s    z%_write_requirements.<locals>.<lambda>)r   r   sorted
writelines)streamreqslinesZ	append_crr0   r0   r1   _write_requirementsi  s    r   c             C   s   |  j  } t j   } t | | j  | j p1 i  } x> t |  D]0 } | j d j t	      t | | |  qA W|  j
 d | | j    d  S)Nz
[{extra}]
requirements)rS   r   StringIOr   Zinstall_requiresextras_requirer   r|   formatvarsru   getvalue)r   r   rP   distrs   r   extrar0   r0   r1   write_requirementsp  s    	r   c             C   s9   t    } t | |  j j  |  j d | | j    d  S)Nzsetup-requirements)r   r   rS   Zsetup_requiresru   r   )r   r   rP   rs   r0   r0   r1   write_setup_requirements{  s    	r   c             C   sO   t  j d d   |  j j   D  } |  j d | d j t |   d  d  S)Nc             S   s&   g  |  ] } | j  d  d  d  q S).r   r   )r   )r   kr0   r0   r1   r     s   	z(write_toplevel_names.<locals>.<listcomp>ztop-level namesr   )rN   fromkeysrS   Ziter_distribution_namesrn   rb   r   )r   r   rP   pkgsr0   r0   r1   write_toplevel_names  s    	r   c             C   s   t  |  | | d  d  S)NT)	write_arg)r   r   rP   r0   r0   r1   overwrite_arg  s    r   Fc             C   sd   t  j j |  d } t |  j | d   } | d  k	 rJ d j |  d } |  j | | | |  d  S)Nr   r   )r    r!   splitextrL   rS   rb   ru   )r   r   rP   rt   ZargnamerJ   r0   r0   r1   r     s
    r   c             C   s   |  j  j } t | t j  s* | d  k r3 | } n | d  k	 r g  } x t | j    D]k \ } } t | t j  s t j | |  } d j	 t t
 t | j      } | j d | | f  qX Wd j	 |  } |  j d | | d  d  S)Nr   z	[%s]
%s

r   zentry pointsT)rS   entry_pointsrV   r   string_typesr   itemsr   parse_grouprb   r   strvaluesr   ru   )r   r   rP   r   rs   sectionr   r0   r0   r1   write_entries  s    	$r   c              C   s{   t  j d t  t j j d  rw t j d  C }  x9 |  D]1 } t j	 d |  } | r; t
 | j d   Sq; WWd QRXd 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   Nr   )warningsrp   DeprecationWarningr    r!   ro   ior{   r#   r   intgroup)r~   r   r   r0   r0   r1   get_pkg_info_revision  s    r  );__doc__distutils.filelistr   Z	_FileListZdistutils.errorsr   distutils.utilr   r[   r   r    r#   r   r  r   r   rM   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   pkg_resources.externr   r2   r3   r   rn   r   r   r   r   r   r   r   r   r   r  r0   r0   r0   r1   <module>   sN   :RI
