o
    ŀg`x                     @   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!   W/var/www/html/myenv/lib/python3.10/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    r8   c                   C   s   dd idddddddgS )	Nr0   
11/08/1993
26/05/2012
created_atlast_updatedJaneDoefirst	last_namer0   author_namer!   r!   r!   r!   r"   author_missing_dataQ   s
   rE   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.	Massillonr7   f  )numberstreetcityr2   zipr   	city_nameFoo York City)r   	addressesprevious_residences!  
Spring St.ElizabethtonTN  
Barmingham)rQ   rR   r!   r!   r!   r!   r"   missing_metadata\   s(   		rY   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IdrZ   	TextField	UserFieldab	CreatedByLookupImager!   r!   r!   r!   r"   max_level_test_input_data{   s   rj   c                   @   s  e Zd Zd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
d0id1d*d+d,d-d.d/id
d0id1gfdd*d+d,d.d/id
d0id2d*d+d,d.d/id
d0id2gfgd3d4 Zd5d6 Zd7d8 Zej	d9g d:d;d< Z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         )rd   re   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/   r2   metar.   r   rn   rm   )r   r   rz   r{   extendnparrayrepeatr}   r8   r   r   recr!   r!   r"   test_simple_normalize   s   
z'TestJSONNormalize.test_simple_normalizec                 C   sb   g ddddgidg}t |dgddggd}tg dddgddgddggd	}t|| d S )
Nrl   rm   rn   listdatarl   rm   )valuesmetadatar   r   record_pathr   )r   zmetadata.listdatary   )r}   parse_metadata_fields_list_typer   r   r!   r!   r"   test_fields_list_type_normalize   s   z1TestJSONNormalize.test_fields_list_type_normalizec                 C   s   t g }t }t|| d S )Nry   r}   r   r   r!   r!   r"   test_empty_array   s   z"TestJSONNormalize.test_empty_arrayz!data, record_path, exception_typerd   r   rl   Nz{"a": [{"a": 0}, {"a": 1}]}c                 C   sv   |d ur$t j|dd t||d W d    d S 1 sw   Y  d S t||d}tddgdgd}t|| d S )N matchr   r   rl   rd   columns)pytestraisesr   r   rz   r{   )r}   datar   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g d }|j |s{J d S )NArl   rm   )r   BzA.AzA.Br   _sepA_AA_Bu   σu   AσAu   AσBr   r   r   r   )r   r   )r   r   r   states_name)	r   r   rz   r{   reindex_liker   sort_valuesr   equals)r}   r#   r   r   r!   r!   r"   $test_simple_normalize_with_separator   s"   
z6TestJSONNormalize.test_simple_normalize_with_separatorc                 C   sL   ddgdddd}t |dd}tddgddggg dd	}t|| d S )
Nrl   rm   )rn   rp   )b_1b_2)rd   re   __r   )rd   b__b_1b__b_2r   ry   r}   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   rl   rm   zPrefix.)record_prefixzPrefix.0r   ry   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/   r2   r0   r0   r/   r   r   r&   r   ry   r   r!   r!   r"   test_nested_object_record_path   s   z0TestJSONNormalize.test_nested_object_record_pathc                 C   sb   t |ddgdddggd}dgd dgd	  g d
g dg dd}t||jd}t|| d S )Nr   r   r   r   r   r   rp   r   rn   )r	   r	   r   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   rz   r{   )r}   r#   r   ex_datar   r!   r!   r"   test_more_deeply_nested
  s   		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}g ddgd dgd  g ddgd dgd  g dd}t||jd}t|| d S )Nr.   r-   r+   r,   r$   r   r%   r'   r(   r)   r*   )r2   r1   r0   r/   r   r7   r6   r3   r   r4   r5   r/   r2   r1   r0   r$   r'   r)   r3   r4   rn   rm   )r-   r-   r-   r7   r7   r   r(   r*   r   r5   )r   r2   r1   info.governorr&   r   r   )r}   r   r   r   r   r!   r!   r"   test_shallow_nested(  s6   z%TestJSONNormalize.test_shallow_nestedc                 C   s|   t |dgddddggdd}g dg d	d
gd dgd  dgd dgd  dgd dgd  d}t|}t|| d S )Nr/   r2   r1   r0   r+   ignorer   r   r   errorsr   r   r.   rn   r   rm   r-   r7   r,   r6   )r   r&   r2   r1   r   ry   )r}   r8   r   r   r   r!   r!   r"   -test_nested_meta_path_with_nested_record_pathL  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 d    n1 s,w   Y  t|dddgdd}dD ]}||v sEJ q=d 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   meta_prefixmetafoometabarr   r   )r   r   
ValueErrorr   )r}   r   msgr   valr!   r!   r"   test_meta_name_conflict`  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s#J dD ]}||v s-J q%d S )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   )r}   r   COLUMNSr   r   r!   r!   r"    test_meta_parameter_not_modifiedu  s   z2TestJSONNormalize.test_meta_parameter_not_modifiedc                 C   s   t |d d}t|d d }t|| t |dddd}g }|D ]	}||d  q!t|}|jdd d}td	d
gddg|d< t|| d S )Nr   r/   r2   county_)r   r   c                 S   s   d|  S )Nr   r!   )xr!   r!   r"   <lambda>  s    z6TestJSONNormalize.test_record_prefix.<locals>.<lambda>r   r.   r   rn   rm   )	r   r   rz   r{   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   rl   zsub.Arn   zsub.Brm   rp   )decoder   r   jsonloadsrz   r{   )r}   testjson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)r0   info.created_atinfo.last_updatedauthor_name.firstauthor_name.last_namer9   r:   r>   r?   r   r   nanr   rz   r{   )r}   rE   r   r   r   r!   r!   r"   test_missing_field  s    z$TestJSONNormalize.test_missing_fieldzmax_level,expectedr\   r]   r^   r_   rZ   r[   re   )rb   rc   rg   ri   )rb   zUserField.IdzUserField.Namerg   ri   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 )NrZ   r[   r\   r]   r^   r_   ra   rd   re   r   r   r   r   r   )rg   rh   ri   tagsrh   rg   ri   )r   r   	max_level)r   r   )r   r   r   r   rz   assert_equal)r}   r   r   
test_inputr   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   rl   dummy)r   rz   r{   )r}   df1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.   irm   r0   r   r   )index)r   r   rz   r   )r}   nulls_fixturer   r   r!   r!   r"   test_nonetype_record_path  s   z+TestJSONNormalize.test_nonetype_record_pathvalue)falsetruez{}1z"text"c                 C   sr   t |}d|d}d}| d| d| d}tjt|d t|g|gd W d    d S 1 s2w   Y  d S )	Nr   r   r0   z has non list value z
 for path z. Must be list or null.r   r   )r   r   r   r   	TypeErrorr   )r}   r   parsed_valuer   	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   idr   rl   rm   c   )dtype)onetwor  )	r   r   r   r   r   r   objectrz   r{   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!   r8   r!   r"   generator_data9  s   z8TestJSONNormalize.test_generator.<locals>.generator_datar   r/   ry   )r}   r8   r	  r   r   r!   r  r"   test_generator6  s   
z TestJSONNormalize.test_generatorc                 C   sF   dddiddd}t |dd}tg d	gg d
d}t|| d S )Nrv   l3r   )a1l2rp   )_idggr   r   )rp   rv   r   )r  _id_a1	_id_l2_l3r   ry   r   r!   r!   r"   'test_top_column_with_leading_underscoreA  s   z9TestJSONNormalize.test_top_column_with_leading_underscore)__name__
__module____qualname__r   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!   r"   rk      s    
		$
) 

rk   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S )-TestNestedToRecordc                 C   s0   ddddddg}t |}|}||ksJ d S )Nrl   rm   )flat1flat2rn   rp   )flat3r  r   r|   r!   r!   r"   test_flat_stays_flatK  s   z'TestNestedToRecord.test_flat_stays_flatc                 C   s4   ddddd}t |}dddd}||ksJ d S )Nrl   rm   ro   d)r  dict1)dict1.cdict1.dr  r   r   r!   r!   r"   test_one_level_deep_flattensQ  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s"J d S )Nrl   rm   r  )er  )r  r   nested)r!  r"  r  znested.dz
nested.e.cz
nested.e.dr   r   r!   r!   r"   test_nested_flattensY  s   	z'TestNestedToRecord.test_nested_flattensc                 C   sH   d}t jt|d t|dddd W d    d S 1 sw   Y  d S )N^Key 'name' not found. To replace missing values of 'name' with np.nan, pass in errors='ignore'r   rQ   r   raiser   r   r   KeyErrorr   r}   rY   r   r!   r!   r"   test_json_normalize_errorsl  s   "z-TestNestedToRecord.test_json_normalize_errorsc                 C   sN   t |dddd}g ddddd	d
tjgg}g d}t||d}t|| d S )NrQ   r   r   r   )rG   rH   rI   r7   rJ   rF   rS   rT   rU   rV   rW   )rK   rL   rM   r2   rN   r   r   r   r}   rY   r   r   r   r   r!   r!   r"   test_missing_meta}  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}g d}t||ddti}t|| tj	t
dd t |dddd	ggdd W d    d S 1 sXw   Y  d S )Nr   r   rl   rm   )r   nested_metar   r   r   r/  leafr   )r   r   r   )r   r   nested_meta.leafr   r1  z'leaf' not foundr   r(  )r   r   r   r   astyper  rz   r{   r   r   r*  )r}   r   r   r   r   r   r!   r!   r"   test_missing_nested_meta  s*   

"z+TestNestedToRecord.test_missing_nested_metac                 C   sL   d}t jt|d t|ddgddd W d    d S 1 sw   Y  d S )Nr'  r   rR   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 )NrR   r   r   r   r   rP   rF   rX   rO   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s*J d S )NSmith	Appleseedr@   rC   r9   r:   r;   r>   r?   )r0   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s&J d S )
Nr   r2       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s(J d S )
Nr9  r:  r;  )r<  r   r=  r>  r?  )r  r2   )r  r   r@  )r  zlocation.idzlocation.country.idrB  rC  rD  rE  rF  r   r   r!   r!   r"   test_nonetype_multiple_levels  s0   
z0TestNestedToRecord.test_nonetype_multiple_levelszmax_level, expectedNr[   r\   r]   r^   re   )CreatedBy.NameLookup.TextFieldzLookup.UserField.IdzLookup.UserField.NameImage.ar   rZ   r_   ra   rd   rf   rl   )rI  rJ  zLookup.UserFieldrK  c                 C   s   t ||d}||ksJ d S )Nr   r   )r}   r   r   rj   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s2J d S )Nd   rg   userLeoThomson)	firstnameLastNamefather	Father001	Father002	Father003rZ   	Father004)r   rU  )rZ   rU  )r   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.NamerL  r   )r}   r   
input_datar   rM  r!   r!   r"   test_with_large_max_levelS  s6   
z,TestNestedToRecord.test_with_large_max_levelc                 C   s   ddddidddddiddd	d
didd}t |}g d|_t|}tg dg ddtjtjgtjdtjgtjtjdgd}t|| d S )Nrl   Foord   )r  r   elementsrm   Barre   rn   Bazro   )r   rl   rm   r   )r]  r_  r`  g      ?g       @g      @)r  r   z
elements.az
elements.bz
elements.c)r   r   r   r   r   r   rz   r{   )r}   r   sr   r   r!   r!   r"   test_series_non_zero_indexx  s    
	z-TestNestedToRecord.test_series_non_zero_index)r  r  r  r  r#  r&  r,  r.  r3  r4  r5  r8  rG  rH  r   r  r  rN  r\  rb  r!   r!   r!   r"   r  J  sZ     "
)%r  )r   numpyr   r   pandasr   r   r   r   pandas._testing_testingrz   pandas.io.json._normalizer   fixturer#   r8   rE   rY   rj   rk   r  r!   r!   r!   r"   <module>   s*    
&




   A