
    eia5                        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jD                  jF                        Z$ej*                  ddd       Z%d Z&d Z'd Z(d Z)d Z*d Z+y)z
Utility functions for testing
    N)tagsc                  ,    t        j                  d      S )zLRandomly choose either 1 or -1.

    Returns
    -------
    sign : int
    )   randomchoice     T/var/www/html/glpi_dashboard/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   5   s@      __&N
KK(''s   *A!A A!AA!c                 j   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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
   .0)
ValueErrorr   randintdecimalDecimalstrrjust)	precisionscalemax_whole_valuewholemax_fractional_value
fractionals         r   randdecimalr%   K   s    " 	RO!OOO!OOqy
 	
 Y./!3ONNO+_=Eu%%;?#78J??'3z?((456 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-   p   s*    5=Aa&..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>y   s     E!6==-Es   ")liststringascii_lettersdigitsjoinr*   )ncharsr3   s    @r   randsr;   t   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 r1   )gccollectgetattrmemory_info)metricprocs   r   _get_usez#memory_leak_check.<locals>._get_use   s"    


t'')622r   c                  N            } | z
  kD  rt        d| z
   d d      y )Nz.Memory leak detected. Departure from baseline z after z iterations)	Exception)current_userD   baseline_user,   	thresholds    r   _leak_checkz&memory_leak_check.<locals>._leak_check   sE    j%	1@-.gaSE  2r   )psutilProcessr*   )frB   rI   
iterationscheck_intervalrK   rJ   rD   rH   r,   rC   s    ``    @@@@r   memory_leak_checkrP   |   sT    * >>D3 :L : 	~"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__pathsepr9   )envexisting_pythonpathmodule_pathnew_pythonpaths       r    get_modified_env_with_pythonpathra      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]   )ra   rS   rW   rY   realpathr[   r9   sys
executableextend
subprocess
check_call)script_nameargssubprocess_envdir_pathpython_filecmds         r   invoke_scriptro      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)rS   rT   rV   )namevalue
orig_values      r   changed_environrt      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r1   )rS   getcwdchdirr   )rW   curdirs     r   
change_cwdry      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r1   )r>   disableenabler
   r   r   disabled_gcr}      s)     JJL
				s   A
1 A
AA
c                 D    t         j                  dk(  rd|  }|S d|  }|S )Nntzfile:///zfile://)rS   rq   )rW   uris     r   _filesystem_urir      s3    	ww$ J vJr   c                       e Zd Zd Zd Zy)FSProtocolClassc                     || _         y r1   )_pathselfrW   s     r   __init__zFSProtocolClass.__init__   s	    
r   c                 ,    t        | j                        S r1   )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 r1   )_fs)r   fss     r   r   zProxyHandler.__init__   s	    r   c                 `    t        |t              r| j                  |j                  k(  S t        S r1   
isinstancer   r   NotImplementedr   others     r   __eq__zProxyHandler.__eq__  %    e\*88uyy((r   c                 `    t        |t              r| j                  |j                  k7  S t        S r1   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 r1   )r   normalize_pathr   s     r   r   zProxyHandler.normalize_path  s    xx&&t,,r   c                 8    | j                   j                  |      S r1   r   get_file_info)r   pathss     r   r   zProxyHandler.get_file_info  s    xx%%e,,r   c                 8    | j                   j                  |      S r1   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   rW   r   s      r   r   zProxyHandler.create_dir  s    xx""49"==r   c                 8    | j                   j                  |      S r1   )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   rW   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 r1   )r   delete_filer   s     r   r   zProxyHandler.delete_file$  s    xx##D))r   c                 :    | j                   j                  ||      S r1   )r   mover   srcdests      r   r   zProxyHandler.move'  s    xx}}S$''r   c                 :    | j                   j                  ||      S r1   )r   	copy_filer   s      r   r   zProxyHandler.copy_file*  s    xx!!#t,,r   c                 8    | j                   j                  |      S r1   )r   open_input_streamr   s     r   r   zProxyHandler.open_input_stream-  s    xx))$//r   c                 8    | j                   j                  |      S r1   )r   open_input_filer   s     r   r   zProxyHandler.open_input_file0  s    xx''--r   c                 <    | j                   j                  ||      S N)metadata)r   open_output_streamr   rW   r   s      r   r   zProxyHandler.open_output_stream3      xx**4(*CCr   c                 <    | j                   j                  ||      S r   )r   open_append_streamr   s      r   r   zProxyHandler.open_append_stream6  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   :  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)rg   PopenPIPEwaitr   readresearchgroupintFileNotFoundError)	componentminimum_year	full_argsrC   r   patternversion_matchversion_years           r   _ensure_minio_component_versionr   M  s    K(I			)JOO!+7
D ?GK99R=A? ? !!#;;		'62(..q1L|$4? ? $=? ?? ?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sleeprF   )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)r5   rg   r   r   r   r9   printr   r   r   r   )r   rj   r   rC   retvalcmd_strs         r   r   r   j  s    tU#d4j0I			)JOO!+7
D 	8GK2((9%gY 
6(#$
4;;++-./0
4;;++-./0Q;#$677 	8 	8 	8s   BC,,C5c           
      .   t         j                  dk(  rt        j                  d       	 t	        dd       t	        dd       | d   }| d   \  }}}}| d| }	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       t        |
ddd       y# 1 sw Y   hx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
connection:zlimited-buckets-policy.jsonr   )modeNadminuseraddzmyminio/policycreatezno-create-bucketsattachz--usermbzmyminio/existing-bucketz--ignore-existingzmyminio/no-delete-bucketz"Configuring limited s3 user failed)rd   platformpytestskipr   rS   rW   r9   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"  x  s    ||w 	@A":'d3'6I&-6|-D*dJ
F!D6"Wd+77>>% MM% 
ggll7,IJ+C( 	&Kf%	& 	 w
JGw"Hh	8w("$7	Fw("$78	M 	t%>+	- 	t%?+	-!	& 	&&  :89:s+   CE3 .E' A&E3 'E0,E3 3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)rS   rT   rW   r  
expandvars)tzdata_booltzdata_paths     r   windows_has_tzdatar(    sa    
 K

*ggnnRZZ0E%FGgg(()JKggnn[1r   c                  \    t        j                         D ]  } | j                  d      s y y)z=
    Checks whether it's running on musl systems or not.
    	musllinuxTF)r   platform_tags
startswith)platform_tags    r   running_on_musllinuxr.    s2     **, "";/ r   )rssi   r   r   ),r   
contextlibr   r>   rS   r   r   r  r   r   r6   rg   rd   r   	packagingr   r  pyarrowrZ   
pyarrow.fsr   contextmanagerr   r%   r-   r;   rP   ra   ro   rt   ry   r}   r   r   r   FileSystemHandlerr   r   r   r   r   r"  r(  r.  r
   r   r   <module>r6     s=  $   	 	  	      
     " ( (*"JCF FH%&)X 	3 * *     ?D7::// ?DD ,1  $?"	C83:lr   