
    Mh                         S r SSKJr  SSKJrJr  SSKrSSKrSSKrSSK	r	SSK
JrJr  SSKrSSKJr  SSKJrJrJr  SSKrSSKJrJr  SS	KJr  \(       a  SS
KJr  SSKJr   " S S\5      r  " S S\5      r!S r"g)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                  ^    \ rS rSr% \R
                  rSr\" 5       r	S\
S'   \SS j5       rSrg)		JSONDtype3   jsonzMapping[str, Any]na_valuec                    [         $ )zI
Return the array type associated with this dtype.

Returns
-------
type
)	JSONArray)clss    S/var/www/html/env/lib/python3.13/site-packages/pandas/tests/extension/json/array.pyconstruct_array_typeJSONDtype.construct_array_type8   s
          N)returnztype_t[JSONArray])__name__
__module____qualname____firstlineno__r   r   typenamer   r   __annotations__classmethodr   __static_attributes__r   r   r   r   r   3   s/    ;;DD"**H, r   r   c                    ^  \ rS rSr\" 5       rSrSSS jjr\SSS.S j5       r	\S 5       r
S	 rSS
 jrSS jrS rS rSS jr\SS j5       rS rS S jrS rS!S jrS r\S 5       rS rS rSSS.U 4S jjrSrU =r$ )"r   D   i  NFc                    U HR  n[        X@R                  R                  5      (       a  M)  [        S[	        U R                  R                  5      -   5      e   Xl        U R
                  =U l        U l        g )NzAll values must be of type )
isinstancedtyper#   	TypeErrorstrdata_items_data)selfvaluesr,   copyvals        r   __init__JSONArray.__init__H   sX    Cc::??33 =DJJOO@T TUU  	 $(99,djr   r,   r4   c                   U " U5      $ Nr   )r   scalarsr,   r4   s       r   _from_sequenceJSONArray._from_sequenceU   s    7|r   c                ^    U " U Vs/ s H  o3S:w  d  M
  [        U5      PM     sn5      $ s  snf )Nr   )r   )r   r3   originalxs       r   _from_factorizedJSONArray._from_factorizedY   s)    ;A7KHQK;<<;s   	**c                D   [        U[        5      (       a  [        U5      n[        U[        R                  5      (       a  U R
                  U   $ [        U[        5      (       a*  U[        S 5      :X  a  [        U 5      " U R
                  5      $ [        U[        5      (       a  [        U 5      " U R
                  U   5      $ [        U5      (       d  [        S5      e[        R                  R                  R                  X5      n[        UR                  5      (       aJ  [        U 5      R!                  [#        X5       VVs/ s H  u  p#U(       d  M  UPM     snnU R                  S9$ [        U 5      " U Vs/ s H  o@R
                  U   PM     sn5      $ s  snnf s  snf )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,   r<   zip)r2   itemr@   mis        r   __getitem__JSONArray.__getitem__]   s>   dE"",T2DdG,,--99T?"e$$t)<:dii((e$$:diio..d## L 
 66??66tBDTZZ((Dz00#&t?8?41aQ?8

 1   :T:Tyy|T:;; 9 ;s   F
F
8Fc                   [        U[        R                  5      (       a  X R                  U'   g [        U[	        U 5      [
        R                  45      (       d  [        R                  " U/5      n[        U[        R                  5      (       an  UR                  S:X  a^  [        [        X5      5       HE  u  nu  pEU(       d  M  [        XPR                  R                  5      (       d   eXPR                  U'   MG     g [        X5       H9  u  pE[        XPR                  R                  5      (       d   eXPR                  U'   M;     g )Nbool)r+   rF   rG   r/   r#   r   Sequence	itertoolscyclenpndarrayr,   	enumeraterN   )r2   keyvaluerQ   kvs         r   __setitem__JSONArray.__setitem__y   s    c7++,,"IIcNed4j#,,%?@@!0#rzz**syyF/B!*3s?!;IAvq)!ZZ__===='(		! "<
  ODA%a9999#$IIaL ,r   c                ,    [        U R                  5      $ r:   )lenr/   r2   s    r   __len__JSONArray.__len__   s    499~r   c                    [         $ r:   NotImplementedr2   others     r   __eq__JSONArray.__eq__       r   c                    [         $ r:   rh   rj   s     r   __ne__JSONArray.__ne__   rn   r   c                    Uc  [         nU[         :X  a  [        [        U 5      5      $ [        R                  " U R
                  US9$ NrD   )objectr   listrY   asarrayr/   )r2   r,   r4   s      r   	__array__JSONArray.__array__   s7    =EF?:4:FFzz$))511r   c                B    [         R                  " U R                  5      $ r:   )sys	getsizeofr/   rd   s    r   nbytesJSONArray.nbytes   s    }}TYY''r   c                    [         R                  " U R                   Vs/ s H  oU R                  R                  :H  PM     sn[
        S9$ s  snf rs   )rY   arrayr/   r,   r   rU   )r2   r@   s     r   isnaJSONArray.isna   s6    xx499E9adjj1119ETRREs   "Ac                   [         R                  " U5      nSnU(       a_  Uc  U R                  R                  nUS:  R	                  5       (       a  [
        e U Vs/ s H  oUS:w  a  U R                  U   OUPM     nnO U Vs/ s H  oPR                  U   PM     nn[        U 5      R                  X`R                  S9$ s  snf ! [         a  n[        U5      UeS nAff = fs  snf ! [         a  n[        U5      UeS nAff = f)NzIIndex is out of bounds or cannot do a non-empty take from an empty array.rD   )
rY   rv   r,   r   any
ValueErrorr/   rI   r#   r<   )r2   indexer
allow_fill
fill_valuemsglocoutputerrs           r   takeJSONArray.take   s    **W%2 	
 !!ZZ00
"!!##  /KRKRCRiDIIcNZ?7  /4;<GS))C.G< Dz((zz(BB  / o3./ = / o3./sT   C  C <C  C( C#C(  C 
C CC #C( (
D2C>>Dc                >    [        U 5      " U R                  S S  5      $ r:   )r#   r/   rd   s    r   r4   JSONArray.copy   s    Dz$))A,''r   Tc                $   SSK Jn  [        U5      n[        U[	        U R
                  5      5      (       a(  XR
                  :X  a  U(       a  U R                  5       $ U $ [        X5      (       a5  U R                  [        5      nUR                  5       nUR                  XASS9$ U(       d/  [        R                  " U  Vs/ s H  n[        U5      PM     snUS9$ [        R                  " U  Vs/ s H  n[        U5      PM     snXS9$ s  snf s  snf )Nr   )StringDtypeFr8   rD   )pandas.core.arrays.string_r   r   r+   r#   r,   r4   astyper.   r   r<   rY   rv   dictr   )r2   r,   r4   r   r]   arr_clsr@   s          r   r   JSONArray.astype   s     	;U#eT$**-..5JJ3Fyy{"K++KK$E002G))%5)II::51tAw5UCC88d3dT!Wd35LL 63s   >D-Dc           	         [        U 5      " U R                   Vs1 s H  n[        UR                  5       5      iM     sn Vs/ s H  n[	        U5      PM     sn5      $ s  snf s  snf r:   )r#   r/   rE   itemsr   )r2   dr@   s      r   uniqueJSONArray.unique   sL     Dztyy,Qy!U1779-=y,QR,Qq47,QRSS,QRs   #AA#c                p    [        [        R                  R                  S U 5       5      5      nU " U5      $ )Nc              3  8   #    U  H  oR                   v   M     g 7fr:   )r/   ).0r@   s     r   	<genexpr>.JSONArray._concat_same_type.<locals>.<genexpr>   s     1L)Q&&)s   )ru   rW   chainfrom_iterable)r   	to_concatr/   s      r   _concat_same_typeJSONArray._concat_same_type   s+    IOO111L)1LLM4yr   c                h    U R                  5       n[        U5      S:X  a  UR                  5       nUS4$ )Nr   r   )_values_for_argsortrc   ravel)r2   frozens     r   _values_for_factorizeJSONArray._values_for_factorize   s1    ))+v;!\\^Frzr   c                t    U  Vs/ s H  n[        UR                  5       5      PM     nn[        U5      $ s  snf r:   )rE   r   r   )r2   r@   r   s      r   r   JSONArray._values_for_argsort   s1    ,01Dq%	"D16v>> 2s   #5)limitr4   c                   > [         TU ]  XUS9$ )N)methodr   r4   )super_pad_or_backfill)r2   r   r   r4   	__class__s       r   r   JSONArray._pad_or_backfill   s    w'v'NNr   )r1   r0   r/   )NF)r   None)r   int)NN)FN)T)r   r    r!   r"   r   r,   __array_priority__r6   r&   r<   rA   rR   r`   re   rl   rp   rw   propertyr|   r   r   r4   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                 b   [         R                  R                  S5      n [        S5       Vs/ s Hp  n[	        [        U R                  SS5      5       Vs/ s H=  nU R                  [        [        R                  5      5      U R                  SS5      4PM?     sn5      PMr     sn$ s  snf s  snf )N   d   r   
   )
rY   randomdefault_rngranger   integerschoiceru   stringascii_letters)rng_s     r   	make_datar      s    
))


"C s A 	 s||Ar233A D!5!567a9MN3	
  s   (B,AB'B,'B,)#__doc__
__future__r   collectionsr   r   rW   rF   r   rz   typingr   r   numpyrY   pandas.core.dtypes.castr   pandas.core.dtypes.commonr	   r
   r   pandasrJ   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   