B
    -§,cá  ã               @   sL   d Z ddlmZmZmZmZ ddlZddlZddlm	Z	 G dd„ de	ƒZ
dS )z´
bzip2mrcfile
------------

Module which exports the :class:`Bzip2MrcFile` class.

Classes:
    :class:`Bzip2MrcFile`: An object which represents a bzip2-compressed MRC
    file.

é    )Úabsolute_importÚdivisionÚprint_functionÚunicode_literalsNé   )ÚMrcFilec                   sZ   e Zd ZdZdd„ Zdd„ Zd‡ fdd„	Zd	d
„ Z‡ fdd„Z‡ fdd„Z	dd„ Z
‡  ZS )ÚBzip2MrcFilez¢:class:`~mrcfile.mrcfile.MrcFile` subclass for handling bzip2-compressed
    files.
    
    Usage is the same as for :class:`~mrcfile.mrcfile.MrcFile`.
    
    c             C   s   d  | j| j¡S )NzBzip2MrcFile('{0}', mode='{1}'))ÚformatÚ_fnameÚ_mode)Úself© r   ú3lib/python3.7/site-packages/mrcfile/bzip2mrcfile.pyÚ__repr__#   s    zBzip2MrcFile.__repr__c             C   s@   || _ d| jkr,tj |¡s,t|dd ¡  tj|dd| _	dS )z+Override _open_file() to open a bzip2 file.Úw)ÚmodeÚrN)
r
   r   ÚosÚpathÚexistsÚopenÚcloseÚbz2ÚBZ2FileÚ	_iostream)r   Únamer   r   r   Ú
_open_file'   s    zBzip2MrcFile._open_fileFc                s   |   ¡  tt| ƒ |¡ dS )z6Override _read() to ensure bzip2 file is in read mode.N)Ú_ensure_readable_bzip2_streamÚsuperr   Ú_read)r   Zheader_only)Ú	__class__r   r   r   .   s    zBzip2MrcFile._readc             C   sL   t | jdƒr| j ¡ }n| jjd dk}|sH| j ¡  tj| jdd| _dS )z7Make sure _iostream is a bzip2 stream that can be read.Úreadabler   r   )r   N)Úhasattrr   r!   r   r   r   r   r
   )r   r!   r   r   r   r   3   s    
z*Bzip2MrcFile._ensure_readable_bzip2_streamc                s   |   ¡  tt| ƒ ¡ S )z=Override _get_file_size() to ensure stream is readable first.)r   r   r   Ú_get_file_size)r   )r    r   r   r#   ?   s    zBzip2MrcFile._get_file_sizec                s<   t | jdƒrtt| ƒ |¡S | j |¡}t|ƒt|ƒfS dS )zbOverride because BZ2File in Python 2 does not support
        :meth:`~io.BufferedIOBase.readinto`.ÚreadintoN)r"   r   r   r   Ú_read_bytearray_from_streamÚreadÚ	bytearrayÚlen)r   Znumber_of_bytesZresult_bytes)r    r   r   r%   D   s    z(Bzip2MrcFile._read_bytearray_from_streamc             C   s\   | j sX| j ¡  tj| jdd| _| j | j ¡ ¡ | j | j	 ¡ ¡ | j | j
 ¡ ¡ dS )z{Override :meth:`~mrcfile.mrcinterpreter.MrcInterpreter.flush` since
        BZ2File objects need special handling.
        r   )r   N)Z
_read_onlyr   r   r   r   r
   ÚwriteÚheaderÚtobytesZextended_headerÚdata)r   r   r   r   ÚflushO   s    
zBzip2MrcFile.flush)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r#   r%   r-   Ú__classcell__r   r   )r    r   r      s   r   )r1   Z
__future__r   r   r   r   r   r   Zmrcfiler   r   r   r   r   r   Ú<module>   s
   