
    c                         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  G d de          Z G d de          ZdS )zDownload related providers.    )print_functionN)IOLoop)FileDownloader)
unpack_zip)SimpleStatus)EnvVarProviderProviderAnalysis)PROVIDE_MODE_CHECK)_new_error_recorderc                   "     e Zd ZdZ fdZ xZS )_DownloadProviderAnalysisz9Subtype of ProviderAnalysis showing if a filename exists.c                 j    t          t          |                               |||           || _        d S N)superr   __init__existing_filename)selfconfigmissing_to_configuremissing_to_provider   	__class__s        Ylib/python3.11/site-packages/anaconda_project/requirements_registry/providers/download.pyr   z"_DownloadProviderAnalysis.__init__   s6    '..77@TVhiii!2    )__name__
__module____qualname____doc__r   __classcell__r   s   @r   r   r      s>        CC3 3 3 3 3 3 3 3 3r   r   c                   N     e Zd ZdZ fdZ fdZ fdZd Z fdZd	dZ	 xZ
S )
DownloadProviderz8Downloads a file according to the specified requirement.c                     t          t          |                               |||||          }d|v sJ |d         dk    sJ |d         dk    rd|d<   |S )z)Override superclass to return our config.sourcedefaultunsetdownload)r   r!   read_config)r   requirementenvironlocal_state_filedefault_env_spec_name	overridesr   r   s          r   r'   zDownloadProvider.read_config!   s|    '..::;Qa;PR[] ] 6!!!!h9,,,,(w& 	*)F8r   c                     t          t          |                               ||||||           d|v r)|d         dk    r|                    |j        d           dS dS dS )zDOverride superclass to clear out environ if we decide not to use it.r#   r)   N)r   r!   set_config_values_as_stringspopenv_var)r   r(   r)   r*   r+   r,   valuesr   s          r   r.   z-DownloadProvider.set_config_values_as_strings.   s     	%%BB;PWYiCXZcek	m 	m 	m v 	3&"2i"? 	3 KK+T22222	3 	3 	3 	3r   c                 >   t          t          |                               |||||          }t          j                            |d         |j                  }t          j                            |          r|}nd}t          |j	        |j
        |j        |          S )z?Override superclass to store additional fields in the analysis.PROJECT_DIRN)r   )r   r!   analyzeospathjoinfilenameexistsr   r   missing_env_vars_to_configuremissing_env_vars_to_provide)
r   r(   r)   r*   r+   r,   analysisr8   r   r   s
            r   r4   zDownloadProvider.analyze>   s    )40088gO_av9BD D7<< 68LMM7>>(## 	% ( $()1)O)1)M;LN N N 	Nr   c           	         |j         j        j        }|*|                    d                    |                     |S t
          j                            t
          j                            |j	        d         |j
                            }|j        r|dz   }n|}t          |j        ||j                  }	 t          d          }|                    |j                  }|6|j        D ]}	|                    |	           	 |                                 d S |j        dk    r|j        `|j        |j        k    rP|                    d                    |j        |j        |j                             	 |                                 d S |j        rng }
t1          |||
          r*t          j        |           ||                                 S |
D ]}	|                    |	           	 |                                 d S ||                                 S |                    d	                    |j        |j                             	 |                                 d S # t4          $ rZ}|                    d
                    |j        t7          |                               Y d }~|                                 d S d }~ww xY w# |                                 w xY w)Nz(Previously downloaded file located at {}r3   z.zip)urlr8   hash_algorithmF)make_current   zEError downloading {}: mismatched hashes. Expected: {}, calculated: {}z&Error downloading {}: response code {}zError downloading {}: {})statusr<   r   infoformatr5   r6   abspathr7   r)   r8   unzipr   r>   r?   r   run_syncrunerrorserrorclosecode
hash_valuehashr   remove	Exceptionstr)r   r(   contextfrontendr8   download_filenamer&   _ioloopresponserJ   unzip_errorses               r   _provide_downloadz"DownloadProvider._provide_downloadL   s   >*< 	MMDKKHUUVVVO7??27<<0NP[Pd#e#eff 	) (6 1 (!ko+<1<1KM M M	%000G''55H %_ * *ENN5)))). MMOOOOO- #% )  +:PT\Ta:a  NN#j#q#q#)?$P $P Q Q Q$ MMOOOOO# $ $#%L!"3X|LL $	"3444' MMOOOO &2 2 2E$NN51111# MMOOOOO   MMOOOO GNN{`h`mnnooo
 MMOOOOO	  	 	 	NN5<<[_cRSffUUVVV444MMOOOOO		 MMOOOOsJ   7AI  AI  /I  I   I  3I   
K*;J?%K ?KK Kc                    t          t          |                               ||          }|j        t          k    r|S t          |j                  }|j        |j        vs|j	        j
        j        d         dk    r(|                     |||          }|||j        |j        <   |                    |                                          S )zOverride 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&   N)rI   )r   r!   providemoder
   r   rS   r0   r)   rB   r<   r   rY   copy_with_additions
pop_errors)r   r(   rR   super_resultrS   r8   r   s         r   r[   zDownloadProvider.providez   s     -t44<<['RR<-- 	  'w'788go5 	@9P9WX`9aeo9o 	@--k7HMMH @7? 34//x7J7J7L7L/MMMr   Nc           
      0   |d         }t           j                            t           j                            ||j                            }	 t           j                            |          rt          j        |           nHt           j                            |          rt          j	        |           nt          dd|z            S t          dd|z            S # t          $ r/}t          dd|dt          |          d	          cY d
}~S d
}~ww xY w)z2Override superclass to delete the downloaded file.r3   Tz-No need to remove %s which wasn't downloaded.)successdescriptionzRemoved downloaded file %s.FzFailed to remove z: .N)r5   r6   rE   r7   r8   isdirshutilrmtreeisfilerO   r   rP   rQ   )	r   r(   r)   r*   r,   requirement_statusproject_dirr8   rX   s	            r   	unprovidezDownloadProvider.unprovide   s/   m,7??27<<[=Q#R#RSS
	nw}}X&& nh'''')) n	(#####D1`ck1kn n n n;X[c;ceeee 	n 	n 	nZbZbZbdghidjdjdjdj<kmmmmmmmmm	ns%   A;C C 
D&$D
DDr   )r   r   r   r   r'   r.   r4   rY   r[   rj   r   r   s   @r   r!   r!      s        BB    3 3 3 3 3 N N N N N, , ,\N N N N N*n n n n n n n nr   r!   )r   
__future__r   r5   re   tornado.ioloopr   %anaconda_project.internal.http_clientr   "anaconda_project.internal.ziputilsr   'anaconda_project.internal.simple_statusr   /anaconda_project.requirements_registry.providerr   r	   anaconda_project.provider
   anaconda_project.frontendr   r   r!    r   r   <module>rt      s(   " ! % % % % % % 				  ! ! ! ! ! ! @ @ @ @ @ @ 9 9 9 9 9 9 @ @ @ @ @ @ \ \ \ \ \ \ \ \ 7 7 7 7 7 7 9 9 9 9 9 93 3 3 3 3 0 3 3 3~n ~n ~n ~n ~n~ ~n ~n ~n ~n ~nr   