a
    Pf                      @  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
mZmZ ddl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 erdd
l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)TYPE_CHECKINGAny'construct_1d_object_array_from_listlike)is_bool_dtypeis_list_likepandas_dtype)ExtensionArrayExtensionDtype)unpack_tuple_and_ellipses)Mapping)type_tc                   @  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   Z/var/www/ai-form-bot/venv/lib/python3.9/site-packages/pandas/tests/extension/json/array.pyconstruct_array_type8   s    	zJSONDtype.construct_array_typeN)__name__
__module____qualname__r   r   typenamer   r   __annotations__classmethodr   r   r   r   r   r   3   s
   
r   c                      s   e Zd Ze ZdZd0ddddZedddd	d
Zedd Z	dd Z
ddddZddddZdd Zdd Zd1ddZeddddZdd Zd2ddZd d! Zd3d#d$Zd%d& Zed'd( Zd)d* Zd+d, Zdd"d- fd.d/
Z  ZS )4r   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__H   s
    zJSONArray.__init__r$   r+   c                C  s   | |S Nr   )r   Zscalarsr$   r+   r   r   r   _from_sequenceU   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>[       z.JSONArray._from_factorized.<locals>.<listcomp>r   )r   r*   originalr   r   r   _from_factorizedY   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nXt
jj |}t|jrt jdd t |D  j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   )r2   r3   mr   r   r   r4   t   r5   z)JSONArray.__getitem__.<locals>.<listcomp>r$   c                   s   g | ]} j | qS r   r'   )r2   ir)   r   r   r4   w   r5   )r#   tupler   numbersIntegralr'   slicer   r
   
IndexErrorpdapiZindexersZcheck_array_indexerr	   r$   r0   zip)r)   itemr   r<   r   __getitem__]   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~J || j|< q\n0t||D ]$\}}t || jjsJ || j|< qd S )Nbool)r#   r>   r?   r'   r   r   Sequence	itertoolscyclenpZndarrayr$   	enumeraterD   )r)   keyvaluer;   kvr   r   r   __setitem__y   s    zJSONArray.__setitem__intc                 C  s
   t | jS r/   )lenr'   r<   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/   rU   rW   r   r   r   __ne__   s    zJSONArray.__ne__c                 C  s0   |d u rt }|t kr tt| S tj| j|dS )Nr9   )objectr   listrK   asarrayr'   )r)   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   r1   r<   r   r   r4      r5   z"JSONArray.isna.<locals>.<listcomp>r9   )rK   arrayr'   rG   r<   r   r<   r   isna   s    zJSONArray.isnac              
     s   t |}d}|r| d u r"jj |dk  r2tz fdd|D }W q tyx } zt||W Y d }~qd }~0 0 nFzfdd|D }W n. ty } zt||W Y d }~n
d }~0 0 tj|jd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 )rd   r:   r2   loc
fill_valuer)   r   r   r4      s   z"JSONArray.take.<locals>.<listcomp>c                   s   g | ]} j | qS r   r:   re   r<   r   r   r4      r5   r9   )	rK   r]   r$   r   any
ValueErrorrA   r   r0   )r)   ZindexerZ
allow_fillrh   msgoutputerrr   rg   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||rj| t}|	 }|j
||ddS |stjdd | D |dS tjdd | D ||dS d S )	Nr   )StringDtypeFr.   c                 S  s   g | ]}t |qS r   dictr1   r   r   r   r4      r5   z$JSONArray.astype.<locals>.<listcomp>r9   c                 S  s   g | ]}t |qS r   rq   r1   r   r   r   r4      r5   )Zpandas.core.arrays.string_rp   r   r#   r   r$   r+   astyper&   r   r0   rK   r]   rb   )r)   r$   r+   rp   rN   Zarr_clsr   r   r   rs      s    

zJSONArray.astypec                 C  s"   t | dd dd | jD D S )Nc                 S  s   g | ]}t |qS r   rq   r1   r   r   r   r4      r5   z$JSONArray.unique.<locals>.<listcomp>c                 S  s   h | ]}t | qS r   r=   items)r2   dr   r   r   	<setcomp>   r5   z#JSONArray.unique.<locals>.<setcomp>ro   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:   r1   r   r   r   	<genexpr>   r5   z.JSONArray._concat_same_type.<locals>.<genexpr>)r\   rI   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_argsortrS   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   rt   r1   r   r   r   r4      r5   z1JSONArray._values_for_argsort.<locals>.<listcomp>r   r~   r   r   r   r}      s    zJSONArray._values_for_argsort)limitr+   c                  s   t  j|||dS )N)methodr   r+   )super_pad_or_backfill)r)   r   r   r+   	__class__r   r   r      s    zJSONArray._pad_or_backfill)NF)NN)FN)T)r   r   r   r   r$   Z__array_priority__r-   r!   r0   r7   rF   rQ   rT   rY   rZ   r^   propertyra   rc   rn   r+   rs   rx   r|   r   r}   r   __classcell__r   r   r   r   r   D   s2   




r   c                     s"   t jd  fddtdD S )N   c              	     s.   g | ]&}t  fd dt ddD qS )c                   s(   g | ] }  ttj d dfqS )r   d   )choicer\   stringascii_lettersintegersr2   _rngr   r   r4      s   z(make_data.<locals>.<listcomp>.<listcomp>r   
   )r   ranger   r   r   r   r   r4      s   
zmake_data.<locals>.<listcomp>r   )rK   randomZdefault_rngr   r   r   r   r   	make_data   s    
r   )#__doc__
__future__r   collectionsr   r   rI   r>   r   r_   typingr   r   numpyrK   Zpandas.core.dtypes.castr   Zpandas.core.dtypes.commonr	   r
   r   ZpandasrB   Zpandas.api.extensionsr   r   Zpandas.core.indexersr   collections.abcr   Zpandas._typingr   r   r   r   r   r   r   r   <module>   s(    2