o
    pf                     @   s   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rEd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
 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_CURSEEK_SET   )Mode)IOAnyIterableIteratorListOptionalTextUnion)	RawIOBasec                       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d/d&d'Zd/d(d)Zd*d+ Zd,d- Z  ZS )1
RawWrapperz<Convert 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__ C/home/ertert/spirit/venv/lib/python3.10/site-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%   ,   r$   zRawWrapper.flushc                 C   r"   r   )r   isattyr!   r   r   r   r&   0   r$   zRawWrapper.isattyc                 C   s   | j ||S r   )r   seek)r   offsetwhencer   r   r   r'   4   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>:       z%RawWrapper.readable.<locals>.<lambda>r   r   r!   r   r!   r   r+   8      zRawWrapper.readablec                    r*   )Nwritablec                      r,   r   )r   r   writingr   r!   r   r   r.   >   r/   z%RawWrapper.writable.<locals>.<lambda>r0   r!   r   r!   r   r2   <   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   @   s   zRawWrapper.seekablec                 C   r"   r   )r   tellr!   r   r   r   r7   L   r$   zRawWrapper.tellc                 C   s   | j |S r   )r   truncate)r   sizer   r   r   r8   P   s   zRawWrapper.truncatec                 C   s>   t |tjr| j| }n| j|}|d u rt|S |S r   )
isinstancearrayr   writetobyteslen)r   datacountr   r   r   r<   T   s   zRawWrapper.writec                 C   s   |dkr|   S | j|S NrA   )readallr   readr   nr   r   r   rD   \   s   zRawWrapper.readc                 C   s   t | jd| j|S )Nread1)r   r   rD   rE   r   r   r   rG   c   s   zRawWrapper.read1c                 C   r"   r   )r   rD   r!   r   r   r   rC   g   s   
zRawWrapper.readallc                 C   J   z| j |W S  ty$   | j t|}t|}||d |< | Y S w r   )r   readintor5   rD   r>   r   br?   
bytes_readr   r   r   rI   l      zRawWrapper.readintoc                 C   rH   r   )r   	readinto1r5   rG   r>   rJ   r   r   r   rN   w   rM   zRawWrapper.readinto1c                 C      | j |d u r
dS |S rB   )r   readline)r   limitr   r   r   rP         zRawWrapper.readlinec                 C   rO   rB   )r   	readlines)r   hintr   r   r   rS      rR   zRawWrapper.readlinesc                 C   s"   dd |D }| j td|S )Nc                 s   s(    | ]}t |tjr| n|V  qd S r   )r:   r;   r=   ).0liner   r   r   	<genexpr>   s    
z(RawWrapper.writelines.<locals>.<genexpr>zIterable[bytes])r   
writelinestypingcast)r   lines_linesr   r   r   rX      s   zRawWrapper.writelinesc                 C   s
   t | jS r   )iterr   r!   r   r   r   __iter__   r$   zRawWrapper.__iter__)NNr   )rA   )__name__
__module____qualname____doc__r   r    r#   r%   r&   r   r'   r+   r2   r4   r7   r8   r<   rY   no_type_checkrD   rG   rC   rI   rN   rP   rS   rX   r^   __classcell__r   r   r   r   r      s6    	








r   rrA    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 )z6Take a Python 2.x binary file and return an IO Stream.re   warK   +TNzutf-8)r   r   r   )encodingerrorsnewlineline_buffering)
r   ioBufferedRandomrY   rZ   r   DEFAULT_BUFFER_SIZEBufferedReaderBufferedWriterTextIOWrapper)r   bin_filer   	bufferingrj   rk   rl   rm   kwargsr-   r3   	appendingbinary	io_objectr   r   r   make_stream   sD   rz   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      
    )rD   appendjoinr>   )readable_filer9   rD   rV   byter   r   r   line_iterator   s(   



r   )re   rA   NNrf   Fr   )rb   
__future__r   r   rY   r;   rn   r   r   r   r   TYPE_CHECKINGr   r	   r
   r   r   r   r   r   mmapr   r   rc   rz   r   r   r   r   r   <module>   s,    ( 5