o
    pffe                     @   sR  d Z ddlmZmZmZ ddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZzddlmZ W n eya   zddlmZ W n ey^   dZY nw Y nw zddlmZ W n ey   zddlmZ W n ey   dZY nw Y nw ddlmZ ddlmZmZm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# ddlm$Z$m%Z% ddl&m'Z' ddl(m)Z)m*Z* ddl+m,Z,m-Z- ddl.m/Z/ ej0rddlm1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddlm<Z< ddl&m=Z= ddl>m?Z? ej@dddZAe
BdZCeD dkZEejFG dd deZGdS )zManage the filesystem provided by your OS.

In essence, an `OSFS` is a thin layer over the `io` and `os` modules
of the Python standard library.
    )absolute_importprint_functionunicode_literalsN)scandir)sendfile   )errors)fsdecodefsencodefspath)	url_quote)FS)copy_modified_time)ResourceType)convert_os_errors)FileExpectedNoURL)Info)Modevalidate_open_mode)basenamedirname)Permissions)IOAnyBinaryIO
CollectionDictIteratorListOptionalSupportsIntTextTuple)_OpendirFactory)RawInfo)SubFS_OOSFS)boundzfs.osfsWindowsc                       s  e Zd ZdZ			dE fdd	Zdd Zd	d
 Zdd Zedd Z	edd Z
ejejejejejejejejejejejejejejiZedd Zdd Zdd ZdFddZdd Z 		dGddZ!dHd d!Z"d"d# Z#d$d% Z$e%j&rydFd&d'Z'dId(d)Z(e)j*dd* d+k re+dure,j-e,j.e,j/e,j0e,j1e,j2hZ3e4e,d,re35e,j6 dJd-d.Z7ndJd/d.Z7e8rdFd0d1Z9ndFd2d1Z9		dKd3d4Z8d5d6 Z:dLd8d9Z;d:d; Z<d<d= Z=					>	dMd?d@Z>dAdB Z? fdCdDZ@  ZAS )Nr(   zCreate an OSFS.

    Examples:
        >>> current_directory_fs = OSFS('.')
        >>> home_fs = OSFS('~/')
        >>> windows_system32_fs = OSFS('c://system32')

    F  Tc              
      s
  t t|   t|trt|}|| _tj	tt
|\}}|r'||p%d n|}tj|r4tj|n|}tjtj|}|| _|rnztj|sVtj|t|d W n& tym } z
td|||d}~ww tj|s~d|}t|ddddtjjdd }	| _z#tjd	d
}
tj|
j |	d< W d   n1 sw   Y  W n ty   t  dkrtj!ddk|	d< Y nw t"rd#dd t$dD d |	d< dS d|	d< dtj%v rzt&t'|tj%d |	d< W dS  ty   Y dS w dS )a  Create an OSFS instance.

        Arguments:
            root_path (str or ~os.PathLike): An OS path or path-like object
                to the location on your HD you wish to manage.
            create (bool): Set to `True` to create the root directory if it
                does not already exist, otherwise the directory should exist
                prior to creating the ``OSFS`` instance (defaults to `False`).
            create_mode (int): The permissions that will be used to create
                the directory if ``create`` is `True` and the path doesn't
                exist, defaults to ``0o777``.
            expand_vars(bool): If `True` (the default) environment variables
                of the form ``~``, ``$name`` or ``${name}`` will be expanded.

        Raises:
            `fs.errors.CreateFailed`: If ``root_path`` does not
                exist, or could not be created.

        /modezunable to create {} ({})Nzroot path '{}' does not existFT)network	read_onlysupports_renamethread_safeunicode_pathsvirtualTmP)prefixcase_insensitiveDarwinAaaa c                 s   s    | ]}t |V  qd S N)sixunichr).0n rA   @/home/ertert/spirit/venv/lib/python3.10/site-packages/fs/osfs.py	<genexpr>   s    z OSFS.__init__.<locals>.<genexpr>   z\:*?"<>|invalid_path_chars PC_PATH_MAXmax_sys_path_length)(superr(   __init__
isinstancebytesr	   	root_pathospath
splitdriver   
expanduser
expandvarsnormpathabspath
_root_pathisdirmakedirsintOSErrorr   CreateFailedformatsupports_unicode_filenames_metatempfileNamedTemporaryFileexistsnamelower	Exceptionplatformsystemnormcase_WINDOWS_PLATFORMjoinrangepathconf_namespathconfr
   )selfrM   createcreate_modeexpand_vars_driverU   errormessager]   	_tmp_file	__class__rA   rB   rJ   [   sn   


	
zOSFS.__init__c                 C   s   d}| j j}||| jS )Nz{}({!r}))ru   __name__r[   rM   )rl   _fmt_class_namerA   rA   rB   __repr__   s   zOSFS.__repr__c                 C   s   d}| j j}|| | jS )Nz	<{} '{}'>)ru   rv   r[   rb   rM   )rl   fmtrx   rA   rA   rB   __str__   s   zOSFS.__str__c                 C   s(   t tj| j|ddtj}|S )z&Convert a FS path to a path on the OS.r,   )r
   rN   rO   rh   rU   lstripreplaceseprl   rO   sys_pathrA   rA   rB   _to_sys_path   s   zOSFS._to_sys_pathc                 C   sN   ddg|j |j|jt| |d}t|dd|d< trdnd}|j||< |S )z;Make a *details* info dict from an `os.stat_result` object.accessedmodified)_writer   r   sizetypest_birthtimeNcreatedmetadata_changed)st_atimest_mtimest_sizerX   _get_type_from_statgetattrrg   st_ctime)clsstat_resultdetails	ctime_keyrA   rA   rB   _make_details_from_stat   s   

zOSFS._make_details_from_statc                 C   s   i }t |jd |d< |j |d< }|j |d< }tsNddl}ddl}z
||j	|d< W n	 t
y7   Y nw z||j|d< W |S  t
yM   Y |S w |S )	z;Make an *access* info dict from an `os.stat_result` object.r-   permissionsgiduidr   Ngroupuser)r   st_modedumpst_gidst_uidrg   grppwdgetgrgidgr_nameKeyErrorgetpwuidpw_name)r   r   accessr   r   r   r   rA   rA   rB   _make_access_from_stat   s(   zOSFS._make_access_from_statc                 C   s    |j }t|}| j|tjS )z6Get the resource type from an `os.stat_result` object.)r   statS_IFMTSTAT_TO_RESOURCE_TYPEgetr   unknown)r   _statr   st_typerA   rA   rB   r      s   
zOSFS._get_type_from_statc                 C   sH   t tdr"ztrt|W S ttt|W S  ty!   Y d S w d S )Nreadlink)hasattrrN   rg   r   r	   r
   rY   )rl   r   rA   rA   rB   
_gettarget  s   
zOSFS._gettargetc                 C   s   |  |}d|iS )Ntarget)r   )rl   r   _targetrA   rA   rB   _make_link_info  s   
zOSFS._make_link_infoNc                    s  |    |pd}| |}| |}d  td| tt|d|v r,tt| W d    n1 s6w   Y  dt|t	j
di}d|v rS| |d< d|v rdfdd	tD |d< d|v ru fd
d	t D |d< d|v r| ||d< d|v r| |d< t|S )NrA   getinfolstatbasicra   is_dirr   r   c                    "   i | ]}| d r|t |qS st_
startswithr   r?   k)r   rA   rB   
<dictcomp>)  
    

z OSFS.getinfo.<locals>.<dictcomp>c                    r   r   r   r   )_lstatrA   rB   r   -  r   linkr   )checkvalidatepath
getsyspathr   rN   r   r
   r   r   S_ISDIRr   r   dirr   r   r   )rl   rO   
namespaces_pathr   inforA   )r   r   rB   r     s8   





zOSFS.getinfoc                 C   sf   |    | |}| |}td|dd tt|}W d    n1 s'w   Y  dd |D S )NlistdirT	directoryc                 S   s   g | ]}t |qS rA   )r	   )r?   ra   rA   rA   rB   
<listcomp>>  s    z OSFS.listdir.<locals>.<listcomp>)r   r   r   r   rN   r   r
   )rl   rO   r   r   namesrA   rA   rB   r   7  s   

zOSFS.listdirc                 C   s   |    t|}| |}| |}td|dd= zt|| W n' tyJ } z|j	t	j
kr6t||j	t	jkr?|r?n W Y d }~nd }~ww | |W  d    S 1 sZw   Y  d S )NmakedirTr   )r   r   get_moder   r   r   rN   mkdirrY   errnoENOENTr   ResourceNotFoundEEXISTopendir)rl   rO   r   recreater.   r   r   rq   rA   rA   rB   r   A  s$   



$zOSFS.makedirrc           	      K   s   t |}|  |   | |}|dkrt|| |}td|* tj	r8|j
r8t|tjtjB tjB }tj|f| |d|}W d    |S 1 sQw   Y  |S )Nr,   openbin)r.   	buffering)r   validate_binr   r   r   r   r   r   r=   PY2	exclusiverN   openO_RDWRO_CREATO_EXCLioto_platform_bin)	rl   rO   r.   r   options_moder   r   binary_filerA   rA   rB   r   X  s*   



zOSFS.openbinc                 C   s   |    | |}| |}td|J zt| W n9 tyT } z-|jtjkr9t	j
dkr9tj|r9t||jtjkrOt	j
dkrOtj|rOt| d }~ww W d    d S 1 s`w   Y  d S )Nremovewin32darwin)r   r   r   r   rN   r   rY   r   EACCESsysrd   rO   rV   r   r   EPERM)rl   rO   r   r   rq   rA   rA   rB   r   i  s$   



"zOSFS.removec                 C   sj   |    | |}|dkrt | |}td|dd t| W d    d S 1 s.w   Y  d S )Nr,   	removedirTr   )r   r   r   RemoveRootErrorr   r   rN   rmdirrl   rO   r   r   rA   rA   rB   r   |  s   

"zOSFS.removedirc                 C   s   d S r<   rA   )rl   rO   factoryrA   rA   rB   r     s   zOSFS.opendirc                 C   sp   |  |}|  |}| |tjurt||s#| |r#t|| t|tj	ur4t
t|||fS r<   )r   gettyper   filer   r   r`   DestinationExistsr   r   DirectoryExpected)rl   src_pathdst_path	overwrite	_src_path	_dst_pathrA   rA   rB   _check_copy  s   



zOSFS._check_copy   )      ENOTSUPc                 C   s^  | j  | |||\}}| || |}}z]t|dD}	t|d.}
|	 |
 }}t|j }}d}|dkrMt	||||}||7 }|dks>W d    n1 sWw   Y  W d    n1 sfw   Y  |rtt
| || | W n ty } z|j| jvr t|| W Y d }~nd }~ww W d    d S W d    d S 1 sw   Y  d S )Nr   wr   )_lockr   r   r   r   filenorN   fstatr   r   r   rY   r   _sendfile_error_codesshutilcopy2)rl   r   r   r   preserve_timer   r   _src_sys_dst_syssrcdstfd_srcfd_dstsentmaxsizeoffseterA   rA   rB   copy  s@   "z	OSFS.copyc                 C   sV   | j  | |||\}}t| || | W d    d S 1 s$w   Y  d S r<   )r  r   r  r	  r   )rl   r   r   r   r
  r   r   rA   rA   rB   r    s   "c           	   	   #   s   |    |pd}h d| }| |}tr)tj| j|d	dtj
}n| |}td|dd t|}zv|D ]h}dt|j| di}|rx| d	|v r\| |d	< d
|v rmfddtD |d
< d|v rx| |d< d|v r|jdd  fddt D |d< d|v r| tj||j|d< t|V  q=W tjdkr|  ntjdkr|  w w W d    d S 1 sw   Y  d S )NrA   >   r   r   r   r,   r   Tr   r   r   r   r   c                    r   r   r   r   r   rA   rB   r         
!OSFS._scandir.<locals>.<dictcomp>r   r   F)follow_symlinksc                    r   r   r   r   lstat_resultrA   rB   r     r  r   )r      )r   
isdisjointr   rg   rN   rO   rh   rU   r|   r}   r~   r   r   r   r	   ra   r   r   r   r   r   r   r   r   version_infoclose)	rl   rO   r   requires_statr   r   scandir_iter	dir_entryr   rA   r  r   rB   _scandir  sh   






%

"zOSFS._scandirc           	      #   sH   |    |pd}| |}| |}td|dd t|D ]q}t|}tj||}t	t
|d|t	jdi}d|v rJ| |d< d|v r[fd	d
tD |d< d|v rqt|  fdd
t D |d< d|v r| tj|||d< d|v r| |d< t|V  q W d    d S 1 sw   Y  d S )NrA   r   Tr   r   r   r   r   c                    r   r   r   r   r  rA   rB   r   )  r  r  r   c                    r   r   r   r   r  rA   rB   r   0  r  r   r   )r   r   r   r   rN   r   r	   rO   rh   r   r
   r   r   r   r   r   r   r   r   )	rl   rO   r   r   r   
entry_name_entry_name
entry_pathr   rA   r#  rB   r$    sF   







"c                 C   s0   | j ||d}|d ur|\}}t|||}|S )N)r   )r$  	itertoolsislice)rl   rO   r   page	iter_infostartendrA   rA   rB   r   >  s
   zOSFS.scandirc                 C   s$   t j| j|ddt j}|S )Nr,   )rN   rO   rh   rU   r|   r}   r~   r   rA   rA   rB   r   M  s    zOSFS.getsyspathdownloadc                 C   s<   |  |}|dkrd| S |dkrt|}d| S t||)Nr.  zfile://fszosfs://)r   r   r   )rl   rO   purposer   url_pathrA   rA   rB   geturlR  s   

zOSFS.geturlc                 C   sT   |    | |}td| t|}W d    n1 sw   Y  | |}|S )Nr   )r   r   r   rN   r   r   )rl   rO   r   r   resource_typerA   rA   rB   r   ]  s   

zOSFS.gettypec                 C   sj   |    | |}| |}| |st|td| tj	|W  d    S 1 s.w   Y  d S )Nislink)
r   r   r   r`   r   r   r   rN   rO   r4  r   rA   rA   rB   r4  f  s   




$zOSFS.islinkr;   c              	   K   s   t |}	t| |   | |}
|
dkrt|| |
}td|: tjr7|	j	r7t
|t
jt
jB t
jB }|p:d}tj|f|	 ||	jrHd n|||	jrOd n|d|W  d    S 1 s`w   Y  d S )Nr,   r   zutf-8)r.   r   encodingr   newline)r   r   r   r   r   r   r   r=   r   r   rN   r   r   r   r   r   to_platformbinary)rl   rO   r.   r   r5  r   r6  line_bufferingr   r   r   r   	_encodingrA   rA   rB   r   p  s.   

$z	OSFS.openc           
      C   s   |    | |}| |}tj|st|d|v rr|d }d|v s)d|v rtt	t
|d}t	t
|d|}t
|d u rC|n|}t
|}	|d usR|	d urvtd| t|||	f W d    d S 1 skw   Y  d S d S d S d S )Nr   r   r   setinfo)r   r   r   rN   rO   r`   r   r   typingcastfloatr   r   utime)
rl   rO   r   r   r   r   	_accessed	_modifiedr   r   rA   rA   rB   r;    s&   


"zOSFS.setinfoc              
      sN   zt | W n ty } ztj|dj||ddd}~ww tt| |S )z7Check path may be encoded, in addition to usual checks.zSpath '{path}' could not be encoded for the filesystem (check LANG env var); {error})rO   rq   )msgN)r
   UnicodeEncodeErrorr   InvalidCharsInPathr[   rI   r(   r   )rl   rO   rq   rt   rA   rB   r     s   zOSFS.validatepath)Fr+   Tr<   )NF)r   r   )F)FF)NN)r.  )r   r   NNr;   F)Brv   
__module____qualname____doc__rJ   ry   r{   r   classmethodr   r   r   S_IFDIRr   r   S_IFCHR	characterS_IFBLKblock_special_fileS_IFREGr   S_IFIFOfifoS_IFLNKsymlinkS_IFSOCKsocketr   r   r   r   r   r   r   r   r   r   r<  TYPE_CHECKINGr   r   r   r  r   r   EIOEINVALENOSYSEBADFENOTSOCK
EOPNOTSUPPr  r   addr  r  r   r$  r   r2  r   r4  r   r;  r   __classcell__rA   rA   rt   rB   r(   P   s    W




 






 
9,

	
!)HrG  
__future__r   r   r   r   r<  r   r   r(  loggingrN   rd   r  r=   r   r^   r   ImportErrorr   r;   r   	_fscompatr	   r
   r   
_url_toolsr   baser   r  r   enumsr   error_toolsr   r   r   r   r   r.   r   r   rO   r   r   r   r   rU  r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   subfsr&   TypeVarr'   	getLoggerlogre   rg   python_2_unicode_compatibler(   rA   rA   rA   rB   <module>   sp    4
