o
    h3                     @   s   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Zd dlZzd dl	Z
W n ey1   dZ
Y nw d dlZd dlZd dlmZmZmZ dd Zdd
dZdd Zdd Zdd ZG dd dZG dd deejZG dd deejZdS )    )OrderedDict)DecimalN)	read_jsonReadOptionsParseOptionsc                  c   s4    t j} | E d H  | D ]}| D ]}|| V  qqd S N)stringascii_lowercase)lettersfirstsecond r   K/var/www/vscode/kcb/lib/python3.10/site-packages/pyarrow/tests/test_json.pygenerate_col_names$   s   
r      
   
c                 C   s   t jdjdd| |fd}ttt | }g }|jD ]}t	dd t
||D }|t| q|| }dd |D }	tj|	|}
||
fS )N*   r   i  )sizec                 S   s   g | ]
\}}|t |fqS r   )int).0kvr   r   r   
<listcomp>2   s    z$make_random_json.<locals>.<listcomp>c                 S   s   g | ]}t j|t  d qS ))type)paarrayint64)r   colr   r   r   r   5   s    )nprandomRandomStaterandintlist	itertoolsislicer   Tr   zipappendjsondumpsjoinencoder   Tablefrom_arrays)num_colsnum_rowslineseparr	col_nameslinesrowjson_objdatacolumnsexpectedr   r   r   make_random_json-   s   
r:   c                 K   sL   | di |}| |j||jd}| D ]\}}t|||ks#J qd S )N)protocolr   )loadsr*   HIGHEST_PROTOCOLitemsgetattr)clspicklerattr_valuesoptsnew_optsnamevaluer   r   r   check_options_class_pickling:   s   
rG   c                 C   s   t }| }|jdksJ d|_|jdksJ |jdu sJ d|_|jdu s'J |ddd}|jdks4J |jdu s;J t|| ddd d S )Nr   i90  TFi  )
block_sizeuse_threads)rA   rH   rI   )r   rH   rI   rG   )pickle_moduler@   rC   r   r   r   test_read_optionsB   s   
rK   c                 C   s   t }| }|jdu sJ |jd u sJ d|_|jdu sJ ttdt g}||_|j|ks3J |jdks:J dD ]}||_|j|ksHJ q<t	t
 d|_W d    n1 s\w   Y  t|| |ddd d S )	NFTfooinfer)ignoreerrorrM   zinvalid-valuerN   )rA   explicit_schemanewlines_in_valuesunexpected_field_behavior)r   rQ   rP   r   schemafieldint32rR   pytestraises
ValueErrorrG   )rJ   r@   rC   rS   rF   r   r   r   test_parse_optionsW   s*   
rY   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zejjdd Zejjdd Zejjdd  Zd!S )"BaseTestJSONReadc                 K   s   | j t|fi |S r   )r   r   	py_buffer)selfbkwargsr   r   r   
read_bytest   s   zBaseTestJSONRead.read_bytesc                 C   s.   |j t|ks	J dd |jD |ksJ d S )Nc                 S   s   g | ]}|j qS r   )rE   )r   cr   r   r   r   y   s    z0BaseTestJSONRead.check_names.<locals>.<listcomp>)num_columnslenr8   )r\   tablenamesr   r   r   check_namesw   s   zBaseTestJSONRead.check_namesc                 C   s~   d}dgdgd}t |}| |}| |ksJ t | }tt | | W d    d S 1 s8w   Y  d S )Ns   {"a": 1, "b": 2}
   r   )ar]   )	ioBytesIOr   	to_pydictStringIOdecoderV   rW   	TypeError)r\   r7   expected_databiorc   sior   r   r   test_file_object{   s   

"z!BaseTestJSONRead.test_file_objectc              
   C   s   d}t  }t }||d fD ]K}dD ]F}||_d|_tjtdd | j|||d W d    n1 s4w   Y  tdd	D ]}||_| j|||d}|	 d
g diksWJ q>qqd S )Ns   {"a": 1}
{"a": 2}
{"a": 3}   
FT   ztry to increase block sizematchread_optionsparse_options	      rg   )rf   r      )
r   r   rQ   rH   rV   rW   rX   r_   rangerj   )r\   rowsrx   ry   r7   rQ   rH   rc   r   r   r   test_block_sizes   s.   z!BaseTestJSONRead.test_block_sizesc                 C   s6   d}|  |}| ddgddgddgdksJ d S )	Ns/   {"a": 1,"b": 2, "c": 3}
{"a": 4,"b": 5, "c": 6}rf   rt   r      r|      rg   r]   r`   )r_   rj   )r\   r~   rc   r   r   r   test_no_newline_at_end   s   
z'BaseTestJSONRead.test_no_newline_at_endc                 C   sl   d}|  |}tdt fdt fdt fg}|j|ks"J | ddgddgd	d
gdks4J d S )Ns0   {"a": 1,"b": 2, "c": 3}
{"a": 4,"b": 5, "c": 6}
rg   r]   r`   rf   rt   r   r   r|   r   r   )r_   r   rS   r   rj   r\   r~   rc   rS   r   r   r   test_simple_ints   s   


z!BaseTestJSONRead.test_simple_intsc                 C   s|   d}|  |}tdt fdt fdt fdt fg}|j|ks'J | ddgdd	gd
dgddgdks<J d S )NsQ   {"a": 1,"b": 2, "c": "3", "d": false}
{"a": 4.0, "b": -5, "c": "foo", "d": true}
rg   r]   r`   d      ?g      @r   3rL   FT)rg   r]   r`   r   )r_   r   rS   float64r   r   bool_rj   r   r   r   r   test_simple_varied   s   



z#BaseTestJSONRead.test_simple_variedc              	   C   s   d}|  |}tdt fdt fdt fdt fdt fg}|j|ks,J | g dg dg d	g d
g ddksDJ d S )Ns   {"a": 1, "b": 2, "c": null, "d": null, "e": null}
{"a": null, "b": -5, "c": "foo", "d": null, "e": true}
{"a": 4.5, "b": null, "c": "nan", "d": null,"e": false}
rg   r]   r`   r   e)r   Ng      @)r   r   N)NrL   nan)NNN)NTF)rg   r]   r`   r   r   )	r_   r   rS   r   r   r   nullr   rj   r   r   r   r   test_simple_nulls   s    




z"BaseTestJSONRead.test_simple_nullsc                 C   sP   d}|  |}tdtt fg}|j|ksJ | dg giks&J d S )N	   {"a": []}rg   )r_   r   rS   list_r   rj   r   r   r   r   test_empty_lists   s
   
z!BaseTestJSONRead.test_empty_listsc                 C   sF   d}|  |}tg }|j|ksJ |jdksJ |jdks!J d S )Ns   {}
{}
r   r   )r_   r   rS   ra   r0   r   r   r   r   test_empty_rows   s   

z BaseTestJSONRead.test_empty_rowsc              
   C   s   d}t t|d}dd dgfdd g gfdd g dgggfdd i gfd	d d
d id
ddiigffD ]#\}}| j|| |d}d|i}| |ksGJ |djdksQJ q.d S )Ns"   {                               }
rH   s   {"a": 0}r   r   s   {"a": []}
{"a": [[1]]}rf   s	   {"a": {}}s    {"a": {}}
{"a": {"b": {"c": 1}}}r]   r`   rx   rg   )r   rb   r_   rj   column
num_chunks)r\   	first_rowrx   	next_rowsexpected_pylistrc   r9   r   r   r   test_reconcile_across_blocks   s"   



z-BaseTestJSONRead.test_reconcile_across_blocksc                 C   s   d}dt dt dt dd gi}tjtjtjtjf}|D ](}td|ddfg}t|d}| j||d	}|j|ks<J |	 |ksDJ qd S )
Ns'   {"a": 1}
{"a": 1.45}
{"a": -23.456}
{}
rg   1z1.45z-23.456rz   rt   rP   ry   )
r   r   	decimal32	decimal64
decimal128
decimal256rS   r   r_   rj   )r\   r~   r9   decimal_typestype_factoryrS   rC   rc   r   r   r   test_explicit_schema_decimal   s   
z-BaseTestJSONRead.test_explicit_schema_decimalc                 C   s  d}t dt  fg}t|d}| j||d}|jt dt  fdt  fgks,J | ddgdd	gd
ks;J t|dd}| j||d}|jt dt  fgksWJ | dddgikscJ t|dd}tjt j	dd | j||d W d    d S 1 sw   Y  d S )Ns2   {"foo": "bar", "num": 0}
{"foo": "baz", "num": 1}
rL   r   r   nums   bars   bazr   rf   )rL   r   rN   )rP   rR   rO   z"JSON parse error: unexpected fieldru   )
r   rS   binaryr   r_   r   rj   rV   rW   ArrowInvalid)r\   r~   rS   rC   rc   r   r   r   .test_explicit_schema_with_unexpected_behaviour  s@   





"z?BaseTestJSONRead.test_explicit_schema_with_unexpected_behaviourc                 C   sP   t ddd\}}| |}|j|jksJ ||sJ | | ks&J d S )Nr   r   r/   r0   )r:   r_   rS   equalsrj   )r\   r7   r9   rc   r   r   r   test_small_random_json1  s
   
z'BaseTestJSONRead.test_small_random_jsonc                 C   sH   t ddd\}}tdd}| j||d}|jdksJ |jdks"J d S )Nr   i r   i   r   r   )r:   r   r_   r0   )r\   r7   r9   rx   rc   r   r   r   test_load_large_json9  s
   
z%BaseTestJSONRead.test_load_large_jsonc           	      C   s   t ddd\}}t }t }||dfD ]1}dD ],}||_dD ]$}||_| j|||d}|j|jks5J ||sD|	 |	 ksDJ q qqd S )Nr   d   r   s   
rs   )      %   rw   )
r:   r   r   rstriprQ   rH   r_   rS   r   rj   )	r\   	data_baser9   rx   ry   r7   rQ   rH   rc   r   r   r   test_stress_block_sizesB  s$   
z(BaseTestJSONRead.test_stress_block_sizesN)__name__
__module____qualname__r_   re   rq   r   r   r   r   r   r   r   r   r   r   rV   marknumpyr   r   r   r   r   r   r   rZ   r   s(    	%

rZ   c                   @      e Zd Zdd ZdS )TestSerialJSONReadc                 O   s2   | dt }d|_t|i |}|jdd |S )Nrx   FTfull
setdefaultr   rI   r   validater\   argsr^   rx   rc   r   r   r   r   X  
   zTestSerialJSONRead.read_jsonNr   r   r   r   r   r   r   r   r   V      r   c                   @   r   )TestParallelJSONReadc                 O   s2   | dt }d|_t|i |}|jdd |S )Nrx   Tr   r   r   r   r   r   r   b  r   zTestParallelJSONRead.read_jsonNr   r   r   r   r   r   `  r   r   )r   r   r   )collectionsr   decimalr   rh   r$   r)   r   unittestr   r   ImportErrorrV   pyarrowr   pyarrow.jsonr   r   r   r   r:   rG   rK   rY   rZ   TestCaser   r   r   r   r   r   <module>   s0   
	 e
