U
    ÎZja  ã                   @  sÜ   d Z ddlmZ ddlmZmZ ddlZddlZddlZddl	Z	ddl
Z
ddlmZmZ ddlZddlmZ ddlmZ ddlmZmZmZ ddlZdd	lmZmZ dd
lmZ G dd„ deƒZG dd„ deƒZ dd„ Z!dS )a¦  
Test extension array for storing nested data in a pandas container.

The JSONArray stores lists of dictionaries. The storage mechanism is a list,
not an ndarray.

Note
----
We currently store lists of UserDicts. Pandas has a few places
internally that specifically check for dicts, and does non-scalar things
in that case. We *want* the dictionaries to be treated as scalars, so we
hack around pandas by using UserDicts.
é    )Úannotations)ÚUserDictÚabcN)ÚAnyÚMapping)Útype_t©Ú'construct_1d_object_array_from_listlike)Úis_bool_dtypeÚis_list_likeÚpandas_dtype)ÚExtensionArrayÚExtensionDtype)Úunpack_tuple_and_ellipsesc                   @  s8   e Zd ZU ejZdZeƒ Zde	d< e
ddœdd„ƒZdS )	Ú	JSONDtypeÚjsonzMapping[str, Any]Úna_valueztype_t[JSONArray]©Úreturnc                 C  s   t S )zq
        Return the array type associated with this dtype.

        Returns
        -------
        type
        )Ú	JSONArray)Úcls© r   úd/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/pandas/tests/extension/json/array.pyÚconstruct_array_type6   s    	zJSONDtype.construct_array_typeN)Ú__name__Ú
__module__Ú__qualname__r   r   ÚtypeÚnamer   r   Ú__annotations__Úclassmethodr   r   r   r   r   r   1   s
   
r   c                   @  sÒ   e Zd Zeƒ ZdZd,ddœdd„Zed-dd	„ƒZed
d„ ƒZ	dd„ Z
dd„ Zddœdd„Zdd„ Zdd„ Zd.dd„Zeddœdd„ƒZdd„ Zd/dd„Zdd „ Zd0d"d#„Zd$d%„ Zed&d'„ ƒZd(d)„ Zd*d+„ ZdS )1r   iè  NFÚNoner   c                 C  sD   |D ]&}t || jjƒstdt| jjƒ ƒ‚q|| _| j | _| _d S )NzAll values must be of type )Ú
isinstanceÚdtyper   Ú	TypeErrorÚstrÚdataZ_itemsÚ_data)ÚselfÚvaluesr#   ÚcopyÚvalr   r   r   Ú__init__F   s
    zJSONArray.__init__c                 C  s   | |ƒS ©Nr   )r   Zscalarsr#   r*   r   r   r   Ú_from_sequenceS   s    zJSONArray._from_sequencec                 C  s   | dd„ |D ƒƒS )Nc                 S  s   g | ]}|d krt |ƒ‘qS )r   )r   ©Ú.0Úxr   r   r   Ú
<listcomp>Y   s      z.JSONArray._from_factorized.<locals>.<listcomp>r   )r   r)   Úoriginalr   r   r   Ú_from_factorizedW   s    zJSONArray._from_factorizedc                   sÌ   t |tƒrt|ƒ}t |tjƒr(ˆ j| S t |tƒrL|td ƒkrLtˆ ƒˆ jƒS t |tƒrhtˆ ƒˆ j| ƒS t|ƒszt	dƒ‚nNt
jj ˆ |¡}t|jƒr®ˆ  dd„ tˆ |ƒD ƒ¡S tˆ ƒ‡ fdd„|D ƒƒS d S )Nzuonly integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indicesc                 S  s   g | ]\}}|r|‘qS r   r   )r0   r1   Úmr   r   r   r2   q   s      z)JSONArray.__getitem__.<locals>.<listcomp>c                   s   g | ]}ˆ j | ‘qS r   ©r&   )r0   Úi©r(   r   r   r2   s   s     )r"   Útupler   ÚnumbersÚIntegralr&   Úslicer   r   Ú
IndexErrorÚpdÚapiZindexersZcheck_array_indexerr
   r#   r.   Úzip)r(   Úitemr   r8   r   Ú__getitem__[   s     


ÿ
zJSONArray.__getitem__c                 C  sÀ   t |tjƒr|| j|< n¤t |t| ƒtjfƒs8t |g¡}t |t	j
ƒrŒ|jdkrŒtt||ƒƒD ],\}\}}|r\t || jjƒs~t‚|| j|< q\n0t||ƒD ]$\}}t || jjƒs°t‚|| j|< q–d S )NÚbool)r"   r:   r;   r&   r   r   ÚSequenceÚ	itertoolsÚcycleÚnpZndarrayr#   Ú	enumerater@   ÚAssertionError)r(   ÚkeyÚvaluer7   ÚkÚvr   r   r   Ú__setitem__u   s    zJSONArray.__setitem__Úintc                 C  s
   t | jƒS r-   )Úlenr&   r8   r   r   r   Ú__len__ˆ   s    zJSONArray.__len__c                 C  s   t S r-   ©ÚNotImplemented©r(   Úotherr   r   r   Ú__eq__‹   s    zJSONArray.__eq__c                 C  s   t S r-   rR   rT   r   r   r   Ú__ne__Ž   s    zJSONArray.__ne__c                 C  s0   |d krt }|t kr tt| ƒƒS tj| j|d�S )N©r#   )Úobjectr	   ÚlistrG   Úasarrayr&   )r(   r#   r   r   r   Ú	__array__‘   s
    zJSONArray.__array__c                 C  s   t  | j¡S r-   )ÚsysÚ	getsizeofr&   r8   r   r   r   Únbytes™   s    zJSONArray.nbytesc                   s   t j‡ fdd„ˆ jD ƒtd�S )Nc                   s   g | ]}|ˆ j jk‘qS r   )r#   r   r/   r8   r   r   r2   ž   s     z"JSONArray.isna.<locals>.<listcomp>rX   )rG   Úarrayr&   rC   r8   r   r8   r   Úisna�   s    zJSONArray.isnac              
     sÈ   t  |¡}d}|rzˆ d kr"ˆjj‰ |dk  ¡ r2t‚z‡ ‡fdd„|D ƒ}W q¾ tk
rv } zt|ƒ|‚W 5 d }~X Y q¾X nDz‡fdd„|D ƒ}W n, tk
r¼ } zt|ƒ|‚W 5 d }~X Y nX ˆ |¡S )NzIIndex is out of bounds or cannot do a non-empty take from an empty array.éÿÿÿÿc                   s"   g | ]}|d krˆj | nˆ ‘qS )rb   r6   ©r0   Úloc©Ú
fill_valuer(   r   r   r2   ±   s    z"JSONArray.take.<locals>.<listcomp>c                   s   g | ]}ˆ j | ‘qS r   r6   rc   r8   r   r   r2   ¸   s     )rG   r[   r#   r   ÚanyÚ
ValueErrorr=   r.   )r(   ZindexerZ
allow_fillrf   ÚmsgÚoutputÚerrr   re   r   Útake    s&    
ÿÿ
zJSONArray.takec                 C  s   t | ƒ| jd d … ƒS r-   ©r   r&   r8   r   r   r   r*   ¾   s    zJSONArray.copyTc                 C  s~   ddl m} t|ƒ}t|t| jƒƒr>|| jkr>|r:|  ¡ S | S t||ƒrd|  t¡}| 	¡ j
|dd�S tjdd„ | D ƒ||d�S )Nr   )ÚStringDtypeF)r*   c                 S  s   g | ]}t |ƒ‘qS r   ©Údictr/   r   r   r   r2   Ñ   s     z$JSONArray.astype.<locals>.<listcomp>)r#   r*   )Zpandas.core.arrays.string_rn   r   r"   r   r#   r*   Úastyper%   r   r.   rG   r`   )r(   r#   r*   rn   rK   r   r   r   rq   Á   s    

zJSONArray.astypec                 C  s"   t | ƒdd„ dd„ | jD ƒD ƒƒS )Nc                 S  s   g | ]}t |ƒ‘qS r   ro   r/   r   r   r   r2   Ö   s     z$JSONArray.unique.<locals>.<listcomp>c                 S  s   h | ]}t | ¡ ƒ’qS r   ©r9   Úitems)r0   Údr   r   r   Ú	<setcomp>Ö   s     z#JSONArray.unique.<locals>.<setcomp>rm   r8   r   r   r   ÚuniqueÓ   s    zJSONArray.uniquec                 C  s"   t tj dd„ |D ƒ¡ƒ}| |ƒS )Nc                 s  s   | ]}|j V  qd S r-   r6   r/   r   r   r   Ú	<genexpr>Ú   s     z.JSONArray._concat_same_type.<locals>.<genexpr>)rZ   rE   ÚchainÚfrom_iterable)r   Z	to_concatr&   r   r   r   Ú_concat_same_typeØ   s    zJSONArray._concat_same_typec                 C  s$   |   ¡ }t|ƒdkr| ¡ }|dfS )Nr   r   )Ú_values_for_argsortrP   Zravel©r(   Úfrozenr   r   r   Ú_values_for_factorizeÝ   s    zJSONArray._values_for_factorizec                 C  s   dd„ | D ƒ}t |ƒS )Nc                 S  s   g | ]}t | ¡ ƒ‘qS r   rr   r/   r   r   r   r2   æ   s     z1JSONArray._values_for_argsort.<locals>.<listcomp>r   r|   r   r   r   r{   ä   s    zJSONArray._values_for_argsort)NF)NF)N)FN)T)r   r   r   r   r#   Z__array_priority__r,   r    r.   r4   rB   rN   rQ   rV   rW   r\   Úpropertyr_   ra   rl   r*   rq   rv   rz   r~   r{   r   r   r   r   r   B   s0   




r   c                   C  s   dd„ t dƒD ƒS )Nc              	   S  s*   g | ]"}t d d„ tt dd¡ƒD ƒƒ‘qS )c                 S  s$   g | ]}t  tj¡t  d d¡f‘qS )r   éd   )ÚrandomÚchoiceÚstringÚascii_lettersÚrandint©r0   Ú_r   r   r   r2   î   s   ÿz(make_data.<locals>.<listcomp>.<listcomp>r   é
   )r   Úranger�   r…   r†   r   r   r   r2   ì   s   úþÿzmake_data.<locals>.<listcomp>r€   )r‰   r   r   r   r   Ú	make_dataê   s    ùrŠ   )"Ú__doc__Ú
__future__r   Úcollectionsr   r   rE   r:   r�   rƒ   r]   Útypingr   r   ÚnumpyrG   Zpandas._typingr   Zpandas.core.dtypes.castr	   Zpandas.core.dtypes.commonr
   r   r   Zpandasr>   Zpandas.api.extensionsr   r   Zpandas.core.indexersr   r   r   rŠ   r   r   r   r   Ú<module>   s&    )