
    A>iV$                        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Jr  \(       a  SS
KJr  SSKJ r    " S S\5      r! " S S\5      r"SS j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)getitem_returns_viewunpack_tuple_and_ellipses)Mapping)type_tc                  T    \ rS rSr% \R
                  rSr\" 5       r	S\
S'   SS jrSrg)		JSONDtype7   jsonzMapping[str, Any]na_valuec                    [         $ )zI
Return the array type associated with this dtype.

Returns
-------
type
)	JSONArrayselfs    `/var/www/html/land-tabula/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__r   __static_attributes__r   r   r   r   r   7   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
 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)r   valuesr-   copyvals        r   __init__JSONArray.__init__K   sX    Cc::??33 =DJJOO@T TUU  	 $(99,djr   r-   r4   c                   U " U5      $ Nr   )clsscalarsr-   r4   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;   r3   originalxs       r   _from_factorizedJSONArray._from_factorized\   s)    ;A7KHQK;<<;s   	**c                     [        U 5      R                  XR                  S9$ ! [        [        4 a2    SSKJn  [        R                  " U[        S9nUR                  USS9s $ f = f)Nr-   r   )libT)convert_non_numeric)r%   r=   r-   
ValueErrorr.   pandas._libsrF   npasarrayobjectmaybe_convert_objects)r   r3   rF   s      r   _cast_pointwise_result JSONArray._cast_pointwise_result`   sc    	O:,,V::,FFI& 	O(ZZf5F,,V,NN	Os   !$ ?A&%A&c                   [        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      nU R                  Ul        U$ [        U[        5      (       aA  [        U 5      " U R
                  U   5      n[        X5      (       a  U R                  Ul        U$ [        U5      (       d  [        S5      e[        R                  R                  R                  X5      n[!        UR"                  5      (       aI  [        U 5      R%                  ['        XSS9 VVs/ s H  u  p4U(       d  M  UPM     snnU R"                  S9$ [        U 5      " U Vs/ s H  oPR
                  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 indicesTstrictrE   )r,   tupler   numbersIntegralr0   slicer%   	_readonlyr   r
   
IndexErrorpdapiindexerscheck_array_indexerr	   r-   r=   zip)r   itemresultrA   mis         r   __getitem__JSONArray.__getitem__j   so   dE"",T2DdG,,--99T?"e$$t)<$Z		*F#~~FMe$$$Z		$0F#D//#'>> Md## L 
 66??66tBDTZZ((Dz00#&t$#?E#?411Q#?ETZZ 1   :T:Tyy|T:;; F ;s   6G
G
-Gc                   U R                   (       a  [        S5      e[        U[        R                  5      (       a  X R
                  U'   g [        U[        U 5      [        R                  45      (       d  [        R                  " U/5      n[        U[        R                  5      (       am  UR                  S:X  a]  [        [        XSS95       HE  u  nu  pEU(       d  M  [        XPR                  R                  5      (       d   eXPR
                  U'   MG     g [        XSS9 H9  u  pE[        XPR                  R                  5      (       d   eXPR
                  U'   M;     g )NzCannot modify read-only arrayboolFrQ   )rW   rH   r,   rT   rU   r0   r%   r   Sequence	itertoolscyclerJ   ndarrayr-   	enumerater]   )r   keyvaluera   kvs         r   __setitem__JSONArray.__setitem__   s    >><==c7++,,"IIcNed4j#,,%?@@!0#rzz**syyF/B!*3s%+H!IIAvq)!ZZ__===='(		! "J
  59DA%a9999#$IIaL :r   c                ,    [        U R                  5      $ r:   )lenr0   r   s    r   __len__JSONArray.__len__   s    499~r   c                    [         $ r:   NotImplementedr   others     r   __eq__JSONArray.__eq__       r   c                    [         $ r:   rv   rx   s     r   __ne__JSONArray.__ne__   r|   r   c                    USL a  [        S5      eUc  [        nU[        :X  a  [        [        U 5      5      $ Uc  [        R
                  " U R                  US9$ [        R
                  " U R                  XS9$ )NFz:Unable to avoid copy while creating an array as requested.rE   r8   )rH   rL   r   listrJ   rK   r0   )r   r-   r4   s      r   	__array__JSONArray.__array__   sj    5=L  =EF?:4:FF<::diiu55zz$))5<<r   c                B    [         R                  " U R                  5      $ r:   )sys	getsizeofr0   r   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   )rJ   arrayr0   r-   r   re   )r   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   )
rJ   rK   r-   r   anyrH   r0   rX   r%   r=   )r   indexer
allow_fill
fill_valuemsglocoutputerrs           r   takeJSONArray.take   s    **W%W 	 !!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   r   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      (       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   )StringDtypeFr8   rE   )pandas.core.arrays.string_r   r   r,   r%   r-   r4   r   r=   rJ   rK   dictr   )r   r-   r4   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   rS   itemsr   )r   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   )r   rg   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_argsortrr   ravel)r   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:   )rS   r   r   )r   rA   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)r   r   r   r4   	__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__r6   classmethodr=   rB   rN   rb   ro   rs   rz   r~   r   propertyr   r   r   r4   r   r   r   r   r   r   r(   __classcell__)r   s   @r   r   r   G   s    KE- .2   = =O<B%,= ( (SC:(M(T
  ?
 154 O Or   r   c                b   [         R                  R                  S5      n[        U 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   r   
   d   )
rJ   randomdefault_rngranger   integerschoicer   stringascii_letters)nrng_s      r   	make_datar     s    
))


"C q A 	 s||Ar233A D!5!567a9MN3	
  s   (B,AB'B,'B,)r   r   )$__doc__
__future__r   collectionsr   r   rg   rT   r   r   typingr   r   numpyrJ   pandas.core.dtypes.castr   pandas.core.dtypes.commonr	   r
   r   pandasrY   pandas.api.extensionsr   r   pandas.core.indexersr   r   collections.abcr   pandas._typingr   r   r   r   r   r   r   <module>r      su    #    

  K  
 '%  EO EOPr   