U
     e                  
   @   s   d dl Z d dl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mZ ddddeee jef ee eee ee	ee
ef d	d
dZeee jef eeeeee f dddZeee dddZeee dddZdS )    N)OptionalUnionBinaryIOTuple   )UnknownFileFormat)FastaReaderFastqReader)FastaWriterFastqWriterr)
fileformatmode	qualities)file_or_pathr   r   r   returnc          
      C   s  |dkrt dt| ||\}}}~ |dk	r<|dkr<t|}|dkr`|dkr`|dk	r`|r\dnd}d|kr|dkrt|}|dkrt|dt|}|  td	| d
|dkr|dkst|dkrdnd}	|  td|	 |dkr|dkr|dkr|  t d|dkr:d|kr.t	||dS t
||dS |dkrfd|krZt||dS t||dS |rt|  td| ddS )z&
    Open a single sequence file.
    )r   wazMode must be 'r', 'w' or 'a'Nr   fastqfastar   namez"Could not determine whether file 'z~' is FASTA or FASTQ. The file extension is not available or not recognized, and the first character in the file is unexpected.z. because the output file name is not available z=Auto-detection of the output file format (FASTA/FASTQ) failedZwaFzDOutput format cannot be FASTQ since no quality values are available.)Z_close_filezFile format 'z+' is unknown (expected 'fasta' or 'fastq').)
ValueError_open_file_or_path_detect_format_from_name_detect_format_from_contentgetattrreprcloser   AssertionErrorr   r
   r	   r   )
r   openerr   r   r   
close_filefilepathr   Zextra r$   .lib/python3.8/site-packages/dnaio/singleend.py_open_single	   sR    





r&   )r   r   r   c                 C   s   zt | }W nX tk
rf   d|kr8t| ds8td| }t|drZt|jtrZ|j}nd }d}Y nX |||d d }d}|||fS )	Nr   readintozQWhen passing in an open file-like object, it must have been opened in binary moder   Fr   bT)osfspath	TypeErrorhasattrr   
isinstancer   str)r   r   r    r#   r"   r!   r$   r$   r%   r   F   s    
r   )r   r   c                 C   sp   |   } dD ]$}| |r| dt|  }  q2qtj| \} }|dkrNdS |dksh|dkrl| drldS dS )	ze
    name -- file name

    Return 'fasta', 'fastq' or None if the format could not be detected.
    )z.gzz.xzz.bz2z.zstN)z.fastaz.faz.fnaz.csfastaz.csfar   )z.fastqz.fqz.txtZ	_sequencer   )lowerendswithlenr)   r#   splitext)r   Zextr$   r$   r%   r   _   s    
r   )r"   r   c                 C   sR   |   r&|  }| d}| | n| ddd }ddddd}||dS )z)
    Return 'fasta', 'fastq' or None
    r   r   r   r   )   @   >   #    N)seekabletellreadseekpeekget)r"   Zoriginal_positionZ
first_charZformatsr$   r$   r%   r   r   s    
r   )r)   typingr   r   r   r   
exceptionsr   Zreadersr   r	   Zwritersr
   r   r.   PathLikeboolr&   r   r   r   r$   r$   r$   r%   <module>   s(   > 