
    Oh#                       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%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)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                  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    i/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/pandas/tests/extension/json/array.pyconstruct_array_typezJSONDtype.construct_array_type;   s
         N)returnztype_t[JSONArray])__name__
__module____qualname__r   r   typenamer   r   __annotations__classmethodr    r   r   r   r   6   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__K   s`     	VCc4::??3 =DJJOO@T TUU	V 	 $(99,djr   r(   r0   c                    | |      S Nr$   )r   scalarsr(   r0   s       r   _from_sequencezJSONArray._from_sequenceX   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_factorized\   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(   r7   zip)r.   itemr:   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(   	enumeraterG   )r.   keyvaluerJ   kvs         r   __setitem__zJSONArray.__setitem__|   s    c7++,"DIIcNed4j#,,%?@!0#rzz*syyF/B!*3sE?!; )IAv1)!TZZ__==='(		!)
  UO %DAq%a999#$DIIaL%r   c                ,    t        | j                        S r5   )lenr+   r.   s    r   __len__zJSONArray.__len__   s    499~r   c                    t         S r5   NotImplementedr.   others     r   __eq__zJSONArray.__eq__       r   c                    t         S r5   r^   r`   s     r   __ne__zJSONArray.__ne__   rc   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.)
stacklevelr=   r3   )
warningswarnFutureWarningr   objectr	   listrQ   asarrayr+   )r.   r(   r0   s      r   	__array__zJSONArray.__array__   sx    5=MM2 +-	 =EF?:4:FF<::diiu55zz$))5t<<r   c                @    t        j                  | j                        S r5   )sys	getsizeofr+   r[   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 )Nr=   )rQ   arrayr+   r(   r   rM   )r.   r:   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=   )
rQ   rm   r(   r   any
ValueErrorr+   rB   r    r7   )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 r5   )r    r+   r[   s    r   r0   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        ||      r$|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   )StringDtypeFr3   r=   )pandas.core.arrays.string_r   r   r'   r    r(   r0   r   r7   rQ   rm   dictrt   )r.   r(   r0   r   arr_clsr:   s         r   astypezJSONArray.astype   s     	;U#eT$**-.5DJJ3Fyy{"K{+002G))$e%)HH::51tAw5UCC88d3T!W35tLL 63s   C#C(c           	          t        |       | j                  D ch c]  }t        |j                                c}D cg c]  }t	        |       c}      S c c}w c c}w r5   )r    r+   r>   itemsr   )r.   dr:   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r5   )r+   ).0r:   s     r   	<genexpr>z.JSONArray._concat_same_type.<locals>.<genexpr>   s     1LQ!&&1Ls   )rl   rO   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_argsortrZ   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 r5   )r>   r   r	   )r.   r:   r   s      r   r   zJSONArray._values_for_argsort   s0    ,01q%	"116v>> 2s    2)limitr0   c               (    t         |   |||      S )N)methodr   r0   )super_pad_or_backfill)r.   r   r   r0   	__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__r2   r#   r7   r;   rK   rX   r\   rb   re   rn   propertyrr   ru   r   r0   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                 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   
   )
rQ   randomdefault_rngranger   integerschoicerl   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   rO   r?   r   rp   typingr   r   rh   numpyrQ   pandas.util._exceptionsr   pandas.core.dtypes.castr	   pandas.core.dtypes.commonr
   r   r   pandasrC   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   