U
    Zwe;                     @   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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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   )BamIter	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, .zst).
        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   r5   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, .zst).

        keep_linebreaks -- whether to keep newline characters in the sequence
        r   F
 r   N)	superr!   r6   delivers_qualities
_delimiternumber_of_recordsioTextIOWrapperr   )r   r   r5   r6   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<   r6   r;   joinr,   r   r   append_shorten)r   r$   seqirA   er   r   r    __iter__^   sH    
zFastaReader.__iter__)r&   r0   r1   r2   r   r
   r   r   r   r   r3   r   r!   r   rL   __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.
       Nr6   buffer_sizer   r   r   rP   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)r9   r!   r6   r:   rP   r   r   _iter	Exceptionr+   nextr   r3   AssertionErrortwo_headersStopIterationiter)r   r   r6   rP   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.rR   r(   r   r   r    rL      s    zFastqReader.__iter__c                 C   s&   z
| j jW S  tk
r    Y dS X d S Nr   rR   r<   AttributeErrorr(   r   r   r    r<      s    
zFastqReader.number_of_records)r&   r0   r1   r2   r   r
   r   r   r   r   intr   r3   r!   r   rL   propertyr<   rM   r   r   r?   r    r      s   &c                       sn   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edd Z  ZS )	BamReadera   
    Reader for BAM files.

    All records in the input BAM must be unmapped single-end reads
    (with a flag value of 4).

    While this class can be instantiated directly, the recommended way is to
    use `dnaio.open` with appropriate arguments.
    rN   NrO   rQ   c                   sb   t  j|||d || _d| _|| _zt| j| j| _W n tk
rV   | 	   Y nX d| _
d S )Nr   TF)r9   r!   r6   r:   rP   r   r   rR   rS   r+   rV   )r   r   r6   rP   r   r   r?   r   r    r!      s    	zBamReader.__init__r"   c                 C   s   | j S )z*Iterate over the records in this BAM file.rY   r(   r   r   r    rL      s    zBamReader.__iter__c                 C   s&   z
| j jW S  tk
r    Y dS X d S rZ   r[   r(   r   r   r    r<      s    
zBamReader.number_of_recordsc                 C   s&   z
| j jW S  tk
r    Y dS X d S )N    )rR   headerr\   r(   r   r   r    ra      s    
zBamReader.header)r&   r0   r1   r2   r   r
   r   r   r   r   r]   r   r3   r!   r   rL   r^   r<   ra   rM   r   r   r?   r    r_      s   
r_   )r2   __all__r=   osr   typingr   r   r   r   r	   r
   Z_corer   r   r   Z_utilr   rH   
exceptionsr   Z
interfacesr   r   r   r   r_   r   r   r   r    <module>   s   .J: