o
    hg                     @   s  d dl Z d dlZd dlZd dlZzd dlmZ W n ey#   dZY nw d dlZzd dl	Z
d dlmZ W n eyA   d Z
ZY nw ejjedu ddZejeddZejeddZejeddZd	d
 Ze jdd ZG dd dejZdd Zdd Zdd Zdd Zdd Zdd Z dd Z!edd Z"edd  Z#d!d" Z$ed#d$ Z%ed%d& Z&did'd(Z'ed)d* Z(ed+d, Z)ed-d. Z*d/d0 Z+ed1d2 Z,ed3d4 Z-ed5d6 Z.d7d8 Z/d9d: Z0d;d< Z1eej2d=e0e1gd>d? Z3ed@dA Z4edBdC Z5ejj2dDe6 e7dEe6 e8dEe6 igg dFdGdHdI Z9ejj2dJe:g dKdLdM e6 e; fej<e:g dKgdNgdOdPdM e8dNe6 ie8dNe; ifgdQdRgdGdSdT Z=ejj2dJe:g dKdUdM e6 e; fej<e:g dKgdNgdOdVdM e8dNe6 ie8dNe; ifgdQdRgdGdWdX Z>ejj2dYej?j@dZdM gd[d\gdGd]d^ ZAd_d` ZBdadb ZCdcdd ZDdedf ZEedgdh ZFdS )j    N)ffiz!test needs cffi package installed)reasonz"Cannot import released ArrowSchemamatchz!Cannot import released ArrowArrayz#Cannot import released Arrow Streamc                 C   s   t jt | |dkS N   )ctypes	pythonapiPyCapsule_IsValid	py_object)capsulename r   K/var/www/vscode/kcb/lib/python3.10/site-packages/pyarrow/tests/test_cffi.pyr
   3   s   r
   c              	   c   s4    t |  zd V  W t | j d S t | j w N)paregister_extension_typeunregister_extension_typeextension_name)ext_typer   r   r   registered_extension_type7   s
   
r   c                       s<   e Zd Z fddZedd Zdd Zedd Z  Z	S )	ParamExtTypec                    s   || _ t t|d d S )Nz$pyarrow.tests.test_cffi.ParamExtType)_widthsuper__init__r   binary)selfwidth	__class__r   r   r   B   s   zParamExtType.__init__c                 C      | j S r   )r   r   r   r   r   r   G   s   zParamExtType.widthc                 C   s   t | j S r   )strr   encoder!   r   r   r   __arrow_ext_serialize__K      z$ParamExtType.__arrow_ext_serialize__c                 C   s   t | }| |S r   )intdecode)clsstorage_type
serializedr   r   r   r   __arrow_ext_deserialize__N   s   z&ParamExtType.__arrow_ext_deserialize__)
__name__
__module____qualname__r   propertyr   r$   classmethodr+   __classcell__r   r   r   r   r   @   s    
r   c                   C   s"   t jdt t  fgddidS )Nints   key1   value1metadata)r   schemalist_int32r   r   r   r   make_schemaT   s   r:   c                   C   s   t jdtdfgddidS Next   r3   r4   r5   )r   r7   r   r   r   r   r   make_extension_schemaY   s   r>   c                   C   s   t jdtdjfgddidS r;   )r   r7   r   r)   r   r   r   r   make_extension_storage_schema^   s   r?   c                   C   s   t dgddgggt S )Nr      *   )r   record_batchr:   r   r   r   r   
make_batchd   s   rC   c                  C   s8   t  } | d jtjddgtdd}t|g| S )Nr   s   foos   barr=   type)r>   rE   
wrap_arrayr   arrayr   rB   )r7   ext_colr   r   r   make_extension_batchh   s
   rI   c                  C   s6   t  } tdgddggg| td g ddggg| gS )Nr   r@   rA         )r:   r   rB   r7   r   r   r   make_batcheso   s   rM   c              	   C   sv   t  -}t j|| }|D ]}|| qW d    n1 s!w   Y  | W  d    S 1 s4w   Y  d S r   )r   BufferOutputStreamipc
new_streamwritegetvalue)r7   batchessinkoutbatchr   r   r   make_serializedw   s   
$rW   c                  C   sV  t d} tt d| }t  t }tt	 }|
| t |ks)J ~t |ks2J tj|}|tt	 ksCJ t |ksKJ t tj| W d    n1 s^w   Y  t	 
| t dd}|| _tjtdd tj| W d    n1 sw   Y  t tj| W d    d S 1 sw   Y  d S )Nstruct ArrowSchema*	uintptr_tzchar[]s   zzzz$Invalid or unsupported format stringr   )r   newr&   castgccollectr   total_allocated_bytesr8   r9   _export_to_cDataType_import_from_cassert_schema_releasedformatpytestraises
ValueError)c_schema
ptr_schemaold_allocatedtyptyp_new
bad_formatr   r   r   test_export_import_type   s4   

"rm   c                  C   s   t d} tt d| }t  t }tjdt	t
 dd}|| t |ks/J ~t |ks8J tj|}|tjdt	t
 ddksOJ t |ksWJ t tj| W d    d S 1 skw   Y  d S )NrX   rY   testT)nullable)r   rZ   r&   r[   r\   r]   r   r^   fieldr8   r9   r_   Fieldra   rb   )rg   rh   ri   rp   	field_newr   r   r   test_export_import_field   s   

""rs   c                 C   s  t d}tt d|}t d|  d}tt d|}t  t }tt	 }tj
dgddgg|d}	|	 }
||	| t |ksJJ ~	|||}| |
ksXJ |jtt	 ksdJ t |kslJ ~~t |ksvJ t ||tt	  W d    n1 sw   Y  tj
dgddggtt	 d}	|	 }
||	|| ~	|||}| |
ksJ |jtt	 ksJ t |ksJ ~t |ksJ t ||| W d    d S 1 sw   Y  d S )	NrX   rY   struct *r   r@   rA   rD   )r   rZ   r&   r[   r\   r]   r   r^   r8   r9   rG   	to_pylistrE   assert_array_releasedrb   )
array_typeexporterimporterrg   rh   c_array	ptr_arrayri   rj   arrpy_valuearr_newr   r   r   check_export_import_array   sD   


"
"r   c                   C   s   t dtjjtjj d S N
ArrowArray)r   r   Arrayr_   ra   r   r   r   r   test_export_import_array   s
   r   c                  C   s   t dtjjtjj td} ttd| }tj	dgddggt
t d}|| | jdks4J | jdks;J | j	jdksCJ d S )	NArrowDeviceArraystruct ArrowDeviceArray*rY   r   r@   rA   rD   )r   r   r   _export_to_c_device_import_from_c_devicer   rZ   r&   r[   rG   r8   r9   device_type	device_idlength)r{   r|   r}   r   r   r   test_export_import_device_array   s   
"
r   c                 C   s<  |d u r| }t d}tt d|}t  t }|  | t |ks)J tj	
|}|| ks6J t |ks>J ~t |ksGJ t tj	
| W d    n1 sZw   Y  t | tjtdd tj	
| W d    n1 s~w   Y  t tj	
| W d    d S 1 sw   Y  d S )NrX   rY   %ArrowSchema describes non-struct typer   )r   rZ   r&   r[   r\   r]   r   r^   r_   Schemara   rb   r9   rd   re   rf   )schema_factoryexpected_schema_factoryrg   rh   ri   
schema_newr   r   r   check_export_import_schema   s2   
"r   c                   C   s   t t d S r   )r   r:   r   r   r   r   test_export_import_schema   s   r   c                   C   sD   t tt ttd t t W d    d S 1 sw   Y  d S r   )r   r>   r?   r   r   r   r   r   r   (test_export_import_schema_with_extension%  s   
"r   c                  C   s   t d} tt d| }d}tjt|d t t	| W d    n1 s)w   Y  tjt|d t
jt	|}W d    n1 sHw   Y  |t ksTJ d S )NrX   rY   z,Passing a pointer value as a float is unsafer   )r   rZ   r&   r[   rd   warnsUserWarningr:   r_   floatr   r   ra   )rg   rh   r   r   r   r   r   'test_export_import_schema_float_pointer0  s   
r   c                 C   s  t d}tt d|}t d|  d}tt d|}t  t }| }	|	j}
|		 }||	| t |ks=J ~	|||
}|	 |ksKJ |j|
ksRJ t |ksZJ ~~
t |ksdJ t
 ||t  W d    n1 sww   Y  | }	|		 }|	|| ~	|||}|	 |ksJ |j| jksJ t |ksJ ~t |ksJ t ||| W d    n1 sw   Y  t | | | tjtdd ||| W d    n1 sw   Y  t ||| W d    d S 1 sw   Y  d S )NrX   rY   rt   ru   r   r   )r   rZ   r&   r[   r\   r]   r   r^   r7   	to_pydictrw   r:   r_   rb   r9   rd   re   rf   )rx   ry   rz   batch_factoryrg   rh   r{   r|   ri   rV   r7   r~   	batch_newr   r   r   check_export_import_batch?  sX   



$r   c                   C   s   t dtjjtjjt d S r   )r   r   RecordBatchr_   ra   rC   r   r   r   r   test_export_import_batchu  s   r   c                   C   sH   t td tdtjjtjjt W d    d S 1 sw   Y  d S )Nr   r   )r   r   r   r   r   r_   ra   rI   r   r   r   r   'test_export_import_batch_with_extension  s   "r   c                  C   sp   t dtjjtjjt td} tt	d| }t }|| | j
dks'J | jdks.J | jjdks6J d S )Nr   r   rY   r   r   r@   )r   r   r   r   r   rC   r   rZ   r&   r[   r   r   rG   r   )r{   r|   rV   r   r   r   test_export_import_device_batch  s   

r   c           	      C   s   t  }|d j}|||}||  ~~tj| }|j|ks!J t|}~|t  ks-J td ur`t  }|d j}tj	|
 }|||}||  ~~tj| }| }~t|| d S d S )Nr   )rM   r7   r_   r   RecordBatchReaderra   listpdTablefrom_batches	to_pandasread_pandastmassert_frame_equal)	
ptr_streamreader_factoryrS   r7   reader
reader_newgot_batchesexpected_dfgot_dfr   r   r   _export_import_batch_reader  s,   





r   c                 C   s   t jt| |S r   )r   rO   open_streamrW   r7   rS   r   r   r   make_ipc_stream_reader  s   r   c                 C   s   t j| |S r   )r   r   r   r   r   r   r   make_py_record_batch_reader  r%   r   r   c                 C   sz   t d}tt d|}t  t }t||  t |ks"J t	 tj
| W d    d S 1 s6w   Y  d S )Nstruct ArrowArrayStream*rY   )r   rZ   r&   r[   r\   r]   r   r^   r   assert_stream_releasedr   ra   )r   c_streamr   ri   r   r   r   test_export_import_batch_reader  s   

"r   c                  C   s   t d} tt d| }t  t }dd }tj	t
 | }|| tj|}tt}|  W d    n1 sAw   Y  dt|jv sOJ dt|jv sXJ dt|jv saJ t |ksiJ d S )Nr   rY   c               
   s   s0    	 zt d t y }  ztd| d } ~ ww )NTfoobar)rf   NotImplementedErrorrM   )er   r   r   gen  s   
z0test_export_import_exception_reader.<locals>.genzValueError: foozNotImplementedError: barzraise ValueError('foo'))r   rZ   r&   r[   r\   r]   r   r^   r   r   r:   r_   ra   rd   re   r   read_next_batchr"   value)r   r   ri   r   originalr   exc_infor   r   r   #test_export_import_exception_reader  s   
	

r   c                  C   sB  t d} tt d| }tdt fg}tjg dg|dtjg dg|dg}t||}tj	
|d d }|| ~tj|}| }||d ksRJ tjtd	d
 |  W d    n1 shw   Y  tj	
|d d }|| ~tj|}tjtd	d
 |  W d    d S 1 sw   Y  d S )Nr   rY   r   r   r@   r=   rL   )   rJ   rK   ir   z<Expected to be able to read 16 bytes for message body, got 8r   )r   rZ   r&   r[   r   r7   r9   rB   rW   rO   r   r_   r   ra   r   rd   re   OSErrorread_all)r   r   r7   rS   bufr   r   rV   r   r   r    test_imported_batch_reader_error  s6   





"r   objr   )rE   rp   r7   )idsc                 C   s   t   t }|  }t|ddksJ t |ksJ t| |}|| ks*J t |ks2J |  }t |ks>J ~t |ksGJ d S )N   arrow_schemar   )r\   r]   r   r^   __arrow_c_schema__r
   rE   _import_from_c_capsule)r   ri   r   obj_outr   r   r   test_roundtrip_schema_capsule  s   r   z&arr,schema_accessor,bad_type,good_typeabcc                 C   r    r   rD   xr   r   r   <lambda>5      r   r   )namesc                 C   r    r   rL   r   r   r   r   r   8  r   rG   rB   c           
      C   s  t   t }t| j}|  \}}t|ddksJ t|ddks%J |||}|| s1J t |ks9J ~t |ksBJ |  }t |ksNJ ~t |ksWJ t	j
tdd | |  W d    n1 spw   Y  | | \}}	|||	}|||ksJ d S )Nr   r   s   arrow_array-Could not cast.* string to requested .* int32r   )r\   r]   r   r^   rE   r   __arrow_c_array__r
   equalsrd   re   rf   r   
r}   schema_accessorbad_type	good_typeri   import_arrayschema_capsuler   arr_outarray_capsuler   r   r   test_roundtrip_array_capsule4  2   



r   c                 C   r    r   rD   r   r   r   r   r   _  r   c                 C   r    r   rL   r   r   r   r   r   b  r   c           
      C   s  t   t }t| j}|  \}}t|ddksJ t|ddks%J |||}|| s1J t |ks9J ~t |ksBJ | 	 }t |ksNJ ~t |ksWJ t
jtdd | |  W d    n1 spw   Y  | | \}}	|||	}|||ksJ d S )Nr   r   s   arrow_device_arrayr   r   )r\   r]   r   r^   rE   _import_from_c_device_capsule__arrow_c_device_array__r
   r   r   rd   re   rf   r   r   r   r   r   #test_roundtrip_device_array_capsule^  r   r   constructorc                 C   s   t j|| S r   )r   r   r   r   r   r   r   r     s    recordbatchreadertablec                 C   sx  t  }|d j}t  t }| ||}| }t|ddks"J tj	|}|j|ks/J t
|}t|t|ks=J t||D ]\}}	||	sMJ qB~~~~	~t |ks[J | ||}tdt i}
tjtjjdd ||
  W d    n1 sw   Y  tdtt i}|| }tj	|}|j|ksJ t||D ]\}}	||	sJ qd S )Nr      arrow_array_streamr   r2   zField 0 cannot be castr   )rM   r7   r\   r]   r   r^   __arrow_c_stream__r
   r   r   r   lenzipr   r9   rd   re   libArrowTypeErrorr   r8   )r   rS   r7   ri   r   r   imported_readerimported_batchesrV   expected
bad_schemamatching_schemar   r   r   test_roundtrip_reader_capsule  s6   



r   c                  C   s   t  } tdtt fg}| }| |}| |}t|ddks'J tj	
|}|j|ks4J | |s=J tt |  W d    d S 1 sRw   Y  d S )Nr2   r   r   )rC   r   r7   r8   int64r   r[   r   r
   r   r   r   r   rd   re   StopIteration)rV   requested_schemarequested_capsulebatch_as_requestedr   r   r   r   r   4test_roundtrip_batch_reader_capsule_requested_schema  s   


"r   c                  C   s   t  } |  }t|ddksJ tj|}|j| jksJ | | s'J t	
t |  W d    d S 1 s<w   Y  d S )Nr   r   )rC   r   r
   r   r   r   r7   r   r   rd   re   r   )rV   r   r   r   r   r   #test_roundtrip_batch_reader_capsule  s   
"r   c                  C   s\   t t g dg} |  }t|ddksJ t j|}|j| jks&J || ks,J d S )Nr   r   r   )r   chunked_arrayrG   r   r
   ChunkedArrayr   rE   )chunkedr   imported_chunkedr   r   r   $test_roundtrip_chunked_array_capsule  s   r  c                  C   s   t t g dg} | j }| |}t j|}|| ks!J t  }| }| |}t j|}|| 	t  ks?J t 
 }| }tjtdd | | W d    d S 1 s_w   Y  d S )Nr   z-Could not cast string to requested type int64r   )r   r  rG   rE   r   r   r  r   r   r[   r   rd   re   rf   )r  r   r   r  requested_typer   r   r   5test_roundtrip_chunked_array_capsule_requested_schema  s"   


"r  c                  C   s   zdd l } W n	 ty   Y nw td td}ttd|}tj	g dt
 d}|| d|_tjtdd	 tj||j W d    d S 1 sPw   Y  d S )
Nr   zpyarrow.cuda is availabler   rY   r   rD   r@   z&Trying to import data on a CUDA devicer   )pyarrow.cudaImportErrorrd   skipr   rZ   r&   r[   r   rG   r   r   r   re   r   r   rE   )pyarrowr{   r|   r}   r   r   r   test_import_device_no_cuda  s   


"r  r   )G
contextlibr   r\   r  r   pyarrow.cffir   r	  rd   pandasr   pandas.testingtestingr   markskipif
needs_cffire   rf   rb   rw   r   r
   contextmanagerr   ExtensionTyper   r:   r>   r?   rC   rI   rM   rW   rm   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   parametrizer   r   r   r9   rp   r7   r   rG   stringrB   r   r   r   r   r   r   r   r  r  r  r   r   r   r   <module>   s   

 
,


 



6
	


 
!
"
 
	! 
	"
%
