a
    h                      @   s@   d dl Z ddlmZ ddlmZ ddlmZ G dd deZdS )	    N   )AbstractFileSystem)infer_storage_options   )
MemoryFilec                       s   e Zd ZdZdZdZdZd fdd	Zedd	 Z	d
d Z
dd Zedd Zedd ZdddZdddZdddZ  ZS ) GistFileSystema9  
    Interface to files in a single GitHub Gist.

    Provides read-only access to a gist's files. Gists do not contain
    subdirectories, so file listing is straightforward.

    Parameters
    ----------
    gist_id : str
        The ID of the gist you want to access (the long hex value from the URL).
    filenames : list[str] (optional)
        If provided, only make a file system representing these files, and do not fetch
        the list of all files for this gist.
    sha : str (optional)
        If provided, fetch a particular revision of the gist. If omitted,
        the latest revision is used.
    username : str (optional)
        GitHub username for authentication (required if token is given).
    token : str (optional)
        GitHub personal access token (required if username is given).
    timeout : (float, float) or float, optional
        Connect and read timeouts for requests (default 60s each).
    kwargs : dict
        Stored on `self.request_kw` and passed to `requests.get` when fetching Gist
        metadata or reading ("opening") a file.
    Zgistz&https://api.github.com/gists/{gist_id}z,https://api.github.com/gists/{gist_id}/{sha}Nc                    sr   t    || _|| _|| _|d u |d u A r<|s4|r<td|| _|| _|| _|d urZ|nd| _	| 
 | jd< d S )Nz2Auth requires both username and token, or neither.)<   r    )super__init__gist_id	filenamessha
ValueErrorusernametoken
request_kwtimeout_fetch_file_listdircache)selfr   r   r   r   r   r   kwargs	__class__ I/var/www/auris/lib/python3.9/site-packages/fsspec/implementations/gist.pyr   (   s    

zGistFileSystem.__init__c                 C   s0   | j dur*| jdur*d| j | jfi| jS | jS )z?Auth parameters passed to 'requests' if we have username/token.Nauth)r   r   r   )r   r   r   r   kwC   s    zGistFileSystem.kwc                 C   s|   | j r| jj| j| j d}n| jj| jd}tj|fd| ji| j}|j	dkrlt
d| j d| j pdd |  | S )z[
        Fetch the JSON metadata for this gist (possibly for a specific revision).
        )r   r   )r   r     zGist not found: @Zlatest)r   gist_rev_urlformatr   gist_urlrequestsgetr   r   status_codeFileNotFoundErrorraise_for_statusjson)r   urlrr   r   r   _fetch_gist_metadataJ   s    
z#GistFileSystem._fetch_gist_metadatac              	   C   s   |   }| jrH|di }i }| jD ] }||vr8t||| ||< q$n|di }g }| D ]4\}}|du rrq`||d|dd|dd q`|S )zz
        Returns a list of dicts describing each file in the gist. These get stored
        in self.dircache[""].
        filesNfilesizer   raw_url)nametyper.   r/   )r+   r   r$   r&   itemsappend)r   metaZavailable_filesr,   fnoutfnamefinfor   r   r   r   [   s*    

zGistFileSystem._fetch_file_listc                 C   s   t |d|}|dS )z=
        Remove 'gist://' from the path, if present.
        path/)r   r$   lstrip)clsr9   r   r   r   _strip_protocol{   s    zGistFileSystem._strip_protocolc                 C   s   t | }i }d|v r(|d r(|d |d< d|v rD|d rD|d |d< d|v r`|d r`|d |d< d|v r|d r|d ddd	d
 }t|dkr|d r|d |d< |d r|d g|d< |S )z
        Parse 'gist://' style URLs into GistFileSystem constructor kwargs.
        For example:
          gist://:TOKEN@<gist_id>/file.txt
          gist://username:TOKEN@<gist_id>/file.txt
        r   passwordr   hostr   r9   r:   r   Nr   r   r   r   )r   rsplitlen)r9   sor6   
path_partsr   r   r   _get_kwargs_from_urls   s     z$GistFileSystem._get_kwargs_from_urlsr	   Fc                    sh   |   p
d  dkr"| jd }n(| jd } fdd|D }|sJt |rR|S tdd |D S dS )a  
        List files in the gist. Gists are single-level, so any 'path' is basically
        the filename, or empty for all files.

        Parameters
        ----------
        path : str, optional
            The filename to list. If empty, returns all files in the gist.
        detail : bool, default False
            If True, return a list of dicts; if False, return a list of filenames.
        r	   c                    s   g | ]}|d   kr|qS r0   r   .0fr9   r   r   
<listcomp>       z%GistFileSystem.ls.<locals>.<listcomp>c                 s   s   | ]}|d  V  qdS )r0   Nr   rG   r   r   r   	<genexpr>   rL   z$GistFileSystem.ls.<locals>.<genexpr>N)r=   r   r&   sorted)r   r9   Zdetailr   results	all_filesr   rJ   r   ls   s    
zGistFileSystem.lsrbc           	         s   |dkrt d|    fdd| jd D }|s>t |d }|d}|sbtd  tj|fd	| ji| j}|jd
krt |	  t
 d|jS )z3
        Read a single file from the gist.
        rR   z'GitHub Gist FS is read-only (no write).c                    s   g | ]}|d   kr|qS rF   r   rG   rJ   r   r   rK      rL   z(GistFileSystem._open.<locals>.<listcomp>r	   r   r/   zNo raw_url for file: r   r   N)NotImplementedErrorr=   r   r&   r$   r#   r   r   r%   r'   r   content)	r   r9   mode
block_sizer   matchesr8   r/   r*   r   rJ   r   _open   s    


zGistFileSystem._openraisec           
      K   s   | j ||d}i }|D ]}z<| |d}| ||< W d   n1 sJ0    Y  W q ty }	 z,|dkrt|	n|dkr~n|	||< W Y d}	~	qd}	~	0 0 q|S )z
        Return {path: contents} for the given file or files. If 'recursive' is True,
        and path is empty, returns all files in the gist.
        )	recursiverR   NrY   Zomit)Zexpand_pathopenreadr&   )
r   r9   rZ   Zon_errorr   pathsr6   prI   er   r   r   cat   s    . zGistFileSystem.cat)NNNNN)r	   F)rR   N)FrY   )__name__
__module____qualname____doc__protocolr"   r    r   propertyr   r+   r   classmethodr=   staticmethodrE   rQ   rX   r`   __classcell__r   r   r   r   r      s*        
 




r   )r#   specr   utilsr   Zmemoryr   r   r   r   r   r   <module>   s   