
    Owg                         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"y)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                  T    e Zd ZU ej                  ZdZ e       Zde	d<   e
dd       Zy)	JSONDtypejsonzMapping[str, Any]na_valuec                    t         S )zq
        Return the array type associated with this dtype.

        Returns
        -------
        type
        )	JSONArray)clss    X/var/www/horilla/myenv/lib/python3.12/site-packages/pandas/tests/extension/json/array.pyconstruct_array_typezJSONDtype.construct_array_type8   s
         N)returnztype_t[JSONArray])__name__
__module____qualname__r   r   typenamer   r   __annotations__classmethodr    r   r   r   r   3   s/    ;;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  NFc                    |D ]M  }t        || j                  j                        r$t        dt	        | j                  j                        z          || _        | j
                  x| _        | _        y )NzAll values must be of type )
isinstancedtyper   	TypeErrorstrdata_items_data)selfvaluesr'   copyvals        r   __init__zJSONArray.__init__H   s`     	VCc4::??3 =DJJOO@T TUU	V 	 $(99,djr   r'   r/   c                    | |      S Nr#   )r   scalarsr'   r/   s       r   _from_sequencezJSONArray._from_sequenceU   s    7|r   c                V     | |D cg c]  }|dk7  s	t        |       c}      S c c}w )Nr#   )r   )r   r.   originalxs       r   _from_factorizedzJSONArray._from_factorizedY   s%    ;A17HQK;<<;s   
&&c                   t        |t              rt        |      }t        |t        j                        r| j
                  |   S t        |t              r)|t        d       k(  r t        |       | j
                        S t        |t              r t        |       | j
                  |         S t        |      st        d      t        j                  j                  j                  | |      }t        |j                        rFt        |       j!                  t#        | |      D cg c]
  \  }}|s	| c}}| j                        S  t        |       |D cg c]  }| j
                  |    c}      S c c}}w c c}w )Nzuonly integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indicesr'   )r&   tupler   numbersIntegralr*   slicer   r
   
IndexErrorpdapiindexerscheck_array_indexerr	   r'   r6   zip)r-   itemr9   mis        r   __getitem__zJSONArray.__getitem__]   s2   dE",T2DdG,,-99T?"e$t)<4:dii((e$4:diio..d# L 
 66??66tTBDTZZ(Dz00#&tT?841aaQ8

 1   4:T:tyy|:;; 9 ;s   $
E3
/E3
E9c                T   t        |t        j                        r|| j                  |<   y t        |t	        |       t
        j                  f      st        j                  |g      }t        |t        j                        rd|j                  dk(  rUt        t        ||            D ]<  \  }\  }}|st        || j                  j                        sJ || j                  |<   > y t        ||      D ]6  \  }}t        || j                  j                        sJ || j                  |<   8 y )Nbool)r&   r>   r?   r*   r   r   Sequence	itertoolscyclenpndarrayr'   	enumeraterF   )r-   keyvaluerI   kvs         r   __setitem__zJSONArray.__setitem__y   s    c7++,"DIIcNed4j#,,%?@!0#rzz*syyF/B!*3sE?!; )IAv1)!TZZ__==='(		!)
  UO %DAq%a999#$DIIaL%r   c                ,    t        | j                        S r4   )lenr*   r-   s    r   __len__zJSONArray.__len__   s    499~r   c                    t         S r4   NotImplementedr-   others     r   __eq__zJSONArray.__eq__       r   c                    t         S r4   r]   r_   s     r   __ne__zJSONArray.__ne__   rb   r   c                    |t         }|t         k(  rt        t        |             S t        j                  | j
                  |      S Nr<   )objectr   listrP   asarrayr*   )r-   r'   r/   s      r   	__array__zJSONArray.__array__   s7    =EF?:4:FFzz$))511r   c                @    t        j                  | j                        S r4   )sys	getsizeofr*   rZ   s    r   nbyteszJSONArray.nbytes   s    }}TYY''r   c                    t        j                  | j                  D cg c]  }|| j                  j                  k(   c}t
              S c c}w rf   )rP   arrayr*   r'   r   rL   )r-   r9   s     r   isnazJSONArray.isna   s4    xx499Eadjj111ETRREs    Ac                   t        j                  |      }d}|rV|| j                  j                  }|dk  j	                         rt
        	 |D cg c]  }|dk7  r| j                  |   n| }}n	 |D cg c]  }| j                  |    }}t        |       j                  || j                        S c c}w # t        $ r}t        |      |d }~ww xY wc c}w # t        $ r}t        |      |d }~ww xY w)NzIIndex is out of bounds or cannot do a non-empty take from an empty array.r<   )
rP   ri   r'   r   any
ValueErrorr*   rA   r   r6   )r-   indexer
allow_fill
fill_valuemsglocoutputerrs           r   takezJSONArray.take   s    **W%2 	
 !!ZZ00
"!!#  /KRDGcRiDIIcNZ? /4;<S$))C.<< Dz((tzz(BB  / o3./ = / o3./sT   B8 B3-B8 1C 5CC 3B8 8	CCCC 	C4#C//C4c                >     t        |       | j                  d d        S r4   )r   r*   rZ   s    r   r/   zJSONArray.copy   s    tDz$))A,''r   Tc                   ddl m} t        |      }t        |t	        | j
                              r#|| j
                  k(  r|r| j                         S | S t        ||      r9| j                  t              }|j                         }|j                  ||d      S |s.t        j                  | D cg c]  }t        |       c}|      S t        j                  | D cg c]  }t        |       c}||      S c c}w c c}w )Nr   )StringDtypeFr2   r<   )pandas.core.arrays.string_r   r   r&   r   r'   r/   astyper)   r   r6   rP   ri   dictrp   )r-   r'   r/   r   rT   arr_clsr9   s          r   r   zJSONArray.astype   s     	;U#eT$**-.5DJJ3Fyy{"K{+KK$E002G))%u5)II::51tAw5UCC88d3T!W35tLL 63s   .C8C=c           	          t        |       | j                  D ch c]  }t        |j                                c}D cg c]  }t	        |       c}      S c c}w c c}w r4   )r   r*   r=   itemsr   )r-   dr9   s      r   uniquezJSONArray.unique   sD     tDztyy,Q!U1779-=,QRq47RSS,QRs
    AAc                p    t        t        j                  j                  d |D                    } | |      S )Nc              3  4   K   | ]  }|j                     y wr4   )r*   ).0r9   s     r   	<genexpr>z.JSONArray._concat_same_type.<locals>.<genexpr>   s     1LQ!&&1Ls   )rh   rN   chainfrom_iterable)r   	to_concatr*   s      r   _concat_same_typezJSONArray._concat_same_type   s+    IOO111L)1LLM4yr   c                f    | j                         }t        |      dk(  r|j                         }|dfS )Nr   r#   )_values_for_argsortrY   ravel)r-   frozens     r   _values_for_factorizezJSONArray._values_for_factorize   s1    ))+v;!\\^Frzr   c                n    | D cg c]  }t        |j                                }}t        |      S c c}w r4   )r=   r   r   )r-   r9   r   s      r   r   zJSONArray._values_for_argsort   s0    ,01q%	"116v>> 2s    2)limitr/   c               (    t         |   |||      S )N)methodr   r/   )super_pad_or_backfill)r-   r   r   r/   	__class__s       r   r   zJSONArray._pad_or_backfill   s    w'vU'NNr   )NF)r   None)r   int)NN)FN)T)r   r   r   r   r'   __array_priority__r1   r"   r6   r:   rJ   rW   r[   ra   rd   rj   propertyrn   rq   r}   r/   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   D   s    KE- .2   = =<8%&2 ( (SC<(M*T
  ?
 154 O Or   r   c                 V   t         j                  j                  d      } t        d      D cg c]l  }t	        t        | j                  dd            D cg c]<  }| j                  t        t        j                              | j                  dd      f> c}      n c}S c c}w c c}w )N   d   r   
   )
rP   randomdefault_rngranger   integerschoicerh   stringascii_letters)rng_s     r   	make_datar      s    
))


"C s  	 s||Ar23 D!5!567a9MN	
 s   'B&AB!	B&!B&)#__doc__
__future__r   collectionsr   r   rN   r>   r   rl   typingr   r   numpyrP   pandas.core.dtypes.castr   pandas.core.dtypes.commonr	   r
   r   pandasrB   pandas.api.extensionsr   r   pandas.core.indexersr   collections.abcr   pandas._typingr   r   r   r   r#   r   r   <module>r      ss    #    

  K   ;'% "nO nObr   