
    da                        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mZmZ ddlZdd	lmZ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)AnyMapping)type_t'construct_1d_object_array_from_listlike)is_bool_dtypeis_list_likepandas_dtype)ExtensionArrayExtensionDtype)unpack_tuple_and_ellipsesc                  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    ]/var/www/html/t/fyr/venv311/lib/python3.11/site-packages/pandas/tests/extension/json/array.pyconstruct_array_typezJSONDtype.construct_array_type6   s
         N)r   r   )__name__
__module____qualname__r   r   typenamer   r   __annotations__classmethodr    r   r   r   r   1   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
 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__F   sm     	V 	VCc4:?33 V =DJO@T@T TUUUV	 $(9,djjjr   c                     | |          S Nr$   )r   scalarsr)   r1   s       r   _from_sequencezJSONArray._from_sequenceS   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>Y   s#    ;;;A177HQKK777r   r$   )r   r0   originals      r   _from_factorizedzJSONArray._from_factorizedW   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>q   s!    +O+O+O$!QQ+OA+O+O+Or   c                *    g | ]}j         |         S r$   r,   )r;   ir/   s     r   r=   z)JSONArray.__getitem__.<locals>.<listcomp>s   s    :::ty|:::r   )r(   tupler   numbersIntegralr,   slicer    r   
IndexErrorpdapiindexerscheck_array_indexerr   r)   r7   zip)r/   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(   rG   rH   r,   r    r   Sequence	itertoolscyclenpndarrayr)   	enumeraterO   )r/   keyvaluerE   kvs         r   __setitem__zJSONArray.__setitem__u   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 r5   )lenr,   r/   s    r   __len__zJSONArray.__len__   s    49~~r   c                    t           S r5   NotImplementedr/   others     r   __eq__zJSONArray.__eq__       r   c                    t           S r5   re   rg   s     r   __ne__zJSONArray.__ne__   rj   r   c                    |t           }|t           k    rt          t          |                     S t          j        | j        |          S )Nr)   )objectr
   listrW   asarrayr,   )r/   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 r5   )sys	getsizeofr,   rb   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<   r/   s     r   r=   z"JSONArray.isna.<locals>.<listcomp>   s#    EEEadj11EEEr   rn   )rW   arrayr,   rS   rb   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|   rD   )r;   loc
fill_valuer/   s     r   r=   z"JSONArray.take.<locals>.<listcomp>   s8       DGcRiiDIcNNZ  r   c                *    g | ]}j         |         S r$   rD   )r;   r~   r/   s     r   r=   z"JSONArray.take.<locals>.<listcomp>   s    <<<S$)C.<<<r   )rW   rq   r)   r   any
ValueErrorrJ   r7   )r/   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 r5   r    r,   rb   s    r   r1   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)r1   c                ,    g | ]}t          |          S r$   dictr:   s     r   r=   z$JSONArray.astype.<locals>.<listcomp>   s    ///Qa///r   )r)   r1   )pandas.core.arrays.string_r   r   r(   r    r)   r1   astyper+   r   r7   rW   ry   )r/   r)   r1   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$   rF   items)r;   ds     r   	<setcomp>z#JSONArray.unique.<locals>.<setcomp>   s(    ,Q,Q,Q!U17799-=-=,Q,Q,Qr   r   rb   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 r5   rD   r:   s     r   	<genexpr>z.JSONArray._concat_same_type.<locals>.<genexpr>   s$      1L1LQ!&1L1L1L1L1L1Lr   )rp   rU   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_argsortra   ravelr/   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_   r5   )FN)T)r   r   r   r   r)   __array_priority__r3   r#   r7   r?   rQ   r^   rc   ri   rl   rr   propertyrv   rz   r   r1   r   r   r   r   r   r$   r   r   r   r   B   s       IKKE- - - - -    [ = = [=< < <4% % %&       2 2 2 2 ( ( ( X(S S S+ + + +<( ( (I I I I$T T T
   [  ? ? ? ? ?r   r   c                 4    d t          d          D             S )Nc                    g | ];}t          d  t          t          j        dd                    D                       <S )c                t    g | ]5}t          j        t          j                  t          j        d d          f6S )r   d   )randomchoicestringascii_lettersrandintr;   _s     r   r=   z(make_data.<locals>.<listcomp>.<listcomp>   sF        v344fnQ6L6LM  r   r   
   )r   ranger   r   r   s     r   r=   zmake_data.<locals>.<listcomp>   sd         	 v~a4455  	
 	
  r   r   )r   r$   r   r   	make_datar      s+      s   r   )"__doc__
__future__r   collectionsr   r   rU   rG   r   r   rt   typingr   r   numpyrW   pandas._typingr   pandas.core.dtypes.castr
   pandas.core.dtypes.commonr   r   r   pandasrK   pandas.api.extensionsr   r   pandas.core.indexersr   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   