B
    Y0d(                 @  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   S/var/www/html/venv/lib/python3.7/site-packages/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  sH   x.|D ]&}t || jjstdt| jj qW || _| 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   )r#   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rxttt||D ],\}\}}|r^t || jjst|| j|< q^W n4x2t||D ]$\}}t || jjst|| j|< qW d S )Nbool)r   r6   r7   r!   r   r   Sequence	itertoolscyclenpZndarrayr   	enumerater;   AssertionError)r#   keyvaluer1   kvr   r   r   __setitem__q   s    zJSONArray.__setitem__int)r   c             C  s
   t | jS )N)r3   r!   )r#   r   r   r   __len__   s    zJSONArray.__len__c             C  s   t S )N)NotImplemented)r#   otherr   r   r   __eq__   s    zJSONArray.__eq__c             C  s   t S )N)rL   )r#   rM   r   r   r   __ne__   s    zJSONArray.__ne__c             C  s   |d krt }tj| j|dS )N)r   )objectrB   asarrayr!   )r#   r   r   r   r   	__array__   s    zJSONArray.__array__c             C  s   t | jS )N)sys	getsizeofr!   )r#   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)   r*   )r#   r   r   r+      s    z"JSONArray.isna.<locals>.<listcomp>)r   )rB   arrayr!   r>   )r#   r   )r#   r   isna   s    zJSONArray.isnac          
     s   t |}d}|rz d kr"jj |dk  r2ty fdd|D }W q tk
rv } zt||W d d }~X Y qX nDyfdd|D }W n, tk
r } zt||W d d }~X Y nX |S )NzIIndex is out of bounds or cannot do a non-empty take from an empty array.r/   c               s"   g | ]}|d krj | n qS )r/   )r!   )r)   loc)
fill_valuer#   r   r   r+      s    z"JSONArray.take.<locals>.<listcomp>c               s   g | ]} j | qS r   )r!   )r)   rX   )r#   r   r   r+      s    )rB   rQ   r   r   any
ValueErrorr5   r(   )r#   ZindexerZ
allow_fillrY   msgoutputerrr   )rY   r#   r   take   s     
zJSONArray.takec             C  s   t | | jd d  S )N)r   r!   )r#   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   )dict)r)   r*   r   r   r   r+      s    z$JSONArray.astype.<locals>.<listcomp>)r   r%   )Zpandas.core.arrays.string_r`   r	   r   r   r   r%   astyper    r   r(   rB   rV   )r#   r   r%   r`   rF   r   r   r   rb      s    

zJSONArray.astypec             C  s"   t | dd dd | jD D S )Nc             S  s   g | ]}t |qS r   )ra   )r)   r*   r   r   r   r+      s    z$JSONArray.unique.<locals>.<listcomp>c             S  s   h | ]}t | qS r   )r2   items)r)   dr   r   r   	<setcomp>   s    z#JSONArray.unique.<locals>.<setcomp>)r   r!   )r#   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 )N)r!   )r)   r*   r   r   r   	<genexpr>   s    z.JSONArray._concat_same_type.<locals>.<genexpr>)listr@   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_argsortr3   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   )r2   rc   )r)   r*   r   r   r   r+      s    z1JSONArray._values_for_argsort.<locals>.<listcomp>)r   )r#   rm   r   r   r   rl      s    zJSONArray._values_for_argsort)NF)NF)N)FN)T)r   r   r   r   r   Z__array_priority__r'   r   r(   r-   r=   rI   rK   rN   rO   rR   propertyrU   rW   r_   r%   rb   rf   rk   rn   rl   r   r   r   r   r   >   s*   



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   rangerq   ru   )r)   rv   r   r   r   r+      s   zmake_data.<locals>.<listcomp>rp   )rx   r   r   r   r   	make_data   s    ry   ) __doc__
__future__r   collectionsr   r   r@   r6   rq   rs   rS   typingr   r   numpyrB   Zpandas._typingr   Zpandas.core.dtypes.castr   Zpandas.core.dtypes.commonr	   Zpandasr9   Zpandas.api.extensionsr
   r   Zpandas.api.typesr   r   r   ry   r   r   r   r   <module>   s&    &