U
    Zwe                     @   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
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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)	BamReader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 |dkrd|krt||dS td|r|  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_filebamz'Only reading is supported for BAM filesz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   NotImplementedError)
r   openerr   r   r   
close_filefilepathr   Zextra r'   .lib/python3.8/site-packages/dnaio/singleend.py_open_single	   sZ    







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   J   s    
r   )r   r   c                 C   s|   |   } dD ]$}| |r| dt|  }  q2qtj| \} }|dkrNdS |dksh|dkrl| drldS |d	krxd	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   r   )lowerendswithlenr,   r&   splitext)r   Zextr'   r'   r(   r   c   s    
r   )r%   r   c                 C   sv   |   r&|  }| d}| | n| ddd }|dsJ|dkrNdS |dsb|drfdS |d	krrd
S dS )z)
    Return 'fasta', 'fastq' or None
       r      @    r      >   #r   s   BAMr   N)seekabletellreadseekpeek
startswith)r%   Zoriginal_positionmagicr'   r'   r(   r   x   s    
r   )r,   typingr   r   r   r   
exceptionsr   Zreadersr   r	   r
   Zwritersr   r   r1   PathLikeboolr)   r   r   r   r'   r'   r'   r(   <module>   s(   B 