a
    XyaI                     @   sL   d dl mZ d dlmZ d dlmZ d dlZd dlmZ G dd de	Z
dS )    )mktime)parse)OrderedDictN)DestionationPathExistsc                   @   sX   e Zd ZdZdd ZdddZddd	Zdd
dZdd ZdddZ	dd Z
dd ZdS )
Downloaderz7
    Download files from your Anaconda repository.
    c                 C   s   || _ || _|| _d S N)aserver_apiusernamenotebook)selfr   r	   r
    r   Glib/python3.9/site-packages/binstar_client/utils/notebook/downloader.py__init__   s    zDownloader.__init__.Fc                 C   s   || _ |   | ||S r   )outputensure_outputdownload_files)r   package_typesr   forcer   r   r   __call__   s    zDownloader.__call__c                 C   sb   || _ |   t }|  D ]@}|dp,d}||v r| ||rP|||d < qt|d q|S )z
        This additional method was created to better handle the log output
        as files are downloaded one by one on the commands/download.py.
        type basename)r   r   r   
list_filesgetcan_downloadr   )r   r   r   r   filesfpkg_typer   r   r   list_download_files   s    zDownloader.list_download_filesc                 C   sb   g }|   D ]L}|dpd}||v r| ||rL| | ||d  qt|d qt|S )Nr   r   r   )r   r   r   downloadappendr   sorted)r   r   r   r   r   r   r   r   r   r   *   s    
zDownloader.download_filesc                 C   s   |d }| j | j| j|d |}tjtj|s`zttj| W n t	y^   Y n0 t
tj| j|d*}|dD ]}|| qW d   n1 s0    Y  dS )z.
        Download file into location.
        r   versionwbi   N)r   r    r	   r
   ospathexistsdirnamemakedirsOSErroropenjoinr   Ziter_contentwrite)r   distfilenameZrequests_handleZfdoutchunkr   r   r   r    7   s    zDownloader.downloadc                 C   s"   t jt j| j|d  p |S )z
        Can download if location/file does not exist or if force=True
        :param dist:
        :param force:
        :return: True/False
        r   )r%   r&   r'   r,   r   )r   r.   r   r   r   r   r   J   s    zDownloader.can_downloadc                 C   s   t j| jst | j dS )z2
        Ensure output's directory exists
        N)r%   r&   r'   r   r)   )r   r   r   r   r   S   s    zDownloader.ensure_outputc              
   C   s   g }i }| j | j| jd }|D ]2}|d |v rF||d  | q"|g||d < q"| D ]d\}}z|t|dd d W q^ ty   |t|dd d Y q^   ||d  Y q^0 q^|S )zY
        List available files in a project (aka notebook).
        :return: list
        r   r   c                 S   s   t | d S )Nr#   )intxr   r   r   <lambda>l       z'Downloader.list_files.<locals>.<lambda>)keyc                 S   s   t t| d  S )NZupload_time)r   r   Z	timetupler2   r   r   r   r4   o   r5   )r   packager	   r
   r!   itemsmax
ValueError)r   r   tmpr   r   r   Zversionsr   r   r   r   Z   s"    zDownloader.list_filesN)r   F)r   F)F)F)__name__
__module____qualname____doc__r   r   r   r   r    r   r   r   r   r   r   r   r   	   s   



	r   )timer   Zdateutil.parserr   collectionsr   r%   Zbinstar_client.errorsr   objectr   r   r   r   r   <module>   s
   