U
    mf                     @   sp   d dl Z d dlmZmZmZ d dlmZ d dlmZ G dd deZ	G dd de	Z
d	d
 Zdd Zdd ZdS )    N)BytesIOStringIOUnsupportedOperation)FileProxyMixin)cached_propertyc                   @   s   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Ze	dd Z
dddZdddZdd Zdd Zdd Zd ddZdd ZdS )!Filei   Nc                 C   s6   || _ |d krt|dd }|| _t|dr2|j| _d S )Nnamemode)filegetattrr   hasattrr	   )selfr
   r    r   :/tmp/pip-unpacked-wheel-siwebuq3/django/core/files/base.py__init__   s    
zFile.__init__c                 C   s
   | j pdS )N r   r   r   r   r   __str__   s    zFile.__str__c                 C   s   d| j j| pdf S )Nz<%s: %s>None)	__class____name__r   r   r   r   __repr__   s    zFile.__repr__c                 C   s
   t | jS N)boolr   r   r   r   r   __bool__   s    zFile.__bool__c                 C   s   | j S r   )sizer   r   r   r   __len__   s    zFile.__len__c              	   C   s   t | jdr| jjS t | jdrLztj| jjW S  ttfk
rJ   Y nX t | jdrt | jdr| j	 }| j
dtj | j	 }| j
| |S tdd S )Nr   r   tellseekr   z$Unable to determine the file's size.)r   r
   r   ospathgetsizer   OSError	TypeErrorr   r   SEEK_ENDAttributeError)r   posr   r   r   r   r      s    

z	File.sizec              	   c   sN   |p| j }z| d W n ttfk
r0   Y nX | |}|sBqJ|V  q2dS )z{
        Read the file and yield chunks of ``chunk_size`` bytes (defaults to
        ``File.DEFAULT_CHUNK_SIZE``).
        r   N)DEFAULT_CHUNK_SIZEr   r&   r   read)r   
chunk_sizedatar   r   r   chunks0   s    

zFile.chunksc                 C   s   | j |p| jkS )z
        Return ``True`` if you can expect multiple chunks.

        NB: If a particular file representation is in memory, subclasses should
        always return ``False`` -- there's no good reason to read from memory in
        chunks.
        )r   r(   )r   r*   r   r   r   multiple_chunksA   s    zFile.multiple_chunksc                 c   sp   d }|   D ]P}|dD ]@}|rFt|r:t|s:|V  n|| }d }t|rV|V  q|}qq|d k	rl|V  d S NT)r,   
splitlinesendswith_cr	equals_lfendswith_lf)r   Zbuffer_chunkliner   r   r   __iter__K   s    zFile.__iter__c                 C   s   | S r   r   r   r   r   r   	__enter__f   s    zFile.__enter__c                 C   s   |    d S r   )close)r   exc_type	exc_valuetbr   r   r   __exit__i   s    zFile.__exit__c                 C   sH   | j s| d n2| jr<tj| jr<t| j|p4| j| _nt	d| S )Nr   zThe file cannot be reopened.)
closedr   r   r    r!   existsopenr	   r
   
ValueErrorr   r	   r   r   r   r>   l   s    z	File.openc                 C   s   | j   d S r   )r
   r7   r   r   r   r   r7   u   s    z
File.close)N)N)N)N)r   
__module____qualname__r(   r   r   r   r   r   r   r   r,   r-   r5   r6   r;   r>   r7   r   r   r   r   r      s   





	r   c                       sL   e Zd ZdZd fdd	Zdd Zdd Zdd	d
Zdd Zdd Z	  Z
S )ContentFilezU
    A File-like object that takes just raw content, rather than an actual file.
    Nc                    s4   t |trtnt}t j|||d t|| _d S )Nr   )
isinstancestrr   r   superr   lenr   )r   contentr   Zstream_classr   r   r   r   ~   s    zContentFile.__init__c                 C   s   dS )NzRaw contentr   r   r   r   r   r      s    zContentFile.__str__c                 C   s   dS r.   r   r   r   r   r   r      s    zContentFile.__bool__c                 C   s   |  d | S )Nr   )r   r@   r   r   r   r>      s    
zContentFile.openc                 C   s   d S r   r   r   r   r   r   r7      s    zContentFile.closec                 C   s   | j dd  | j|S )Nr   )__dict__popr
   write)r   r+   r   r   r   rL      s    zContentFile.write)N)N)r   rA   rB   __doc__r   r   r   r>   r7   rL   __classcell__r   r   rI   r   rC   y   s   
rC   c                 C   s   |  t| trdndS )z9Return True if line (a text or bytestring) ends with ''.   endswithrD   rE   r4   r   r   r   r0      s    r0   c                 C   s   |  t| trdndS )z9Return True if line (a text or bytestring) ends with '
'.
   
rQ   rS   r   r   r   r2      s    r2   c                 C   s   | t | trdndkS )z6Return True if line (a text or bytestring) equals '
'.rT   rU   )rD   rE   rS   r   r   r   r1      s    r1   )r    ior   r   r   Zdjango.core.files.utilsr   Zdjango.utils.functionalr   r   rC   r0   r2   r1   r   r   r   r   <module>   s   q