
    m*i#                       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rSSKJ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)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                  ^    \ rS rSr% \R
                  rSr\" 5       r	S\
S'   \SS j5       rSrg)		JSONDtype6   jsonzMapping[str, Any]na_valuec                    [         $ )zI
Return the array type associated with this dtype.

Returns
-------
type
)	JSONArray)clss    a/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/pandas/tests/extension/json/array.pyconstruct_array_typeJSONDtype.construct_array_type;   s
          N)returnztype_t[JSONArray])__name__
__module____qualname____firstlineno__r   r   typenamer   r   __annotations__classmethodr   __static_attributes__r   r   r   r   r   6   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   G   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__K   sX    Cc::??33 =DJJOO@T TUU  	 $(99,djr   r-   r5   c                   U " U5      $ Nr   )r   scalarsr-   r5   s       r   _from_sequenceJSONArray._from_sequenceX   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   r4   originalxs       r   _from_factorizedJSONArray._from_factorized\   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Integralr0   slicer$   r   
IndexErrorpdapiindexerscheck_array_indexerr
   r-   r=   zip)r3   itemrA   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,   rG   rH   r0   r$   r   Sequence	itertoolscyclenpndarrayr-   	enumeraterO   )r3   keyvaluerR   kvs         r   __setitem__JSONArray.__setitem__|   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;   )lenr0   r3   s    r   __len__JSONArray.__len__   s    499~r   c                    [         $ r;   NotImplementedr3   others     r   __eq__JSONArray.__eq__       r   c                    [         $ r;   ri   rk   s     r   __ne__JSONArray.__ne__   ro   r   c                    USL a"  [         R                  " S[        [        5       S9  Uc  [        nU[        :X  a  [        [        U 5      5      $ Uc  [        R                  " U R                  US9$ [        R                  " U R                  XS9$ )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.)
stacklevelrE   r9   )
warningswarnFutureWarningr   objectr	   listrZ   asarrayr0   )r3   r-   r5   s      r   	__array__JSONArray.__array__   sv    5=MM2 +-	 =EF?:4:FF<::diiu55zz$))5<<r   c                B    [         R                  " U R                  5      $ r;   )sys	getsizeofr0   re   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 )NrE   )rZ   arrayr0   r-   r   rV   )r3   rA   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.rE   )
rZ   rz   r-   r   any
ValueErrorr0   rJ   r$   r=   )r3   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$   r0   re   s    r   r5   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      (       a   UR                  5       nUR                  XS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   )StringDtypeFr9   rE   )pandas.core.arrays.string_r   r   r,   r$   r-   r5   r   r=   rZ   rz   dictr   )r3   r-   r5   r   arr_clsrA   s         r   astypeJSONArray.astype   s     	;U#eT$**-..5JJ3Fyy{"K++002G))$%)HH::51tAw5UCC88d3dT!Wd35LL 63s   )C3C8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$   r0   rF   itemsr   )r3   drA   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;   )r0   ).0rA   s     r   	<genexpr>.JSONArray._concat_same_type.<locals>.<genexpr>   s     1L)Q&&)s   )ry   rX   chainfrom_iterable)r   	to_concatr0   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_argsortrd   ravel)r3   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;   )rF   r   r	   )r3   rA   r   s      r   r   JSONArray._values_for_argsort   s1    ,01Dq%	"D16v>> 2s   #5)limitr5   c                   > [         TU ]  XUS9$ )N)methodr   r5   )super_pad_or_backfill)r3   r   r   r5   	__class__s       r   r   JSONArray._pad_or_backfill  s    w'v'NNr   )r2   r1   r0   )NF)r   None)r   int)NN)FN)T)r    r!   r"   r#   r   r-   __array_priority__r7   r'   r=   rB   rS   ra   rf   rm   rq   r{   propertyr   r   r   r5   r   r   r   r   r   r   r(   __classcell__)r   s   @r   r   r   G   s    KE- .2   = =<8%&=. ( (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   
   )
rZ   randomdefault_rngranger   integerschoicery   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   rX   rG   r   r~   typingr   r   ru   numpyrZ   pandas.util._exceptionsr   pandas.core.dtypes.castr	   pandas.core.dtypes.commonr
   r   r   pandasrK   pandas.api.extensionsr   r   pandas.core.indexersr   collections.abcr   pandas._typingr   r   r   r   r   r   r   <module>r      sy    #    
   4 K   ;'% "|O |O~r   