
    eiY                        d dl Z d dlmZ d dlmZ d dlZd dlZd dlZd dlZd dl	Z		 d dl
Zd dlZd dlZd dlmZmZmZmZ d ZddZd Zd Zd	 Z G d
 de j4                        Z G d de      Z G d de      Z G d dee	j<                        Z G d dee	j<                        Z  G d dee	j<                        Z!ejD                  jF                   G d dee	j<                               Z$y# e$ r dZY w xY w)    N)OrderedDict)Decimal)	read_json	open_jsonReadOptionsParseOptionsc               #   n   K   t         j                  } | E d {    | D ]  }| D ]	  }||z      y 7 wN)stringascii_lowercase)lettersfirstseconds      Y/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/pyarrow/tests/test_json.pygenerate_col_namesr   %   sG     $$G ! 	!F&. 	!! s   535c                    t         j                  j                  d      j                  dd| |f      }t	        t        j                  t               |             }g }|j                  D ]Y  }t        t        ||      D cg c]  \  }}|t        |      f c}}      }	|j                  t        j                  |	             [ |j                  |      j!                         }
|D cg c]+  }t#        j$                  |t#        j&                               - }}t"        j(                  j+                  ||      }|
|fS c c}}w c c}w )N*   r     )size)type)nprandomRandomStaterandintlist	itertoolsislicer   Tr   zipintappendjsondumpsjoinencodepaarrayint64Tablefrom_arrays)num_colsnum_rowslineseparr	col_nameslinesrowkvjson_objdatacolcolumnsexpecteds                 r   make_random_jsonr9   .   s   
))


#
+
+At8X:N
+
OCY%%&8&:HEFIEuu +#i:MNACFNOTZZ)*+ <<%%'D9<=#rxx"((*-=G=xx##GY7H>  O >s    D>(0Ec                      | di |}|j                  |j                  ||j                              }|j                         D ]  \  }}t	        ||      |k(  rJ  y )N)protocol )loadsr#   HIGHEST_PROTOCOLitemsgetattr)clspicklerattr_valuesoptsnew_optsnamevalues          r   check_options_class_picklingrH   ;   sk    D}}W]]44;4L4L + N OH"((* 0ex&%///0    c                 2   t         } |       }|j                  dkD  sJ d|_        |j                  dk(  sJ |j                  du sJ d|_        |j                  du sJ  |dd      }|j                  dk(  sJ |j                  du sJ t        || dd       y )Nr   i90  TFi  )
block_sizeuse_threads)rB   rK   rL   )r   rK   rL   rH   )pickle_modulerA   rD   s      r   test_read_optionsrN   C   s    
C5D??QDO??e###t###Du$$$$E2D??d"""u$$$ m,0-24rI   c                    t         } |       }|j                  du sJ |j                  J d|_        |j                  du sJ t        j                  t        j
                  dt        j                               g      }||_        |j                  |k(  sJ |j                  dk(  sJ dD ]  }||_        |j                  |k(  rJ  t        j                  t              5  d|_        d d d        t        || |dd       y # 1 sw Y   xY w)	NFTfooinfer)ignoreerrorrQ   zinvalid-valuerR   )rB   explicit_schemanewlines_in_valuesunexpected_field_behavior)r   rU   rT   r&   schemafieldint32rV   pytestraises
ValueErrorrH   )rM   rA   rD   rW   rG   s        r   test_parse_optionsr]   X   s   
C5D""e+++'''"D""d***YY
345F!D6)))))W444- 7).&--6667 
z	" 9)8&9 !m1749;CE9 9s    DD
c                      e Zd Zej                  d        Zd Zd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zd Zej"                  j$                  d        Zej"                  j$                  d        Zej"                  j$                  d        Zy)BaseTestJSONc                     t         )z
        :param b: bytes to be parsed
        :param kwargs: arguments passed on to open the json file
        :return: b parsed as a single Table
        )NotImplementedErrorselfbkwargss      r   
read_byteszBaseTestJSON.read_bytest   s
     "!rI   c                     |j                   t        |      k(  sJ |j                  D cg c]  }|j                   c}|k(  sJ y c c}w r
   )num_columnslenr7   rF   )rc   tablenamescs       r   check_nameszBaseTestJSON.check_names}   s>      CJ... %.1.%777.s   Ac                    d}t               }t               }||dz   fD ]  }dD ]  }||_        d|_        t	        j
                  t        d      5  | j                  |||       d d d        t        dd	      D ]6  }||_        | j                  |||      }|j                         d
g dik(  r6J    y # 1 sw Y   SxY w)Ns   {"a": 1}
{"a": 2}
{"a": 3}   
FT   ztry to increase block sizematchread_optionsparse_options	      a)         )
r   r   rU   rK   rZ   r[   r\   rf   range	to_pydict)rc   rowsru   rv   r5   rU   rK   rj   s           r   test_block_sizeszBaseTestJSON.test_block_sizes   s    ."}$4%<( 	AD&3 A"3E0*+']]:)EG AOOD|2? $ AA #(2, AJ.8L+ OOD|:G , IE ??,i0@@@@	AA	AA As   B66B?c                 h    d}| j                  |      }|j                         ddgddgddgdk(  sJ y )	Ns/   {"a": 1,"b": 2, "c": 3}
{"a": 4,"b": 5, "c": 6}rz   rq   r{      r|      ry   rd   rl   )rf   r~   )rc   r   rj   s      r   test_no_newline_at_endz#BaseTestJSON.test_no_newline_at_end   sH    B% QQQ%
 
 	
 
rI   c                 2   d}| j                  |      }t        j                  dt        j                         fdt        j                         fdt        j                         fg      }|j                  |k(  sJ |j	                         ddgddgd	d
gdk(  sJ y )Ns0   {"a": 1,"b": 2, "c": 3}
{"a": 4,"b": 5, "c": 6}
ry   rd   rl   rz   rq   r{   r   r|   r   r   )rf   r&   rW   r(   r~   rc   r   rj   rW   s       r   test_simple_intszBaseTestJSON.test_simple_ints   s    D%S"((*- "((*- "((*-/ 0 ||v%%% QQQ%
 
 	
 
rI   c                 b   d}| j                  |      }t        j                  dt        j                         fdt        j                         fdt        j
                         fdt        j                         fg      }|j                  |k(  sJ |j                         ddgdd	gd
dgddgdk(  sJ y )NsQ   {"a": 1,"b": 2, "c": "3", "d": false}
{"a": 4.0, "b": -5, "c": "foo", "d": true}
ry   rd   rl   d      ?      @r{   3rP   FTry   rd   rl   r   )rf   r&   rW   float64r(   r   bool_r~   r   s       r   test_simple_variedzBaseTestJSON.test_simple_varied   s    @%S"**,/ "((*- "))+. "((*-/ 0 ||v%%% sRu	%
 
 	
 
rI   c           	         d}| j                  |      }t        j                  dt        j                         fdt        j                         fdt        j
                         fdt        j                         fdt        j                         fg      }|j                  |k(  sJ |j                         g dg dg d	g d
g ddk(  sJ y )Ns   {"a": 1, "b": 2, "c": null, "d": null, "e": null}
{"a": null, "b": -5, "c": "foo", "d": null, "e": true}
{"a": 4.5, "b": null, "c": "nan", "d": null,"e": false}
ry   rd   rl   r   e)r   Ng      @)r{   r   N)NrP   nan)NNN)NTF)ry   rd   rl   r   r   )	rf   r&   rW   r   r(   r   nullr   r~   r   s       r   test_simple_nullszBaseTestJSON.test_simple_nulls   s    M %S"**,/ "((*- "))+. "''), "((*-	/ 0
 ||v%%% !%#$%
 
 	
 
rI   c                     d}| j                  |      }t        j                  dt        j                  t        j                               fg      }|j                  |k(  sJ |j                         dg gik(  sJ y )N	   {"a": []}ry   )rf   r&   rW   list_r   r~   r   s       r   test_empty_listszBaseTestJSON.test_empty_lists   sg    %S"((2779"5678||v%%% S2$K///rI   c                     d}| j                  |      }t        j                  g       }|j                  |k(  sJ |j                  dk(  sJ |j                  dk(  sJ y )Ns   {}
{}
r   r{   )rf   r&   rW   rh   r,   r   s       r   test_empty_rowszBaseTestJSON.test_empty_rows   sZ    %2||v%%%  A%%%~~"""rI   c                    d}dt        d      t        d      t        d      d gi}t        j                  t        j                  t        j                  t        j
                  f}|D ]f  }t        j                  d |dd      fg      }t        |      }| j                  ||	      }|j                  |k(  sJ |j                         |k(  rfJ  y )
Ns'   {"a": 1}
{"a": 1.45}
{"a": -23.456}
{}
ry   1z1.45z-23.456rw   rq   rT   rv   )
r   r&   	decimal32	decimal64
decimal128
decimal256rW   r   rf   r~   )rc   r   r8   decimal_typestype_factoryrW   rD   rj   s           r   test_explicit_schema_decimalz)BaseTestJSON.test_explicit_schema_decimal   s    
 '#,1CTJ
 r||R]]BMMR) 	1LYYl1a&8 9:;F7DOODO=E<<6)))??$000	1rI   c                    d}t        j                  dt        j                         fg      }t        |      }| j	                  ||      }|j                  t        j                  dt        j                         fdt        j
                         fg      k(  sJ |j                         ddgdd	gd
k(  sJ t        |d      }| j	                  ||      }|j                  t        j                  dt        j                         fg      k(  sJ |j                         dddgik(  sJ t        |d      }t        j                  t         j                  d      5  | j	                  ||       d d d        y # 1 sw Y   y xY w)Ns2   {"foo": "bar", "num": 0}
{"foo": "baz", "num": 1}
rP   r   r   nums   bars   bazr   rz   )rP   r   rR   )rT   rV   rS   "JSON parse error: unexpected fieldrr   )
r&   rW   binaryr   rf   r(   r~   rZ   r[   ArrowInvalid)rc   r   rW   rD   rj   s        r   .test_explicit_schema_with_unexpected_behaviourz;BaseTestJSON.test_explicit_schema_with_unexpected_behaviour   s   .BIIK 
  F3D9||ryyBIIK BHHJ*
    	   F#q6%
 
 	
 
 F6>@D9||ryyBIIK *
    	   FF#%
 
 	
 

 F6=?]]2??!EG 	6OODO5	6 	6 	6s   E77F c                     t        dd      \  }}| j                  |      }|j                  |j                  k(  sJ |j                  |      sJ |j	                         |j	                         k(  sJ y )Nr{   
   r+   r,   )r9   rf   rW   equalsr~   )rc   r5   r8   rj   s       r   test_small_random_jsonz#BaseTestJSON.test_small_random_json  sf    )1rBh%||x...||H%%% H$6$6$8888rI   c                     t        dd      \  }}t        d      }| j                  ||      }|j                  dk(  sJ |j                  dk(  sJ y )Nr{   i r   i   rK   ru   )r9   r   rf   r,   )rc   r5   r8   ru   rj   s        r   test_load_large_jsonz!BaseTestJSON.test_load_large_json!  sT    )1vFh"l;<@~~'''  F***rI   c                 |   t        dd      \  }}t               }t               }||j                  d      fD ]  }dD ]{  }||_        dD ]m  }||_        | j                  |||      }|j                  |j                  k(  sJ |j                  |      rK|j                         |j                         k(  rmJ  }  y )Nr{   d   r   s   
rp   )      %   rt   )
r9   r   r   rstriprU   rK   rf   rW   r   r~   )	rc   	data_baser8   ru   rv   r5   rU   rK   rj   s	            r   test_stress_block_sizesz$BaseTestJSON.test_stress_block_sizes*  s     /CH	8"}$	 0 0 9: 
	ID&3 	I"3E0". IJ.8L+ OOD|:G , IE <<8??::: <<1$0H4F4F4HHHHI	I
	IrI   N)__name__
__module____qualname__abcabstractmethodrf   rm   r   r   r   r   r   r   r   r   r   rZ   marknumpyr   r   r   r<   rI   r   r_   r_   s   s    " "8A,


"
(0#1"#6J [[9 9 [[+ + [[I IrI   r_   c                       e Zd Zd Zd Zd Zy)BaseTestJSONReadc                 N     | j                   t        j                  |      fi |S r
   )r   r&   	py_bufferrb   s      r   rf   zBaseTestJSONRead.read_bytes@       t~~bll1o888rI   c                 P   d}dgdgd}t        j                  |      }| j                  |      }|j                         |k(  sJ t        j                  |j                               }t        j                  t              5  | j                  |       d d d        y # 1 sw Y   y xY w)N   {"a": 1, "b": 2}
rz   r{   ry   rd   )	ioBytesIOr   r~   StringIOdecoderZ   r[   	TypeError)rc   r5   expected_databiorj   sios         r   test_file_objectz!BaseTestJSONRead.test_file_objectC  s    $ c,jjs# M111kk$++-(]]9% 	 NN3	  	  	 s   BB%c           
      *   d}t        t        |            }dd dgfdd g gfdd g dgggfdd i gfd	d d
d id
ddiigffD ]T  \  }}| j                  ||z   |      }d|i}|j                         |k(  sJ |j	                  d      j
                  dkD  rTJ  y )Ns"   {                               }
r   s   {"a": 0}r   r   s   {"a": []}
{"a": [[1]]}rz   s	   {"a": {}}s    {"a": {}}
{"a": {"b": {"c": 1}}}rd   rl   r   ry   )r   ri   rf   r~   column
num_chunks)rc   	first_rowru   	next_rowsexpected_pylistrj   r8   s          r   test_reconcile_across_blocksz-BaseTestJSONRead.test_reconcile_across_blocksN  s    :	"c)n=4)$D":&'$aSE):;D":&1S$K#Qx13+
 	4&I OOI	$91= $ ?E_-H??$000<<$//!333	4rI   N)r   r   r   rf   r   r   r<   rI   r   r   r   >  s    9	 4rI   r   c                   f    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zy)BaseTestStreamingJSONReadc                 v    |j                  dt                     }| j                  |_        t        |g|i |S )z
        Reads the JSON file into memory using pyarrow's open_json
        json The JSON bytes
        args Positional arguments to be forwarded to pyarrow's open_json
        kwargs Keyword arguments to be forwarded to pyarrow's open_json
        ru   )
setdefaultr   rL   r   )rc   r"   argsre   ru   s        r   r   z#BaseTestStreamingJSONRead.open_jsonc  s;     ((G#'#3#3 ////rI   c                 N     | j                   t        j                  |      fi |S r
   )r   r&   r   rb   s      r   
open_bytesz$BaseTestStreamingJSONRead.open_bytesn  r   rI   c                    |j                   |k(  sJ t        |      }t        |      t        |      k(  sJ t        ||      D ]=  \  }}|j	                  d       |j                   |k(  sJ |j                         |k(  r=J  y )NTfull)rW   r   ri   r   validater~   )rc   readerexpected_schemar   batchesbatchexpected_batchs          r   check_readerz&BaseTestStreamingJSONRead.check_readerq  s    }}///v,7|s=1111%(-%@ 	7!E>NNN%<<?222??$666	7rI   c                 D     | j                   |fi |j                         S r
   )r   read_allrb   s      r   rf   z$BaseTestStreamingJSONRead.read_bytesz  s!    tq+F+4466rI   c                    d}dgdgd}t        j                  |      }| j                  |      }t        j                  dt        j
                         fdt        j
                         fg      }| j                  |||g       y )Nr   rz   r{   r   ry   rd   )r   r   r   r&   rW   r(   r   )rc   r5   r   r   r   r   s         r   r   z*BaseTestStreamingJSONRead.test_file_object}  ss    $ c,jj$))c288:%6&)288:%6%8 9&/M?CrI   c                     d}t               }d|_        t        j                  t        j
                  d      5  | j                  ||       d d d        y # 1 sw Y   y xY w)Ns   {"i": 0            }
{"i": 1}r|   1straddling object straddles two block boundaries*rr   r   r   rK   rZ   r[   r&   r   r   )rc   bad_first_chunkru   s      r   test_bad_first_chunkz.BaseTestStreamingJSONRead.test_bad_first_chunk  sW    ;"}"#]]OOE
 	H OOO,OG		H 	H 	H   AAc                 "   d}t               }d|_        t        j                  dt        j                         fg      }| j                  ||      }|j                  |k(  sJ |j                         j                         ddgik(  sJ t        j                  t        j                  d      5  |j                          d d d        t        j                  t              5  |j                          d d d        y # 1 sw Y   <xY w# 1 sw Y   y xY w)Ns   {"i": 0}
{"i":     1}
{"i": 2}r   ir   r   r   rr   r   rK   r&   rW   r(   r   read_next_batchr~   rZ   r[   r   StopIterationrc   bad_middle_chunkru   r   r   s        r   test_bad_middle_chunkz/BaseTestStreamingJSONRead.test_bad_middle_chunk  s    >"}"$))c288:%6$78!1M}}///%%'113!8
 
 	
 
 ]]OOE
 	% ""$		% ]]=) 	%""$	% 	%	% 	%	% 	%   -C9D9DDc                     d}t               }d|_        t        j                  t        j
                  d      5  | j                  ||       d d d        y # 1 sw Y   y xY w)Ns   {"n": }
{"n": 10000}   !JSON parse error: Invalid value.*rr   r   r   rc   bad_first_blockru   s      r   test_bad_first_parsez.BaseTestStreamingJSONRead.test_bad_first_parse  sU    2"}"$]]2??!DF 	HOOO,OG	H 	H 	Hr   c                     d}t               }d|_        t        j                  t        j
                  d      5  | j                  ||       d d d        y # 1 sw Y   y xY w)Ns"   {            }{"n": }
{"n": 10000}r  r  rr   r   r   r  s      r   !test_bad_middle_parse_after_emptyz;BaseTestStreamingJSONRead.test_bad_middle_parse_after_empty  sU    @"}"$]]2??!DF 	HOOO,OG	H 	H 	Hr   c                 "   d}t               }d|_        t        j                  dt        j                         fg      }| j                  ||      }|j                  |k(  sJ |j                         j                         ddgik(  sJ t        j                  t        j                  d      5  |j                          d d d        t        j                  t              5  |j                          d d d        y # 1 sw Y   <xY w# 1 sw Y   y xY w)Ns%   {"n": 1000}
{"n": 200 00}
{"n": 3000}r   nr   r   z@JSON parse error: Missing a comma or '}' after an object member*rr   r   r   s        r   test_bad_middle_parsez/BaseTestStreamingJSONRead.test_bad_middle_parse  s    E"}"$))c288:%6$78!1M}}///%%'113$8
 
 	
 
 ]]OO1
 	%
 ""$	% ]]=) 	%""$	% 	%	% 	%	% 	%r  c                 2   d}t        d      }t        d      }t        j                  dt        j                         fg      }| j                  |||      }|j                  |k(  sJ |j                         j                         ddgik(  sJ t        j                  t        j                  d	
      5  |j                          d d d        t        j                  t              5  |j                          d d d        y # 1 sw Y   <xY w# 1 sw Y   y xY wNs   {"n": 0}{1}
{"n": 2}r   r   TrU   r  rt   r   JSON parse error *rr   r   r   r&   rW   r(   r   r   r~   rZ   r[   r   r   rc   r   ru   rv   r   r   s         r   %test_non_linewise_chunker_first_blockz?BaseTestStreamingJSONRead.test_non_linewise_chunker_first_block     3"b1$=))c288:%6$78%' ! ) }}///%%'113!8
 
 	
 
 ]]2??!57 	%""$	% ]]=) 	%""$	% 	%		% 	%	% 	%   5D'DD
Dc                 2   d}t        d      }t        d      }t        j                  dt        j                         fg      }| j                  |||      }|j                  |k(  sJ |j                         j                         ddgik(  sJ t        j                  t        j                  d	
      5  |j                          d d d        t        j                  t              5  |j                          d d d        y # 1 sw Y   <xY w# 1 sw Y   y xY wr  r  r  s         r   )test_non_linewise_chunker_bad_first_blockzCBaseTestStreamingJSONRead.test_non_linewise_chunker_bad_first_block  r  r  c                 ~   d}t        d      }t        d      }t        j                  dt        j                         fg      }| j                  |||      }|j                  |k(  sJ |j                         j                         ddgik(  sJ |j                         j                         dd	gik(  sJ t        j                  t        j                  d
      5  |j                          d d d        t        j                  t              5  |j                          d d d        y # 1 sw Y   <xY w# 1 sw Y   y xY w)Ns&   {"n": 0}
{"n":    1}
{}"n":2}
{"n": 3}r   r   Tr  r  rt   r   rz   r  rr   r  r  s         r   *test_non_linewise_chunker_bad_middle_blockzDBaseTestStreamingJSONRead.test_non_linewise_chunker_bad_middle_block  s6   G"b1$=))c288:%6$78%' ! ) }}///%%'113!8
 
 	
 
 %%'113!8
 
 	
 
 ]]2??!57 	%""$	% ]]=) 	%""$	% 	%		% 	%	% 	%s   D'D3'D03D<c                    d}t        j                  dt        j                         fdt        j                         fg      }t	        d      }t        |      }dgdgd	}| j                  |||
      }| j                  |||g       y )Ns       
{"b": true, "s": "foo"}rd   s   r   r   TrP   )rd   r  rt   )r&   rW   r   utf8r   r   r   r   )rc   leading_empty_chunkrT   ru   rv   r   r   s          r    test_ignore_leading_empty_blocksz:BaseTestStreamingJSONRead.test_ignore_leading_empty_blocks  s    >))"((*"'')%
  #b1$_Eug
 %' ! ) 	&/M?CrI   c                 ~   d}t        j                  dt        j                         fdt        j                         fg      }dgdgd}t	        d      }t        d	
      }| j                  |||      }|j                  |k(  sJ |j                         j                         |k(  sJ t        j                  t         j                  d      5  |j                          d d d        t        j                  dt        j                         fdt        j                         fdt        j                         fg      }ddgdd gd dgd}t	        d      }| j                  |||      }|j                  |k(  sJ |j                         j                         |k(  sJ t        j                  t         j                  d      5  |j                          d d d        t        j                  dt        j                         fdt        j                         fdt        j                         fdt        j                         fg      }g dg dg dg dd}t	        d      }| j                  |||      }|j                  |k(  sJ |j                         j                         |k(  sJ y # 1 sw Y   xY w# 1 sw Y   xY w)NsI   {"a": 0, "b": "foo"    }
        {"a": 1, "c": true  }
{"a": 2, "d": 4.0}ry   rd   r   rP   r       r   rQ   )rV   rt   r   rr   rl   rz   Tr   @   r   )r   rz   r{   )rP   NN)NTN)NNr   r   `   )r&   rW   r(   r  r   r   r   r   r~   rZ   r[   r   r   r   )rc   r   r   r   ru   rv   r   s          r   test_inferencez(BaseTestStreamingJSONRead.test_inference  s   3))"((*"'')%
   !c0"b1$wG%' ! ) }}///%%'113}DDD]]2??!EG 	%""$	% ))"((*"'')"((*%
 
  !!fE4=d|L"b1L/< ! >}}///%%'113}DDD]]2??!EG 	%""$	% ))"((*"'')"((*"**,	%
  (.A07HJ"b1L/< ! >}}///%%'113}DDD?	% 	%	% 	%s   J& J3&J03J<N)r   r   r   r   r   r   rf   r   r   r   r  r	  r  r  r  r  r  r$  r<   rI   r   r   r   b  sS    	0977DH%(HH%*%*%*%2D$0ErI   r   c                       e Zd Zd Zy)TestSerialJSONReadc                     |j                  dt                     }d|_        t        |i |}|j	                  d       |S )Nru   FTr   r   r   rL   r   r   rc   r   re   ru   rj   s        r   r   zTestSerialJSONRead.read_jsonS  s@    ((G#( 4*6*D!rI   Nr   r   r   r   r<   rI   r   r&  r&  Q      rI   r&  c                       e Zd Zd Zy)TestParallelJSONReadc                     |j                  dt                     }d|_        t        |i |}|j	                  d       |S )Nru   Tr   r(  r)  s        r   r   zTestParallelJSONRead.read_json]  s@    ((G#' 4*6*D!rI   Nr*  r<   rI   r   r-  r-  [  r+  rI   r-  c                       e Zd ZdZy)TestSerialStreamingJSONReadFNr   r   r   rL   r<   rI   r   r0  r0  e  s    KrI   r0  c                       e Zd ZdZy)TestThreadedStreamingJSONReadTNr1  r<   rI   r   r3  r3  j  s	     KrI   r3  )r{   r   z
)%r   collectionsr   decimalr   r   r   r"   r   unittestr   r   ImportErrorrZ   pyarrowr&   pyarrow.jsonr   r   r   r   r   r9   rH   rN   r]   ABCr_   r   r   TestCaser&  r-  r0  r   	threadingr3  r<   rI   r   <module>r=     s  $  #  	       H H!
04*E6HI377 HIV!4| !4HlE lE^)8+<+< +X->-> ";X=N=N 
 $=x?P?P  ]  	Bs   C+ +C54C5