U
    +ifKv                     @   s   d dl Z d dlZd dl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    V/home/mars/bis/venv/lib/python3.8/site-packages/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_data8   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_dataQ   s
    rA   c                   C   sF   dddddddgdd	d
igidddddddgdd	digidgS )NAliceZ%  
Morris St.	Massillonr6   f  )numberstreetcityr1   zipr   	city_nameFoo York City)r   	addressesprevious_residences!  
Spring St.ElizabethtonTN  
Barmingham)rM   rN   r    r    r    r    r!   missing_metadata\   s(    		rU   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IdrV   	TextField	UserFieldab	CreatedByLookupImager    r    r    r    r!   max_level_test_input_data{   s    re   c                   @   s  e Zd Zdd Z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dd  Z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d0d(d)d*d,d-idd.id0gfgd1d2 Zd3d4 Zd5d6 Zejd7d8d9d:d;d<gd=d> Zd?d@ ZdAdB ZdS )C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   ri   rh   )r   r   rv   rw   extendnparrayrepeatry   r7   r{   r|   recr    r    r!   test_simple_normalize   s    
z'TestJSONNormalize.test_simple_normalizec                 C   s   t g }t }t|| d S )Nru   ry   r{   r|   r    r    r!   test_empty_array   s    z"TestJSONNormalize.test_empty_arrayz!data, record_path, exception_typer_   r   rg   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   rg   r_   columns)pytestraisesrv   ZEMPTY_STRING_PATTERNr   r   rw   )ry   datar   Zexception_typer{   r|   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Arg   rh   )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   rv   rw   Zreindex_liker   Zsort_valuesr   equalsAssertionError)ry   r"   r{   r|   r    r    r!   $test_simple_normalize_with_separator   s"    
z6TestJSONNormalize.test_simple_normalize_with_separatorc                 C   sN   ddgdddd}t |dd}tddgddggdd	d
gd}t|| d S )Nrg   rh   )ri   rl   )Zb_1Zb_2)r_   r`   __r   r_   Zb__b_1Zb__b_2r   ru   ry   r   r{   r|   r    r    r!   'test_normalize_with_multichar_separator   s    z9TestJSONNormalize.test_normalize_with_multichar_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   rg   rh   zPrefix.)record_prefixzPrefix.0r   ru   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   ru   r   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   r~   r   rl   r   ri   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   rv   rw   )ry   r"   r{   ex_datar|   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/   ri   rh   )r   r1   r0   info.governorr%   r   r   )ry   r   r{   r   r|   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-   ri   r   rh   r,   r6   r+   r5   )r   r%   r1   r0   r   ru   )ry   r7   r{   r   r|   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   r~   r   r   Zmeta_prefixZmetafooZmetabarr   r   )r   r   
ValueErrorr   r   )ry   r   msgr{   valr    r    r!   test_meta_name_conflictS  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   )ry   r   COLUMNSr{   r   r    r    r!    test_meta_parameter_not_modifiedh  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   ri   rh   )	r   r   rv   rw   r   renamer   r   r   r   r    r    r!   test_record_prefix|  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   rg   zsub.Ari   zsub.Brh   rl   )decoder   r   jsonloadsrv   rw   )ry   ZtestjsonZtestdatar|   r{   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   rv   rw   )ry   rA   r{   r   r|   r    r    r!   test_missing_field  s     z$TestJSONNormalize.test_missing_fieldzmax_level,expectedrX   rY   rZ   r[   rV   rW   r`   )r]   r^   rb   rd   )r]   zUserField.IdzUserField.Namerb   rd   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 )NrV   rW   rX   rY   rZ   r[   r\   r_   r`   r   r   r   r   r   )rb   rc   rd   tagsrc   rb   rd   )r   r   	max_level)r   r   )r   r   r   valuesrv   assert_equal)ry   r   r|   
test_inputr{   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   rg   dummy)r   rv   rw   )ry   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-   irh   r/   r   r   )index)r   r   rv   r   )ry   Znulls_fixturer{   r|   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   )ry   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   rg   rh   c   )Zdtype)onetwor   )	r   r   r   r   r   r   objectrv   rw   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.   ru   )ry   r7   r   r{   r|   r    r   r!   test_generator)  s    
z TestJSONNormalize.test_generator)__name__
__module____qualname__r}   r   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    r!   rf      s~   	
	$)
 

rf   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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 )Nrg   rh   )flat1flat2ri   rl   )Zflat3r   r   r   rx   r    r    r!   test_flat_stays_flat6  s    z'TestNestedToRecord.test_flat_stays_flatc                 C   s4   ddddd}t |}dddd}||ks0td S )Nrg   rh   rk   d)r   dict1)dict1.cdict1.dr   r   r   r    r    r!   test_one_level_deep_flattens<  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 )Nrg   rh   r   )er   )r   r   nested)r   r   r   znested.dz
nested.e.cz
nested.e.dr   r   r    r    r!   test_nested_flattensD  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 )N^Key 'name' not found. To replace missing values of 'name' with np.nan, pass in errors='ignore'r   rM   r   raiser   r   r   KeyErrorr   ry   rU   r   r    r    r!   test_json_normalize_errorsW  s    z-TestNestedToRecord.test_json_normalize_errorsc                 C   s^   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}t||d}t|| d S )NrM   r   r   r   rC   rD   rE   r6   rF   rB   rO   rP   rQ   rR   rS   rG   rH   rI   r1   rJ   r   r   ry   rU   r{   r   r   r|   r    r    r!   test_missing_metah  s       z$TestNestedToRecord.test_missing_metac              	   C   s   dd ddiddigd}t |dddd	ggd
d}ddtjgddtjgg}dddg}t||ddti}t|| tj	t
dd t |dddd	ggdd W 5 Q R X d S )Nr   r   rg   rh   )r   nested_metar   r   r   r  leafr   )r   r   r   znested_meta.leafr   z'leaf' not foundr   r   )r   r   r   r   Zastyper   rv   rw   r   r   r  )ry   r   r{   r   r   r|   r    r    r!   test_missing_nested_metaw  s(    


z+TestNestedToRecord.test_missing_nested_metac              	   C   s6   d}t jt|d t|ddgddd W 5 Q R X d S )Nr   r   rN   r   r   r   r   r   r  r    r    r!   5test_missing_meta_multilevel_record_path_errors_raise  s    zHTestNestedToRecord.test_missing_meta_multilevel_record_path_errors_raisec                 C   sJ   t |ddgddd}ddgdtjgg}d	dg}t||d
}t|| d S )NrN   r   r   r   r   rL   rB   rT   rK   r   r   r  r    r    r!   6test_missing_meta_multilevel_record_path_errors_ignore  s    zITestNestedToRecord.test_missing_meta_multilevel_record_path_errors_ignorec                 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_nonevalues  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, expectedNrW   rX   rY   rZ   r`   )CreatedBy.NameLookup.TextFieldzLookup.UserField.IdzLookup.UserField.NameImage.ar   rV   r[   r\   r_   ra   rg   )r  r  zLookup.UserFieldr  c                 C   s   t ||d}||kstd S )Nr   r   )ry   r   r|   re   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   rb   userZLeoZThomson)Z	firstnameZLastNamefatherZ	Father001Z	Father002Z	Father003rV   Z	Father004)r   r$  )rV   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   )ry   r   Z
input_datar|   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   rg   rh   ri   rj   rl   rm   rn   )rv   Zassert_produces_warningFutureWarningZpandas.io.jsonr   )ry   r   rz   r    r    r!   test_deprecated_importc  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 )Nrg   ZFoor_   )r   r   elementsrh   ZBarr`   ri   ZBazrk   )r   rg   rh   g      ?g       @g      @)r   r   z
elements.az
elements.bz
elements.c)r   r   r   r   r   r   rv   rw   )ry   r   sr{   r|   r    r    r!   test_series_non_zero_indexj  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    r    r!   r   5  sZ    ")
%r   )r   numpyr   r   Zpandasr   r   r   r   Zpandas._testingZ_testingrv   Zpandas.io.json._normalizer   Zfixturer"   r7   rA   rU   re   rf   r   r    r    r    r!   <module>   s(   
&




   ,