
    o[we                        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rdd
lmZ ddlmZ  G d de          Z  G d de          Z!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                  X    e Zd ZU ej        ZdZ e            Zde	d<   e
dd            ZdS )		JSONDtypejsonzMapping[str, Any]na_valuereturntype_t[JSONArray]c                    t           S )zq
        Return the array type associated with this dtype.

        Returns
        -------
        type
        )	JSONArray)clss    Alib/python3.11/site-packages/pandas/tests/extension/json/array.pyconstruct_array_typezJSONDtype.construct_array_type8   s
         N)r   r   )__name__
__module____qualname__r   r   typenamer   r   __annotations__classmethodr    r   r   r   r   3   sW         ;DD"*(**H,,,,   [  r   r   c                      e Zd Z e            ZdZdddZedd            Zed             Z	d	 Z
dd
ZddZd Zd ZddZedd            Zd ZddZd ZddZd Zed             Zd Zd ZdS ) r   i  NFr   Nonec                    |D ]E}t          || j        j                  s)t          dt	          | j        j                  z             F|| _        | j        x| _        | _        d S )NzAll values must be of type )
isinstancedtyper!   	TypeErrorstrdata_items_data)selfvaluesr*   copyvals        r   __init__zJSONArray.__init__H   sm     	V 	VCc4:?33 V =DJO@T@T TUUUV	 $(9,djjjr   c                     | |          S Nr%   )r   scalarsr*   r2   s       r   _from_sequencezJSONArray._from_sequenceU   s    s7||r   c                ,     | d |D                       S )Nc                8    g | ]}|d k    t          |          S )r%   )r   .0xs     r   
<listcomp>z.JSONArray._from_factorized.<locals>.<listcomp>[   s#    ;;;A177HQKK777r   r%   )r   r1   originals      r   _from_factorizedzJSONArray._from_factorizedY   s!    s;;;;;<<<r   c                    t          |t                    rt          |          }t          |t          j                  r j        |         S t          |t                    r0|t          d           k    r t                      j                  S t          |t                    r# t                      j        |                   S t          |          st          d          t          j        j                             |          }t          |j                  r-                     d t#           |          D                       S  t                      fd|D                       S )Nzuonly integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indicesc                    g | ]	\  }}||
S r%   r%   )r<   r=   ms      r   r>   z)JSONArray.__getitem__.<locals>.<listcomp>s   s!    +O+O+O$!QQ+OA+O+O+Or   c                *    g | ]}j         |         S r%   r-   )r<   ir0   s     r   r>   z)JSONArray.__getitem__.<locals>.<listcomp>u   s    :::ty|:::r   )r)   tupler   numbersIntegralr-   slicer!   r   
IndexErrorpdapiindexerscheck_array_indexerr
   r*   r8   zip)r0   items   ` r   __getitem__zJSONArray.__getitem__]   sY   dE"" 	3,T22DdG,-- 	<9T?"e$$ 	<t)<)<4::di(((e$$ 	<4::dio...d## 	< L  
 6?66tTBBDTZ(( Q**+O+O#dD//+O+O+OPPP4::::::T:::;;;r   c                0   t          |t          j                  r|| j        |<   d S t          |t	          |           t
          j        f          st          j        |g          }t          |t          j
                  r[|j        dk    rPt          t          ||                    D ]0\  }\  }}|r&t          || j        j                  sJ || j        |<   1d S t          ||          D ]+\  }}t          || j        j                  sJ || j        |<   ,d S )Nbool)r)   rH   rI   r-   r!   r   Sequence	itertoolscyclenpndarrayr*   	enumeraterP   )r0   keyvaluerF   kvs         r   __setitem__zJSONArray.__setitem__w   s#   c7+,, 	%"DIcNNNed4jj#,%?@@ 1!00#rz** 	%syF/B/B!*3sE??!;!; ) )IAv1 ))!TZ_====='(	!) )
  UOO % %DAq%a99999#$DIaLL% %r   intc                *    t          | j                  S r6   )lenr-   r0   s    r   __len__zJSONArray.__len__   s    49~~r   c                    t           S r6   NotImplementedr0   others     r   __eq__zJSONArray.__eq__       r   c                    t           S r6   rf   rh   s     r   __ne__zJSONArray.__ne__   rk   r   c                    |t           }|t           k    rt          t          |                     S t          j        | j        |          S )Nr*   )objectr	   listrX   asarrayr-   )r0   r*   s     r   	__array__zJSONArray.__array__   s@    =EF??:4::FFFz$)51111r   c                4    t          j        | j                  S r6   )sys	getsizeofr-   rc   s    r   nbyteszJSONArray.nbytes   s    }TY'''r   c                \     t          j         fd j        D             t                    S )Nc                0    g | ]}|j         j        k    S r%   )r*   r   )r<   r=   r0   s     r   r>   z"JSONArray.isna.<locals>.<listcomp>   s#    EEEadj11EEEr   ro   )rX   arrayr-   rT   rc   s   `r   isnazJSONArray.isna   s/    xEEEE49EEETRRRRr   c                    t          j        |          }d}|r` j        j        |dk                                     rt
          	  fd|D             }nT# t          $ r}t          |          |d }~ww xY w	  fd|D             }n"# t          $ r}t          |          |d }~ww xY w                     |          S )NzIIndex is out of bounds or cannot do a non-empty take from an empty array.c                :    g | ]}|d k    rj         |         nS )r}   rE   )r<   loc
fill_valuer0   s     r   r>   z"JSONArray.take.<locals>.<listcomp>   s8       DGcRiiDIcNNZ  r   c                *    g | ]}j         |         S r%   rE   )r<   r   r0   s     r   r>   z"JSONArray.take.<locals>.<listcomp>   s    <<<S$)C.<<<r   )rX   rr   r*   r   any
ValueErrorrK   r8   )r0   indexer
allow_fillr   msgoutputerrs   `  `   r   takezJSONArray.take   s    *W%%2 	
  	/!!Z0
"!!## !  /    KR    / / / oo3.//<<<<G<<< / / / oo3./ ""6***s0   	A 
A8#A33A8<B 
B*B%%B*c                L     t          |           | j        d d                    S r6   r!   r-   rc   s    r   r2   zJSONArray.copy   s"    tDzz$)AAA,'''r   Tc                   ddl m} t          |          }t          |t	          | j                            r#|| j        k    r|r|                                 S | S t          ||          rC|                     t                    }|	                                
                    |d          S t          j        d | D             ||          S )Nr   )StringDtypeF)r2   c                ,    g | ]}t          |          S r%   dictr;   s     r   r>   z$JSONArray.astype.<locals>.<listcomp>   s    ///Qa///r   )r*   r2   )pandas.core.arrays.string_r   r   r)   r!   r*   r2   astyper,   r   r8   rX   rz   )r0   r*   r2   r   r\   s        r   r   zJSONArray.astype   s     	;:::::U##eT$*--.. 	R5DJ3F3F #yy{{"K{++ 	RKK$$E--//>>u5>QQQx//$///u4HHHHr   c                d     t          |           d d | j        D             D                       S )Nc                ,    g | ]}t          |          S r%   r   r;   s     r   r>   z$JSONArray.unique.<locals>.<listcomp>   s    RRRq477RRRr   c                P    h | ]#}t          |                                          $S r%   rG   items)r<   ds     r   	<setcomp>z#JSONArray.unique.<locals>.<setcomp>   s(    ,Q,Q,Q!U17799-=-=,Q,Q,Qr   r   rc   s    r   uniquezJSONArray.unique   s:     tDzzRR,Q,Qty,Q,Q,QRRRSSSr   c                    t          t          j                            d |D                                 } | |          S )Nc              3  $   K   | ]}|j         V  d S r6   rE   r;   s     r   	<genexpr>z.JSONArray._concat_same_type.<locals>.<genexpr>   s$      1L1LQ!&1L1L1L1L1L1Lr   )rq   rV   chainfrom_iterable)r   	to_concatr-   s      r   _concat_same_typezJSONArray._concat_same_type   s<    IO111L1L)1L1L1LLLMMs4yyr   c                    |                                  }t          |          dk    r|                                }|dfS )Nr   r%   )_values_for_argsortrb   ravelr0   frozens     r   _values_for_factorizezJSONArray._values_for_factorize   s;    ))++v;;!\\^^Frzr   c                8    d | D             }t          |          S )Nc                P    g | ]#}t          |                                          $S r%   r   r;   s     r   r>   z1JSONArray._values_for_argsort.<locals>.<listcomp>   s(    111q%		""111r   r   r   s     r   r   zJSONArray._values_for_argsort   s#    11D1116v>>>r   )NF)r   r'   )r   r`   r6   )FN)T)r   r   r    r   r*   __array_priority__r4   r$   r8   r@   rR   r_   rd   rj   rm   rs   propertyrw   r{   r   r2   r   r   r   r   r   r%   r   r   r   r   D   s       IKKE- - - - -    [ = = [=< < <4% % % %&       2 2 2 2 ( ( ( X(S S S+ + + +<( ( (I I I I$T T T
   [  ? ? ? ? ?r   r   c                 x     t           j                            d            fdt          d          D             S )N   c                    g | ]>}t          fd t                              dd                    D                       ?S )c                    g | ]D}                     t          t          j                                                d d          fES )r   d   )choicerq   stringascii_lettersintegersr<   _rngs     r   r>   z(make_data.<locals>.<listcomp>.<listcomp>   sS        D!56677a9M9MN  r   r   
   )r   ranger   r   s     r   r>   zmake_data.<locals>.<listcomp>   sq         	   s||Ar2233  	
 	
  r   r   )rX   randomdefault_rngr   )r   s   @r   	make_datar      sK    
)


"
"C    s   r   )#__doc__
__future__r   collectionsr   r   rV   rH   r   ru   typingr   r   numpyrX   pandas.core.dtypes.castr	   pandas.core.dtypes.commonr
   r   r   pandasrL   pandas.api.extensionsr   r   pandas.core.indexersr   collections.abcr   pandas._typingr   r   r   r   r%   r   r   <module>r      s    # " " " " "              



       
     K K K K K K                     ; : : : : : &''''''%%%%%%       "e? e? e? e? e? e? e? e?P    r   