o
    Q `8                     @   s   d Z ddlmZ ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ej
rAddlmZ dd	lmZmZmZmZmZmZmZmZ G d
d dejZej						dddZdddZdS )zBCompatibility tools between Python 2 and Python 3 I/O interfaces.
    )print_function)unicode_literalsN)SEEK_SETSEEK_CUR   )Mode)	RawIOBase)AnyIterableIteratorIOListOptionalTextUnionc                       s   e Zd ZdZd. fdd	Z fddZdd Zd	d
 Zdd Ze	fddZ
dd Zdd Zdd Zdd Zd/ddZdd Zejd0ddZd0ddZejd d! Zejd"d# Zejd$d% Zd0d&d'Zd0d(d)Zd*d+ Zd,d- Z  ZS )1
RawWrapperzAConvert a Python 2 style file-like object in to a IO object.
    Nc                    s0   || _ |p
t|dd | _|| _tt|   d S )Nmode)_fgetattrr   namesuperr   __init__)selffr   r   	__class__ ,/usr/lib/python3/dist-packages/fs/iotools.pyr      s   zRawWrapper.__init__c                    s&   | j stt|   | j  d S d S N)closedr   r   closer   r   r   r   r   r    &   s   zRawWrapper.closec                 C   
   | j  S r   )r   filenor!   r   r   r   r#   /      
zRawWrapper.filenoc                 C   r"   r   )r   flushr!   r   r   r   r%   3   r$   zRawWrapper.flushc                 C   r"   r   )r   isattyr!   r   r   r   r&   7   r$   zRawWrapper.isattyc                 C   s   | j ||S r   )r   seek)r   offsetwhencer   r   r   r'   ;   s   zRawWrapper.seekc                       t  jd fdd S )Nreadablec                         t  jjS r   )r   r   readingr   r!   r   r   <lambda>A       z%RawWrapper.readable.<locals>.<lambda>r   r   r!   r   r!   r   r+   ?      zRawWrapper.readablec                    r*   )Nwritablec                      r,   r   )r   r   writingr   r!   r   r   r.   E   r/   z%RawWrapper.writable.<locals>.<lambda>r0   r!   r   r!   r   r2   C   r1   zRawWrapper.writablec                 C   sH   z| j  W S  ty#   z
| dt W Y dS  ty"   Y Y dS w w )Nr   FT)r   seekableAttributeErrorr'   r   IOErrorr!   r   r   r   r4   G   s   zRawWrapper.seekablec                 C   r"   r   )r   tellr!   r   r   r   r7   S   r$   zRawWrapper.tellc                 C      | j |S r   )r   truncate)r   sizer   r   r   r9   W      zRawWrapper.truncatec                 C   s    | j |}|d u rt|S |S r   )r   writelen)r   datacountr   r   r   r<   [   s   zRawWrapper.writec                 C   s   |dkr|   S | j|S )Nr@   )readallr   readr   nr   r   r   rB   `   s   zRawWrapper.readc                 C   s   t | jd| j|S )Nread1)r   r   rB   rC   r   r   r   rE   g   s   zRawWrapper.read1c                 C   r"   r   )r   rB   r!   r   r   r   rA   k   s   
zRawWrapper.readallc                 C   J   z| j |W S  ty$   | j t|}t|}||d |< | Y S w r   )r   readintor5   rB   r=   r   br>   Z
bytes_readr   r   r   rG   p      zRawWrapper.readintoc                 C   rF   r   )r   	readinto1r5   rE   r=   rH   r   r   r   rK   {   rJ   zRawWrapper.readinto1c                 C   r8   r   )r   readline)r   limitr   r   r   rL      r;   zRawWrapper.readlinec                 C   r8   r   )r   	readlines)r   Zhintr   r   r   rN      r;   zRawWrapper.readlinesc                 C   r8   r   )r   
writelines)r   Zsequencer   r   r   rO      r;   zRawWrapper.writelinesc                 C   s
   t | jS r   )iterr   r!   r   r   r   __iter__   r$   zRawWrapper.__iter__)NNr   )r@   )__name__
__module____qualname____doc__r   r    r#   r%   r&   r   r'   r+   r2   r4   r7   r9   r<   typingno_type_checkrB   rE   rA   rG   rK   rL   rN   rO   rQ   __classcell__r   r   r   r   r      s6    	








r   rr@    Fc                 K   s   d|v }	d|v }
d|v }d|v }d|v rd}	d}
|rdn|pd}t ||| d	}|d
kra|	r>|
r>tttj||p;tj}n#|	rOtttj||pLtj}n|
sS|ratttj||p_tj}|smtj	|||||d}|S )z;Take a Python 2.x binary file and return an IO Stream.
    rY   warI   +TNzutf-8)r   r   r   )encodingerrorsnewlineline_buffering)
r   ioBufferedRandomrV   castr   DEFAULT_BUFFER_SIZEBufferedReaderBufferedWriterTextIOWrapper)r   Zbin_filer   	bufferingr^   r_   r`   ra   kwargsr-   r3   Z	appendingbinaryZ	io_objectr   r   r   make_stream   sD   rl   c                 c   s    | j }g }d}|du s|dk r0|r.|d}|| |dv r*d|V  |dd= |sdS dS |rZ|r\|d}|t|8 }|| |dv sI|sTd|V  |dd= |r^|s4dS dS dS dS )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      
    )rB   appendjoinr=   )Zreadable_filer:   rB   lineZbyter   r   r   line_iterator   s(   



rs   )rY   r@   NNrZ   Fr   )rU   Z
__future__r   r   rb   rV   r   r   r   r   ZTYPE_CHECKINGr   r	   r
   r   r   r   r   r   r   r   rW   rl   rs   r   r   r   r   <module>   s(    (|6