
    ob3                     `   d Z ddlmZmZmZ ddlZddl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 ddlmZmZ ej0                  rHddlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z,  ejZ                  dd      Z. edddg      Z/ G d de      Z0y)z2Manage several filesystems through a single view.
    )absolute_importprint_functionunicode_literalsN)OrderedDict
namedtuple)
itemgetter)	text_type   )errors)FS)check_writable)open_fs)abspathnormpath)IOAnyBinaryIO
CollectionIteratorListMutableMapping
MutableSetOptionalTextTuple)ResourceType)InfoRawInfo)Permissions)SubFSMMultiFS)bound_PrioritizedFSpriorityfsc                   D    e Zd ZdZddddZd* fd	Zd Zd Zd+dZd	 Z	d
 Z
d Zd Zd Zd Zd,dZd Zd-dZd Z	 	 d.dZd/dZd Zd Z	 	 d0dZd Zd-dZd1dZd Zd Zd Zd2dZd Zd2d Z d! Z!d" Z"d# Z# fd$Z$	 	 d.d%Z%	 	 	 	 	 d3d&Z&d-d'Z'd( Z(	 	 	 d4d)Z) xZ*S )5r"   zA filesystem that delegates to a sequence of other filesystems.

    Operations on the MultiFS will try each 'child' filesystem in order,
    until it succeeds. In effect, creating a filesystem that combines
    the files and dirs of its children.

    TF)virtual	read_onlycase_insensitivec                     t         t        |           || _        d| _        d| _        d| _        i | _        d| _        d| _	        y)zCreate a new MultiFS.

        Arguments:
            auto_close (bool): If `True` (the default), the child
                filesystems will be closed when `MultiFS` is closed.

        Nr   F)
superr"   __init___auto_closewrite_fs_write_fs_name_sort_index_filesystems_fs_sequence_closed)self
auto_close	__class__s     ,/usr/lib/python3/dist-packages/fs/multifs.pyr-   zMultiFS.__init__7   sH     	gt%'%"     c                     | j                   ryy)Nz	MultiFS()zMultiFS(auto_close=False))r.   r5   s    r8   __repr__zMultiFS.__repr__J   s    .r9   c                      y)Nz	<multifs> r;   s    r8   __str__zMultiFS.__str__Q   s    r9   c                 (   t        |t              rt        |      }t        |t              st	        d      t        || j                  f|      | j                  |<   | xj                  dz  c_        | j                          |r|| _	        || _
        yy)a  Add a filesystem to the MultiFS.

        Arguments:
            name (str): A unique name to refer to the filesystem being
                added.
            fs (FS or str): The filesystem (instance or URL) to add.
            write (bool): If this value is True, then the ``fs`` will
                be used as the writeable FS (defaults to False).
            priority (int): An integer that denotes the priority of the
                filesystem being added. Filesystems will be searched in
                descending priority order and then by the reverse order
                they were added. So by default, the most recently added
                filesystem will be looked at first.

        z,fs argument should be an FS object or FS URL)r%   r&   r
   N)
isinstancer	   r   r   	TypeErrorr$   r1   r2   _resortr/   r0   )r5   namer&   writer%   s        r8   add_fszMultiFS.add_fsU   s    " b)$B"b!JKK"0 0 01b#
$ 	ADM"&D r9   c                 4    | j                   |   j                  S )a+  Get a filesystem from its name.

        Arguments:
            name (str): The name of a filesystem previously added.

        Returns:
            FS: the filesystem added as ``name`` previously.

        Raises:
            KeyError: If no filesystem with given ``name`` could be found.

        )r2   r&   )r5   rD   s     r8   get_fszMultiFS.get_fsv   s       &)))r9   c                     d| _         y)z0Force `iterate_fs` to re-sort on next reference.N)r3   r;   s    r8   rC   zMultiFS._resort   s     !r9   c                     | j                   Nt        | j                  j                         t	        d      d      D cg c]  \  }\  }}||f c}}}| _         t        | j                         S c c}}}w )z7Get iterator that returns (name, fs) in priority order.r
   T)keyreverse)r3   sortedr2   itemsr   iter)r5   rD   _orderr&   s       r8   
iterate_fszMultiFS.iterate_fs   su     $ +1%%++-:a=$+! !&D,62 r
!D D%%&&!s    A0c                 ^    | j                         D ]  \  }}|j                  |      s|c S  y)z(Get a filesystem which has a given path.N)rQ   exists)r5   path_namer&   s       r8   	_delegatezMultiFS._delegate   s3     * 	IE2yy		 r9   c                 V    | j                  |      }|t        j                  |      |S )z9Check that there is a filesystem with the given ``path``.)rV   r   ResourceNotFoundr5   rT   r&   s      r8   _delegate_requiredzMultiFS._delegate_required   s-     ^^D!:))$//	r9   c                 \    | j                   t        j                  |      | j                   S )z!Check that ``path`` is writeable.)r/   r   ResourceReadOnly)r5   rT   s     r8   _writable_requiredzMultiFS._writable_required   s)     == ))$//}}r9   c                     t        |      r| j                  | j                  fS | j                         D ]  \  }}|j	                  |      s||fc S  y)zGet a tuple of (name, fs) that the given path would map to.

        Arguments:
            path (str): A path on the filesystem.
            mode (str): An `io.open` mode.

        NN)r   r0   r/   rQ   rS   )r5   rT   moderD   r&   s        r8   whichzMultiFS.which   sT     $&&55) 	 HD"yyRx	  r9   c                 F   d| _         | j                  r_	 | j                  j                         D ]  \  }}|j	                           	 | j                  j                          | j                          y y # | j                  j                          | j                          w xY w)NT)r4   r.   r2   valuescloseclearrC   )r5   rP   r&   s      r8   rd   zMultiFS.close   s    "&"3"3":":"< JFBHHJ !!'') 
 !!'')s   2A4 4,B c                     | j                          |xs d}| j                  |      }|t        j                  |      t	        t        |            }|j                  ||      }|S )Nr>   )
namespaces)checkrV   r   rX   r   r   getinfo)r5   rT   rg   r&   _pathinfos         r8   ri   zMultiFS.getinfo   s^    

%2
^^D!:))$//'zz%Jz7r9   c                 @   | j                          g }d}| j                         D ](  \  }}	 |j                  |j                  |             d}* |st	        j
                  |      t        t        j                  |            }|S # t        j
                  $ r Y ww xY w)NFT)	rh   rQ   extendlistdirr   rX   listr   fromkeys)r5   rT   	directoryrS   rU   _fss         r8   rn   zMultiFS.listdir   s    

	//+ 	JE3  T!23 	 ))$//--i89	 ** s    BBBc                 l    | j                          | j                  |      }|j                  |||      S N)permissionsrecreate)rh   r]   makedirr5   rT   ru   rv   r/   s        r8   rw   zMultiFS.makedir   s5     	

**40+QQr9   c                     | j                          t        |      r| j                  |      }n| j                  |      } |j                  |f||d|S )N)r`   	buffering)rh   r   r]   rZ   openbin)r5   rT   r`   rz   optionsrr   s         r8   r{   zMultiFS.openbin   sP    

$))$/C))$/Cs{{4KdiK7KKr9   c                 f    | j                          | j                  |      }|j                  |      S N)rh   rZ   removerY   s      r8   r   zMultiFS.remove   s)    

$$T*yyr9   c                 f    | j                          | j                  |      }|j                  |      S r~   )rh   rZ   	removedirrY   s      r8   r   zMultiFS.removedir   s*    

$$T*||D!!r9   c              #   h  K   | j                          t               }d}| j                         D ]O  \  }}	 |j                  |||      D ]0  }|j                  |vs| |j                  |j                         2 d}Q |st        j                  |      y # t        j                  $ r Y w xY ww)NF)rg   pageT)rh   setrQ   scandirrD   addr   rX   )	r5   rT   rg   r   seenrS   rU   r&   rk   s	            r8   r   zMultiFS.scandir  s      	

u* 	IE2JJt
JN ,Dyy,"
+, 	 ))$//  ** s.   3B2%B#B?B2B/,B2.B//B2c                     | j                          | j                  |      }|t        j                  |      |j	                  |      S r~   )rh   rV   r   rX   	readbytesrY   s      r8   r   zMultiFS.readbytes  s>    

^^D!:))$//||D!!r9   c                 P    | j                  |      } |j                  ||fd|i|S N
chunk_size)rZ   download)r5   rT   filer   r|   r&   s         r8   r   zMultiFS.download$  s/    $$T*r{{4H*HHHr9   c                 n    | j                          | j                  |      }|j                  ||||      S N)encodingr   newline)rh   rZ   readtext)r5   rT   r   r   r   r&   s         r8   r   zMultiFS.readtext)  s2    

$$T*{{4(67{SSr9   c                 f    | j                          | j                  |      }|j                  |      S r~   )rh   rZ   getsizerY   s      r8   r   zMultiFS.getsize/  *    

$$T*zz$r9   c                 f    | j                          | j                  |      }|j                  |      S r~   )rh   rZ   
getsyspathrY   s      r8   r   zMultiFS.getsyspath5  s*    

$$T*}}T""r9   c                 f    | j                          | j                  |      }|j                  |      S r~   )rh   rZ   gettyperY   s      r8   r   zMultiFS.gettype;  r   r9   c                 j    | j                          | j                  |      }|j                  ||      S N)purpose)rh   rZ   geturlr5   rT   r   r&   s       r8   r   zMultiFS.geturlA  s.    

$$T*yywy//r9   c                 r    | j                          | j                  |      }|d uxr |j                  |      S r~   )rh   rV   
hassyspathrY   s      r8   r   zMultiFS.hassyspathG  s1    

^^D!~5"--"55r9   c                 v    | j                          | j                  |      }|d uxr |j                  ||      S r   )rh   rV   hasurlr   s       r8   r   zMultiFS.hasurlM  s5    

^^D!~B"))D')"BBr9   c                 r    | j                          | j                  |      }|d uxr |j                  |      S r~   )rh   rV   isdirrY   s      r8   r   zMultiFS.isdirS  s0    

^^D!~0"((4.0r9   c                 r    | j                          | j                  |      }|d uxr |j                  |      S r~   )rh   rV   isfilerY   s      r8   r   zMultiFS.isfileY  s0    

^^D!~1"))D/1r9   c                 h    | j                          | j                  |      }|j                  ||      S r~   )rh   r]   setinfo)r5   rT   rk   r/   s       r8   r   zMultiFS.setinfo_  s.    

**40d++r9   c                     | j                          | j                  | j                  j                  |       nt        t        |   |       t        t        |            }|S r~   )rh   r/   validatepathr,   r"   r   r   )r5   rT   r7   s     r8   r   zMultiFS.validatepathe  sJ    

==$MM&&t,'4-d3x~&r9   c                 l    | j                          | j                  |      }|j                  |||      S rt   )rh   r]   makedirsrx   s        r8   r   zMultiFS.makedirso  s5     	

**40  ; RRr9   c           	          | j                          t        |      r| j                  |      }n| j                  |      } |j                  |f|||||d|S )N)r`   rz   r   r   r   )rh   r   r]   rZ   open)	r5   rT   r`   rz   r   r   r   kwargsrr   s	            r8   r   zMultiFS.openz  si     	

$))$/C))$/Csxx

 
 	
r9   c                 N     | j                  |      j                  ||fd|i| y r   )r]   upload)r5   rT   r   r   r|   s        r8   r   zMultiFS.upload  s2    ,%,,$	
#-	
18	
r9   c                 F    | j                  |      j                  ||       y r~   )r]   
writebytes)r5   rT   contentss      r8   r   zMultiFS.writebytes  s    %00x@r9   c                 P    | j                  |      }|j                  |||||      S r   )r]   	writetext)r5   rT   r   r   r   r   r/   s          r8   r   zMultiFS.writetext  s7     **40!!(Xfg " 
 	
r9   )T)Fr   )rr~   )NF)r   r_   )NN )r   )r   r   NNr   )zutf-8Nr   )+__name__
__module____qualname____doc___metar-   r<   r?   rF   rH   rC   rQ   rV   rZ   r]   ra   rd   ri   rn   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r7   s   @r8   r"   r"   ,   s    5eLE&/'B* !

' 		( 		RL" 	0."I
T # 06C12, 		S 
4
A 
r9   )1r   
__future__r   r   r   typingcollectionsr   r   operatorr   sixr	   r   r   baser   r`   r   openerr   rT   r   r   TYPE_CHECKINGr   r   r   r   r   r   r   r   r   r   r   enumsr   rk   r   r   ru   r   subfsr    TypeVarr!   r$   r"   r>   r9   r8   <module>r      s    I H  /        #	    $#(s),A ,z4.@A~
b ~
r9   