ó
¼S]c           @  sÔ   d  Z  d d l m 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 m Z d d	 l m Z d d
 l m Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   s   Download related providers.iÿÿÿÿ(   t   print_functionN(   t   IOLoop(   t   FileDownloader(   t
   unpack_zip(   t   SimpleStatus(   t   EnvVarProvidert   ProviderAnalysis(   t   PROVIDE_MODE_CHECK(   t   _new_error_recordert   _DownloadProviderAnalysisc           B  s   e  Z d  Z d „  Z RS(   s9   Subtype of ProviderAnalysis showing if a filename exists.c         C  s)   t  t |  ƒ j | | | ƒ | |  _ d  S(   N(   t   superR	   t   __init__t   existing_filename(   t   selft   configt   missing_to_configuret   missing_to_provideR   (    (    sX   lib/python2.7/site-packages/anaconda_project/requirements_registry/providers/download.pyR      s    (   t   __name__t
   __module__t   __doc__R   (    (    (    sX   lib/python2.7/site-packages/anaconda_project/requirements_registry/providers/download.pyR	      s   t   DownloadProviderc           B  sG   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z	 RS(   s8   Downloads a file according to the specified requirement.c         C  sm   t  t |  ƒ j | | | | | ƒ } d | k s6 t ‚ | d d k sL t ‚ | d d k ri d | d <n  | S(   s)   Override superclass to return our config.t   sourcet   defaultt   unsett   download(   R
   R   t   read_configt   AssertionError(   R   t   requirementt   environt   local_state_filet   default_env_spec_namet	   overridesR   (    (    sX   lib/python2.7/site-packages/anaconda_project/requirements_registry/providers/download.pyR   #   s    c         C  s[   t  t |  ƒ j | | | | | | ƒ d | k rW | d d k rW | j | j d ƒ n  d S(   sD   Override superclass to clear out environ if we decide not to use it.R   R   N(   R
   R   t   set_config_values_as_stringst   popt   env_vart   None(   R   R   R   R   R   R   t   values(    (    sX   lib/python2.7/site-packages/anaconda_project/requirements_registry/providers/download.pyR    0   s    c   	      C  s€   t  t |  ƒ j | | | | | ƒ } t j j | d | j ƒ } t j j | ƒ r[ | } n d } t	 | j
 | j | j d | ƒS(   s?   Override superclass to store additional fields in the analysis.t   PROJECT_DIRR   N(   R
   R   t   analyzet   ost   patht   joint   filenamet   existsR#   R	   R   t   missing_env_vars_to_configuret   missing_env_vars_to_provide(	   R   R   R   R   R   R   t   analysisR*   R   (    (    sX   lib/python2.7/site-packages/anaconda_project/requirements_registry/providers/download.pyR&   @   s    			c         C  s  | j  j j } | d  k	 r5 | j d j | ƒ ƒ | St j j t j j	 | j
 d | j ƒ ƒ } | j rv | d } n | } t d | j d | d | j ƒ } zjy-t d t ƒ } | j | j ƒ } | d  k rõ x | j D] }	 | j |	 ƒ qÚ Wd  S| j d k r©| j d  k	 rN| j | j k rN| j d	 j | j | j | j ƒ ƒ d  S| j r¥g  }
 t | | |
 ƒ r€t j | ƒ | Sx |
 D] }	 | j |	 ƒ q‡Wd  Sn  | S| j d
 j | j | j ƒ ƒ d  SWn6 t k
 r} | j d j | j t | ƒ ƒ ƒ d  SXWd  | j ƒ  Xd  S(   Ns(   Previously downloaded file located at {}R%   s   .zipt   urlR*   t   hash_algorithmt   make_currentiÈ   sE   Error downloading {}: mismatched hashes. Expected: {}, calculated: {}s&   Error downloading {}: response code {}s   Error downloading {}: {}(   t   statusR.   R   R#   t   infot   formatR'   R(   t   abspathR)   R   R*   t   unzipR   R/   R0   R   t   Falset   run_synct   runt   errorst   errort   codet
   hash_valuet   hashR   t   removet	   Exceptiont   strt   close(   R   R   t   contextt   frontendR*   t   download_filenameR   t   _ioloopt   responseR;   t   unzip_errorst   e(    (    sX   lib/python2.7/site-packages/anaconda_project/requirements_registry/providers/download.pyt   _provide_downloadO   sL    +	 !	"	c         C  sµ   t  t |  ƒ j | | ƒ } | j t k r. | St | j ƒ } | j | j k sh | j	 j
 j d d k rŸ |  j | | | ƒ } | d k	 rŸ | | j | j <qŸ n  | j d | j ƒ  ƒ S(   s°   Override superclass to start a download..

        If it locates a downloaded file with matching checksum, it sets the
        requirement's env var to that filename.

        R   R   R:   N(   R
   R   t   providet   modeR   R   RD   R"   R   R2   R.   R   RJ   R#   t   copy_with_additionst
   pop_errors(   R   R   RC   t   super_resultRD   R*   (    (    sX   lib/python2.7/site-packages/anaconda_project/requirements_registry/providers/download.pyRK   |   s    +c   	      C  sÞ   | d } t  j j t  j j | | j ƒ ƒ } yv t  j j | ƒ rS t j | ƒ n9 t  j j | ƒ ru t  j	 | ƒ n t
 d t d d | ƒ St
 d t d d | ƒ SWn3 t k
 rÙ } t
 d t d d | t | ƒ f ƒ SXd S(   s2   Override superclass to delete the downloaded file.R%   t   successt   descriptions-   No need to remove %s which wasn't downloaded.s   Removed downloaded file %s.s   Failed to remove %s: %s.N(   R'   R(   R5   R)   R*   t   isdirt   shutilt   rmtreet   isfileR?   R   t   TrueR@   R7   RA   (	   R   R   R   R   R   t   requirement_statust   project_dirR*   RI   (    (    sX   lib/python2.7/site-packages/anaconda_project/requirements_registry/providers/download.pyt	   unprovide‘   s    
$N(
   R   R   R   R   R    R&   RJ   RK   R#   RY   (    (    (    sX   lib/python2.7/site-packages/anaconda_project/requirements_registry/providers/download.pyR       s   				-	(   R   t
   __future__R    R'   RS   t   tornado.ioloopR   t%   anaconda_project.internal.http_clientR   t"   anaconda_project.internal.ziputilsR   t'   anaconda_project.internal.simple_statusR   t/   anaconda_project.requirements_registry.providerR   R   t   anaconda_project.provideR   t   anaconda_project.frontendR   R	   R   (    (    (    sX   lib/python2.7/site-packages/anaconda_project/requirements_registry/providers/download.pyt   <module>   s   