
    HR-e|                     t   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% g dZ& e'e	d          rej(        dk    sej)        dk    re&*                    d            e            Z+e&D ]bZ,e,dk    r e	j-        g d          Z.n+e,dk    r e	j-        g d          Z.n e	j/        de,          Z. ee.dde,z   de,z   di          Z0e0e+e,<   cddge+j1        d <   g d!Z2d" Z3d# Z4d$ Z5d% Z6d& Z7d' Z8d( Z9d) Z:d* Z;d+ Z<d, Z=d|d.Z>d/ Z?d0 Z@e
jA        B                    d1eef          d2             ZCd3 ZDe
jA        B                    d4 eE ejF                                        e
jA        B                    d1eef          e
jA        B                    d5d6          d7                                     ZGd8 ZHd9 ZIe
jA        B                    d1eef          d:             ZJd; ZKe
jA        B                    d<d=d>g          e
jA        B                    d?e	jL        e	jM        eNeOg          e
jA        B                    d@dAdBg          dC                                     ZPe
jA        B                    dDdEdFg          dG             ZQdH ZRdI ZSdJ ZTdK ZUdL ZVdM ZWdN ZXdO ZYdP ZZdQ Z[i Z\i Z] e	j-        ddRge	j^                  e]dS<   dTdSdUge\dS<    e	j_        dVe`W          xe]dX<   Z0ddRgdYdZgge0d<   g d6g d[ge0d<   d\dXd]d^ge\dX<    e	j_        dVe`W          xe]d_<   Z0 e	j-        ddRgddZgge	ja                  e0d<    e	j-        g d6g d`ge	ja                  e0d<   d\d_dad^ge\d_<    e	j-        ddRgg dbge`          e]dc<   d\dcd]d^ge\dc<    e	j-         e	j-        ddRge	jb                   e	j-        g dbe	jb                  ge`          e]dd<   d\ddded^ge\dd<    e	j-         e	j-        dYdfg           e	j-        g dg          ge`          e]dh<   d\dhdid^ge\dh<    e	j-         e	j-        d-djg           e	j-        g dk          ge`          e]dl<   d\dldmd^ge\dl<    e	j-        ddRgddZgge	jc                  e]dn<   d\dndod^ge\dn<    e	j/        dpe	jd                  e                    dRdRdR          e]dq<   d\dqdrd^ge\dq<    e	j-        dYdidfdRige`          e]ds<   d\dsd]d^ge\ds<    e	j-        dYdidfdRigdYdidfdRigge`          e]dt<   d\dtdud^ge\dt<   e
jA        B                    dv eE efe]e]g                                e\g                                                              dw             Zhdx Zidy Zjdz Zkd{ 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uint8uint16uint32uint64float16float32float64float128strr!   ntl        r   FTFr"   )zab 0zab, 1ab2   dtypezm / sdescr_zmeta )unitdescriptionmetacomment1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                      t                      } t                      }|                     |d           |                                                                t
          k    sJ 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touts     @lib/python3.11/site-packages/astropy/io/ascii/tests/test_ecsv.pytest_write_simplerA   P   sW    
 	A
**CGGCG%%%<<>>$$&&,666666    c                      t           d         } g d}t                      }|                     |d           |                                                                |k    sJ dS )zV
    Write a full-featured table with common types and explicitly checkout output
    )r   r   r    r"   )r0   r1   r2   z# - name: bool#   unit: m / sz#   datatype: boolz#   description: descr_boolz#   meta: {meta bool: 1}z# - name: int64rD   z#   datatype: int64z#   description: descr_int64z#   meta: {meta int64: 1}z# - name: float64rD   z#   datatype: float64z#   description: descr_float64z#   meta: {meta float64: 1}z# - name: strrD   z#   datatype: stringz#   description: descr_strz#   meta: {meta str: 1}z# meta: !!omapz"# - comments: [comment1, comment2]r3   zbool int64 float64 strzFalse 0 0.0 "ab 0"zTrue 1 1.0 "ab, 1"zFalse 2 2.0 ab2r6   r7   N)T_DTYPESr   r9   r:   r;   )r>   linesr?   s      r@   test_write_fullrG   \   sm     	23A  EB **CGGCG%%%<<>>$$&&%//////rB   c            	         t           } t          D ]W}t                      }|                     |d|           t	          j        |                                d          t	          j        |                                d          t          j        |                                          t          j        |                                dd          t          j        |                                d          g}|D ]g}| j        |j        k    sJ | j	        D ]K}| |         
                    ||                   sJ t          j        | |         ||         k              sJ LhYdS )	z
    Write a full-featured table with all types and see that it round-trips on
    readback.  Use both space and comma delimiters.
    r6   r8   	delimiterr7   r   ecsvFr8   guessN)rE   r   r   r9   r   readr:   r   r,   colnamesattrs_equalnpall)r>   rJ   r?   t2st2names         r@   test_write_read_roundtriprV      sT   
 	A 3 3	jj	LI>>> Js||~~l;;;Js||~~g666Js||~~&&Js||~~fEBBBJs||~~f555
  	3 	3B6RW$$$$
 3 3w**2d844444vagD12222223	33 3rB   c                      t                      } t          j        t                    5 }t                              | dd           ddd           n# 1 swxY w Y   dt          |j                  v sJ dS )zJ
    Passing a delimiter other than space or comma gives an exception
    r6   |rI   N only space and comma are allowed)r   pytestraises
ValueErrorrE   r9   r"   value)r?   errs     r@   test_bad_delimiterr_      s     **C	z	"	" @cs<3???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @-SY??????s   AAAc                     t          j         t                    } d| d<   t          j        t          j                  5  t          j        d                    |           dd           ddd           dS # 1 swxY w Y   dS )z0
    Bad header without initial # %ECSV x.x
    z
# %ECV 0.9r   
r6   FrL   N)	copyr<   rZ   r[   r   InconsistentTableErrorr   rN   join)rF   s    r@   test_bad_header_startre      s     Il##EE!H	u3	4	4 G G
499U##LFFFFG G G G G G G G G G G G G G G G G Gs   +A55A9<A9c                  J   t          j         t                    } |                     dd           t          j        t
                    5 }t          j        d                    |           dd           ddd           n# 1 swxY w Y   dt          |j
                  v sJ dS )	z$
    Illegal delimiter in input
       z# delimiter: |ra   r6   FrL   NrY   )rb   r<   insertrZ   r[   r\   r   rN   rd   r"   r]   )rF   r^   s     r@   test_bad_delimiter_inputri      s     Il##E	LL$%%%	z	"	" Gc
499U##LFFFFG G G G G G G G G G G G G G G-SY??????s   	+B  BBc                     t                      } t          j        d                              ddd          | d<   d| d         j        _        ddi| d         j        _        ddg| d<   t                      }|                     |d	
           t          j	        |
                                d	
          }t          j        |d         | d         k              sJ |d         j        | d         j        k    sJ |d         j        | d         j        k    sJ |d         j        j        | d         j        j        k    sJ |d         j        j        | d         j        j        k    sJ t          j        |d         | d         k              sJ dS )z+
    Multi-dimensional column in input
       rg   r&      ar+   r   br6   r7   N)r   rQ   arangereshapeinfor+   r,   r   r9   rN   r:   rR   shaper(   r>   r?   rT   s      r@   test_multidim_inputrt      sd    	AYr]]""1a++AcF+AcFK1vAcFKVAcF
**CGGCG%%%	CLLNN<	8	8	8B6"S'QsV#$$$$$c7=AcFL((((c7=AcFL((((c7<#qv{'>>>>>c7<# 000006"S'QsV#$$$$$$$rB   c            	      b   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<   t          ddgddggdt          j        d                    | d<   t	                      }|                     |d           t          j        |                                d          }| j        D ]}t          j
        ||         | |         k              sJ ||         j        | |         j        k    sJ ||         j        | |         j        k    sJ ||         j        | |         j        k    sJ ||         j        | |         j        k    sJ ||         j        j        | |         j        j        k    sJ ||         j        j        | |         j        j        k    sJ dS )z%
    Structured column in input.
    B      ?       @      @A      "@       @      @)sU1v)p0f8)p12f8r+   >mr   rg   )r(   r+   r8   r*   r,   rm   )rw   rx   )r{   r|   )ry   g      @)r}   g      @zf8,f8zm,s)r(   r*   rn   r6   r7   N)r   r   uUnitr   r9   rN   r:   rO   rQ   rR   rr   r(   r*   r8   rq   r+   r,   )r>   r?   rT   cols       r@   test_structured_inputr      s    	A
c3Z 	!C#Sz):#;<S<"?@A!V  AcF 
j	!J
#;<VE]]  AcF **CGGCG%%%	CLLNN<	8	8	8Bz 5 5vbg3'(((((#w}#,,,,#w}#,,,,#w|qv{****#w~3....#w|'1S6;+BBBBB#w| AcFK$4444445 5rB   c                  $   t          t          ddgg d          } t                      }|                     |d           t          j        |                                d          }| j        |j        k    sJ t          |          dk    sJ dS )	zLTest fix in #5010 for issue #5009 (ECSV fails for empty type with bool type)if)rm   rn   c)r(   namesr6   r7   r   N)r   r   r   r9   rN   r:   r(   lenrs   s      r@   test_round_trip_empty_tabler      s    T3$OOO<<<A
**CGGCG%%%	CLLNN<	8	8	8B7bhr77a<<<<<<rB   c                  *   t          j         t                    } |                     d          }d| |<   t          j        t
                    5 }t          j        | d           ddd           n# 1 swxY w Y   dt          |j	                  v sJ dS )z{
    Test that mismatch in column names from normal CSV header vs.
    ECSV YAML header raises the expected exception.
    r4   za b drK   r7   Nz-column names from ECSV header ['a', 'b', 'c'])
rb   r<   indexrZ   r[   r\   r   rN   r"   r]   )rF   header_indexr^   s      r@   test_csv_ecsv_colnames_mismatchr     s    
 Il##E;;w''L!E,	z	"	" )c
5(((() ) ) ) ) ) ) ) ) ) ) ) ) ) ):c#)nnLLLLLLs   A00A47A4c                  4   t                      } dt          j        z  t          j        d| _        dgt          j        z  | d<   t                      }|                     |d           d|                                v sJ d|                                v sJ d	S )
zF
    See https://github.com/astropy/astropy/issues/5604 for more.
       )foofoo2   barr6   r7   z!astropy.units.Unitz!astropy.units.QuantityN)r   r   kmr~   r,   r   r9   r:   r=   s     r@   test_regression_5604r     s     	AXqs++AFsQTzAeH
**CGGCG%%% CLLNN2222$666666rB   Tc                    |r| j         |j         u sJ | j        |j        k    sJ g d}||z   D ]}| }|}|                    d          D ]C}	 t          ||          }t          ||          }$# t          $ r ||         }||         }Y @w xY wt          |t          j                  r%|j        j	        dk    rt          ||d          sJ t          j        ||k              sJ |sZt          | t          j                  r&| j        j	        dk    rt          | |d          sJ d S t          j        | |k              sJ d S d S )N)z	info.namezinfo.formatz	info.unitzinfo.descriptionz
info.dtype.r   绽|=rtolgV瞯<)	__class__rr   splitgetattrAttributeError
isinstancerQ   ndarrayr(   kindquantity_allcloserR   )	obj1obj2attrscompare_class
info_attrsattra1a2subattrs	            r@   assert_objects_equalr     s    0~////:####  J 
" $ $zz# 	! 	!G!R))R))! ! ! ![[! b"*%% 	$"(-3*>*>$R%88888886"(######  (dBJ'' 	(DJOs,B,B$T4e<<<<<<<<6$$,'''''	( ( ('s    A--B
	B
c                     t          d t          j                    D                       } t                      }|                     |d           t          j        |                                d          }t          |          t          u sJ t          d         | d<   t                      }|                     |d           t          j        |                                d          }t          |          t           u sJ dS )zzEnsure that ascii.read(ecsv_file) returns the correct class
    (QTable if any Quantity subclasses, Table otherwise).
    c                 N    i | ]"\  }}t          |j        t                    ||#S  )r   rq   r   ).0rU   r   s      r@   
<dictcomp>z5test_ecsv_mixins_ascii_read_class.<locals>.<dictcomp>H  s@     	
 	
 	
cch55	
#	
 	
 	
rB   r6   r7   rK   lonN)
r   r
   itemsr   r9   r   rN   r:   typer   rs   s      r@   !test_ecsv_mixins_ascii_read_classr   B  s    
 		
 	
'-//	
 	
 	
	 	A **CGGCG%%%	CLLNN6	2	2	2B88u % AeH
**CGGCG%%%	CLLNN6	2	2	2B88vrB   c                  \   t          t                    } t          d | D             |           }t                      }|                    |d           t          j        |                                d          }|j        |j        k    sJ |j	        
                                D ]\  }}||         }t          |         }d}t          |j        t                    r;t          |          t           u sJ dg}d}t#          j        |j        |d	          sJ t)          ||||           d
S )zWTest writing as QTable and reading as Table.  Ensure correct classes
    come out.
    c                 (    g | ]}t           |         S r   r
   r   rU   s     r@   
<listcomp>z4test_ecsv_mixins_qtable_to_table.<locals>.<listcomp>b  s    333T
4 333rB   r   r6   r7   Tr*   Fr   r   N)sortedr
   r   r   r9   r   rN   r:   rO   columnsr   r	   r   rq   r   r   r   rQ   r   r]   r   )	r   r>   r?   rT   rU   r   col2r   r   s	            r@    test_ecsv_mixins_qtable_to_tabler   \  s0    :E33U3335AAAA
**CGGCG%%%	CLLNN<	8	8	8B:$$$$Y__&& > >	c$xd#ch-- 	<::''''HE!M;sy$U;;;;;;S$}====> >rB   	table_clsc                    t          t                    }g }|D ]E}t          |         }|                    d          sd |D             }|                    |           F | d |D             |          }t                      }|                    |d           |                     |                                d          }|j	        |j	        k    sJ |                     |                                d          }|j	        |k    sJ dS )	zGTest write/read all cols at once and validate intermediate column namestm3c                 d    g | ]-}|                     d           |                    dd          .S )jd2z.jd1 )endswithreplace)r   s_names     r@   r   z+test_ecsv_mixins_as_one.<locals>.<listcomp>  sH       u--vr**  rB   c                 (    g | ]}t           |         S r   r   r   s     r@   r   z+test_ecsv_mixins_as_one.<locals>.<listcomp>  s    666:d#666rB   r   r6   r7   zascii.basicN)
r   r
   r   
startswithextendr   r9   rN   r:   rO   )	r   r   all_serialized_namesrU   s_namesr>   r?   rT   t3s	            r@   test_ecsv_mixins_as_oner   z  s*    :E  - -"4(u%% 	 %  G
 	##G,,,,	66666eDDDA
**CGGCG%%%	|	<	<B:$$$$ 
}	=	=B;.......rB   c                     |dk    rbddl }d t          |                    ddg          t          d|z                      D             }| |                             dg|z            } | 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                     g | ]\  }}|S r   r   )r   idx_s      r@   r   z!make_multidim.<locals>.<listcomp>  s    OOOQOOOrB   r&   )	itertoolszipcyclerangerp   )r   ndimr   idxss       r@   make_multidimr     sr     axxOO#iooq!f&=&=uQW~~"N"NOOO$id
++JrB   name_colr   r   rg   r&   c                     |\  }}t          t          j        ddg          |          }t          ||          }  |||gd|dg          }d||         j        _        t                      }|                    |d                                |                                d          }|j	        |j	        k    sJ |j	        D ]`}	t          ||	         j                  |k    sJ |	d	v rd
g}
n fdt          |	         D             }
t          ||	         ||	         |
           a|                    d          rJ||         j        j        j        t          j        u sJ ||         j        j        j        t          j        u sJ dS 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.
    rw   rx   c1c2r   r+   r6   r7   )r   r   datac                 2    g | ]}|d k    r	t           u |S )
wrap_angle)r   )r   r   r   s     r@   r   z/test_ecsv_mixins_per_column.<locals>.<listcomp>  s8       ,,e1C1C 1C1C1CrB   tmN)r   rQ   arrayrq   r+   r   r9   rN   r:   rO   r   rr   r	   r   r   _timejd1r   r   r   )r   r   r   rU   r   r   r>   r?   rT   colnamecompares   `          r@   test_ecsv_mixins_per_columnr     s    ID#bhSz**D11A
T
"
"C	1c1+dD$%7888A,AdGL
**CGGCG%%%	|	<	<B:$$$$: ? ?2g;$%%----l""hGG   )'2  G
 	QwZGg>>>> t :$x~!+rz9999$x~!+rz9999: :99rB   c                    | dz  }t          d          }|                    |           t          j        |          }|j        du sJ |j        |j        k    sJ |j        D ]}t          j        ||         j        ||         j        k              sJ t          j        ||         ||         k              sJ d||         _        d||         _        t          j        ||         ||         k              rJ d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   r9   r   rN   r   rO   rQ   rR   masktmp_pathfilenamer>   rT   rU   s        r@   $test_round_trip_masked_table_defaultr     s
    +%HD!!!AGGH	H		B9;!*$$$$ 	/ 	/vbhmqw|344444vbh!D')***** $46"T(ag-......	/ 	/rB   c                 $   | dz  }t          d          }d|d         d<   g d|d<   |                    |d	
           t          j        |          }|j        du sJ |j        |j        k    sJ |j        D ]}t          j        ||         j        ||         j        k              sJ t          j        ||         ||         k              sJ d||         _        d||         _        t          j        ||         ||         k              sJ dS )zY
    Same as prev but set the serialize_method to 'data_mask' so mask is written out
    r   Tr   r   r   r   r   d	data_mask)serialize_methodFNr   r   s        r@   +test_round_trip_masked_table_serialize_maskr     s*    +%HD!!!AAcF1I YYAcFGGH{G333	H		B9;!*$$$$ + +vbhmqw|344444vbh!D')***** $4vbh!D')******+ +rB   c                    |dz  }t          j        d          } |             }t          j        d          |z  |d<   |                    |           | t
          u r!t          j        t           j        d          }nt                      }|5  | 
                    |          }ddd           n# 1 swxY w Y   t          |d         j        t           j                  sJ t          |d         j                  dk    sJ | t
          u r1t          j        |d         j        |d         j        k              sJ n&t          j        |d         |d         k              sJ t          j        |          5  | 
                    |          }|d         j        |u sJ t          j        |d         |d         k              sJ |dz  }|                    |           | 
                    |          }	|	d         j        |u sJ t          j        |	d         |d         k              sJ 	 ddd           dS # 1 swxY w Y   dS )	z8Ensure that we can read-back enabled user-defined units.r   bandpass_sol_lumr   lz#'bandpass_sol_lum' did not parse .*matchNz
test2.ecsv)r   def_unitrQ   ro   r9   r   rZ   warnsUnitsWarningr   rN   r   r*   UnrecognizedUnitr"   rR   r]   add_enabled_units)
r   r   r   r*   r>   ctxrT   r   	filename2t4s
             r@   &test_ecsv_round_trip_user_defined_unitr    s    +%H:())D	AYq\\D AcFGGHFl1>1WXXXmm	 & &^^H%%& & & & & & & & & & & & & & &bglA$677777r#w| 22222Fvbgmqv|3444444vbg3'((((( 
	T	"	" 
) 
)^^H%%#w|t####vbg3'((((( |+	
^^H%%#w|t####vbg3'((((((
) 
) 
) 
) 
) 
) 
) 
) 
) 
) 
) 
) 
) 
) 
) 
) 
) 
)s%   B//B36B35B3H66H:=H:c                      d} t          j        | d          }|d         }t          |t                    sJ t	          j        |j        g dk              sJ t	          j        |g dk              sJ d S )Nzl# %ECSV 1.0
# ---
# datatype:
# - {name: col0, datatype: bool}
# schema: astropy-2.0
col0
1
0
True
""
False
rK   r7   col0)FFFTF)TFTFF)r   rN   r   r   rQ   rR   r   )txtdatr   s      r@   test_read_masked_boolr  5  s    C *S
(
(
(C
f+Cc<(((((6#(@@@@AAAAA6#::::;;;;;;;rB   r   
null_valuer   r(   rJ   , c                    t                      }t          t          j        d                              ddd          |          }|t
          u r|                    d          }d|j        d<   d|j        d<   ||d	<   d
dg|d<   t                      }|	                    |d|            t          j
        |                                d          }|j        du sJ |j        |j        k    sJ |j        D ]}||         j        ||         j        k    sJ t          ||         d          r0t          j        ||         j        ||         j        k              sJ t          j        ||         ||         k              sJ d S )N   rg   r&   r'   U2T)r   r   r   )r   r   r   rm   xyrn   r6   )r8   r   r7   Fr   )r   r   rQ   ro   rp   r"   astyper   r   r9   rN   r:   r   rO   r(   hasattrrR   )r   r(   rJ   r>   r   r?   rT   rU   s           r@   $test_roundtrip_multidim_masked_arrayr  J  s   
 	A
ry}},,Q155U
C
C
CC||jjCHWCHWAcF3ZAcF
**CGGC7GGHHH	CLLNN<	8	8	8B9;!*$$$$ + +$x~4....1T7F## 	96"T(-1T7<788888vbh!D')******	+ +rB   subtypezsome-user-typecomplexc                    d|  d}t          j        t          d|  d          5  t          j        |d          }ddd           n# 1 swxY w Y   |d	         j        j        d
k    sJ |d	         d         dk    sJ 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  rK   r7   Nrm   Ur   z[1,2])rZ   r  r   r   rN   r(   r   )r  r  r>   s      r@   test_multidim_unknown_subtyper#  e  s    
	 
	 
	 
	C 
"CgCCC
 
 
 + + Js6***	+ + + + + + + + + + + + + + + S6<####S6!9s   A		AAc                      d} t          j        t          d          5  t          j        | d           ddd           dS # 1 swxY w Y   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  r6   r7   NrZ   r[   r\   r   rN   )r  s    r@   test_multidim_bad_shaper'  }  s    
	C 
H
 
 
 - - 	
3|,,,,- - - - - - - - - - - - - - - - - -s   AA	Ac                     t                      } t          j        ddhdgt                    | d<   d}t	                      }t          j        t          |          5  |                     |d           d d d            d S # 1 swxY w Y   d S )	Nr   rg   r'   rm   zScould not convert column 'a' to string: Object of type set is not JSON serializabler  r6   r7   )	r   rQ   r   objectr   rZ   r[   	TypeErrorr9   )r>   r  r?   s      r@    test_write_not_json_serializabler+    s    AX1vqk000AcF	 
 **C	y	.	.	. * *	L)))* * * * * * * * * * * * * * * * * *s   BBBc                      d} d}t          j        t          |          5  t          j        | d           ddd           dS # 1 swxY w Y   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  r6   r7   Nr&  r  r  s     r@   test_read_not_json_serializabler.    s    	C KE	z	/	/	/ - -
3|,,,,- - - - - - - - - - - - - - - - - -   AAAc                  p   d} t          j        t          d          5  t          j        | d          }ddd           n# 1 swxY w Y   |d         d         d	k    sJ t          |d         d
                   t          u sJ t          |d         j                  t          j        d          k    sJ 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  r6   r7   Nrm   r   failr   O)	rZ   r  r   r   rN   r   r"   r(   rQ   r  r>   s     r@   test_read_bad_datatyper4    s    	C 
"L
 
 
 1 1 Js<000	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 S6!9#q	??c!!!!##......   AAAc                      d} t          j        t          d          5  t          j        | d          }ddd           n# 1 swxY w Y   |d         j        j        t          j        u sJ 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  r6   r7   Nrm   )	rZ   r  r   r   rN   r(   r   rQ   
complex128r3  s     r@   test_read_complexr8    s    C 
"M
 
 
 1 1 Js<000	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 S6<------r5  c                  2   d} t          j        t          d          5  t          j        | d          }ddd           n# 1 swxY w Y   t          |d         d         t                    sJ t          |d         d	         t          j                  sJ 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  r6   r7   Nrm   r   r   )	rZ   r  r   r   rN   r   r"   rQ   str_r3  s     r@   test_read_strr;    s    C 
"I
 
 
 1 1 Js<000	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 afQi%%%%%afQi)))))))r5  c                      d} d}t          j        t          |          5  t          j        | d           ddd           dS # 1 swxY w Y   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  r6   r7   Nr&  r-  s     r@   )test_read_bad_datatype_for_object_subtyper=    s    	C VE	z	/	/	/ - -
3|,,,,- - - - - - - - - - - - - - - - - -r/  c                     t                      } t          j        t          j        dgt          j                  | d<   d| d         j        _        t                      }|                     |d           t          j	        |
                                d          }t          j        | d         |d         k              sJ |d         j        j        dk    sJ dS )zPTest round-trip of float values to full precision even with format
    specifiedg$I$I?r'   rm   z.2fr6   r7   N)r   rQ   r   pir    rq   r8   r   r9   rN   r:   rR   rs   s      r@   test_full_repr_roundtripr@    s     	AXruenBJ777AcFAcFK
**CGGCG%%%	CLLNN<	8	8	8B6!C&BsG#$$$$$c7<%''''''rB   c                     d |                                  D             }d |D             }|dd          }t          j        d                    |                    }|S )Nc                 6    g | ]}|                                 S r   )stripr   lines     r@   r   z)_get_ecsv_header_dict.<locals>.<listcomp>  s     888dTZZ\\888rB   c                 L    g | ]!}|                     d           |dd         "S )#rg   N)r   rD  s     r@   r   z)_get_ecsv_header_dict.<locals>.<listcomp>  s1    @@@$4??3+?+?@T!""X@@@rB   rg   ra   )r;   yaml	safe_loadrd   )textrF   r?   s      r@   _get_ecsv_header_dictrK    s_    88doo&7&7888E@@%@@@E!""IE
.5))
*
*CJrB   c                    ddl m} |                                 D ]\  }}t                      }|||<   t	                      }|                    |d           t          |                                          } ||d                   }t          d|d|d d                    t          |dd                     t                       d S )	Nr   )pformatr6   r7   datatypezexps[z] =r   )	pprintrM  r   r   r   r9   rK  r:   print)colsrM  rU   r   r>   r?   hdrfmt_hdrs           r@   _make_expected_valuesrT    s    ZZ\\ 	 		cGG$jj	L)))#CLLNN33'#j/**!d!!!72A2;///gabbk	 	rB   rg   scalarr   )rN  rU   )rg   )rr   r(   z2-d variable array listsrm   rl   )rl   g      @   stringjson)rN  rU   r  z2-d variable array numpy)rl   g      @rV  zfloat32[2,null]r&   rl   r   z1-d variable array listsz1-d variable array numpyzuint8[null]rn   )r   r   ez1-d variable array numpy strzstring[null]F)TFTz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                 h   t                      }||| <   t                      }|                    |d           t          |                                          }|d         |k    sJ t          j        |                                d          }|j        |j        k    sJ |j        D ]} ||          j        ||          j        k    sJ t          ||          ||                    D ]K\  }}t          |t          j                  r|j        |j        k    sJ t          j        ||k              sJ LdS )z=Test variable length lists, multidim columns, object columns.r6   r7   rN  N)r   r   r9   rK  r:   rN   rO   r(   r   r   rQ   r   rR   )	rU   r   expr>   r?   rR  rT   val1val2s	            r@   test_specialized_columnsr`  }  s8    	AAdG
**CGGCG%%%

/
/Cz?c!!!!	CLLNN<	8	8	8B;!*$$$$ ( ($x~4....bh$00 	( 	(JD$$
++ 0zTZ////6$$,''''''	(( (rB   c            	      .   t          j        t          j                            t
          dd                    } d                    d          }| j        |k    sJ ddddd	d
ddd}|                                 D ]}|j	        }|j
        dk    rt          |t                    sJ |j
        dd         }|j
        dd         }|dk    r|j        dk    sJ |dk    r|j        dk    sJ |dk    r{|j        dk    sJ |j        j
        dk    sJ |D ]X}t          |t          j                  sJ |j        j
                            ||                   sJ t%          |          dv sJ Y|j        j
                            ||                   sJ d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.ecsvzi_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doublerW  booleani_indexrg   Nr   r~   )   r   )rj  r&   r   r)  )r   r   rg   r&   )r   rN   ospathrd   r   r   rO   itercolsrq   rU   r   r   rr   r(   rQ   r   r   r   )r>   rO   type_mapr   rq   	type_namer  vals           r@   test_full_subtypesrq    s    	
27<<&/BBCCA	
 eCjj  :!!!! 	 	H zz|| C Cx9	!!#|,,,,,IabbM	)BQB-c>>9%%%%c>>9''''c>>9%%%%:?h.... 0 0!#rz22222y~00)1DEEEEE3xx</////0
 :?--hy.ABBBBBB1C CrB   c            	         d} t          j        | d          }t          j        |d         t          j        ddddggt
          	          k              sJ t          j        |d         j        g d
k              sJ t          j                            ddgddgddggddgddgddgg          }t          j        |d         |k              sJ t          j        |d         j        |j        k              sJ t          j        |d         d         dgk              sJ t          j        |d         d         ddgk              sJ t          j        |d         j        g d
k              sJ 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]
    r6   r7   oNr   rg   r'   r$   r   r&   )r   r   r   )r   rN   rQ   rR   r   r)  r   ma)r  r>   r]  s      r@   test_masked_empty_subtypesrv    sx   C 	
3|,,,A6!C&BHdBA%7vFFFFGGGGG6!C&+!5!5!5566666
%++1vBx!Q0AAA7O+
P
PC6!C&C-     6!C&+)*****6!C&)s"#####6!C&)1v%&&&&&6!C&+!5!5!556666666rB   c                     t                      } t          j                            ddgddggddgddggt          j                  | d<   t          j        dt                    | d	<   t          j                            ddgddgt          j                  | d	         d<   t          j                            g d
g dt          j                  | d	         d<   t                      }|                     |d           d}t          |
                                          }t          |          }||k    sJ t          j        |
                                d          }|j        | j        k    sJ |j        D ]}||         j        | |         j        k    sJ t          ||                   t          | |                   u sJ t          ||         | |                   D ]\  }}t!          |t          j                  r|j        |j        k    sJ t!          |t          j        j                  r$t          j        |j        |j        k              sJ t          j        ||k              sJ dS )z6Test null values in fixed and variable array subtypes.r   rg   r&   rl   r   )r   r(   r   r'   r   rY  )r   r   r   r6   r7   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   rQ   ru  r   r   emptyr)  r   r9   rK  r:   rN   rO   r(   r   r   r   r   MaskedArrayrR   r   )	r>   r?   r  rR  hdr_exprT   rU   r^  r_  s	            r@   "test_masked_vals_in_array_subtypesr{    s=   AU[[1a&1a&)!Q!Q0@[QQAcFXav&&&AcFQF!Qrx@@AcF1IIIIIIIRXFFAcF1I
**CGGCG%%%
C  
/
/C#C((G'>>>>	CLLNN<	8	8	8B;!*$$$$ ( ($x~4....BtH~~ag....bh$00 	( 	(JD$$
++ 0zTZ////$ 122 6vdi494555556$$,''''''	(( (rB   c                      d} t          j        |           }|d         j        j        dk    sJ |d         j        dk    sJ 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
    r   r"  helloN)r   rN   r(   r   r+   r3  s     r@   test_guess_ecsv_with_one_columnr~    sP    	C 	
3AU8>#%%%%U87******rB   )T)m__doc__rb   rk  sys
contextlibr   ior   numpyrQ   rZ   rH  astropyr   r   
astropy.ior   astropy.io.ascii.ecsvr   r   astropy.io.tests.mixin_columnsr	   r
   r   astropy.tabler   r   r   astropy.table.columnr   astropy.table.table_helpersr   astropy.unitsr   r   r   commonr   DTYPESr  rU   maxsizeremoverE   r(   r   r   ro   r   r,   r<   rA   rG   rV   r_   re   ri   rt   r   r   r   r   r   r   r   markparametrizer   r   listr   r   r   r   r  r  r   r    r   r"   r  r#  r'  r+  r.  r4  r8  r;  r=  r@  rK  rT  expsrQ  r   rx  r)  r   r   r   r   rp   r   valuesr`  rq  rv  r{  r~  r   rB   r@   <module>r     sk
     				 



 " " " " " "                         H H H H H H H H V V V V V V V V V V / / / / / / / / / / - - - - - - 4 4 4 4 4 4 & & & & & & 7 7 7 7 7 7      
 
 
  wr: "'T//S[E5I5I
MM*577 
 
Erx,,,--	%rx00011ry%(((75(8%QR?S	 	 	A HUOO'4j   	7 	7 	7(0 (0 (0V3 3 30@ @ @G G G@ @ @% % %.5 5 5D  
M 
M 
M7 7 7"( "( "( "(J  4> > >< ufo66/ / 76/:  " TT*:**:*<*<%=%=>>ufo66++!: !: ,+ 76 ?>!:H/ / /B+ + +8 ufo66$) $) 76$)N< < <* +lK-HII28RZs"CDDsCj11+ + 21 ED JI+0 %5y$ABB    CB .- - -&	* 	* 	*- - - / / /*. . .(* * **- - - 
( 
( 
((      
	 1a&111X&99:X (0rxd&'I'I'I I  1	
Aa!		<<< !#=&QQ$  
 (0rxd&'I'I'I I  1rx!Q!Q 
333!rxKKK(
;;;! *$ $   $,28aVYYY,?v#N#N#N  #=&QQ$  
 $,28RXq!fBH%%%xrx			'J'J'JK
$ $ $  
 #=-XX$   (0rxRXsCj828OOO445V( ( (# $
 .! (# $ )1RXtUmhbh':':':;;<F) ) )$ %
 / )$ % %BHq!fq!f%5RWEEE #69MM  &BIarz:::BB1aKK #6>RR  !3(S!H!5VDDD_ ?vFF_  RX
AhaS!HsAh/0  \  <IFF\ 
 cc$t{{}}.U.U)V)VWW( ( XW($6C 6C 6Cr7 7 7:"( "( "(J+ + + + +rB   