o
    g(                     @  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                   @  s4   e Zd ZU ejZdZe Zde	d< e
d	ddZdS )
	JSONDtypejsonzMapping[str, Any]na_valuereturntype_t[JSONArray]c                 C     t S )zq
        Return the array type associated with this dtype.

        Returns
        -------
        type
        )	JSONArray)cls r   _/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/pandas/tests/extension/json/array.pyconstruct_array_type2   s   	zJSONDtype.construct_array_typeN)r   r   )__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Zdd Zdd Zd-ddZe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data_items_data)selfvaluesr!   copyvalr   r   r   __init__B   s   zJSONArray.__init__c                 C  s   | |S Nr   )r   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r2t|dkr$|d tu r|dd  }n|d tu r$|d d }t|dkr.td|d }t |tjr= j| S t |trO|td krOt	  jS t |tr]t	  j| S t
jj |}t|jrw dd t |D S t	  fdd|D S )N   r   ztoo many indices for array.c                 S  s   g | ]\}}|r|qS r   r   )r0   r1   mr   r   r   r2   m       z)JSONArray.__getitem__.<locals>.<listcomp>c                      g | ]} j | qS r   r$   )r0   ir'   r   r   r2   o       )r    tuplelenEllipsis
IndexErrornumbersIntegralr$   slicer   pdapiindexerscheck_array_indexerr   r!   r.   zip)r'   itemr   r<   r   __getitem__W   s&   



zJSONArray.__getitem__c                 C  s   t |tjr|| j|< d S t |t| tjfst|g}t |t	j
rH|jdkrHtt||D ]\}\}}|rEt || jjs@J || j|< q/d S t||D ]\}}t || jjsZJ || j|< qMd S )Nbool)r    rB   rC   r$   r   r   Sequence	itertoolscyclenpndarrayr!   	enumeraterI   )r'   keyvaluer;   kvr   r   r   __setitem__q   s   
zJSONArray.__setitem__r   intc                 C  s
   t | jS r,   )r?   r$   r<   r   r   r   __len__   s   
zJSONArray.__len__c                 C  r   r,   NotImplementedr'   otherr   r   r   __eq__      zJSONArray.__eq__c                 C  r   r,   rZ   r\   r   r   r   __ne__   r_   zJSONArray.__ne__c                 C  s   |d u rt }tj| j|dS )Nr!   )objectrP   asarrayr$   )r'   r!   r   r   r   	__array__   s   zJSONArray.__array__c                 C  s   t | jS r,   )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   r2      r8   z"JSONArray.isna.<locals>.<listcomp>ra   )rP   arrayr$   rL   r<   r   r<   r   isna   s   zJSONArray.isnac              
     s   t |}d}|r7 d u rjj |dk  rtz fdd|D }W n. ty6 } zt||d }~ww zfdd|D }W n tyS } zt||d }~ww |S )NzIIndex is out of bounds or cannot do a non-empty take from an empty array.r6   c                   s"   g | ]}|d krj | n qS )r6   r:   r0   loc
fill_valuer'   r   r   r2      s    z"JSONArray.take.<locals>.<listcomp>c                   r9   r   r:   rj   r<   r   r   r2      r=   )rP   rc   r!   r   any
ValueErrorrA   r.   )r'   indexer
allow_fillrm   msgoutputerrr   rl   r   take   s.   




zJSONArray.takec                 C  s   t | | jd d  S r,   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||r2| t}|	 j
|ddS tjdd | D ||dS )Nr   )StringDtypeF)r)   c                 S     g | ]}t |qS r   dictr/   r   r   r   r2          z$JSONArray.astype.<locals>.<listcomp>)r!   r)   )pandas.core.arrays.string_rw   r
   r    r   r!   r)   astyper#   r   r.   rP   rh   )r'   r!   r)   rw   rT   r   r   r   r}      s   

zJSONArray.astypec                 C  s"   t | dd dd | jD D S )Nc                 S  rx   r   ry   r/   r   r   r   r2      r{   z$JSONArray.unique.<locals>.<listcomp>c                 S  s   h | ]}t | qS r   r>   items)r0   dr   r   r   	<setcomp>   r8   z#JSONArray.unique.<locals>.<setcomp>rv   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 r,   r:   r/   r   r   r   	<genexpr>   s    z.JSONArray._concat_same_type.<locals>.<genexpr>)listrN   chainfrom_iterable)r   	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_argsortr?   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   r~   r/   r   r   r   r2      r8   z1JSONArray._values_for_argsort.<locals>.<listcomp>r   r   r   r   r   r      s   zJSONArray._values_for_argsort)NF)r   rX   r,   )FN)T)r   r   r   r   r!   __array_priority__r+   r   r.   r4   rK   rW   rY   r^   r`   rd   propertyrg   ri   ru   r)   r}   r   r   r   r   r   r   r   r   r   >   s2    






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   rN   rB   r   r   re   typingr   r   numpyrP   pandas._typingr   pandas.core.dtypes.castr	   pandas.core.dtypes.commonr
   pandasrE   pandas.api.extensionsr   r   pandas.api.typesr   r   r   r   r   r   r   r   <module>   s(     &