o
    #if3:                     @   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w zddlmZ W n eyU   ed Y nw zddlmZ W n eyl   ed	 Y nw zdd
lmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ W n ey   ed Y n
w ddl%Z%e%&e" dd Z'dd Z(ddddZ)dd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)AzureFileSystemr   )HadoopFileSystemr   )GcsFileSystemr   )
AwsDefaultS3RetryStrategyAwsStandardS3RetryStrategyS3FileSystem
S3LogLevelS3RetryStrategyensure_s3_initializedfinalize_s3ensure_s3_finalizedinitialize_s3resolve_s3_regionr   Nc                 C   s$   | t v rtd| td| )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!   C/var/www/html/corbot_env/lib/python3.10/site-packages/pyarrow/fs.py__getattr__I   s   r#   c                 C   s^   t | \}}||}|r-||gd }|jtjkr(t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prefixprefix_infor!   r!   r"   _filesystem_from_strU   s   

r/   Fuse_mmapc                C   s   t | tr| S t | tr|rtdt| S zdd l}W n	 ty%   Y nw t | |jr>t| j	dkr8t
|dS tt| S tdt| )NzXSpecifying to use memory mapping not supported for filesystem specified as an URI stringr   r   r0   zlUnrecognized filesystem: {}. `filesystem` argument must be a FileSystem instance or a valid file system URI')
isinstancer   strr)   r/   fsspecr   AbstractFileSystemr'   __name__r   r   FSSpecHandler	TypeErrorr   )r,   r1   r4   r!   r!   r"   _ensure_filesystemi   s.   


r9   )
memory_mapc             
   C   s:  t | s|durtd|| fS |dur6t||d}t|tr$t| } n	t| ts-td|| } || fS t| } t|d}z|	| }W n tyS   d}d}Y nw |j
tjk}|szt| \}} W || fS  ty } zdt|vr}dt|vr W Y d}~|| fS W Y d}~|| fS d}~ww || } || 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 schemezCannot parse URI)r   r)   r9   r2   r   r   r3   r8   r%   r&   r'   r   NotFoundr   r$   )r*   r,   r:   	file_infoexists_locallyer!   r!   r"   _resolve_filesystem_and_path   sR   







r?   i   T)
chunk_sizeuse_threadsc                C   sj   t | |\}}t ||\}}	||}
|
jtjkr*t|dd}t||||	|| dS 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)r?   r&   r'   r   r(   r   r   r   )sourcedestinationsource_filesystemdestination_filesystemr@   rA   	source_fssource_pathdestination_fsdestination_pathr<   
source_selr!   r!   r"   
copy_files   s"   8
rM   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 )+r7   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)selfrO   r!   r!   r"   __init__  s   
zFSSpecHandler.__init__c                 C   s   t |tr| j|jkS tS rN   r2   r7   rO   NotImplementedrP   otherr!   r!   r"   __eq__     
zFSSpecHandler.__eq__c                 C   s   t |tr| j|jkS tS rN   rR   rT   r!   r!   r"   __ne__#  rW   zFSSpecHandler.__ne__c                 C   s$   | j j}t|tr|d }d|S )Nr   z
fsspec+{0})rO   protocolr2   listr   )rP   rY   r!   r!   r"   get_type_name(  s   

zFSSpecHandler.get_type_namec                 C   s   |S rN   r!   rP   r*   r!   r!   r"   r%   .  s   zFSSpecHandler.normalize_pathc                 C   sR   |d }|d dkrt j}n|d dkrt j}d }nt j}t| |||dd dS )Nsizer'   file	directorymtime)r]   r`   )r   Filer(   Unknownr   get)r*   infor]   ftyper!   r!   r"   _create_file_info1  s   zFSSpecHandler._create_file_infoc              	   C   sZ   g }|D ]&}z| j |}W n ty    |t|tj Y qw || || q|S rN   )rO   rd   FileNotFoundErrorappendr   r   r;   rf   )rP   pathsinfosr*   rd   r!   r!   r"   r&   >  s   zFSSpecHandler.get_file_infoc           	      C   s   | j |js| j |jrt|j|jrg S t|j|jr#d }nd}g }| j j|j|ddd}|	 D ]\}}|
d}|j
d}||krR|| || q6|S )N   T)maxdepthwithdirsdetail/)rO   isdirbase_direxistsNotADirectoryErrorallow_not_foundrg   rC   finditemsstriprh   rf   )	rP   selectorrl   rj   selected_filesr*   rd   _pathrq   r!   r!   r"   get_file_info_selectorI  s(   



z$FSSpecHandler.get_file_info_selectorc                 C   s,   z| j j||d W d S  ty   Y d S w )N)create_parents)rO   mkdirFileExistsError)rP   r*   rC   r!   r!   r"   
create_dirf  s
   zFSSpecHandler.create_dirc                 C   s   | j j|dd d S NTrB   )rO   rmr\   r!   r!   r"   
delete_dirm  s   zFSSpecHandler.delete_dirc                 C   st   z
| j j|dd}W n ty   |rY d S  w |D ]}| j |r+| j j|dd q| j |r7| j | qd S )NF)rn   TrB   )rO   listdirrg   rp   r   isfile)rP   r*   missing_dir_oksubpathssubpathr!   r!   r"   _delete_dir_contentsp  s   z"FSSpecHandler._delete_dir_contentsc                 C   s*   | ddkrtd|d| || d S )Nro    z$delete_dir_contents called on path '')rw   r)   r   )rP   r*   r   r!   r!   r"   delete_dir_contents}  s
   z!FSSpecHandler.delete_dir_contentsc                 C   s   |  d d S )Nro   )r   )rP   r!   r!   r"   delete_root_dir_contents  s   z&FSSpecHandler.delete_root_dir_contentsc                 C   s$   | j |s
t|| j | d S rN   )rO   rr   rg   r   r\   r!   r!   r"   delete_file  s   zFSSpecHandler.delete_filec                 C   s   | j j||dd d S r   )rO   mvrP   srcdestr!   r!   r"   move  s   zFSSpecHandler.movec                 C   s   | j || d S rN   )rO   copyr   r!   r!   r"   	copy_file  s   zFSSpecHandler.copy_filec                 C   8   ddl m} | j|st||| jj|ddddS Nr   
PythonFilerbmoderpyarrowr   rO   r   rg   openrP   r*   r   r!   r!   r"   open_input_stream     zFSSpecHandler.open_input_streamc                 C   r   r   r   r   r!   r!   r"   open_input_file  r   zFSSpecHandler.open_input_filec                 C   $   ddl m} || jj|ddddS )Nr   r   wbr   wr   r   rO   r   rP   r*   metadatar   r!   r!   r"   open_output_stream     z FSSpecHandler.open_output_streamc                 C   r   )Nr   r   abr   r   r   r   r!   r!   r"   open_append_stream  r   z FSSpecHandler.open_append_streamN)r6   
__module____qualname____doc__rQ   rV   rX   r[   r%   staticmethodrf   r&   r{   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   r7     s.    
r7   rN   )NN)-r   pyarrow.utilr   r   pyarrow._fsr   r   r   r   r   r	   r
   r   r   r   r   	FileStatsr   pyarrow._azurefsr   r   rh   pyarrow._hdfsr   pyarrow._gcsfsr   pyarrow._s3fsr   r   r   r   r   r   r   r   r   r   atexitregisterr#   r/   r9   r?   rM   r7   r!   r!   r!   r"   <module>   sH   44
;K