
    z-Ph4                        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m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"        j#                  Z$ej        ddd            Z%d Z&d Z'd Z(d Z)d Z*d  Z+dS )"z
Utility functions for testing
    N)tagsc                  *    t          j        d          S )zLRandomly choose either 1 or -1.

    Returns
    -------
    sign : int
    )   randomchoice     R/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pyarrow/tests/util.pyrandsignr   +   s     =!!!r   c              #      K   t          j                    }t          j        |            	 dV  t          j        |           dS # t          j        |           w xY 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   5   s_       _&&N
K('''''''''s   A Ac           	         d| cxk    rdk    sn 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                    |t          |                              |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%   K   s    " 	R!Oqyy
 
 	
 Y./!3ONO+_==E &u%%%;?#788J?uc*oo33E3??@@  r   c                 N    t          d t          |           D                       S )Nc                 8    g | ]}t          j        d d          S )A   z   )r   r   ).0is     r   
<listcomp>z random_ascii.<locals>.<listcomp>q   s$    AAAa&.S))AAAr   )bytesrange)lengths    r   random_asciir0   p   s%    AA5==AAABBBr   c                     t          t          j        t          j        z             d                    fdt          |           D                       S )z%
    Generate one random string.
     c              3   @   K   | ]}t          j                  V  d S Nr   )r*   r+   RANDS_CHARSs     r   	<genexpr>zrands.<locals>.<genexpr>y   s-      EE!6=--EEEEEEr   )liststringascii_lettersdigitsjoinr.   )ncharsr5   s    @r   randsr=   t   sI     v+fm;<<K77EEEEuV}}EEEEEEr   rss   r   r   c                    	
 ddl }|                                

fd             	fd}t          |          D ]	 |              	|z  dk    r
 |              dS )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                  n    t          j                     t                                                     S r4   )gccollectgetattrmemory_info)metricprocs   r   _get_usez#memory_leak_check.<locals>._get_use   s*    

t''))6222r   c                  z                 } | z
  k    r&t          d                    | z
                      d S )NzDMemory leak detected. Departure from baseline {} after {} iterations)	Exceptionr   )current_userH   baseline_user+   	thresholds    r   _leak_checkz&memory_leak_check.<locals>._leak_check   sU    hjj%	11 M#VK,$>BBD D D 21r   )psutilProcessr.   )frF   rM   
iterationscheck_intervalrO   rN   rH   rL   r+   rG   s    ``    @@@@r   memory_leak_checkrT   |   s    * MMM>>D3 3 3 3 3 3 8::LD D D D D D D D :  	~""KMMM r   c                     t           j                                        } |                     dd          }t           j                            t           j                            t           j                            t          j                                      }|r"t           j	        
                    ||f          }n|}|| d<   | S )N
PYTHONPATHr2   )osenvironcopygetpathabspathdirnamepa__file__pathsepr;   )envexisting_pythonpathmodule_pathnew_pythonpaths       r    get_modified_env_with_pythonpathre      s    
*//

C'',33'//
44557 7K  %+7J)KLL$&CJr   c                 V   t                      }t          j                            t          j                            t
                              }t          j                            ||           }t          j        |g}|	                    |           t          j        ||           d S )N)ra   )re   rW   r[   r]   realpathr_   r;   sys
executableextend
subprocess
check_call)script_nameargssubprocess_envdir_pathpython_filecmds         r   invoke_scriptrs      s    577Nwrw//99::H',,x55K>;
'CJJt#>222222r   c              #      K   t           j                            |           }|t           j        | <   	 dV  |t           j        | = dS |t           j        | <   dS # |t           j        | = n|t           j        | <   w xY w)zA
    Temporarily set environment variable *name* to *value*.
    N)rW   rX   rZ   )namevalue
orig_values      r   changed_environrx      s      
 %%JBJt*
4   )BJt 
4  )BJt))))s   A !A9c              #      K   t          j                    }t          j        t          |                      	 d V  t          j        |           d S # t          j        |           w xY wr4   )rW   getcwdchdirr   )r[   curdirs     r   
change_cwdr}      sa      Y[[FHSYY
s   A A(c               #      K   t          j                     	 d V  t          j                     d S # t          j                     w xY wr4   )rB   disableenabler
   r   r   disabled_gcr      s>      JLLL
		s	   0 Ac                 |    t           j        dk    rd                    |           }nd                    |           }|S )Nntz
file:///{}z	file://{})rW   ru   r   )r[   uris     r   _filesystem_urir      s:    	w$!!$''  &&Jr   c                       e Zd Zd Zd ZdS )FSProtocolClassc                     || _         d S r4   )_pathselfr[   s     r   __init__zFSProtocolClass.__init__   s    


r   c                 *    t          | j                  S r4   )r   r   r   s    r   
__fspath__zFSProtocolClass.__fspath__   s    4:r   N)__name__
__module____qualname__r   r   r
   r   r   r   r      s2              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dS )ProxyHandlerz
    A dataset handler that proxies to an underlying filesystem.  Useful
    to partially wrap an existing filesystem with partial changes.
    c                     || _         d S r4   )_fs)r   fss     r   r   zProxyHandler.__init__   s    r   c                 Z    t          |t                    r| j        |j        k    S t          S r4   
isinstancer   r   NotImplementedr   others     r   __eq__zProxyHandler.__eq__   )    e\** 	)8uy((r   c                 Z    t          |t                    r| j        |j        k    S t          S r4   r   r   s     r   __ne__zProxyHandler.__ne__  r   r   c                      d| j         j        z   S )Nzproxy::)r   	type_namer   s    r   get_type_namezProxyHandler.get_type_name
  s    48---r   c                 6    | j                             |          S r4   )r   normalize_pathr   s     r   r   zProxyHandler.normalize_path  s    x&&t,,,r   c                 6    | j                             |          S r4   r   get_file_info)r   pathss     r   r   zProxyHandler.get_file_info  s    x%%e,,,r   c                 6    | j                             |          S r4   r   )r   selectors     r   get_file_info_selectorz#ProxyHandler.get_file_info_selector  s    x%%h///r   c                 :    | j                             ||          S )N)	recursive)r   
create_dir)r   r[   r   s      r   r   zProxyHandler.create_dir  s    x""49"===r   c                 6    | j                             |          S r4   )r   
delete_dirr   s     r   r   zProxyHandler.delete_dir  s    x""4(((r   c                 :    | j                             ||          S )N)missing_dir_okr   delete_dir_contents)r   r[   r   s      r   r   z ProxyHandler.delete_dir_contents  s)    x++D;I , K K 	Kr   c                 :    | j                             dd          S )Nr2   T)accept_root_dirr   r   s    r   delete_root_dir_contentsz%ProxyHandler.delete_root_dir_contents   s    x++B+EEEr   c                 6    | j                             |          S r4   )r   delete_filer   s     r   r   zProxyHandler.delete_file#  s    x##D)))r   c                 8    | j                             ||          S r4   )r   mover   srcdests      r   r   zProxyHandler.move&  s    x}}S$'''r   c                 8    | j                             ||          S r4   )r   	copy_filer   s      r   r   zProxyHandler.copy_file)  s    x!!#t,,,r   c                 6    | j                             |          S r4   )r   open_input_streamr   s     r   r   zProxyHandler.open_input_stream,  s    x))$///r   c                 6    | j                             |          S r4   )r   open_input_filer   s     r   r   zProxyHandler.open_input_file/  s    x''---r   c                 :    | j                             ||          S N)metadata)r   open_output_streamr   r[   r   s      r   r   zProxyHandler.open_output_stream2      x**4(*CCCr   c                 :    | j                             ||          S r   )r   open_append_streamr   s      r   r   zProxyHandler.open_append_stream5  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      s:        
    
  
. . .- - -- - -0 0 0> > >) ) )K K KF F F* * *( ( (- - -0 0 0. . .D D DD D D D Dr   r   Fwarn_on_full_bufferc              #     K   t          j                    \  }}d }	 |                    d           |                    d           t          j        |                                |           }|V  |t          j        |           |                                 |                                 d S # |t          j        |           |                                 |                                 w xY w)NFr   )socket
socketpairsetblockingsignalset_wakeup_fdfilenoclose)r   rwold_fds       r   signal_wakeup_fdr   9  s       DAqF
	e	e%HHJJ,?A A A (((										  (((									s   AB2 2A C2c                    | dg}t          j        |t           j        t           j        d          5 }|                    d          dk    r	 d d d            dS |j                                        }| dz   }t          j        ||          }|r4|                    d          }t          |          |k    cd d d            S t          d	          # 1 swxY w Y   d S )
Nz	--versionutf-8stdoutstderrencodingr   r   Fz version RELEASE\.(\d+)-.*r   z+minio component older than the minimum year)rk   PopenPIPEwaitr   readresearchgroupintFileNotFoundError)	componentminimum_year	full_argsrG   r   patternversion_matchversion_years           r   _ensure_minio_component_versionr   L  sI   K(I		)JO!+7
D 
D 
D ?GK99R==A? ? ? ? ? ? ? ? !!##;;	'622 	?(..q11L|$$4? ? ? ? ? ? ? ? $=? ? ?? ? ? ? ? ? ? ? ? ?s   CACCCCc           	      ,   t          j                     }t          j                     |z
  dk     rY	 t          | dddd| ||           d S # t          $ r t          j        d           Y nw xY wt          j                     |z
  dk     Yt	          d          )Nr   aliassetmyminiozhttp://r   z+mc command could not connect to local minio)time_run_mc_commandChildProcessErrorsleeprJ   )mcdiraddress
access_key
secret_keystarts        r   _wait_for_minio_startupr  ]  s    IKKE
)++

"
"	E7E9/g//ZI I IF  	 	 	JqMMMMM	 )++

"
" A
B
BBs   A	 	A*)A*c                 &   dd| gt          |          z   }t          j        |t          j        t          j        d          5 }|                    d          }d                    |          }t          d|            t          d|            t          d	|j                                                    t          d
|j	                                                    |dk    rt          d          	 d d d            d S # 1 swxY w Y   d S )Nmcz-Cr   r   r    zCmd: z
  Return: z
  Stdout: z
  Stderr: r   zCould not run mc)r7   rk   r   r   r   r;   printr   r   r   r   )r   rn   r   rG   retvalcmd_strs         r   r   r   i  sX   tU#d4jj0I		)JO!+7
D 
D 
D 	8GK2((9%%g   #6##$$$/4;++--//000/4;++--//000Q;;#$6777 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s   B6DD
D
c           
         t           j        dk    rt          j        d           	 t	          dd           t	          dd           | d         }| d         \  }}}}d                    ||          }	t          j                            |d          }
t          j        	                    |
          rt          j        |
           t          j        |
           t          j                            |d	          }t          |d
          5 }|                    |           ddd           n# 1 swxY w Y   t          |
|	||           t!          |
dddd||           t!          |
ddddd|           t!          |
dddddd|           t!          |
ddd           dS # t"          $ r t          j        d           Y dS 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)rh   platformpytestskipr   r   rW   r[   r;   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%  w  s2    |w 	@AAA:'d333'666I&-6|-D*dJ
..t,,Wd++7>>%   	!M%   
gll7,IJJ+C((( 	&Kf%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	 w
JGGGw"Hh	8 	8 	8w("$7	F 	F 	Fw("$78	M 	M 	M 	t%>+	- 	- 	- 	- 	-  : : :8999999:s7   C#F 	D+F +D//F 2D/3A'F F>=F>c                     d} dt           j        v r/t           j                            t           j        d                   } | s>t           j                            d          }t           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)rW   rX   r[   r  
expandvars)tzdata_booltzdata_paths     r   windows_has_tzdatar+    sh    
 K
**gnnRZ0E%FGG 2g(()JKKgnn[11r   c                  b    t          j                    D ]} |                     d          r dS dS )z=
    Checks whether it's running on musl systems or not.
    	musllinuxTF)r   platform_tags
startswith)platform_tags    r   running_on_musllinuxr1    sC     *,,  "";// 	44	5r   )r>   r?   r   r   ),r   
contextlibr   rB   rW   r   r   r  r   r   r8   rk   rh   r   	packagingr   r  pyarrowr^   
pyarrow.fsr   contextmanagerr   r%   r0   r=   rT   re   rs   rx   r}   r   r   r   r   FileSystemHandlerr   r   r   r  r   r%  r+  r1  r
   r   r   <module>r8     s  $       				 				  				         



                " " " ( ( (*" " "JC C CF F F FH%&( ( ( (V   	3 	3 	3 * * *               ?D ?D ?D ?D ?D7:/ ?D ?D ?DD ,1     $? ? ?"	C 	C 	C8 8 80: 0: 0:f      r   