U
    f/e(                     @  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 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)pandas_dtype)ExtensionArrayExtensionDtype)is_bool_dtypec                   @  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   E/tmp/pip-unpacked-wheel-tiezk1ph/pandas/tests/extension/json/array.pyconstruct_array_type2   s    	zJSONDtype.construct_array_typeN)__name__
__module____qualname__r   r   typenamer   r   __annotations__classmethodr   r   r   r   r   r   -   s
   
r   c                   @  s   e Zd Ze ZdZ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d/d!d"Zd#d$ Zed%d& Zd'd( Zd)d* ZdS )0r   i  NFc                 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__B   s
    zJSONArray.__init__c                 C  s   | |S Nr   )r   Zscalarsr    r'   r   r   r   _from_sequenceO   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>U   s      z.JSONArray._from_factorized.<locals>.<listcomp>r   )r   r&   originalr   r   r   _from_factorizedS   s    zJSONArray._from_factorizedc                   s  t |trdt|dkrH|d tkr0|dd  }n|d tkrH|d d }t|dkr\td|d }t |tjrz j| S t |tr|td krt	  jS t |trt	  j| S t
jj |}t|jr dd t |D S t	  fdd|D S d S )N   r   ztoo many indices for array.c                 S  s   g | ]\}}|r|qS r   r   )r-   r.   mr   r   r   r/   m   s      z)JSONArray.__getitem__.<locals>.<listcomp>c                   s   g | ]} j | qS r   r#   )r-   ir%   r   r   r/   o   s     )r   tuplelenEllipsis
IndexErrornumbersIntegralr#   slicer   pdapiZindexersZcheck_array_indexerr   r    r+   zip)r%   itemr   r7   r   __getitem__W   s&    



zJSONArray.__getitem__c                 C  s   t |tjr|| j|< nt |t| tjfs8t|g}t |t	j
r|jdkrtt||D ],\}\}}|r\t || jjs~t|| j|< q\n0t||D ]$\}}t || jjst|| j|< qd S )Nbool)r   r<   r=   r#   r   r   Sequence	itertoolscyclenpZndarrayr    	enumeraterA   AssertionError)r%   keyvaluer6   kvr   r   r   __setitem__q   s    zJSONArray.__setitem__intr   c                 C  s
   t | jS r*   )r9   r#   r7   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  s   |d krt }tj| j|dS )Nr    )objectrH   asarrayr#   )r%   r    r   r   r   	__array__   s    zJSONArray.__array__c                 C  s   t | jS r*   )sys	getsizeofr#   r7   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,   r7   r   r   r/      s     z"JSONArray.isna.<locals>.<listcomp>rX   )rH   arrayr#   rD   r7   r   r7   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 qX 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.r3   c                   s"   g | ]}|d krj | n qS )r3   r5   r-   loc
fill_valuer%   r   r   r/      s    z"JSONArray.take.<locals>.<listcomp>c                   s   g | ]} j | qS r   r5   ra   r7   r   r   r/      s     )rH   rZ   r    r   any
ValueErrorr;   r+   )r%   ZindexerZ
allow_fillrd   msgoutputerrr   rc   r   take   s&    

zJSONArray.takec                 C  s   t | | jd d  S r*   r   r#   r7   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   r/      s     z$JSONArray.astype.<locals>.<listcomp>)r    r'   )Zpandas.core.arrays.string_rl   r
   r   r   r    r'   astyper"   r   r+   rH   r_   )r%   r    r'   rl   rL   r   r   r   ro      s    

zJSONArray.astypec                 C  s"   t | dd dd | jD D S )Nc                 S  s   g | ]}t |qS r   rm   r,   r   r   r   r/      s     z$JSONArray.unique.<locals>.<listcomp>c                 S  s   h | ]}t | qS r   r8   items)r-   dr   r   r   	<setcomp>   s     z#JSONArray.unique.<locals>.<setcomp>rk   r7   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*   r5   r,   r   r   r   	<genexpr>   s     z.JSONArray._concat_same_type.<locals>.<genexpr>)listrF   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_argsortr9   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   rp   r,   r   r   r   r/      s     z1JSONArray._values_for_argsort.<locals>.<listcomp>r   r{   r   r   r   rz      s    zJSONArray._values_for_argsort)NF)NF)N)FN)T)r   r   r   r   r    Z__array_priority__r)   r   r+   r1   rC   rO   rQ   rV   rW   r[   propertyr^   r`   rj   r'   ro   rt   ry   r}   rz   r   r   r   r   r   >   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r-   _r   r   r   r/      s   z(make_data.<locals>.<listcomp>.<listcomp>r   
   )r   ranger   r   r   r   r   r   r/      s   zmake_data.<locals>.<listcomp>r   )r   r   r   r   r   	make_data   s    r   ) __doc__
__future__r   collectionsr   r   rF   r<   r   r   r\   typingr   r   ZnumpyrH   Zpandas._typingr   Zpandas.core.dtypes.castr	   Zpandas.core.dtypes.commonr
   Zpandasr?   Zpandas.api.extensionsr   r   Zpandas.api.typesr   r   r   r   r   r   r   r   <module>   s&    &