
    ob                        d Z ddlmZmZ ddlZddlZddlZddlmZmZ ddl	m
Z
 ej                  rddlmZmZmZmZmZmZmZmZ ddlZddlmZ  G d	 d
ej*                        Zej.                  	 	 	 	 	 	 dd       ZddZy)zBCompatibility tools between Python 2 and Python 3 I/O interfaces.
    )print_functionunicode_literalsN)SEEK_CURSEEK_SET   )Mode)IOAnyIterableIteratorListOptionalTextUnion)	RawIOBasec                   &    e Zd ZdZd fd	Z fdZd Zd Zd Ze	fdZ
d Zd	 Zd
 Zd ZddZd Zej$                  dd       ZddZej$                  d        Zej$                  d        Zej$                  d        ZddZddZd Zd Z xZS )
RawWrapperz<Convert a Python 2 style file-like object in to a IO object.c                 r    || _         |xs t        |dd       | _        || _        t        t
        |           y )Nmode)_fgetattrr   namesuperr   __init__)selffr   r   	__class__s       ,/usr/lib/python3/dist-packages/fs/iotools.pyr   zRawWrapper.__init__   s3    4GAvt4		j$(*    c                 x    | j                   s-t        t        |           | j                  j                          y y N)closedr   r   closer   )r   r   s    r   r#   zRawWrapper.close   s+    {{ *d)+GGMMO r   c                 6    | j                   j                         S r!   )r   filenor   s    r   r%   zRawWrapper.fileno(       ww~~r   c                 6    | j                   j                         S r!   )r   flushr&   s    r   r)   zRawWrapper.flush,   s    ww}}r   c                 6    | j                   j                         S r!   )r   isattyr&   s    r   r+   zRawWrapper.isatty0   r'   r   c                 :    | j                   j                  ||      S r!   )r   seek)r   offsetwhences      r   r-   zRawWrapper.seek4   s    ww||FF++r   c                 B      t         j                  d fd             S )Nreadablec                  B    t         j                        j                  S r!   )r   r   readingr&   s   r   <lambda>z%RawWrapper.readable.<locals>.<lambda>:       DO4K4K r   r   r   r&   s   `r   r1   zRawWrapper.readable8       Lwtww
,KLNNr   c                 B      t         j                  d fd             S )Nwritablec                  B    t         j                        j                  S r!   )r   r   writingr&   s   r   r4   z%RawWrapper.writable.<locals>.<lambda>>   r5   r   r6   r&   s   `r   r9   zRawWrapper.writable<   r7   r   c                     	 | j                   j                         S # t        $ r* 	 | j                  dt               Y y# t
        $ r Y Y yw xY ww xY w)Nr   TF)r   seekableAttributeErrorr-   r   IOErrorr&   s    r   r=   zRawWrapper.seekable@   sU    	77##%% 			!X&   	s$    	A>	AA
AAc                 6    | j                   j                         S r!   )r   tellr&   s    r   rA   zRawWrapper.tellL   s    ww||~r   c                 8    | j                   j                  |      S r!   )r   truncate)r   sizes     r   rC   zRawWrapper.truncateP   s    ww%%r   c                     t        |t        j                        r*| j                  j                  |j	                               }n| j                  j                  |      }|t        |      S |S r!   )
isinstancearrayr   writetobyteslen)r   datacounts      r   rH   zRawWrapper.writeT   sM    dEKK(GGMM$,,.1EGGMM$'E!Ms4y4u4r   c                 b    |dk(  r| j                         S | j                  j                  |      S N)readallr   readr   ns     r   rQ   zRawWrapper.read\   s)     7<<>!ww||Ar   c                 P     t        | j                  d| j                        |      S )Nread1)r   r   rQ   rR   s     r   rU   zRawWrapper.read1c   s     3wtww3A66r   c                 6    | j                   j                         S r!   )r   rQ   r&   s    r   rP   zRawWrapper.readallg   s     ww||~r   c                     	 | j                   j                  |      S # t        $ r9 | j                   j                  t	        |            }t	        |      }||d | |cY S w xY wr!   )r   readintor>   rQ   rJ   r   brK   
bytes_reads       r   rX   zRawWrapper.readintol   s[    	77##A&& 	77<<A'DTJ!AkzN		    ?AAc                     	 | j                   j                  |      S # t        $ r9 | j                   j                  t	        |            }t	        |      }||d | |cY S w xY wr!   )r   	readinto1r>   rU   rJ   rY   s       r   r^   zRawWrapper.readinto1w   s[    	77$$Q'' 	77==Q(DTJ!AkzN		r\   c                 H    | j                   j                  |d      S |      S rN   )r   readline)r   limits     r   r`   zRawWrapper.readline   s#    wwem????r   c                 H    | j                   j                  |d      S |      S rN   )r   	readlines)r   hints     r   rc   zRawWrapper.readlines   s#    ww  t|>>>>r   c                 r    d |D        }| j                   j                  t        j                  d|            S )Nc              3   t   K   | ]0  }t        |t        j                        r|j                         n| 2 y wr!   )rF   rG   rI   ).0lines     r   	<genexpr>z(RawWrapper.writelines.<locals>.<genexpr>   s-      
JNju{{;DLLNE
s   68zIterable[bytes])r   
writelinestypingcast)r   lines_liness      r   rj   zRawWrapper.writelines   s4    
RW
 ww!!&++.?"HIIr   c                 ,    t        | j                        S r!   )iterr   r&   s    r   __iter__zRawWrapper.__iter__   s    DGG}r   )NNr!   )rO   )__name__
__module____qualname____doc__r   r#   r%   r)   r+   r   r-   r1   r9   r=   rA   rC   rH   rk   no_type_checkrQ   rU   rP   rX   r^   r`   rc   rj   rq   __classcell__)r   s   @r   r   r      s    F+   #+ ,OO
&5  7      @?Jr   r   c                 |   d|v }	d|v }
d|v }d|v }d|v rd}	d}
|rdn|xs d}t        ||| 	      }|d
k\  r|	rM|
rKt        j                  t        j                  t        j
                  |      |xs t        j                        }n|	rKt        j                  t        j                  t        j
                  |      |xs t        j                        }nN|
s|rJt        j                  t        j                  t        j
                  |      |xs t        j                        }|st        j                  |||||      }|S )z6Take a Python 2.x binary file and return an IO Stream.rwarZ   +TNzutf-8)r   r   r   )encodingerrorsnewlineline_buffering)
r   ioBufferedRandomrk   rl   r   DEFAULT_BUFFER_SIZEBufferedReaderBufferedWriterTextIOWrapper)r   bin_filer   	bufferingr}   r~   r   r   kwargsr3   r;   	appendingbinary	io_objects                 r   make_streamr      s)    TkGTkGtID[F
d{tH$7H8$T:IA~w))BLL)43R33I ))BLL)43R33I 	))BLL)43R33I
 $$)
	 r   c              #   T  K   | j                   }g }d}||dk  r<|r9 |d      }|j                  |       |dv rdj                  |       |dd= |r8yy|rO|rL |d      }|t        |      z  }|j                  |       |dv s|sdj                  |       |dd= |r|rJyyyyw)zIterate over the lines of a file.

    Implementation reads each char individually, which is not very
    efficient.

    Yields:
        str: a single line in the file.

       1Nr   r      
r   )rQ   appendjoinrJ   )readable_filerD   rQ   rh   bytes        r   line_iteratorr      s      DDD|tax7DKKu}hhtn$G  t7DCIDKKu}Dhhtn$G tdtds   AB(AB($B()ry   rO   NN Fr!   )ru   
__future__r   r   rk   rG   r   r   r   r   r   TYPE_CHECKINGr	   r
   r   r   r   r   r   r   mmapr   r   rv   r   r    r   r   <module>r      s}    8   	 ! 	OOO~ ~B  
2 2jr   