U
    e»{j²?  ã                   @   s¬   d dl Z d dlZd dlmZ d dlmZ d dlmZ ddlm	Z	m
Z
 G dd„ de	jd	�ZG d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )é    N)ÚOrderedDict)ÚTable)Ú_set_localeé   )ÚcoreÚcparserc                   @   sf   e Zd ZdZdZdZdZdZdZdZ	i fdd„Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zddd„ZdS )Ú	FastBasicaF  
    This class is intended to handle the same format addressed by the
    ordinary :class:`Basic` writer, but it acts as a wrapper for underlying C
    code and is therefore much faster. Unlike the other ASCII readers and
    writers, this class is not very extensible and is restricted
    by optimization requirements.
    Z
fast_basicz9Basic table with custom delimiter using the fast C engineTFc                 K   sú   |  dd¡d k	r(|  dd¡d kr(tdƒ‚t |¡}| t |¡¡ | dd¡}|d k	r^t|ƒnd | _|  dd¡| _| dd¡| _	| j	d k	r–t| j	ƒ| _	t| d	d
¡ƒ| _
| dd¡| _|  d| jd k	rÐ| jd nd¡}| d|¡| _|| _d| _d| _d S )NÚheader_startr   z2header_start cannot be set to None for this ReaderÚ	delimiterú Úcommentz# ú#Ú	quotecharú"Ú
data_startr   T)ÚgetÚ
ValueErrorÚcopyÚdeepcopyÚupdateÚpopÚstrr
   Úwrite_commentr   r   r	   r   ÚkwargsÚstrip_whitespace_linesÚstrip_whitespace_fields)ÚselfÚdefault_kwargsZuser_kwargsr   r
   Zdata_start_default© r   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/io/ascii/fastbasic.pyÚ__init__   s.    ÿþ

 ÿzFastBasic.__init__c                 C   s   | j  ¡  d S )N)ÚengineÚread_header)r   r   r   r   Ú_read_header@   s    zFastBasic._read_headerc           
   	   C   s6  | j dk	r&t| j ƒdkr&t d¡‚�n| jdkr<t d¡‚nð| jdk	rf| jdk rft| tƒsft d¡‚nÆ| jdk r|t d¡‚n°t| jƒdkr–t d¡‚n–t| j	ƒdkr°t d	¡‚n|d
| j
krÆt d¡‚nfd| j
krÜt d¡‚nPd| j
kròt d¡‚n:d| j
k�r
t d¡‚n"d| j
k�s"d| j
k�r,t d¡‚| j
 dd¡| _| j
 dd¡}t|tƒ�sZi }| dd¡ | dd¡| _|| j
d< tj|| j| jf| j| j| j | j	| j| jdœ| j
—Ž| _|  ¡ }|  ¡  |dk	�rÜ|\}}}ni }i }i }tdƒ� | j |||¡\}}W 5 Q R X |  ||¡}	| j�r2| jj|	jd< |	S )z�
        Read input data (file-like object, filename, list of strings, or
        single string) into a Table and return the result.
        Nr   z-The C reader does not support a comment regexz1The C reader does not allow data_start to be Noner   zYThe C reader does not allow header_start to be negative except for commented-header filesz5The C reader does not allow data_start to be negativez,The C reader only supports 1-char delimitersz5The C reader only supports a length-1 quote characterÚ
convertersz<The C reader does not support passing specialized convertersÚencodingz0The C reader does not use the encoding parameterZ	Outputterz1The C reader does not use the Outputter parameterZInputterz0The C reader does not use the Inputter parameterZdata_SplitterZheader_Splitterz*The C reader does not use a Splitter classÚstrict_namesFÚfast_readerTÚenableÚreturn_header_chars)r
   r	   r   r   r   Úfill_extra_colsÚCZ"__ascii_fast_reader_header_chars__)r   Úlenr   ZParameterErrorr   r	   Ú
isinstanceÚFastCommentedHeaderr
   r   r   r   r&   r   Údictr)   r   ZCParserr   r   r*   r!   r#   Úcheck_headerr   ÚreadÚ
make_tableZheader_charsÚmeta)
r   Útabler'   Zconversion_infoÚtry_intÚ	try_floatÚ
try_stringÚdataÚcommentsÚoutr   r   r   r1   E   sš    
ÿÿþýÿ
ÿÿ
ÿ
ÿ
ÿÿ

ý÷
ö

zFastBasic.readc                 C   s0   t ƒ }|r||d< t | j ¡ ¡}t|||d�S )z:Actually make the output table give the data and comments.r9   ©Únamesr3   )r   r   Ú_deduplicate_namesr!   Ú	get_namesr   )r   r8   r9   r3   r<   r   r   r   r2   ¡   s
    zFastBasic.make_tablec                 C   s–   | j  ¡ p| j  ¡ }| jrrddddddg}|D ]B}t |¡s`t|ƒdks`|d |ks`|d |kr.td	|›d
�ƒ‚q.| jr’t|ƒdkr’td|› �ƒ‚d S )Nr   ú,ú|ú	ú'r   r   éÿÿÿÿzColumn name z' does not meet strict name requirementsr   z9Table format guessing requires at least two columns, got )	r!   Úget_header_namesr>   r&   r   Z
_is_numberr,   r   Úguessing)r   r<   ZbadsÚnamer   r   r   r0   ª   s&    ÿ
þ
ý
ü
ÿÿzFastBasic.check_headerc                 C   s   |   ||i ¡ dS )z�
        Use a fast Cython method to write table data to output,
        where output is a filename or file-like object.
        N©Ú_write©r   r4   Úoutputr   r   r   Úwrite¿   s    zFastBasic.writec                 C   sZ   t j|dd� | j| j| j| jdœ}| |¡ | | j¡ tj	|f|Ž}| 
|||¡ d S )Nr   )Zmax_ndim)r
   r   Zstrip_whitespacer   )r   Z_check_multidim_tabler
   r   r   r   r   r   r   Z
FastWriterrK   )r   r4   rJ   r   Úheader_outputÚoutput_typesZwrite_kwargsÚwriterr   r   r   rH   Æ   s    ü
zFastBasic._writeN)TF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_format_nameÚ_descriptionÚ_fastr*   rE   r&   r    r#   r1   r2   r0   rK   rH   r   r   r   r   r      s    #\	   ÿr   )Ú	metaclassc                       s8   e Zd ZdZdZdZdZdZ‡ fdd„Zdd„ Z	‡  Z
S )	ÚFastCsva	  
    A faster version of the ordinary :class:`Csv` writer that uses the
    optimized C parsing engine. Note that this reader will append empty
    field values to the end of any row with not enough columns, while
    :class:`FastBasic` simply raises an error.
    Zfast_csvz4Comma-separated values table using the fast C engineTc                    s   t ƒ jdd dœf|Ž d S )Nr?   )r
   r   ©Úsuperr    ©r   r   ©Ú	__class__r   r   r    æ   s    zFastCsv.__init__c                 C   s   |   ||dtjdfgi¡ dS )zs
        Override the default write method of `FastBasic` to
        output masked values as empty fields.
        Zfill_valuesÚ N)rH   r   ZmaskedrI   r   r   r   rK   é   s    zFastCsv.write)rO   rP   rQ   rR   rS   rT   rU   r*   r    rK   Ú__classcell__r   r   r[   r   rW   Ù   s   rW   c                       s,   e Zd ZdZdZdZdZ‡ fdd„Z‡  ZS )ÚFastTabzl
    A faster version of the ordinary :class:`Tab` reader that uses
    the optimized C parsing engine.
    Zfast_tabz2Tab-separated values table using the fast C engineTc                    s$   t ƒ jddif|Ž d| _d| _d S )Nr
   rA   F©rY   r    r   r   rZ   r[   r   r   r    û   s    zFastTab.__init__)	rO   rP   rQ   rR   rS   rT   rU   r    r^   r   r   r[   r   r_   ñ   s
   r_   c                       s4   e Zd ZdZdZdZdZ‡ fdd„Zdd„ Z‡  Z	S )	ÚFastNoHeaderzª
    This class uses the fast C engine to read tables with no header line. If
    the names parameter is unspecified, the columns will be autonamed with
    "col{}".
    Zfast_no_headerz3Basic table with no headers using the fast C engineTc                    s   t ƒ jd ddœf|Ž d S )Nr   )r	   r   rX   rZ   r[   r   r   r      s    zFastNoHeader.__init__c                 C   s   | j ||i dd� dS )z€
        Override the default writing behavior in `FastBasic` so
        that columns names are not included in output.
        N©rL   rG   rI   r   r   r   rK     s    zFastNoHeader.write)
rO   rP   rQ   rR   rS   rT   rU   r    rK   r^   r   r   r[   r   ra     s   ra   c                       sD   e Zd ZdZdZdZdZ‡ fdd„Zdd„ Zd	d
„ Z	dd„ Z
‡  ZS )r.   zá
    A faster version of the :class:`CommentedHeader` reader, which looks for
    column names in a commented line. ``header_start`` denotes the index of
    the header line among all commented lines and is 0 by default.
    Zfast_commented_headerz8Columns name in a commented line using the fast C engineTc                    s"   t ƒ ji f|Ž d|krd| _d S )Nr   r   )rY   r    r   rZ   r[   r   r   r    "  s    zFastCommentedHeader.__init__c                 C   sp   t ƒ }|rR| j}|dk r$t|ƒ| }|d|… ||d d…  |d< |d sR|d= t | j ¡ ¡}t|||d�S )z¸
        Actually make the output table give the data and comments.  This is
        slightly different from the base FastBasic method in the way comments
        are handled.
        r   Nr   r9   r;   )r   r	   r,   r   r=   r!   r>   r   )r   r8   r9   r3   Úidxr<   r   r   r   r2   )  s     zFastCommentedHeader.make_tablec                 C   sª   | j j}g }| ¡ D ]F}| ¡ }|r|d | jkr| |dd … ¡ t|ƒ| jd kr q\qt|ƒ| jkrtt 	d¡‚| j  
|| j g¡ d| j _| j  ¡  | j  
|¡ d S )Nr   r   znot enough commented lines)r!   ÚsourceÚ
splitlinesÚlstripr   Úappendr,   r	   r   ZCParserErrorÚsetup_tokenizerr"   )r   ÚtmpZcommented_linesÚliner   r   r   r#   ;  s    

z FastCommentedHeader._read_headerc                 C   s   | j ||i dd� dS )zr
        Override the default writing behavior in `FastBasic` so
        that column names are commented.
        r   rb   NrG   rI   r   r   r   rK   N  s    zFastCommentedHeader.write)rO   rP   rQ   rR   rS   rT   rU   r    r2   r#   rK   r^   r   r   r[   r   r.     s   r.   c                       s<   e Zd ZdZdZdZdZ‡ fdd„Zdd„ Zd	d
„ Z	‡  Z
S )ÚFastRdbzå
    A faster version of the :class:`Rdb` reader. This format is similar to
    tab-delimited, but it also contains a header line after the column
    name line denoting the type of each column (N for numeric, S for string).
    Zfast_rdbz0Tab-separated with a type definition header lineTc                    s&   t ƒ jdddœf|Ž d| _d| _d S )NrA   é   )r
   r   Fr`   rZ   r[   r   r   r    a  s    zFastRdb.__init__c           
         sä  | j j}d}d}| ¡ D ]N}|s@| ¡ r@| ¡ d | jkr@|}q|s| ¡ r| ¡ d | jkr|} qpqtdƒ‚| j  |g¡ d| j _| j j	ddd� | j  
¡ ‰ˆ| j  ¡ krº| j  g ¡ | j  |g¡ | j j	ddd� | j  ¡ ‰ | j j	dd� tˆ ƒtˆƒk�rt d¡‚t| j  ¡ ƒtˆƒk�r>‡ ‡fd	d
„| j  ¡ D ƒ‰tdd„ ˆD ƒƒ�rbt dˆ› �¡‚i }i }i }t| j  ¡ ˆƒD ]N\}}	|	d  ¡ dk�r²d||< d||< d||< nd||< d||< d||< �q~| j  |¡ |||fS )Nr]   r   zRDB header requires 2 linesF)ÚdeduplicateZfilter_namesT)rm   zCRDB header mismatch between number of column names and column typesc                    s   g | ]}ˆˆ   |¡ ‘qS r   )Úindex)Ú.0Ún©Z	col_namesÚtypesr   r   Ú
<listcomp>Ž  s     z(FastRdb._read_header.<locals>.<listcomp>c                 s   s    | ]}t  d |t j¡ V  qdS )z	\d*(N|S)$N)ÚreÚmatchÚ
IGNORECASE)ro   Úxr   r   r   Ú	<genexpr>�  s     z'FastRdb._read_header.<locals>.<genexpr>z2RDB type definitions do not all match [num](N|S): rC   Úsr   )r!   rd   re   Ústriprf   r   r   rh   r	   r"   rD   r>   Z	set_namesr,   r   ZInconsistentTableErrorÚanyÚzipÚlower)
r   ri   Úline1Úline2rj   r5   r6   r7   rF   Zcol_typer   rq   r   r#   f  sV    

ÿÿ
zFastRdb._read_headerc                 C   s   | j ||i dd� dS )z�
        Override the default writing behavior in `FastBasic` to
        output a line with column types after the column name line.
        T)rM   NrG   rI   r   r   r   rK   ¦  s    zFastRdb.write)rO   rP   rQ   rR   rS   rT   rU   r    r#   rK   r^   r   r   r[   r   rk   V  s   @rk   )r   rt   Úcollectionsr   Zastropy.tabler   Zastropy.utils.miscr   r]   r   r   ZMetaBaseReaderr   rW   r_   ra   r.   rk   r   r   r   r   Ú<module>   s    M?