
    g3                        d 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	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 Zej&                  d        Zd Zd Zd Z	 	 ddZd	 Zd
 Zej&                  d        Zej&                  d        Zej&                  d        Zd Z G d d      Z G d dej@                  jB                        Z"ej&                  ddd       Z#d Z$d Z%d Z&d Z'd Z(y)z
Utility functions for testing
    Nc                  ,    t        j                  d      S )zLRandomly choose either 1 or -1.

    Returns
    -------
    sign : int
    )   randomchoice     G/var/www/openai/venv/lib/python3.12/site-packages/pyarrow/tests/util.pyrandsignr   *   s     ==!!r
   c              #      K   t        j                         }t        j                  |        	 d t        j                  |       y# t        j                  |       w xY ww)a  Set the random seed inside of a context manager.

    Parameters
    ----------
    seed : int
        The seed to set

    Notes
    -----
    This function is useful when you want to set a random seed but not affect
    the random state of other functions using the random module.
    N)r   getstateseedsetstate)r   original_states     r   random_seedr   4   s@      __&N
KK(''s   *A!A A!AA!c           	         d| cxk  rdk  sJ d        J d       |dk  rt        d      d| |z
  z  dz
  }t        j                  | |      }|st        j                  |      S d|z  dz
  }t        j                  d|      }t        j                  dj                  |t        |      j                  |d                  S )	a  Generate a random decimal value with specified precision and scale.

    Parameters
    ----------
    precision : int
        The maximum number of digits to generate. Must be an integer between 1
        and 38 inclusive.
    scale : int
        The maximum number of digits following the decimal point.  Must be an
        integer greater than or equal to 0.

    Returns
    -------
    decimal_value : decimal.Decimal
        A random decimal.Decimal object with the specified precision and scale.
    r   &   z,precision must be between 1 and 38 inclusiver   zHranddecimal does not yet support generating decimals with negative scale
   z{}.{}0)
ValueErrorr   randintdecimalDecimalformatstrrjust)	precisionscalemax_whole_valuewholemax_fractional_value
fractionals         r   randdecimalr$   J   s    " 	RO!OOO!OOqy
 	
 Y./!3ONNO+_=Eu%%;?#78J??uc*o33E3?@ r
   c           	      x    t        t        |       D cg c]  }t        j                  dd       c}      S c c}w )NA   z   )bytesranger   r   )lengthis     r   random_asciir,   o   s.    5=A=a&..S)=ABBAs   7c                     t        t        j                  t        j                  z         dj	                  fdt        |       D              S )z%
    Generate one random string.
     c              3   H   K   | ]  }t        j                          y wNr   ).0r+   RANDS_CHARSs     r   	<genexpr>zrands.<locals>.<genexpr>x   s     E}!6==-}s   ")liststringascii_lettersdigitsjoinr)   )ncharsr2   s    @r   randsr:   s   s7     v++fmm;<K77EuV}EEEr
   c                    	
 ddl }|j                         

fd        	fd}t        |      D ]  	 |         	|z  dk(  s |         y)a  
    Execute the function and try to detect a clear memory leak either internal
    to Arrow or caused by a reference counting problem in the Python binding
    implementation. Raises exception if a leak detected

    Parameters
    ----------
    f : callable
        Function to invoke on each iteration
    metric : {'rss', 'vms', 'shared'}, default 'rss'
        Attribute of psutil.Process.memory_info to use for determining current
        memory use
    threshold : int, default 128K
        Threshold in number of bytes to consider a leak
    iterations : int, default 10
        Total number of invocations of f
    check_interval : int, default 1
        Number of invocations of f in between each memory use check
    r   Nc                  `    t        j                          t        j                                S r0   )gccollectgetattrmemory_info)metricprocs   r   _get_usez#memory_leak_check.<locals>._get_use   s"    


t'')622r
   c                  `            } | z
  kD  rt        dj                  | z
              y )NzDMemory leak detected. Departure from baseline {} after {} iterations)	Exceptionr   )current_userC   baseline_user+   	thresholds    r   _leak_checkz&memory_leak_check.<locals>._leak_check   sB    j%	1 M#VK,$>BD D 2r
   )psutilProcessr)   )frA   rH   
iterationscheck_intervalrJ   rI   rC   rG   r+   rB   s    ``    @@@@r   memory_leak_checkrO   {   sP    * >>D3 :LD :	~"M r
   c                     t         j                  j                         } | j                  dd      }t         j                  j                  t         j                  j                  t         j                  j                  t        j                                    }|r"t         j                  j                  ||f      }n|}|| d<   | S )N
PYTHONPATHr.   )osenvironcopygetpathabspathdirnamepa__file__pathsepr8   )envexisting_pythonpathmodule_pathnew_pythonpaths       r    get_modified_env_with_pythonpathr`      s    
**//
C'',3''//
457K +7J)KL$&CJr
   c                 L   t               }t        j                  j                  t        j                  j	                  t
                    }t        j                  j                  ||       }t        j                  |g}|j                  |       t        j                  ||       y )N)r\   )r`   rR   rV   rX   realpathrZ   r8   sys
executableextend
subprocess
check_call)script_nameargssubprocess_envdir_pathpython_filecmds         r   invoke_scriptrn      si    57Nwwrww//9:H'',,x5K>>;
'CJJt#>2r
   c              #      K   t         j                  j                  |       }|t         j                  | <   	 d |t         j                  | = y|t         j                  | <   y# |t         j                  | = w |t         j                  | <   w xY ww)zA
    Temporarily set environment variable *name* to *value*.
    N)rR   rS   rU   )namevalue
orig_values      r   changed_environrs      ss     
 %JBJJt*

4 )BJJt 

4 )BJJts   3BA" (B")BBc              #      K   t        j                         }t        j                  t        |              	 d  t        j                  |       y # t        j                  |       w xY wwr0   )rR   getcwdchdirr   )rV   curdirs     r   
change_cwdrx      sA     YY[FHHSY
s   3A*A A*A''A*c               #      K   t        j                          	 d  t        j                          y # t        j                          w xY wwr0   )r=   disableenabler	   r
   r   disabled_gcr|      s)     JJL
				s   A
1 A
AA
c                 t    t         j                  dk(  rdj                  |       }|S dj                  |       }|S )Nntz
file:///{}z	file://{})rR   rp   r   )rV   uris     r   _filesystem_urir      s;    	ww$!!$' J   &Jr
   c                       e Zd Zd Zd Zy)FSProtocolClassc                     || _         y r0   )_pathselfrV   s     r   __init__zFSProtocolClass.__init__   s	    
r
   c                 ,    t        | j                        S r0   )r   r   r   s    r   
__fspath__zFSProtocolClass.__fspath__   s    4::r
   N)__name__
__module____qualname__r   r   r	   r
   r   r   r      s    r
   r   c                   |    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d Zd Zd Zd Zy)ProxyHandlerz
    A dataset handler that proxies to an underlying filesystem.  Useful
    to partially wrap an existing filesystem with partial changes.
    c                     || _         y r0   )_fs)r   fss     r   r   zProxyHandler.__init__   s	    r
   c                 `    t        |t              r| j                  |j                  k(  S t        S r0   
isinstancer   r   NotImplementedr   others     r   __eq__zProxyHandler.__eq__   %    e\*88uyy((r
   c                 `    t        |t              r| j                  |j                  k7  S t        S r0   r   r   s     r   __ne__zProxyHandler.__ne__  r   r
   c                 4    d| j                   j                  z   S )Nzproxy::)r   	type_namer   s    r   get_type_namezProxyHandler.get_type_name	  s    488----r
   c                 8    | j                   j                  |      S r0   )r   normalize_pathr   s     r   r   zProxyHandler.normalize_path  s    xx&&t,,r
   c                 8    | j                   j                  |      S r0   r   get_file_info)r   pathss     r   r   zProxyHandler.get_file_info  s    xx%%e,,r
   c                 8    | j                   j                  |      S r0   r   )r   selectors     r   get_file_info_selectorz#ProxyHandler.get_file_info_selector  s    xx%%h//r
   c                 <    | j                   j                  ||      S )N)	recursive)r   
create_dir)r   rV   r   s      r   r   zProxyHandler.create_dir  s    xx""49"==r
   c                 8    | j                   j                  |      S r0   )r   
delete_dirr   s     r   r   zProxyHandler.delete_dir  s    xx""4((r
   c                 <    | j                   j                  ||      S )N)missing_dir_okr   delete_dir_contents)r   rV   r   s      r   r   z ProxyHandler.delete_dir_contents  s%    xx++D;I , K 	Kr
   c                 <    | j                   j                  dd      S )Nr.   T)accept_root_dirr   r   s    r   delete_root_dir_contentsz%ProxyHandler.delete_root_dir_contents  s    xx++B+EEr
   c                 8    | j                   j                  |      S r0   )r   delete_filer   s     r   r   zProxyHandler.delete_file"  s    xx##D))r
   c                 :    | j                   j                  ||      S r0   )r   mover   srcdests      r   r   zProxyHandler.move%  s    xx}}S$''r
   c                 :    | j                   j                  ||      S r0   )r   	copy_filer   s      r   r   zProxyHandler.copy_file(  s    xx!!#t,,r
   c                 8    | j                   j                  |      S r0   )r   open_input_streamr   s     r   r   zProxyHandler.open_input_stream+  s    xx))$//r
   c                 8    | j                   j                  |      S r0   )r   open_input_filer   s     r   r   zProxyHandler.open_input_file.  s    xx''--r
   c                 <    | j                   j                  ||      S N)metadata)r   open_output_streamr   rV   r   s      r   r   zProxyHandler.open_output_stream1      xx**4(*CCr
   c                 <    | j                   j                  ||      S r   )r   open_append_streamr   s      r   r   zProxyHandler.open_append_stream4  r   r
   N)r   r   r   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r
   r   r   r      se    


.--0>)KF*(-0.DDr
   r   Fwarn_on_full_bufferc              #     K   t        j                         \  }}d }	 |j                  d       |j                  d       t        j                  |j                         |       }| |t        j                  |       |j                          |j                          y # |t        j                  |       |j                          |j                          w xY ww)NFr   )socket
socketpairsetblockingsignalset_wakeup_fdfilenoclose)r   rwold_fds       r   signal_wakeup_fdr   8  s      DAqF
	e	e%%HHJ,?A  (				   (				s   CAB  (8C 9CCc                    | dg}t        j                  |t         j                  t         j                  d      5 }|j                  d      dk7  r
	 d d d        y|j                  j                         }| dz   }t        j                  ||      }|r(|j                  d      }t        |      |k\  cd d d        S t        d	      # 1 sw Y   y xY w)
Nz	--versionutf-8stdoutstderrencodingr   r   Fz version RELEASE\.(\d+)-.*r   z+minio component older than the minimum year)rf   PopenPIPEwaitr   readresearchgroupintFileNotFoundError)	componentminimum_year	full_argsrB   r   patternversion_matchversion_years           r   _ensure_minio_component_versionr   K  s    K(I			)JOO!+7
DGK99R=A
D 
D !!#;;		'62(..q1L|$4
D 
D $=? ?
D 
Ds   CAC8CCc           	          t        j                          }t        j                          |z
  dk  r	 t        | dddd| ||       y t	        d      # t        $ r t        j                  d       Y nw xY wt        j                          |z
  dk  r`K)Nr   aliassetmyminiozhttp://r   z+mc command could not connect to local minio)time_run_mc_commandChildProcessErrorsleeprE   )mcdiraddress
access_key
secret_keystarts        r   _wait_for_minio_startupr   \  s    IIKE
))+

"	E7E9%gY/ZI A
BB ! 	JJqM	 ))+

"s   A A10A1c                    dd| gt        |      z   }t        j                  |t        j                  t        j                  d      5 }|j	                  d      }dj                  |      }t        d|        t        d|        t        d	|j                  j                                 t        d
|j                  j                                 |dk7  rt        d      	 d d d        y # 1 sw Y   y xY w)Nmcz-Cr   r   r    zCmd: z
  Return: z
  Stdout: z
  Stderr: r   zCould not run mc)r4   rf   r   r   r   r8   printr   r   r   r   )r   ri   r   rB   retvalcmd_strs         r   r   r   h  s    tU#d4j0I			)JOO!+7
DGK2((9%gY 
6(#$
4;;++-./0
4;;++-./0Q;#$677 
D 
D 
Ds   BC,,C5c           
      (   t         j                  dk(  rt        j                  d       	 t	        dd       t	        dd       | d   }| d   \  }}}}dj                  ||      }	t        j                  j                  |d      }
t        j                  j                  |
      rt        j                  |
       t        j                  |
       t        j                  j                  |d	      }t        |d
      5 }|j                  |       ddd       t        |
|	||       t!        |
dddd||       t!        |
ddddd|       t!        |
dddddd|       t!        |
ddd       y# 1 sw Y   ZxY w# t"        $ r t        j                  d       Y yw xY w)ab  
    Attempts to use the mc command to configure the minio server
    with a special user limited:limited123 which does not have
    permission to create buckets.  This mirrors some real life S3
    configurations where users are given strict permissions.

    Arrow S3 operations should still work in such a configuration
    (e.g. see ARROW-13685)
    win32z*The mc command is not installed on Windowsr   i  miniotempdir
connectionz{}:{}zlimited-buckets-policy.jsonr   )modeNadminuseraddzmyminio/policycreatezno-create-bucketsattachz--usermbzmyminio/existing-bucketz--ignore-existingz"Configuring limited s3 user failed)rc   platformpytestskipr   r   rR   rV   r8   existsshutilrmtreemkdiropenwriter   r   r   )	s3_serverr  usernamepasswordr  hostportr   r   r   r   policy_pathpolicy_files                r   _configure_s3_limited_userr   v  si    ||w 	@A:'d3'6I&-6|-D*dJ
..t,Wd+77>>% MM% 
ggll7,IJ+C(Kf% ) 	 w
JGw"Hh	8w("$7	Fw("$78	M 	t%>+	- )(   :89:s+   CE0 9E$AE0 $E-)E0 0FFc                     d} dt         j                  v r0t         j                  j                  t         j                  d         } | s>t         j                  j	                  d      }t         j                  j                  |      } | S )zs
    This is the default location where tz.cpp will look for (until we make
    this configurable at run-time)
    FPYARROW_TZDATA_PATHz%USERPROFILE%\Downloads\tzdata)rR   rS   rV   r  
expandvars)tzdata_booltzdata_paths     r   windows_has_tzdatar&    sa    
 K

*ggnnRZZ0E%FGgg(()JKggnn[1r
   )rssi   r   r   ))r   
contextlibr   r=   rR   r   r   r  r   r   r5   rf   rc   r   r  pyarrowrY   
pyarrow.fsr   contextmanagerr   r$   r,   r:   rO   r`   rn   rs   rx   r|   r   r   r   FileSystemHandlerr   r   r   r   r   r   r&  r	   r
   r   <module>r-     s5  $   	 	  	      
    " ( (*"JCF FH%&(V 	3 * *     ?D7::// ?DD ,1  $?"	C80:fr
   