
    bMh#                       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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 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)find_stack_level'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    a/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pandas/tests/extension/json/array.pyconstruct_array_typezJSONDtype.construct_array_type;   s
         N)r   r   )__name__
__module____qualname__r   r   typenamer   r   __annotations__classmethodr    r   r   r   r   6   sW         ;DD"*(**H,,,,   [  r   r   c                      e Zd Z e            ZdZdddZedd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dd fd
Z xZ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__K   sm     	V 	VCc4:?33 V =DJO@T@T TUUUV	 $(9,djjjr   r+   r3   c                    | |          S Nr&   )r   scalarsr+   r3   s       r   _from_sequencezJSONArray._from_sequenceX   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   r2   originals      r   _from_factorizedzJSONArray._from_factorized\   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                  rAt                                         d t#           |          D              j                  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>w   s!    88841aa8Q888r   r+   c                *    g | ]}j         |         S r&   r.   )r>   ir1   s     r   r@   z)JSONArray.__getitem__.<locals>.<listcomp>z   s    :::ty|:::r   )r*   tupler   numbersIntegralr.   slicer"   r   
IndexErrorpdapiindexerscheck_array_indexerr   r+   r:   zip)r1   items   ` r   __getitem__zJSONArray.__getitem__`   so   dE"" 	3,T22DdG,-- 	<9T?"e$$ 	<t)<)<4::di(((e$$ 	<4::dio...d## 	< L  
 6?66tTBBDTZ(( Dzz00883tT??888
 1    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*   rK   rL   r.   r"   r   Sequence	itertoolscyclenpndarrayr+   	enumeraterS   )r1   keyvaluerI   kvs         r   __setitem__zJSONArray.__setitem__|   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 r8   )lenr.   r1   s    r   __len__zJSONArray.__len__   s    49~~r   c                    t           S r8   NotImplementedr1   others     r   __eq__zJSONArray.__eq__       r   c                    t           S r8   ri   rk   s     r   __ne__zJSONArray.__ne__   rn   r   c                ,   |du r(t          j        dt          t                                 |t          }|t          k    rt          t          |                     S |t          j        | j	        |          S t          j        | j	        ||          S )NFaS  Starting with NumPy 2.0, the behavior of the 'copy' keyword has changed and passing 'copy=False' raises an error when returning a zero-copy NumPy array is not possible. pandas will follow this behavior starting with pandas 3.0.
This conversion to NumPy requires a copy, but 'copy=False' was passed. Consider using 'np.asarray(..)' instead.)
stacklevelrF   r6   )
warningswarnFutureWarningr   objectr
   listr[   asarrayr.   )r1   r+   r3   s      r   	__array__zJSONArray.__array__   s    5==M2 +--	 	 	 	 =EF??:4::FFF<:diu5555z$)5t<<<<r   c                4    t          j        | j                  S r8   )sys	getsizeofr.   rf   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?   r1   s     r   r@   z"JSONArray.isna.<locals>.<listcomp>   s#    EEEadj11EEEr   rF   )r[   arrayr.   rW   rf   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t                                         | j                  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   rH   )r>   loc
fill_valuer1   s     r   r@   z"JSONArray.take.<locals>.<listcomp>   s8       DGcRiiDIcNNZ  r   c                *    g | ]}j         |         S r&   rH   )r>   r   r1   s     r   r@   z"JSONArray.take.<locals>.<listcomp>   s    <<<S$)C.<<<r   rF   )	r[   rx   r+   r   any
ValueErrorrN   r"   r:   )r1   indexer
allow_fillr   msgoutputerrs   `  `   r   takezJSONArray.take   s*    *W%%2 	
  	/!!Z0
"!!## !  /    KR    / / / oo3.//<<<<G<<< / / / oo3./ Dzz((tz(BBBs0   	A 
A8#A33A8<B 
B*B%%B*c                L     t          |           | j        d d                    S r8   r"   r.   rf   s    r   r3   zJSONArray.copy   s"    tDzz$)AAA,'''r   Tc                   ddl m} t          |          }t          |t	          | j                            r#|| j        k    r|r|                                 S | S t          ||          r,|                                }|                    | |d          S |s t          j
        d | D             |          S t          j        d | D             ||          S )Nr   )StringDtypeFr6   c                ,    g | ]}t          |          S r&   dictr=   s     r   r@   z$JSONArray.astype.<locals>.<listcomp>   s    5551tAww555r   rF   c                ,    g | ]}t          |          S r&   r   r=   s     r   r@   z$JSONArray.astype.<locals>.<listcomp>   s    333T!WW333r   )pandas.core.arrays.string_r   r   r*   r"   r+   r3   r   r:   r[   rx   r   )r1   r+   r3   r   arr_clss        r   astypezJSONArray.astype   s     	;:::::U##eT$*--.. 
	M5DJ3F3F #yy{{"K{++ 	M0022G))$e%)HHH 	M:55555UCCCC833d3335tLLLLr   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&   rJ   items)r>   ds     r   	<setcomp>z#JSONArray.unique.<locals>.<setcomp>   s(    ,Q,Q,Q!U17799-=-=,Q,Q,Qr   r   rf   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 r8   rH   r=   s     r   	<genexpr>z.JSONArray._concat_same_type.<locals>.<genexpr>   s$      1L1LQ!&1L1L1L1L1L1Lr   )rw   rY   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_argsortre   ravelr1   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   )limitr3   c               L    t                                          |||          S )N)methodr   r3   )super_pad_or_backfill)r1   r   r   r3   	__class__s       r   r   zJSONArray._pad_or_backfill  s"    ww''vU'NNNr   )NF)r   r(   )r   rc   )NN)FN)T)r   r    r!   r   r+   __array_priority__r5   r%   r:   rB   rU   rb   rg   rm   rp   ry   propertyr}   r   r   r3   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   G   s       IKKE- - - - - .2     [ = = [=< < <8% % % %&       = = = =. ( ( ( X(S S SC C C C<( ( (M M M M(T T T
   [  ? ? ?
 154 O O O O O O O O O O O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   )choicerw   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   )r[   randomdefault_rngr   )r   s   @r   	make_datar     sK    
)


"
"C    s   r   )&__doc__
__future__r   collectionsr   r   rY   rK   r   r{   typingr   r   rs   numpyr[   pandas.util._exceptionsr   pandas.core.dtypes.castr
   pandas.core.dtypes.commonr   r   r   pandasrO   pandas.api.extensionsr   r   pandas.core.indexersr   collections.abcr   pandas._typingr   r   r   r   r&   r   r   <module>r      s    # " " " " "              



             4 4 4 4 4 4 K K K K K K                     ; : : : : : &''''''%%%%%%       "|O |O |O |O |O |O |O |O~    r   