U
     e                     @   s   d Z ddgZddlZddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ G dd dZG dd deeZG dd deeZdS )z+
Classes for reading FASTA and FASTQ files
FastaReaderFastqReader    N)PathLike)UnionBinaryIOOptionalIteratorList)xopen   )	FastqIterSequenceRecord)shorten)FastaFormatError)SingleEndReaderc                   @   s   e Zd ZU dZdZdZeed< dZe	ed< e
ddeee	ef ee dd	d
Ze	dddZddddZdd Zdd ZdS )BinaryFileReaderze
    A mixin for readers that ensures that a file or a path can be passed in to the constructor.
    FpairedrbmodeNopener_close_file)filer   c                C   s<   t |tr ||| j| _d| _n|r2d| _|| _n|| _dS )z
        The file is a path or a file-like object. In both cases, the file may
        be compressed (.gz, .bz2, .xz).
        TN)
isinstancestrr   _file_close_on_exit)selfr   r   r    r   ,lib/python3.8/site-packages/dnaio/readers.py__init__   s    
zBinaryFileReader.__init__returnc                 C   s    | j j dt| jd| j dS )Nz('namez'))	__class____name__getattrr   r   r   r   r   __repr__/   s    zBinaryFileReader.__repr__c                 C   s$   | j r | jd k	r | j  d | _d S N)r   r   closer'   r   r   r   r*   2   s    
zBinaryFileReader.closec                 C   s   | j d krtd| S )Nz(I/O operation on closed BinaryFileReader)r   
ValueErrorr'   r   r   r   	__enter__7   s    
zBinaryFileReader.__enter__c                 G   s   |    d S r)   )r*   )r   argsr   r   r   __exit__<   s    zBinaryFileReader.__exit__)r%   
__module____qualname____doc__r   r   bool__annotations__r   r   r
   r   r   r   r   r    r(   r*   r,   r.   r   r   r   r   r      s   
r   c                       sV   e Zd ZdZdeeddeeee	f e
ee
 d fddZee dd	d
Z  ZS )r   z
    Reader for FASTA files

    While this class can be instantiated directly, the recommended way is to
    use `dnaio.open` with appropriate arguments.
    FN)keep_linebreakssequence_classr   r   )r   r4   r   c                   sD   t  j|||d || _d| _|r&dnd| _d| _t| j| _dS )z
        file is a path or a file-like object. In both cases, the file may
        be compressed (.gz, .bz2, .xz).

        keep_linebreaks -- whether to keep newline characters in the sequence
        r   F
 r   N)	superr    r5   delivers_qualities
_delimiternumber_of_recordsioTextIOWrapperr   )r   r   r4   r5   r   r   r$   r   r   r    H   s    zFastaReader.__init__r!   c                 c   sp  d}g }| j jrdS t| j D ]\}}| }|s4q|r|d dkr|dk	r|  jd7  _z| || j|dV  W n6 tk
r } zt	t
|d |dW 5 d}~X Y nX |dd }g }q|r|d dkrqq|dk	r|| qt	dt| d	|dq|dk	rl|  jd7  _z| || j|dV  W n4 tk
rj } zt	t
|ddW 5 d}~X Y nX dS )
z>
        Iterate over the records in this FASTA file.
        Nr   >r   z9 (line number refers to record after the problematic one))line#z.Expected '>' at beginning of record, but got 'z'.)r   closed	enumeratestripr;   r5   r:   joinr+   r   r   append_shorten)r   r#   seqir@   er   r   r   __iter__^   sH    
zFastaReader.__iter__)r%   r/   r0   r1   r   r
   r   r   r   r   r2   r   r    r   rK   __classcell__r   r   r>   r   r   @   s   c                       sb   e Zd ZdZededdeeee	f e
ee d fddZee dd	d
Zedd Z  ZS )r   z
    Reader for FASTQ files. Does not support multi-line FASTQ files.

    While this class can be instantiated directly, the recommended way is to
    use `dnaio.open` with appropriate arguments.
    i   N)r5   buffer_sizer   r   )r   rM   r   c                   s   t  j|||d || _d| _|| _zt| j| j| j| _W n tk
rZ   | 	   Y nX z"t
| j}t|tsvt|| _W n@ tk
r   d| _td| _Y n tk
r   | 	   Y nX dS )zx
        file is a filename or a file-like object.
        If file is a filename, then .gz files are supported.
        r   TFr   N)r8   r    r5   r9   rM   r   r   _iter	Exceptionr*   nextr   r2   AssertionErrorZtwo_headersStopIterationiter)r   r   r5   rM   r   r   Zthr>   r   r   r       s.      


zFastqReader.__init__r!   c                 C   s   | j S )z,Iterate over the records in this FASTQ file.)rN   r'   r   r   r   rK      s    zFastqReader.__iter__c                 C   s&   z
| j jW S  tk
r    Y dS X d S )Nr   )rN   r;   AttributeErrorr'   r   r   r   r;      s    
zFastqReader.number_of_records)r%   r/   r0   r1   r   r
   r   r   r   r   intr   r2   r    r   rK   propertyr;   rL   r   r   r>   r   r      s   &)r1   __all__r<   osr   typingr   r   r   r   r	   r
   Z_corer   r   Z_utilr   rG   
exceptionsr   Z
interfacesr   r   r   r   r   r   r   r   <module>   s   .J