U
    e»{jÏ|  ã                   @   s†  d Z ddlZddlZddlZddlmZ ddlmZ ddlZ	ddl
Z
ddlZddlmZ ddlmZ ddlmZmZ ddlmZmZ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! ddl m"Z# ddl$m%Z% ddddddddddddddgZ&e'e	dƒ�rej(dk�sej)dk�r&e& *d¡ eƒ Z+e&D ]pZ,e,dk�rPe	 -d d!d g¡Z.n*e,dk�rle	 -d"d#d$g¡Z.ne	j/d%e,d&�Z.ee.d'd(e, d)e, did*�Z0e0e+e,< �q0d+d,ge+j1d-< d.d/d0d1d2d3d4d5d6d7d8gZ2d9d:„ Z3d;d<„ Z4d=d>„ Z5d?d@„ Z6dAdB„ Z7dCdD„ Z8dEdF„ Z9dGdH„ Z:dIdJ„ Z;dKdL„ Z<dMdN„ Z=d¸dOdP„Z>dQdR„ Z?dSdT„ Z@e
jA BdUeef¡dVdW„ ƒZCdXdY„ ZDe
jA BdZeEe F¡ ƒ¡e
jA BdUeef¡e
jA Bd[d\¡d]d^„ ƒƒƒZGd_d`„ ZHdadb„ ZIe
jA BdUeef¡dcdd„ ƒZJdedf„ ZKe
jA Bdgdhdig¡e
jA Bdje	jLe	jMeNeOg¡e
jA Bdkdldmg¡dndo„ ƒƒƒZPe
jA Bdpdqdrg¡dsdt„ ƒZQdudv„ ZRdwdx„ ZSdydz„ ZTd{d|„ ZUd}d~„ ZVdd€„ ZWd�d‚„ ZXdƒd„„ ZYd…d†„ ZZd‡dˆ„ Z[i Z\i Z]e	j-dd‰ge	j^d&�e]dŠ< ddŠd‹œge\dŠ< e	j_dŒe`d�� e]dŽ< Z0dd‰gd�d�gge0d< dd‰d%gd�d‘d’gge0d< d“dŽd”d•œge\dŽ< e	j_dŒe`d�� e]d–< Z0e	j-dd‰gd%d�gge	jad&�e0d< e	j-dd‰d%gd�d—d’gge	jad&�e0d< d“d–d˜d•œge\d–< e	j-dd‰gd%d�d™gge`d&�e]dš< d“dšd”d•œge\dš< e	j-e	j-dd‰ge	jbd&�e	j-d%d�d™ge	jbd&�ge`d&�e]d›< d“d›dœd•œge\d›< e	j-e	 -d�d�g¡e	 -dždŸd g¡ge`d&�e]d¡< d“d¡d¢d•œge\d¡< e	j-e	 -d!d g¡e	 -d!d d!g¡ge`d&�e]d£< d“d£d¤d•œge\d£< e	j-dd‰gd%d�gge	jcd&�e]d¥< d“d¥d¦d•œge\d¥< e	j/d§e	jdd&� ed‰d‰d‰¡e]d¨< d“d¨d©d•œge\d¨< e	j-d�did�d‰ige`d&�e]dª< d“dªd”d•œge\dª< e	j-d�did�d‰igd�did�d‰igge`d&�e]d«< d“d«d¬d•œge\d«< e
jA Bd­eEefe]e] g¡ e\ g¡ ƒƒ¡d®d¯„ ƒZhd°d±„ Zid²d³„ Zjd´dµ„ Zkd¶d·„ ZldS )¹zN
This module tests some of the methods related to the ``ECSV``
reader/writer.
é    N)Únullcontext)ÚStringIO)Úunits)Úascii)Ú
DELIMITERSÚInvalidEcsvDatatypeWarning)Úcompare_attrsÚ
mixin_colsÚserialized_names)ÚColumnÚQTableÚTable)ÚMaskedColumn)Úsimple_table)ÚQuantityInfo)Úallcloseé   )ÚTEST_DIRÚboolÚint8Úint16Úint32Úint64Úuint8Zuint16Zuint32Zuint64Úfloat16Úfloat32Úfloat64Zfloat128ÚstrÚntl        FTzab 0zab, 1Zab2é   ©Údtypezm / sZdescr_zmeta )ÚunitÚdescriptionÚmetaZcomment1Zcomment2Úcommentsú# %ECSV 1.0ú# ---ú# datatype:z# - {name: a, datatype: int64}z # - {name: b, datatype: float64}z# - {name: c, datatype: string}ú# schema: astropy-2.0úa b cz1 1.0 cz2 2.0 dz3 3.0 ec                  C   s2   t ƒ } tƒ }| j|dd� | ¡  ¡ tks.t‚dS )z€
    Write a simple table with common types.  This shows the compact version
    of serialization with one line per column.
    ú
ascii.ecsv©ÚformatN)r   r   ÚwriteÚgetvalueÚ
splitlinesÚSIMPLE_LINESÚAssertionError©ÚtÚout© r6   ú_/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/io/ascii/tests/test_ecsv.pyÚtest_write_simpleP   s    r8   c                  C   st   t d } dddddddd	d
dddddddddddddddddddddg}tƒ }| j|dd� | ¡  ¡ |kspt‚dS ) zV
    Write a full-featured table with common types and explicitly checkout output
    )r   r   r   r   r&   r'   r(   z# - name: boolz#   unit: m / sz#   datatype: boolz#   description: descr_boolz#   meta: {meta bool: 1}z# - name: int64z#   datatype: int64z#   description: descr_int64z#   meta: {meta int64: 1}z# - name: float64z#   datatype: float64z#   description: descr_float64z#   meta: {meta float64: 1}z# - name: strz#   datatype: stringz#   description: descr_strz#   meta: {meta str: 1}z# meta: !!omapz"# - comments: [comment1, comment2]r)   zbool int64 float64 strzFalse 0 0.0 "ab 0"zTrue 1 1.0 "ab, 1"zFalse 2 2.0 ab2r+   r,   N)ÚT_DTYPESr   r.   r/   r0   r2   )r4   Úlinesr5   r6   r6   r7   Útest_write_full\   sF    â!r;   c               	   C   sÐ   t } tD ]Â}tƒ }| j|d|d� tj| ¡ dd�tj| ¡ dd�t | ¡ ¡tj| ¡ ddd�tj| ¡ dd�g}|D ]P}| j|jksŒt	‚| j
D ]4}| |  || ¡s¬t	‚t | | || k¡s’t	‚q’qxqdS )	z‡
    Write a full-featured table with all types and see that it round-trips on
    readback.  Use both space and comma delimiters.
    r+   ©r-   Ú	delimiterr,   r   ÚecsvF©r-   ÚguessN)r9   r   r   r.   r   Úreadr/   r   r$   r2   ÚcolnamesZattrs_equalÚnpÚall)r4   r=   r5   Zt2sÚt2Únamer6   r6   r7   Útest_write_read_roundtrip‡   s    û
rG   c               	   C   sB   t ƒ } t t¡�}tj| ddd� W 5 Q R X dt|jƒks>t‚dS )zJ
    Passing a delimiter other than space or comma gives an exception
    r+   ú|r<   ú only space and comma are allowedN)	r   ÚpytestÚraisesÚ
ValueErrorr9   r.   r   Úvaluer2   )r5   Úerrr6   r6   r7   Útest_bad_delimiterŸ   s    rO   c               	   C   sD   t   t¡} d| d< t tj¡� tjd | ¡ddd� W 5 Q R X dS )z0
    Bad header without initial # %ECSV x.x
    z
# %ECV 0.9r   Ú
r+   Fr?   N)	Úcopyr1   rJ   rK   r   ZInconsistentTableErrorr   rA   Újoin)r:   r6   r6   r7   Útest_bad_header_start©   s    
rS   c               	   C   sX   t   t¡} |  dd¡ t t¡�}tjd | ¡ddd� W 5 Q R X dt	|j
ƒksTt‚dS )	z$
    Illegal delimiter in input
    é   z# delimiter: |rP   r+   Fr?   rI   N)rQ   r1   ÚinsertrJ   rK   rL   r   rA   rR   r   rM   r2   )r:   rN   r6   r6   r7   Útest_bad_delimiter_input³   s
    
 rV   c                  C   s  t ƒ } t d¡ ddd¡| d< d| d j_ddi| d j_ddg| d< tƒ }| j|d	d
� t j	| 
¡ d	d
�}t |d | d k¡s†t‚|d j| d jksžt‚|d j| d jks¶t‚|d jj| d jjksÒt‚|d jj| d jjksît‚t |d | d k¡�s
t‚dS )z+
    Multi-dimensional column in input
    é   rT   r   é   Úar#   r   Úbr+   r,   N)r   rC   ÚarangeÚreshapeÚinfor#   r$   r   r.   rA   r/   rD   r2   Úshaper!   ©r4   r5   rE   r6   r6   r7   Útest_multidim_input¾   s    r`   c                  C   s\  t ƒ } tddddgffddddgffgd	d
ddgfgdddddid�| d< tddgddggdt d¡d�| d< tƒ }| j|dd� t j| ¡ dd�}| jD ]¼}t	 
|| | | k¡s¸t‚|| j| | jksÐt‚|| j| | jksèt‚|| j| | jk�st‚|| j| | jk�st‚|| jj| | jjk�s:t‚|| jj| | jjksšt‚qšdS )z%
    Structured column in input.
    ÚBç      ð?ç       @ç      @ÚAç      "@ç       @ç      @)ÚsZU1Úv)Úp0Zf8)Úp1Z2f8r#   ú>Úmr   rT   )r!   r#   r-   r"   r$   rY   )rb   rc   )rf   rg   )rd   g      @)rh   g      @zf8,f8zm,s)r!   r"   rZ   r+   r,   N)r   r   ÚuZUnitr   r.   rA   r/   rB   rC   rD   r2   r^   r!   r"   r-   r]   r#   r$   )r4   r5   rE   Úcolr6   r6   r7   Útest_structured_inputÕ   s2    ú
ý

rq   c                  C   sb   t tddgdddgd�} tƒ }| j|dd� t j| ¡ dd�}| j|jksNt‚t|ƒd	ks^t‚d
S )zLTest fix in #5010 for issue #5009 (ECSV fails for empty type with bool type)ÚiÚfrY   rZ   Úc)r!   Únamesr+   r,   r   N)	r   r   r   r.   rA   r/   r!   r2   Úlenr_   r6   r6   r7   Útest_round_trip_empty_table÷   s    rw   c               	   C   sV   t   t¡} |  d¡}d| |< t t¡�}tj| dd� W 5 Q R X dt|j	ƒksRt
‚dS )z{
    Test that mismatch in column names from normal CSV header vs.
    ECSV YAML header raises the expected exception.
    r*   za b dr>   r,   z-column names from ECSV header ['a', 'b', 'c']N)rQ   r1   ÚindexrJ   rK   rL   r   rA   r   rM   r2   )r:   Zheader_indexrN   r6   r6   r7   Útest_csv_ecsv_colnames_mismatch  s    

ry   c                  C   sb   t ƒ } dtj tjdœ| _dgtj | d< tƒ }| j|dd� d| ¡ ksNt‚d| ¡ ks^t‚d	S )
zF
    See https://github.com/astropy/astropy/issues/5604 for more.
    é   )ZfooZfoo2é   Úbarr+   r,   z!astropy.units.Unitz!astropy.units.QuantityN)	r   ro   Úkmri   r$   r   r.   r/   r2   r3   r6   r6   r7   Útest_regression_5604  s    r~   c           	   
   C   s$  |r| j |j kst‚| j|jks$t‚dddddg}|| D ]˜}| }|}| d¡D ]B}zt||ƒ}t||ƒ}W qP tk
r�   || }|| }Y qPX qPt|tjƒrÀ|j	j
dkrÀt||dd	�sÒt‚q:t ||k¡s:t‚q:|�s t| tjƒ�r| j	j
dk�rt| |d
d	��s t‚nt | |k¡�s t‚d S )Nz	info.namezinfo.formatz	info.unitzinfo.descriptionz
info.dtypeÚ.rs   ç»½×Ùß|Û=©ZrtolgVçž¯Ò<)Ú	__class__r2   r^   ÚsplitÚgetattrÚAttributeErrorÚ
isinstancerC   Úndarrayr!   ÚkindÚquantity_allcloserD   )	Zobj1Úobj2ÚattrsÚcompare_classZ
info_attrsÚattrZa1Za2Zsubattrr6   r6   r7   Úassert_objects_equal  s4    û
rŽ   c                  C   s’   t dd„ t ¡ D ƒƒ} tƒ }| j|dd� tj| ¡ dd�}t|ƒt	ksLt
‚td | d< tƒ }| j|dd� tj| ¡ dd�}t|ƒt ksŽt
‚dS )zzEnsure that ascii.read(ecsv_file) returns the correct class
    (QTable if any Quantity subclasses, Table otherwise).
    c                 S   s"   i | ]\}}t |jtƒs||“qS r6   )r†   r]   r   )Ú.0rF   rp   r6   r6   r7   Ú
<dictcomp>H  s   þ z5test_ecsv_mixins_ascii_read_class.<locals>.<dictcomp>r+   r,   r>   ZlonN)r   r	   Úitemsr   r.   r   rA   r/   Útyper   r2   r_   r6   r6   r7   Ú!test_ecsv_mixins_ascii_read_classB  s    þÿr“   c            	      C   sÊ   t tƒ} tdd„ | D ƒ| d�}tƒ }|j|dd� tj| ¡ dd�}|j|jksTt	‚|j
 ¡ D ]f\}}|| }t| }d}t|jtƒr¶t|ƒtks–t	‚dg}d}tj|j|d	d
�s¶t	‚t||||ƒ q^dS )zWTest writing as QTable and reading as Table.  Ensure correct classes
    come out.
    c                 S   s   g | ]}t | ‘qS r6   ©r	   ©r�   rF   r6   r6   r7   Ú
<listcomp>b  s     z4test_ecsv_mixins_qtable_to_table.<locals>.<listcomp>©ru   r+   r,   Tr"   Fr€   r�   N)Úsortedr	   r   r   r.   r   rA   r/   rB   r2   Úcolumnsr‘   r   r†   r]   r   r’   r   rC   r   rM   rŽ   )	ru   r4   r5   rE   rF   rp   Zcol2r‹   rŒ   r6   r6   r7   Ú test_ecsv_mixins_qtable_to_table\  s     rš   Ú	table_clsc           	      C   s°   t tƒ}g }|D ].}t| }| d¡s4dd„ |D ƒ}| |¡ q| dd„ |D ƒ|d�}tƒ }|j|dd� | j| ¡ dd�}|j	|j	ksŒt
‚| j| ¡ dd�}|j	|ks¬t
‚d	S )
zGTest write/read all cols at once and validate intermediate column namesZtm3c                 S   s"   g | ]}|  d ¡s| dd¡‘qS )Újd2z.jd1Ú )ÚendswithÚreplace)r�   Zs_namer6   r6   r7   r–   „  s   
þz+test_ecsv_mixins_as_one.<locals>.<listcomp>c                 S   s   g | ]}t | ‘qS r6   r”   r•   r6   r6   r7   r–   ‹  s     r—   r+   r,   zascii.basicN)r˜   r	   r
   Ú
startswithÚextendr   r.   rA   r/   rB   r2   )	r›   ru   Zall_serialized_namesrF   Zs_namesr4   r5   rE   Út3r6   r6   r7   Útest_ecsv_mixins_as_onez  s     
þr£   c                 C   sN   |dkrJddl }dd„ t| ddg¡td| ƒƒD ƒ}| |  dg| ¡} | S )a5  Take a col with length=2 and make it N-d by repeating elements.

    For the special case of ndim==1 just return the original.

    The output has shape [3] * ndim. By using 3 we can be sure that repeating
    the two input elements gives an output that is sufficiently unique for
    the multidim tests.
    r   r   Nc                 S   s   g | ]\}}|‘qS r6   r6   )r�   ÚidxÚ_r6   r6   r7   r–   ¤  s     z!make_multidim.<locals>.<listcomp>r   )Ú	itertoolsÚzipÚcycleÚranger\   )rp   Úndimr¦   Zidxsr6   r6   r7   Úmake_multidim˜  s
    	&r«   Úname_colrª   )r   rT   r   c                    s   |\}}t t ddg¡|ƒ}t ||ƒ}ˆ |||gd|dgd�}d|| j_tƒ }|j|dd� ˆ j| ¡ dd�}|j	|j	ks€t
‚|j	D ]T}	t||	 jƒ|ks t
‚|	d	kr°d
g}
n‡ fdd„t|	 D ƒ}
t||	 ||	 |
ƒ q†| d¡�r|| jjjtjk�st
‚|| jjjtjk�st
‚dS )z~Test write/read one col at a time and do detailed validation.
    This tests every input column type as 1-d, 2-d and 3-d.
    rb   rc   Úc1Úc2r—   r#   r+   r,   )r­   r®   Údatac                    s    g | ]}|d krˆ t ks|‘qS )Z
wrap_angle)r   )r�   r�   ©r›   r6   r7   r–   Ã  s    þz/test_ecsv_mixins_per_column.<locals>.<listcomp>ÚtmN)r«   rC   Úarrayr]   r#   r   r.   rA   r/   rB   r2   rv   r^   r   rŽ   r    Ú_timeZjd1r‚   r‡   rœ   )r›   r¬   rª   rF   rp   rt   r4   r5   rE   ZcolnameÚcomparer6   r°   r7   Útest_ecsv_mixins_per_column©  s(    


þrµ   c                 C   sº   | d }t dd�}| |¡ t |¡}|jdks4t‚|j|jksDt‚|jD ]j}t || j	|| j	k¡slt‚t || || k¡s†t‚d|| _	d|| _	t || || k¡rJt‚qJdS )a_  Test (mostly) round-trip of MaskedColumn through ECSV using default serialization
    that uses an empty string "" to mark NULL values.  Note:

    >>> simple_table(masked=True)
    <Table masked=True length=3>
      a      b     c
    int64 float64 str1
    ----- ------- ----
       --     1.0    c
        2     2.0   --
        3      --    e
    ú	test.ecsvT©ÚmaskedFN©
r   r.   r   rA   r¸   r2   rB   rC   rD   Úmask©Útmp_pathÚfilenamer4   rE   rF   r6   r6   r7   Ú$test_round_trip_masked_table_defaultÐ  s    





r¾   c                 C   sØ   | d }t dd�}d|d d< ddd	g|d
< |j|dd� t |¡}|jdksRt‚|j|jksbt‚|jD ]j}t || j	|| j	k¡sŠt‚t || || k¡s¤t‚d|| _	d|| _	t || || k¡sht‚qhdS )zY
    Same as prev but set the serialize_method to 'data_mask' so mask is written out
    r¶   Tr·   r�   rt   r   r   rT   r   ÚdÚ	data_mask)Úserialize_methodFNr¹   r»   r6   r6   r7   Ú+test_round_trip_masked_table_serialize_maskñ  s    




rÂ   c           
   	   C   s|  |d }t  d¡}| ƒ }t d¡| |d< | |¡ | tkrNtjt jdd�}nt	ƒ }|� |  
|¡}W 5 Q R X t|d jt jƒs„t‚t|d jƒdksšt‚| tkrÂt |d j|d jk¡sÜt‚nt |d |d k¡sÜt‚t  |¡�Œ |  
|¡}|d j|k�st‚t |d |d k¡�s"t‚|d }| |¡ |  
|¡}	|	d j|k�sRt‚t |	d |d k¡�snt‚W 5 Q R X dS )	z8Ensure that we can read-back enabled user-defined units.r¶   Zbandpass_sol_lumrz   Úlz#'bandpass_sol_lum' did not parse .*©Úmatchz
test2.ecsvN)ro   Zdef_unitrC   r[   r.   r   rJ   ÚwarnsZUnitsWarningr   rA   r†   r"   ZUnrecognizedUnitr2   r   rD   rM   Zadd_enabled_units)
r›   r¼   r½   r"   r4   ÚctxrE   r¢   Ú	filename2Zt4r6   r6   r7   Ú&test_ecsv_round_trip_user_defined_unit  s0    

 


rÉ   c                  C   sf   d} t j| dd�}|d }t|tƒs(t‚t |jdddddgk¡sFt‚t |dddddgk¡sbt‚d S )Nzl# %ECSV 1.0
# ---
# datatype:
# - {name: col0, datatype: bool}
# schema: astropy-2.0
col0
1
0
True
""
False
r>   r,   Zcol0FT)r   rA   r†   r   r2   rC   rD   rº   )ÚtxtZdatrp   r6   r6   r7   Útest_read_masked_bool5  s    rË   rÁ   Z
null_valuerÀ   r!   r=   ú,ú c                 C   s  t ƒ }tt d¡ ddd¡|d�}|tkr4| d¡}d|jd< d|jd< ||d	< d
dg|d< tƒ }|j	|d| d� t j
| ¡ dd�}|jdks’t‚|j|jks¢t‚|jD ]b}|| j|| jksÄt‚t|| dƒrðt || j|| jk¡sðt‚t || || k¡s¨t‚q¨d S )Né   rT   r   r    ZU2T)r   r   r   )r   r   r   rY   ÚxÚyrZ   r+   )r-   rÁ   r,   Frº   )r   r   rC   r[   r\   r   Zastyperº   r   r.   rA   r/   r¸   r2   rB   r!   ÚhasattrrD   )rÁ   r!   r=   r4   rp   r5   rE   rF   r6   r6   r7   Ú$test_roundtrip_multidim_masked_arrayJ  s$    



rÒ   Úsubtypezsome-user-typeÚcomplexc              	   C   sh   d| › d�}t jtd| › d�d�� tj|dd�}W 5 Q R X |d jjd	ksPt‚|d d
 dksdt‚dS )z8Test an ECSV file with a string type but unknown subtypezL# %ECSV 1.0
# ---
# datatype:
# - name: a
#   datatype: string
#   subtype: z$
# schema: astropy-2.0
a
[1,2]
[3,4]zunexpected subtype 'z' set for column 'a'rÄ   r>   r,   rY   ÚUr   z[1,2]N)rJ   rÆ   r   r   rA   r!   rˆ   r2   )rÓ   rÊ   r4   r6   r6   r7   Útest_multidim_unknown_subtypee  s    ú
þrÖ   c               	   C   s0   d} t jtdd�� tj| dd� W 5 Q R X dS )úTest a malformed ECSV filezx# %ECSV 1.0
# ---
# datatype:
# - name: a
#   datatype: string
#   subtype: int64[3]
# schema: astropy-2.0
a
[1,2]
[3,4]z,column 'a' failed to convert: shape mismatchrÄ   r+   r,   N©rJ   rK   rL   r   rA   )rÊ   r6   r6   r7   Útest_multidim_bad_shape}  s     ÿrÙ   c               	   C   sV   t ƒ } tjddhdgtd�| d< d}tƒ }tjt|d�� | j|dd� W 5 Q R X d S )	Nr   rT   r    rY   zScould not convert column 'a' to string: Object of type set is not JSON serializablerÄ   r+   r,   )	r   rC   r²   Úobjectr   rJ   rK   Ú	TypeErrorr.   )r4   rÅ   r5   r6   r6   r7   Ú test_write_not_json_serializable�  s    ÿrÜ   c               	   C   s4   d} d}t jt|d�� tj| dd� W 5 Q R X dS )r×   zo# %ECSV 1.0
# ---
# datatype:
# - {name: a, datatype: string, subtype: json}
# schema: astropy-2.0
a
fail
[3,4]z<column 'a' failed to convert: column value is not valid JSONrÄ   r+   r,   NrØ   ©rÊ   rÅ   r6   r6   r7   Útest_read_not_json_serializableœ  s    	rÞ   c               	   C   sx   d} t jtdd�� tj| dd�}W 5 Q R X |d d dks@t‚t|d d	 ƒtksXt‚t|d jƒt	 d
¡kstt‚dS )r×   z`# %ECSV 1.0
# ---
# datatype:
# - {name: a, datatype: object}
# schema: astropy-2.0
a
fail
[3,4]z<unexpected datatype 'object' of column 'a' is not in allowedrÄ   r+   r,   rY   r   Zfailr   ÚON)
rJ   rÆ   r   r   rA   r2   r’   r   r!   rC   ©rÊ   r4   r6   r6   r7   Útest_read_bad_datatype¬  s    	þrá   c               	   C   sF   d} t jtdd�� tj| dd�}W 5 Q R X |d jjtjksBt	‚dS )z,Test an ECSV v1.0 file with a complex columnz`# %ECSV 1.0
# ---
# datatype:
# - {name: a, datatype: complex}
# schema: astropy-2.0
a
1+1j
2+2jz=unexpected datatype 'complex' of column 'a' is not in allowedrÄ   r+   r,   rY   N)
rJ   rÆ   r   r   rA   r!   r’   rC   Z
complex128r2   rà   r6   r6   r7   Útest_read_complexÁ  s    
þrâ   c               	   C   s^   d} t jtdd�� tj| dd�}W 5 Q R X t|d d tƒsBt‚t|d d tj	ƒsZt‚d	S )
z;Test an ECSV file with a 'str' instead of 'string' datatypez]# %ECSV 1.0
# ---
# datatype:
# - {name: a, datatype: str}
# schema: astropy-2.0
a
sometext
Sz9unexpected datatype 'str' of column 'a' is not in allowedrÄ   r+   r,   rY   r   r   N)
rJ   rÆ   r   r   rA   r†   r   r2   rC   Zstr_rà   r6   r6   r7   Útest_read_strÕ  s    
þrã   c               	   C   s4   d} d}t jt|d�� tj| dd� W 5 Q R X dS )r×   zn# %ECSV 1.0
# ---
# datatype:
# - {name: a, datatype: int64, subtype: json}
# schema: astropy-2.0
a
fail
[3,4]zEcolumn 'a' failed to convert: datatype of column 'a' must be "string"rÄ   r+   r,   NrØ   rÝ   r6   r6   r7   Ú)test_read_bad_datatype_for_object_subtypeê  s    	rä   c                  C   s„   t ƒ } tjtjdgtjd�| d< d| d j_tƒ }| j|dd� t j	| 
¡ dd�}t | d |d k¡slt‚|d jjdks€t‚dS )zPTest round-trip of float values to full precision even with format
    specifiedg’$I’$IÂ?r    rY   z.2fr+   r,   N)r   rC   r²   Úpir   r]   r-   r   r.   rA   r/   rD   r2   r_   r6   r6   r7   Útest_full_repr_roundtripú  s    ræ   c                 C   s@   dd„ |   ¡ D ƒ}dd„ |D ƒ}|dd … }t d |¡¡}|S )Nc                 S   s   g | ]}|  ¡ ‘qS r6   )Ústrip©r�   Úliner6   r6   r7   r–     s     z)_get_ecsv_header_dict.<locals>.<listcomp>c                 S   s"   g | ]}|  d ¡r|dd… ‘qS )ú#rT   N)r    rè   r6   r6   r7   r–     s     
 rT   rP   )r0   ÚyamlZ	safe_loadrR   )Útextr:   r5   r6   r6   r7   Ú_get_ecsv_header_dict  s
    rí   c                 C   sŒ   ddl m} |  ¡ D ]r\}}tƒ }|||< tƒ }|j|dd� t| ¡ ƒ}||d ƒ}td|›d�|d d… ƒ t|dd … ƒ tƒ  qd S )	Nr   )Úpformatr+   r,   Údatatypezexps[z] =r   )	Úpprintrî   r‘   r   r   r.   rí   r/   Úprint)Úcolsrî   rF   rp   r4   r5   ÚhdrZfmt_hdrr6   r6   r7   Ú_make_expected_values  s    rô   rT   Zscalar)rï   rF   )rT   )r^   r!   z2-d variable array listsrY   rX   g      @é   ÚstringÚjson)rï   rF   rÓ   z2-d variable array numpyg      @zfloat32[2,null]rz   z1-d variable array listsz1-d variable array numpyzuint8[null]rZ   rt   r¿   Úez1-d variable array numpy strzstring[null]z1-d variable array numpy boolz
bool[null]z1-d regular arrayzint8[2]é   z2-d regular arrayzfloat16[2,2]zscalar objectz
1-d objectzjson[2]zname,col,expc           	      C   sÒ   t ƒ }||| < tƒ }|j|dd� t| ¡ ƒ}|d |ks>t‚t j| ¡ dd�}|j|jks`t‚|jD ]f} ||  j||  jks‚t‚t	||  ||  ƒD ]6\}}t
|tjƒr¸|j|jks¸t‚t ||k¡s”t‚q”qfdS )z=Test variable length lists, multidim columns, object columns.r+   r,   rï   N)r   r   r.   rí   r/   r2   rA   rB   r!   r§   r†   rC   r‡   rD   )	rF   rp   Úexpr4   r5   ró   rE   Úval1Úval2r6   r6   r7   Útest_specialized_columns|  s    
rý   c               	   C   s@  t  tj tdd¡¡} d d¡}| j|ks.t‚ddddd	d
dddœ}|  	¡ D ]î}|j
}|jdkrbqLt|tƒspt‚|jdd… }|jdd… }|dkr¢|jdks¢t‚|dkr¸|jdks¸t‚|dk�r$|jdksÐt‚|jjdksàt‚|D ]<}t|tjƒsøt‚|jj || ¡�st‚t|ƒdksät‚qäqL|jj || ¡sLt‚qLdS )aO  Read ECSV file created by M. Taylor that includes scalar, fixed array,
    variable array for all datatypes. This file has missing values for all
    columns as both per-value null and blank entries for the entire column
    value.

    Note: original file was modified to include blank values in f_float and
    f_double columns.
    r¯   zsubtypes.ecsvzÖi_index,s_byte,s_short,s_int,s_long,s_float,s_double,s_string,s_boolean,f_byte,f_short,f_int,f_long,f_float,f_double,f_string,f_boolean,v_byte,v_short,v_int,v_long,v_float,v_double,v_string,v_boolean,m_int,m_doublerÌ   r   r   r   r   r   r   r   r   )ÚbyteÚshortÚintÚlongÚfloatÚdoublerö   ÚbooleanZi_indexrT   Nr   ri   )é   rs   )r  r   rj   rÚ   )r   r   rT   r   )r   rA   ÚosÚpathrR   r   rƒ   rB   r2   Zitercolsr]   rF   r†   r   r^   r!   rC   r‡   r    rv   )r4   rB   Ztype_maprp   r]   Ú	type_namerÓ   Úvalr6   r6   r7   Útest_full_subtypes�  sD    	ûÿø

r
  c                  C   s  d} t j| dd�}t |d tjddddggtd	�k¡s<t‚t |d jd
dd
gk¡sZt‚tjjddgddgddggddgddgddggd�}t |d |k¡s¤t‚t |d j|jk¡s¾t‚t |d d dgk¡sÚt‚t |d d ddgk¡søt‚t |d jd
dd
gk¡�st‚dS )z]Test blank field in subtypes. Similar to previous test but with explicit
    checks of valuesa1  
    # %ECSV 1.0
    # ---
    # datatype:
    # - {name: o, datatype: string, subtype: json}
    # - {name: f, datatype: string, subtype: 'int64[2]'}
    # - {name: v, datatype: string, subtype: 'int64[null]'}
    # schema: astropy-2.0
    o f v
    null [0,1] [1]
    "" "" ""
    [1,2] [2,3] [2,3]
    r+   r,   ÚoNéÿÿÿÿr   rT   r    FTr   r   )rº   rs   rj   )	r   rA   rC   rD   r²   rÚ   r2   rº   Úma)rÊ   r4   rú   r6   r6   r7   Útest_masked_empty_subtypesÈ  s    *4r  c            	      C   s°  t ƒ } tjjddgddggddgddggtjd�| d< tjdtd�| d	< tjjddgddgtjd�| d	 d< tjjddd
gdddgtjd�| d	 d< tƒ }| j|dd� d}t	| 
¡ ƒ}t	|ƒ}||ksÌt‚t j| 
¡ dd�}|j| jksît‚|jD ]¶}|| j| | jk�st‚t|| ƒt| | ƒk�s0t‚t|| | | ƒD ]f\}}t|tjƒ�rj|j|jk�sjt‚t|tjjƒ�r’t |j|jk¡�s’t‚t ||k¡�sBt‚�qBqôdS )z6Test null values in fixed and variable array subtypes.r   rT   r   rX   r   )rº   r!   rs   r    rj   rz   r+   r,   zô
    # %ECSV 1.0
    # ---
    # datatype:
    # - {name: f, datatype: string, subtype: 'int64[2]'}
    # - {name: v, datatype: string, subtype: 'int64[null]'}
    # schema: astropy-2.0
    f v
    [1,null] [1,null]
    [null,4] [null,4,5]
    N)r   rC   r  r²   r   ÚemptyrÚ   r   r.   rí   r/   r2   rA   rB   r!   r’   r§   r†   r‡   ZMaskedArrayrD   rº   )	r4   r5   rÊ   ró   Zhdr_exprE   rF   rû   rü   r6   r6   r7   Ú"test_masked_vals_in_array_subtypeså  s,    0$(
r  c                  C   s8   d} t  | ¡}|d jjdks"t‚|d jdks4t‚dS )z<Except for ECSV, guessing always requires at least 2 columnsz—
    # %ECSV 1.0
    # ---
    # datatype:
    # - {name: col, datatype: string, description: hello}
    # schema: astropy-2.0
    col
    1
    2
    rp   rÕ   ZhelloN)r   rA   r!   rˆ   r2   r#   rà   r6   r6   r7   Útest_guess_ecsv_with_one_column
  s    

r  )T)mÚ__doc__rQ   r  ÚsysÚ
contextlibr   Úior   ÚnumpyrC   rJ   rë   Zastropyr   ro   Z
astropy.ior   Zastropy.io.ascii.ecsvr   r   Zastropy.io.tests.mixin_columnsr   r	   r
   Zastropy.tabler   r   r   Zastropy.table.columnr   Zastropy.table.table_helpersr   Zastropy.unitsr   r   r‰   Úcommonr   ZDTYPESrÑ   rF   ÚmaxsizeÚremover9   r!   r²   r¯   r[   rt   r$   r1   r8   r;   rG   rO   rS   rV   r`   rq   rw   ry   r~   rŽ   r“   rš   ÚmarkZparametrizer£   r«   Úlistr‘   rµ   r¾   rÂ   rÉ   rË   r   r   r   r   rÒ   rÖ   rÙ   rÜ   rÞ   rá   râ   rã   rä   ræ   rí   rô   Zexpsrò   r   r  rÚ   r   r   r   r   r\   r§   Úvaluesrý   r
  r  r  r  r6   r6   r6   r7   Ú<module>   sR  ò$


   
ÿõ+

"

%
$!
'

ÿ $ýÿ 
ÿ(þ

ÿ ÿ
ýÿ ÿ
ýÿ 
ÿ
ÿ
ÿ ÿ

ÿ 
9%