U
    f/e>l                     @   s   d dl Z d dlZd dlZd dlm  mZ d dlm	Z	m
Z
mZmZ d dlmZ d dlmZ ejdd Zejdd Zejdd	 Zejd
d Zejdd ZG dd dZG dd dZdS )    N)	DataFrameIndexSeriesjson_normalize)nested_to_recordc                   C   sl   ddddddddgdd	d
dddddgdgddddddgddddddddgdgdgS )NUSA
CaliforniaSan Francisco90  )namepopLos Angeles:0  )r   citiesOhioColumbus  	Cleveland  )countrystatesGermanyBayernMunich;0  Nordrhein-WestfalenDuesseldorf  Koeln   r    r    r    G/tmp/pip-unpacked-wheel-tiezk1ph/pandas/tests/io/json/test_normalize.pydeep_nested   s.    r"   c                   C   sL   dddddddddgdd	id
ddddddddgddidddgS )NDader
   r   
populationBroward@  
Palm Beach`  governor
Rick ScottFLFlorida)countiesinfo	shortnamestateSummitr   Cuyahoga9  John KasichOHr   r    r    r    r    r!   
state_data:   s     r7   c                   C   s   dd idddddddgS )	Nr/   
11/08/1993
26/05/2012Z
created_atZlast_updatedJaneDoefirst	last_namer/   Zauthor_namer    r    r    r    r!   author_missing_dataS   s
    rA   c                   C   s.   dddddddgdd	d
dddddgigS )NAliceZ%  
Morris St.	Massillonr6   f  )numberstreetcityr1   zip)r   	addressesrK   !  
Spring St.ElizabethtonTN  r    r    r    r    r!   missing_metadata^   s&    rQ   c                   C   s"   ddiddddddd	id
gS )z@
    input data to test json_normalize with max_level param
    NameUser001	Some textID001Name001ZIdrR   	TextField	UserFieldab	CreatedByLookupImager    r    r    r    r!   max_level_test_input_data{   s    ra   c                   @   s  e Zd Zdd Zejdd Zdd Zej	
ddd	idd
igddfddd	idd
igiddfddefddefg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dd  Zd!d" Zd#d$ Zej	
d%d	d&d'd(d)d*d+idd,id-d&d'd(d)d*d+idd,id-gfd
d&d'd(d*d+idd,id.d&d'd(d*d+idd,id.gfgd/d0 Zd1d2 Zd3d4 Zej	
d5d6d7d8d9d:gd;d< Zd=d> Zd?d@ ZdS )ATestJSONNormalizec                 C   sL   dddddddddd	d
dddddg}t |}t|}t|| d S )N         r[   r\   c               	   
         r   r   tmassert_frame_equalselfrecsresultexpectedr    r    r!   test_simple_records   s    



z%TestJSONNormalize.test_simple_recordsc                 C   s   t |d d}t|d d }t|| t |d}g }|D ]}||d  q<t|}t|| t |ddd}tddgddg|d< t|| d S )	Nr   r.   r1   metar-   r   re   rd   )r   r   rr   rs   extendnparrayrepeatru   r7   rw   rx   Zrecr    r    r!   test_simple_normalize   s    
z'TestJSONNormalize.test_simple_normalizec                 C   s   t g }t }t|| d S )Nrq   ru   rw   rx   r    r    r!   test_empty_array   s    z"TestJSONNormalize.test_empty_arrayz!data, record_path, exception_typer[   r   rc   Nz{"a": [{"a": 0}, {"a": 1}]}c              	   C   s`   |d k	r2t j|tjd t||d W 5 Q R X n*t||d}tddgdgd}t|| d S )Nmatchrecord_pathr   rc   r[   columns)pytestraisesrr   ZEMPTY_STRING_PATTERNr   r   rs   )ru   datar   Zexception_typerw   rx   r    r    r!   test_accepted_input   s    
z%TestJSONNormalize.test_accepted_inputc                 C   s   t ddddi}tddggddgd}t||| t ddddidd	}tddggd
dgd}t||| t ddddidd	}tddggddgd}t||| t |ddgdddggdd}tddddg }|j |st	d S )NArc   rd   )r   BzA.AzA.Br   _)sepZA_AZA_Bu   σu   AσAu   AσBr   r   r   r   )r{   r   r   Zstates_name)
r   r   rr   rs   Zreindex_liker   Zsort_valuesr   equalsAssertionError)ru   r"   rw   rx   r    r    r!   $test_simple_normalize_with_separator   s"    
z6TestJSONNormalize.test_simple_normalize_with_separatorc                 C   s<   t dddgiddd}tdgdggdgd}t|| d S )Nr   rc   rd   zPrefix.)record_prefixzPrefix.0r   rq   r   r    r    r!   test_value_array_record_prefix   s    z0TestJSONNormalize.test_value_array_record_prefixc                 C   sj   dddddddddd	dgd
d}t |ddgd}tddgddgdd	ggddgd}t|| d S )Nr-   r+   r#   r
   r$   r&   r'   r(   r)   )r*   r.   r1   r/   r/   r.   r   r   r%   r   rq   ru   r   rw   rx   r    r    r!   test_nested_object_record_path   s    z0TestJSONNormalize.test_nested_object_record_pathc              
   C   s   t |ddgdddggd}dgd dgd	  d
d
dddddgdddddddgdddddddgd}t||jd}t|| d S )Nr   r   r   r   rz   r   rh   r   re   r   r   r   r   r	   r   r   r   r   r   r   r
   r   r   r   r   r   r   )r   zstates.namer   r   r   r   r   r   rr   rs   )ru   r"   rw   ex_datarx   r    r    r!   test_more_deeply_nested   s4      

	z)TestJSONNormalize.test_more_deeply_nestedc              	   C   s   ddddiddddd	dd
ddgdddddiddddddgdg}t |dddddgg}ddd
ddgdgd dgd  dddddgdgd dgd  dd	dddgd}t||jd}t|| d S )Nr-   r,   r*   r+   r#   r
   r$   r&   r'   r(   r)   )r1   r0   r/   r.   r   r6   r5   r2   r   r3   r4   r.   r1   r0   r/   re   rd   )r   r1   r0   info.governorr%   r   r   )ru   r   rw   r   rx   r    r    r!   test_shallow_nested  s:      z%TestJSONNormalize.test_shallow_nestedc                 C   s   t |dgddddggdd}dd	d
ddgdddddgdgd dgd  dgd dgd  dgd dgd  d}t|}t|| d S )Nr.   r1   r0   r/   r*   ignorer   r   r{   errorsr#   r&   r(   r2   r3   r
   r'   r)   r   r4   r-   re   r   rd   r,   r6   r+   r5   )r   r%   r1   r0   r   rq   )ru   r7   rw   r   rx   r    r    r!   -test_nested_meta_path_with_nested_record_path:  s    z?TestJSONNormalize.test_nested_meta_path_with_nested_record_pathc              	   C   s|   ddddddddgdg}d	}t jt|d
 t|dddgd W 5 Q R X t|dddgdd}dD ]}||ksftqfd S )Nhellothere	somethingelsefoobar
something2else2r   r   r   z?Conflicting metadata name (foo|bar), need distinguishing prefixr   r   r   r   rz   r{   r{   Zmeta_prefixZmetafooZmetabarr   r   )r   r   
ValueErrorr   r   )ru   r   msgrw   valr    r    r!   test_meta_name_conflictN  s    z)TestJSONNormalize.test_meta_name_conflictc                 C   s`   ddddddddgdg}d	d
g}t |d|dd}|d	d
gksFtdD ]}||ksJtqJd S )Nr   r   r   r   r   r   r   r   r   r   r   r{   r   r   )r   r   )ru   r   COLUMNSrw   r   r    r    r!    test_meta_parameter_not_modifiedc  s    z2TestJSONNormalize.test_meta_parameter_not_modifiedc                 C   s   t |d d}t|d d }t|| t |dddd}g }|D ]}||d  qBt|}|jdd d}td	d
gddg|d< t|| d S )Nr   r.   r1   county_)r{   r   c                 S   s   d|  S )Nr   r    )xr    r    r!   <lambda>      z6TestJSONNormalize.test_record_prefix.<locals>.<lambda>r   r-   r   re   rd   )	r   r   rr   rs   r|   renamer}   r~   r   r   r    r    r!   test_record_prefixx  s        z$TestJSONNormalize.test_record_prefixc                 C   sR   d d}d dddgdddgdd	d
gi}t|}tt|}t|| d S )NsK   [{"Ünicøde":0,"sub":{"A":1, "B":2}},{"Ünicøde":1,"sub":{"A":3, "B":4}}]utf8s	   Ünicøder   rc   zsub.Are   zsub.Brd   rh   )decoder   r   jsonloadsrr   rs   )ru   ZtestjsonZtestdatarx   rw   r    r    r!   test_non_ascii_key  s       z$TestJSONNormalize.test_non_ascii_keyc                 C   sJ   t |}tjtjtjtjtjdd dddddg}t|}t|| d S )N)r/   info.created_atinfo.last_updatedauthor_name.firstauthor_name.last_namer8   r9   r;   r<   r   r}   nanr   rr   rs   )ru   rA   rw   r   rx   r    r    r!   test_missing_field  s     z$TestJSONNormalize.test_missing_fieldzmax_level,expectedrT   rU   rV   rW   rR   rS   r\   )rY   rZ   r^   r`   )rY   zUserField.IdzUserField.Namer^   r`   c                 C   s~   ddiddddddddddgdd	id
dddddgdg}t |dgdgdgg|d}t||jjd}t|| d S )NrR   rS   rT   rU   rV   rW   rX   r[   r\   r   r   r   r   r   )r^   r_   r`   tagsr_   r^   r`   )r   r{   	max_level)r   r   )r   r   r   valuesrr   assert_equal)ru   r   rx   
test_inputrw   Zexpected_dfr    r    r!    test_max_level_with_records_path  s,    -

z2TestJSONNormalize.test_max_level_with_records_pathc                 C   s:   t dddiig}t ddddiigid}t|| d S )Nr   r   rc   dummy)r   rr   rs   )ru   Zdf1Zdf2r    r    r!   !test_nested_flattening_consistent  s    z3TestJSONNormalize.test_nested_flattening_consistentc                 C   sF   t d|ddddigdgdgd}tddidgd	}t|| d S )
NTexasr   r-   ird   r/   r   r   )index)r   r   rr   r   )ru   Znulls_fixturerw   rx   r    r    r!   test_nonetype_record_path  s    z+TestJSONNormalize.test_nonetype_record_pathvaluefalsetruez{}1z"text"c              	   C   s\   t |}d|d}d}| d| d| d}tjt|d t|g|gd W 5 Q R X d S )	Nr   r   r/   z has non list value z
 for path z. Must be list or null.r   r   )r   r   r   r   	TypeErrorr   )ru   r   Zparsed_valuer   Z	test_pathr   r    r    r!    test_non_list_record_path_errors  s    

z2TestJSONNormalize.test_non_list_record_path_errorsc                 C   sL   d}t t|dgdgd}tdgdgtjdgtdd	}t|| d S )
Nz,[{"id": 99, "data": [{"one": 1, "two": 2}]}]r   id)r   r{   rc   rd   c   )Zdtype)ZoneZtwor   )	r   r   r   r   r}   r~   objectrr   rs   r   r    r    r!   test_meta_non_iterable  s    z(TestJSONNormalize.test_meta_non_iterablec                    s6    fdd}t | }t d d }t|| d S )Nc                   3   s    d d E d H  d S )Nr   r.   r    r    r7   r    r!   generator_data)  s    z8TestJSONNormalize.test_generator.<locals>.generator_datar   r.   rq   )ru   r7   r   rw   rx   r    r   r!   test_generator&  s    
z TestJSONNormalize.test_generator)__name__
__module____qualname__ry   tdZ&skip_array_manager_not_yet_implementedr   r   r   markparametrizeNotImplementedErrorr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r    r    r!   rb      s   
	
	$
)
 

rb   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
ejddddddddgfdddidddddddidgfdddddddd gfgd!d" Zd#d$ Zd%d& Zd'd( ZdS ))TestNestedToRecordc                 C   s0   ddddddg}t |}|}||ks,td S )Nrc   rd   )flat1flat2re   rh   )Zflat3r   r   r   rt   r    r    r!   test_flat_stays_flat3  s    z'TestNestedToRecord.test_flat_stays_flatc                 C   s4   ddddd}t |}dddd}||ks0td S )Nrc   rd   rg   d)r   dict1)dict1.cdict1.dr   r   r   r    r    r!   test_one_level_deep_flattens9  s    z/TestNestedToRecord.test_one_level_deep_flattensc                 C   sH   dddddddddd}t |}ddddddd}||ksDtd S )Nrc   rd   r   )er   )r   r   nested)r   r   r   znested.dz
nested.e.cz
nested.e.dr   r   r    r    r!   test_nested_flattensA  s    	z'TestNestedToRecord.test_nested_flattensc              	   C   s2   d}t jt|d t|dddd W 5 Q R X d S )NzDTry running with errors='ignore' as key 'name' is not always presentr   rK   r   raiser   )r   r   KeyErrorr   )ru   rQ   r   r    r    r!   test_json_normalize_errorsT  s    z-TestNestedToRecord.test_json_normalize_errorsc                 C   sn   t |dddd}ddddd	d
gdddddtjgg}ddddddg}ddddddg}t||d}t|| d S )NrK   r   r   r   rC   rD   rE   r6   rF   rB   rL   rM   rN   rO   rP   rI   rG   r1   rH   rJ   r   r   )ru   rQ   rw   r   r   rx   r    r    r!   test_missing_metab  s       z$TestNestedToRecord.test_missing_metac                 C   sX   d ddddddddd	ddg}t |}d ddd
dd	dddg}||ksTtd S )NZSmithZ	Appleseedr=   r@   r8   r9   r:   r;   r<   )r/   r   r   )r   r   r   r   r   r   r    r    r!   test_donot_drop_nonevaluesr  s"    z-TestNestedToRecord.test_donot_drop_nonevaluesc              
   C   sP   d ddd d d dddddiid}t |}d d d d dddd	}||ksLtd S )
Nr   r1       gH@   @   ;@)r   regionr   yzr   z	town.infor   location)r   location.country.state.idz#location.country.state.town.info.id'location.country.state.town.info.region"location.country.state.town.info.x"location.country.state.town.info.y"location.country.state.town.info.zr   r   r    r    r!   $test_nonetype_top_level_bottom_level  s0    	z7TestNestedToRecord.test_nonetype_top_level_bottom_levelc              	   C   sT   d d d d d dddddddd}t |}d d d d d dddd	}||ksPtd S )
Nr   r   r   )r   r   r   r   r   )r   r1   )r   r   r  )r   zlocation.idzlocation.country.idr  r  r  r  r  r   r   r    r    r!   test_nonetype_multiple_levels  s0    
z0TestNestedToRecord.test_nonetype_multiple_levelszmax_level, expectedNrS   rT   rU   rV   r\   )CreatedBy.NameLookup.TextFieldzLookup.UserField.IdzLookup.UserField.NameImage.ar   rR   rW   rX   r[   r]   rc   )r
  r  zLookup.UserFieldr  c                 C   s   t ||d}||kstd S )Nr   r   )ru   r   rx   ra   outputr    r    r!   test_with_max_level  s    +z&TestNestedToRecord.test_with_max_levelc              	   C   sh   d}dddddddd	d
ddidddidiig}dddd	d
ddg}t ||d}||ksdtd S )Nd   r^   userZLeoZThomson)Z	firstnameZLastNamefatherZ	Father001Z	Father002Z	Father003rR   Z	Father004)r   r  )rR   r  )r   Zfamily_tree)zCreatedBy.user.name.firstnamezCreatedBy.user.name.LastNamez&CreatedBy.user.family_tree.father.namez-CreatedBy.user.family_tree.father.father.Namez4CreatedBy.user.family_tree.father.father.father.namez;CreatedBy.user.family_tree.father.father.father.father.Namer  r   )ru   r   Z
input_datarx   r  r    r    r!   test_with_large_max_level  s6    
z,TestNestedToRecord.test_with_large_max_levelc              	   C   sF   t t2 ddlm} ddddddd	dg}|| W 5 Q R X d S )
Nr   )r   rc   rd   re   rf   rh   ri   rj   )rr   Zassert_produces_warningFutureWarningZpandas.io.jsonr   )ru   r   rv   r    r    r!   test_deprecated_import!  s    z)TestNestedToRecord.test_deprecated_importc                 C   s   ddddidddddiddd	d
didd}t |}dddg|_t|}tdddgddd	gdtjtjgtjdtjgtjtjdgd}t|| d S )Nrc   ZFoor[   )r   r   elementsrd   Barr\   re   ZBazrg   )r   rc   rd   g      ?g       @g      @)r   r   z
elements.az
elements.bz
elements.c)r   r   r   r   r}   r   rr   rs   )ru   r   srw   rx   r    r    r!   test_series_non_zero_index(  s     	z-TestNestedToRecord.test_series_non_zero_index)r   r   r   r   r   r   r   r   r   r  r	  r   r   r   r  r  r  r  r    r    r    r!   r   2  sT    ")
%r   )r   Znumpyr}   r   Zpandas.util._test_decoratorsutilZ_test_decoratorsr   Zpandasr   r   r   r   Zpandas._testingZ_testingrr   Zpandas.io.json._normalizer   Zfixturer"   r7   rA   rQ   ra   rb   r   r    r    r    r!   <module>   s*   
&




   )