a
    ,gh8                     @   s:  d Z ddlmZmZ ddlmZmZmZmZm	Z	m
Z
mZmZmZmZmZ eZg ZzddlmZ W n ey|   ed Y n0 zddlmZ W n ey   ed Y n0 z ddlmZmZmZmZmZ W n ey   ed	 Y n0 e  d
d Zdd ZdddZ dddZ!ddddddZ"G dd deZ#dS )zO
FileSystem abstraction to interact with various local and remote filesystems.
    )_is_path_like_stringify_path)FileSelectorFileTypeFileInfo
FileSystemLocalFileSystemSubTreeFileSystem_MockFileSystemFileSystemHandlerPyFileSystem_copy_files_copy_files_selector)HadoopFileSystemr   )GcsFileSystemr   )S3FileSystem
S3LogLevelinitialize_s3finalize_s3resolve_s3_regionr   c                 C   s(   | t v rtd| td| d S )Nz<The pyarrow installation is not built with support for '{0}'z*module 'pyarrow.fs' has no attribute '{0}')_not_importedImportErrorformatAttributeError)name r   Z/mounts/lovelace/software/anaconda3/envs/metaDMG/lib/python3.9/site-packages/pyarrow/fs.py__getattr__?   s    r   c                 C   s^   t | \}}||}|rZ||gd }|jtjkrPtd|jj	|j
| t||}|S )Nr   zThe path component of the filesystem URI must point to a directory but it has a type: `{}`. The path component is `{}` and the given filesystem URI is `{}`)r   from_urinormalize_pathget_file_infotyper   	Directory
ValueErrorr   r   pathr	   )uri
filesystemprefixZprefix_infor   r   r   _filesystem_from_strK   s    

r(   Fc                 C   s   t | tr| S t | tr,|r$tdt| S zdd l}W n tyJ   Y n20 t | |jr|t| j	dkrpt
|dS tt| S dd lm} t | |j
rt
|dS |rt | |jr| S tdt| d S )NzXSpecifying to use memory mapping not supported for filesystem specified as an URI stringr   r   )use_mmapzlUnrecognized filesystem: {}. `filesystem` argument must be a FileSystem instance or a valid file system URI')
isinstancer   strr#   r(   fsspecr   ZAbstractFileSystemr!   __name__r   r   FSSpecHandlerZpyarrow.filesystemr&   	TypeErrorr   )r&   r)   allow_legacy_filesystemr,   Zlegacyfsr   r   r   _ensure_filesystem_   s4    



r1   Nc              
   C   s  t | s |durtd|| fS |durpt||d}t|trHt| } nt| tsZtd|sh|| } || fS t| } t }z|	| }W n ty   d}d}Y n0 |j
tjk}|szt| \}} W n2 ty } zdt|vr W Y d}~n
d}~0 0 n
|| } || fS )z`
    Return filesystem/path from path which could be an URI or a plain
    filesystem path.
    Nzg'filesystem' passed but the specified path is file-like, so there is nothing to open with 'filesystem'.)r0   zPExpected string path; path-like objects are only allowed with a local filesystemFzempty scheme)r   r#   r1   r*   r   r   r+   r/   r   r    r!   r   NotFoundr   r   )r$   r&   r0   	file_infoZexists_locallyer   r   r   _resolve_filesystem_and_path   sF    





r5   i   T)
chunk_sizeuse_threadsc                C   sh   t | |\}}t ||\}}	||}
|
jtjkrRt|dd}t||||	|| nt||||	|| dS )a  
    Copy files between FileSystems.

    This functions allows you to recursively copy directories of files from
    one file system to another, such as from S3 to your local machine.

    Parameters
    ----------
    source : string
        Source file path or URI to a single file or directory.
        If a directory, files will be copied recursively from this path.
    destination : string
        Destination file path or URI. If `source` is a file, `destination`
        is also interpreted as the destination file (not directory).
        Directories will be created as necessary.
    source_filesystem : FileSystem, optional
        Source filesystem, needs to be specified if `source` is not a URI,
        otherwise inferred.
    destination_filesystem : FileSystem, optional
        Destination filesystem, needs to be specified if `destination` is not
        a URI, otherwise inferred.
    chunk_size : int, default 1MB
        The maximum size of block to read before flushing to the
        destination file. A larger chunk_size will use more memory while
        copying but may help accommodate high latency FileSystems.
    use_threads : bool, default True
        Whether to use multiple threads to accelerate copying.

    Examples
    --------
    Inspect an S3 bucket's files:

    >>> s3, path = fs.FileSystem.from_uri(
    ...            "s3://registry.opendata.aws/roda/ndjson/")
    >>> selector = fs.FileSelector(path)
    >>> s3.get_file_info(selector)
    [<FileInfo for 'registry.opendata.aws/roda/ndjson/index.ndjson':...]

    Copy one file from S3 bucket to a local directory:

    >>> fs.copy_files("s3://registry.opendata.aws/roda/ndjson/index.ndjson",
    ...               "file:///{}/index_copy.ndjson".format(local_path))

    >>> fs.LocalFileSystem().get_file_info(str(local_path)+
    ...                                    '/index_copy.ndjson')
    <FileInfo for '.../index_copy.ndjson': type=FileType.File, size=...>

    Copy file using a FileSystem object:

    >>> fs.copy_files("registry.opendata.aws/roda/ndjson/index.ndjson",
    ...               "file:///{}/index_copy.ndjson".format(local_path),
    ...               source_filesystem=fs.S3FileSystem())
    T	recursiveN)r5   r    r!   r   r"   r   r   r   )sourceZdestinationZsource_filesystemZdestination_filesystemr6   r7   Z	source_fssource_pathZdestination_fsZdestination_pathr3   Z
source_selr   r   r   
copy_files   s"    8
r<   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*S )+r.   a   
    Handler for fsspec-based Python filesystems.

    https://filesystem-spec.readthedocs.io/en/latest/index.html

    Parameters
    ----------
    fs : FSSpec-compliant filesystem instance.

    Examples
    --------
    >>> PyFileSystem(FSSpecHandler(fsspec_fs)) # doctest: +SKIP
    c                 C   s
   || _ d S N)fs)selfr>   r   r   r   __init__  s    zFSSpecHandler.__init__c                 C   s   t |tr| j|jkS tS r=   r*   r.   r>   NotImplementedr?   otherr   r   r   __eq__"  s    
zFSSpecHandler.__eq__c                 C   s   t |tr| j|jkS tS r=   rA   rC   r   r   r   __ne__'  s    
zFSSpecHandler.__ne__c                 C   s$   | j j}t|tr|d }d|S )Nr   z
fsspec+{0})r>   protocolr*   listr   )r?   rG   r   r   r   get_type_name,  s    
zFSSpecHandler.get_type_namec                 C   s   |S r=   r   r?   r$   r   r   r   r   2  s    zFSSpecHandler.normalize_pathc                 C   sR   |d }|d dkrt j}n|d dkr4t j}d }nt j}t| |||dd dS )Nsizer!   file	directorymtime)rK   rN   )r   Filer"   Unknownr   get)r$   inforK   Zftyper   r   r   _create_file_info5  s    zFSSpecHandler._create_file_infoc              	   C   sZ   g }|D ]L}z| j |}W n$ ty@   |t|tj Y q0 || || q|S r=   )r>   rR   FileNotFoundErrorappendr   r   r2   rS   )r?   pathsinfosr$   rR   r   r   r   r    B  s    zFSSpecHandler.get_file_infoc                 C   s   | j |js<| j |jr(t|jn|jr2g S t|j|jrHd }nd}g }| j j|j|ddd}|	 D ]\}}|
| || qn|S )N   T)maxdepthZwithdirsdetail)r>   isdirbase_direxistsNotADirectoryErrorZallow_not_foundrT   r9   finditemsrU   rS   )r?   selectorrY   rW   Zselected_filesr$   rR   r   r   r   get_file_info_selectorM  s     

z$FSSpecHandler.get_file_info_selectorc                 C   s,   z| j j||d W n ty&   Y n0 d S )N)Zcreate_parents)r>   mkdirFileExistsError)r?   r$   r9   r   r   r   
create_dire  s    zFSSpecHandler.create_dirc                 C   s   | j j|dd d S NTr8   )r>   rmrJ   r   r   r   
delete_dirl  s    zFSSpecHandler.delete_dirc                 C   sx   z| j j|dd}W n ty2   |r,Y d S  Y n0 |D ]:}| j |rZ| j j|dd q8| j |r8| j | q8d S )NF)rZ   Tr8   )r>   listdirrT   r[   rg   isfile)r?   r$   missing_dir_okZsubpathssubpathr   r   r   _delete_dir_contentso  s    z"FSSpecHandler._delete_dir_contentsc                 C   s*   | ddkrtd|d| || d S )N/ z$delete_dir_contents called on path '')stripr#   rm   )r?   r$   rk   r   r   r   delete_dir_contents|  s
    z!FSSpecHandler.delete_dir_contentsc                 C   s   |  d d S )Nrn   )rm   )r?   r   r   r   delete_root_dir_contents  s    z&FSSpecHandler.delete_root_dir_contentsc                 C   s$   | j |st|| j | d S r=   )r>   r]   rT   rg   rJ   r   r   r   delete_file  s    zFSSpecHandler.delete_filec                 C   s   | j j||dd d S rf   )r>   mvr?   srcdestr   r   r   move  s    zFSSpecHandler.movec                 C   s   | j || d S r=   )r>   copyrv   r   r   r   	copy_file  s    zFSSpecHandler.copy_filec                 C   s8   ddl m} | j|s t||| jj|ddddS Nr   
PythonFilerbmoderpyarrowr~   r>   rj   rT   openr?   r$   r~   r   r   r   open_input_stream  s    zFSSpecHandler.open_input_streamc                 C   s8   ddl m} | j|s t||| jj|ddddS r|   r   r   r   r   r   open_input_file  s    zFSSpecHandler.open_input_filec                 C   s$   ddl m} || jj|ddddS )Nr   r}   wbr   wr   r~   r>   r   r?   r$   metadatar~   r   r   r   open_output_stream  s    z FSSpecHandler.open_output_streamc                 C   s$   ddl m} || jj|ddddS )Nr   r}   abr   r   r   r   r   r   r   open_append_stream  s    z FSSpecHandler.open_append_streamN)r-   
__module____qualname____doc__r@   rE   rF   rI   r   staticmethodrS   r    rb   re   rh   rm   rr   rs   rt   ry   r{   r   r   r   r   r   r   r   r   r.     s,   
r.   )FF)NF)NN)$r   Zpyarrow.utilr   r   Zpyarrow._fsr   r   r   r   r   r	   r
   r   r   r   r   Z	FileStatsr   Zpyarrow._hdfsr   r   rU   Zpyarrow._gcsfsr   Zpyarrow._s3fsr   r   r   r   r   r   r(   r1   r5   r<   r.   r   r   r   r   <module>   s8   4  
* 
> K