
!dVnB                 @   s  d  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 y d d l	 Z	 Wn! e
 k
 r d d l j	 Z	 Yn Xd d l Z e j Z e j 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 d	 d l m Z m Z d	 d l  m! Z! d	 d l" m# Z# m$ Z$ d	 d l% m& Z& d	 d l' m Z m% Z% d d   Z( d d   Z) Gd d   d e  Z* d S)zI
Create a wheel (.whl) distribution.

A wheel is a built archive format.
    N)rmtree)	Generator)get_platform)Command)get_python_version)log   )get_abbr_implget_impl_ver)nativeopen_for_csv)archive_wheelfile)read_pkg_infowrite_pkg_info)pkginfo_to_dict)
pep425tagsmetadatac             C   s   t  |   j d d  S)N-_)	safe_namereplace)name r   2/tmp/pip-build-0jahl3lb/wheel/wheel/bdist_wheel.py
safer_name+   s    r   c             C   s   t  |   j d d  S)Nr   r   )safe_versionr   )versionr   r   r   safer_version.   s    r   c               @   s9  e  Z d  Z d Z d= d d d e   f d d	 d
 d f d> d? d@ dA dB dC d d d e   d f g
 Z d d d d g Z d d    Z d! d"   Z	 e
 d# d$    Z d% d&   Z d' d(   Z d) d*   Z d+ e j d, d- d.  Z d/ d0   Z d1 d2   Z d3 d4   Z d5 d6   Z d7 d8   Z d9 d:   Z d; d<   Z d S)Dbdist_wheelzcreate a wheel distribution
bdist-dir=b1temporary directory for creating the distributionz
plat-name=pz;platform name to embed in generated filenames (default: %s)z	keep-tempkz/keep the pseudo-installation tree around after z!creating the distribution archive	dist-dir=d-directory to put final built distributions in
skip-buildN2skip rebuilding everything (for testing/debugging)relative6build the archive using relative paths(default: false)owner=u@Owner name used when creating a tar file [default: current user]group=gAGroup name used when creating a tar file [default: current group]	universal'make a universal wheel (default: false)zpython-tag=z7Python implementation compatibility tag (default: py%s)r   c             C   s   d  |  _  d  |  _ d  |  _ d |  _ d |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _	 d |  _
 d  |  _ d  |  _ d |  _ d t   d |  _ d  S)NzipFpyr   )	bdist_dirdata_dir	plat_nameformat	keep_tempdist_dirdistinfo_diregginfo_dirroot_is_purelib
skip_buildr)   ownergroupr1   r
   
python_tag)selfr   r   r   initialize_optionsT   s    														zbdist_wheel.initialize_optionsc             C   s   |  j  d  k r< |  j d  j } t j j | d  |  _  n  |  j d |  _ d } |  j d t	 | |   |  j
 j   |  _ |  j
 j d  } d | k r | d d j   } | j   d k r d |  _ q n  d  S)Nbdistwheelz.datar:   r7   r>   r1   r   1trueyesT)zdist_dirz	plat_namez
skip_build)rF   ztruezyes)r5   get_finalized_command
bdist_baseospathjoinwheel_dist_namer6   set_undefined_optionsr3   distributionis_purer=   get_option_dictstriplowerr1   )rB   rJ   Zneed_optionsrE   valr   r   r   finalize_optionse   s    	zbdist_wheel.finalize_optionsc             C   s1   d j  t |  j j    t |  j j    f  S)z4Return distribution full name with - replaced with _r   )rM   r   rP   get_namer   get_version)rB   r   r   r   rN   {   s    zbdist_wheel.wheel_dist_namec             C   s
  t  j   } |  j j   rH |  j r- d } n	 |  j } | d d f } n |  j } | d  k ri t   } n  | j d d  j d d  } t	   } t
   } t j   j d d  } | j d  r d	 | j d d
  d } n  | | | | f } | | d k st  | S)Nzpy2.py3noneanyr   r   .SOABIzcpython-cpr   r   )r   get_supportedrP   rQ   r1   rA   r7   r   r   r	   r
   	sysconfigget_config_varsget
startswithrsplitAssertionError)rB   supported_tagsimpltagr7   Z	impl_nameimpl_verabi_tagr   r   r   get_tag   s$    						zbdist_wheel.get_tagc             C   s2   |  j    \ } } } d |  j | | | f } | S)z%Return archive name without extensionz%s-%s-%s-%s)rk   rN   )rB   impl_tagrj   plat_tagarchive_basenamer   r   r   get_archive_basename   s    
z bdist_wheel.get_archive_basenamec       
      C   s  |  j  d  } d | _ |  j s1 |  j d  n  |  j  d d d } |  j | _ d | _ |  j | _ d | _ |  j  d  } d | _ x4 d D], } t	 | d | t
 j j |  j |   q Wd } t
 j d k r t
 j j |  j d  } | |  _ |  _ n  t	 | |  j rd n d |  t j d |  j  |  j d  |  j   } t
 j j |  j |  } |  j sw|  j } n$ t
 j j |  j |  j | j   } |  j d d  t
 j j |  j d |  j  |  _ |  j |  j |  j  |  j |  j  |  j |  j |  j  t
 j j  |  j  s1t
 j! |  j  n  t" | |  }	 d t
 j# k rot$ j% t
 j# d d |	 g  n  t& |  j' d g   j( d t)   |	 f  |  j* s|  j+ rt j d |  j  qt, |  j  n  d  S) Nbuild_scriptspythonbuildinstallreinit_subcommandsTFinstall_scriptsheadersscriptsdatapurelibplatlibinstall_ ntz..install_purelibinstall_platlibzinstalling to %sinstall_egg_infotargetr<   z%s.dist-infoZ
WHEEL_TOOLsign
dist_filesr   zremoving %s)zheaderszscriptszdatazpurelibzplatlib)ztargetzegginfo_dir)-reinitialize_command
executabler>   run_commandr5   rootcompilewarn_dirno_epsetattrrK   rL   rM   r6   r   install_libbaseinstall_libr=   loggerinforo   r:   r)   _ensure_relativeinstall_baserO   rN   r;   egg2distr<   write_wheelfilewrite_recordexistsmakedirsr   environ
subprocesscallgetattrrP   appendr   r9   dry_runr   )
rB   rp   rs   ru   keyZbasedir_observedrn   Zpseudoinstall_rootZarchive_root
wheel_namer   r   r   run   sf    								

 		zbdist_wheel.runzbdist_wheel ()c             C   s  d d l  m } |   } d | d <| | d <t |  j  j   | d <|  j   \ } } } xg | j d  D]V } xM | j d  D]< }	 x3 | j d  D]" }
 d j | |	 |
 f  | d	 <q Wq Wqk Wt j	 j | d
  } t
 j d |  t | d    } t | d d j |  Wd  QXd  S)Nr   )Messagez1.0zWheel-Versionr   zRoot-Is-Purelibr[   r   ZTagWHEELzcreating %swmaxheaderlen)Zemail.messager   strr=   rT   rk   splitrM   rK   rL   r   r   openr   flatten)rB   Zwheelfile_base	generatorr   msgrl   rj   rm   rg   abiplatZwheelfile_pathfr   r   r   r      s    	

(zbdist_wheel.write_wheelfilec             C   sL   t  j j |  \ } } | d d  t  j k rH | | d d   } n  | S)Nr   r   )rK   rL   
splitdrivesep)rB   rL   driver   r   r   r     s    zbdist_wheel._ensure_relativec             C   s   t  j | |  S)N)r   Zpkginfo_to_metadata)rB   egg_info_pathpkginfo_pathr   r   r   _pkginfo_to_metadata  s    z bdist_wheel._pkginfo_to_metadatac             C   s.   |  j  j d  } d | k r" d S| d d S)zFReturn license filename from a license-file key in setup.cfg, or None.r   license_fileNr   )rP   rR   )rB   r   r   r   r   r     s    zbdist_wheel.license_filec             c   s   |  j  j d  } xn d
 D]f \ } } | | k r7 q n  | | } x; | d j   D]) } | j   } | sp qR n  | | f VqR Wq Wd S)a5  Generate requirements from setup.cfg as
        ('Requires-Dist', 'requirement; qualifier') tuples. From a metadata
        section in setup.cfg:

        [metadata]
        provides-extra = extra1
            extra2
        requires-dist = requirement; qualifier
            another; qualifier2
            unqualified

        Yields

        ('Provides-Extra', 'extra1'),
        ('Provides-Extra', 'extra2'),
        ('Requires-Dist', 'requirement; qualifier'),
        ('Requires-Dist', 'another; qualifier2'),
        ('Requires-Dist', 'unqualified')
        r   provides_extraProvides-Extrarequires_distRequires-Distr   Nr   r   zrequires_distr   )r   r   )rP   rR   
splitlinesrS   )rB   r   r   titlefieldliner   r   r   setupcfg_requirements!  s    
z!bdist_wheel.setupcfg_requirementsc             C   s   t  |  j    } | s d St |  } d | k s@ d | k r^ t j d  | d =| d =n  x | D] \ } } | | | <qe Wt | |  d S)z@Add additional requirements from setup.cfg to file metadata_pathNzProvides-ExtrazRequires-Distz5setup.cfg requirements overwrite values from setup.py)listr   r   warningswarnr   )rB   metadata_path
additionalpkg_infor#   vr   r   r   add_requirementsC  s     
zbdist_wheel.add_requirementsc             C   s  d d   } | |  t  j j |  s d d l } t  j j t  j j |  d  } | j |  } d | f } | r t  j j | d  } | d | f 7} n  t |   n  t  j j |  r | }	 |  j	 | |  }
 t  j
 |  n t  j j | d  }	 |  j	 | |	  }
 t j | | d	 d
 d   t  j j | d  } t | d  j   j   sj| |  n  t t  j j | d  |
  t  j j | d  } |  j |  t  j j | d  } t | d |  j } d | k rOd } | j d  } t  j j | |  } t | d   } | j | j d   Wd QX| | d d d d <n  |  j   } | rd } t j | t  j j |  j |   | | d d d d <n  t | d   } t j | |  Wd QX| |  d S)z:Convert an .egg-info directory into a .dist-info directoryc             S   sm   t  j j |   rG t  j j |   rG t  j j |   rG t j |   n" t  j j |   ri t  j |   n  d S)z-Appropriately delete directory, file or link.N)rK   rL   r   islinkisdirshutilr   unlink)r"   r   r   r   adiosR  s    7z#bdist_wheel.egg2dist.<locals>.adiosr   Nz
*.egg-infoz)Egg metadata expected at %s but not foundz- (%s found - possible misnamed archive file?)zPKG-INFOignorec             S   s
   t  d  S)NPKG-INFOrequires.txtSOURCES.txtnot-zip-safe)r   r   r   r   )set)xyr   r   r   <lambda>v  s     z&bdist_wheel.egg2dist.<locals>.<lambda>zdependency_links.txtrMETADATAzmetadata.jsonrP   descriptionzDESCRIPTION.rstwbzutf-8
extensionszpython.detailsZdocument_nameszLICENSE.txtlicenser   )rK   rL   r   globrM   dirnamebasename
ValueErrorisfiler   mkdirr   copytreer   readrS   r   r   r   rP   popwriteencoder   copyr;   jsondump)rB   Zegginfo_pathZdistinfo_pathr   r   patpossibleerrZaltr   r   dependency_linksr   Zmetadata_json_pathZpymetaZdescription_filenameZdescription_textZdescription_pathZdescription_filer   Zlicense_filenameZmetadata_jsonr   r   r   r   P  sX    
!		"zbdist_wheel.egg2distc                se  d d l  m } t j j | d  } t j j |       f d d   }  f d d   } t | d   } t j |  } x |   D] }	 t j j |	    }
 | |
  r d	 } d	 } n[ t	 |	 d
   } | j
   } Wd  QXt j |  j   } d t | |   } t |  } t j j |	    j t j j d  } | j | | | f  q WWd  QXd  S)Nr   )urlsafe_b64encodeRECORDc              3   sL   xE t  j    D]4 \ }  } } x" | D] } t  j j |  |  Vq& Wq Wd  S)N)rK   walkrL   rM   )dirdirsfilesr   )r5   r   r   r     s    z&bdist_wheel.write_record.<locals>.walkc                s
   |    k S)z!Wheel hashes every possible file.r   )rL   )record_relpathr   r   skip  s    z&bdist_wheel.write_record.<locals>.skipzw+r|   rbzsha256=/)Z
wheel.utilr   rK   rL   rM   relpathr   csvwriterr   r   hashlibsha256digestr   lenr   r   writerow)rB   r5   r;   r   Zrecord_pathr   r   Zrecord_filer   rL   r   hashsizer   rx   r   r   )r5   r   r   r     s(    		zbdist_wheel.write_record)r   r    r!   )r$   r%   r&   )r'   Nr(   )zrelativeNr*   )r+   r,   r-   )r.   r/   r0   )z	universalNr2   )__name__
__module____qualname__r   r   r
   user_optionsboolean_optionsrC   rV   propertyrN   rk   ro   r   rE   __version__r   r   r   r   r   r   r   r   r   r   r   r   r   1   sN    
      S"Pr   )+__doc__r   r   rK   r   r   r   r   rE   r`   ImportErrordistutils.sysconfigpkg_resourcesr   r   r   email.generatorr   distutils.utilr   distutils.corer   r   	distutilsr   r   r   r	   r
   utilr   r   archiver   Zpkginfor   r   r   r   r|   r   r   r   r   r   r   r   <module>   s<   		